From 1c449eced07031d9800f8515612b7b7d329d22a0 Mon Sep 17 00:00:00 2001 From: "Timothy J. Warren" Date: Mon, 3 Nov 2014 10:59:34 -0500 Subject: [PATCH] Add sqlite3 modules for tests --- node_modules/sqlite3/CHANGELOG.md | 103 + node_modules/sqlite3/LICENSE | 25 + node_modules/sqlite3/README.md | 186 + node_modules/sqlite3/appveyor.yml | 45 + node_modules/sqlite3/binding.gyp | 52 + node_modules/sqlite3/deps/common-sqlite.gypi | 5 + node_modules/sqlite3/deps/extract.py | 9 + .../deps/sqlite-autoconf-3080600.tar.gz | Bin 0 -> 1968379 bytes node_modules/sqlite3/deps/sqlite3.gyp | 100 + .../node-v11-linux-x64/node_sqlite3.node | Bin 0 -> 988113 bytes node_modules/sqlite3/lib/index.js | 1 + node_modules/sqlite3/lib/sqlite3.js | 187 + node_modules/sqlite3/lib/trace.js | 42 + .../sqlite3/node_modules/.bin/node-pre-gyp | 1 + node_modules/sqlite3/node_modules/nan/.dntrc | 30 + .../sqlite3/node_modules/nan/CHANGELOG.md | 200 + node_modules/sqlite3/node_modules/nan/LICENSE | 46 + .../sqlite3/node_modules/nan/README.md | 1054 ++++ .../sqlite3/node_modules/nan/appveyor.yml | 32 + .../sqlite3/node_modules/nan/include_dirs.js | 1 + node_modules/sqlite3/node_modules/nan/nan.h | 2331 ++++++++ .../sqlite3/node_modules/nan/package.json | 79 + .../node_modules/node-pre-gyp/CHANGELOG.md | 161 + .../sqlite3/node_modules/node-pre-gyp/LICENSE | 27 + .../node_modules/node-pre-gyp/README.md | 515 ++ .../node_modules/node-pre-gyp/appveyor.yml | 32 + .../node-pre-gyp/bin/node-pre-gyp | 130 + .../node-pre-gyp/bin/node-pre-gyp.cmd | 2 + .../node_modules/node-pre-gyp/lib/build.js | 52 + .../node_modules/node-pre-gyp/lib/clean.js | 24 + .../node_modules/node-pre-gyp/lib/info.js | 40 + .../node_modules/node-pre-gyp/lib/install.js | 198 + .../node-pre-gyp/lib/node-pre-gyp.js | 194 + .../node_modules/node-pre-gyp/lib/package.js | 46 + .../node-pre-gyp/lib/pre-binding.js | 24 + .../node_modules/node-pre-gyp/lib/publish.js | 58 + .../node_modules/node-pre-gyp/lib/rebuild.js | 12 + .../node-pre-gyp/lib/reinstall.js | 12 + .../node_modules/node-pre-gyp/lib/reveal.js | 28 + .../node-pre-gyp/lib/testbinary.js | 71 + .../node-pre-gyp/lib/testpackage.js | 49 + .../node-pre-gyp/lib/unpublish.js | 41 + .../node-pre-gyp/lib/util/abi_crosswalk.json | 474 ++ .../node-pre-gyp/lib/util/compile.js | 80 + .../lib/util/nw-pre-gyp/index.html | 26 + .../lib/util/nw-pre-gyp/package.json | 9 + .../node-pre-gyp/lib/util/s3_setup.js | 30 + .../node-pre-gyp/lib/util/versioning.js | 159 + .../node-pre-gyp/node_modules/.bin/mkdirp | 1 + .../node-pre-gyp/node_modules/.bin/nopt | 1 + .../node-pre-gyp/node_modules/.bin/rc | 1 + .../node-pre-gyp/node_modules/.bin/rimraf | 1 + .../node-pre-gyp/node_modules/.bin/semver | 1 + .../node_modules/mkdirp/.npmignore | 2 + .../node_modules/mkdirp/.travis.yml | 5 + .../node-pre-gyp/node_modules/mkdirp/LICENSE | 21 + .../node_modules/mkdirp/bin/cmd.js | 33 + .../node_modules/mkdirp/bin/usage.txt | 12 + .../node_modules/mkdirp/examples/pow.js | 6 + .../node-pre-gyp/node_modules/mkdirp/index.js | 97 + .../mkdirp/node_modules/minimist/.travis.yml | 4 + .../mkdirp/node_modules/minimist/LICENSE | 18 + .../node_modules/minimist/example/parse.js | 2 + .../mkdirp/node_modules/minimist/index.js | 187 + .../mkdirp/node_modules/minimist/package.json | 67 + .../node_modules/minimist/readme.markdown | 73 + .../mkdirp/node_modules/minimist/test/dash.js | 24 + .../minimist/test/default_bool.js | 20 + .../node_modules/minimist/test/dotted.js | 16 + .../mkdirp/node_modules/minimist/test/long.js | 31 + .../node_modules/minimist/test/parse.js | 318 + .../minimist/test/parse_modified.js | 9 + .../node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/whitespace.js | 8 + .../node_modules/mkdirp/package.json | 58 + .../node_modules/mkdirp/readme.markdown | 100 + .../node_modules/mkdirp/test/chmod.js | 38 + .../node_modules/mkdirp/test/clobber.js | 37 + .../node_modules/mkdirp/test/mkdirp.js | 26 + .../node_modules/mkdirp/test/opts_fs.js | 27 + .../node_modules/mkdirp/test/opts_fs_sync.js | 25 + .../node_modules/mkdirp/test/perm.js | 30 + .../node_modules/mkdirp/test/perm_sync.js | 34 + .../node_modules/mkdirp/test/race.js | 40 + .../node_modules/mkdirp/test/rel.js | 30 + .../node_modules/mkdirp/test/return.js | 25 + .../node_modules/mkdirp/test/return_sync.js | 24 + .../node_modules/mkdirp/test/root.js | 18 + .../node_modules/mkdirp/test/sync.js | 30 + .../node_modules/mkdirp/test/umask.js | 26 + .../node_modules/mkdirp/test/umask_sync.js | 30 + .../node-pre-gyp/node_modules/nopt/.npmignore | 1 + .../node-pre-gyp/node_modules/nopt/LICENSE | 23 + .../node-pre-gyp/node_modules/nopt/README.md | 209 + .../node_modules/nopt/bin/nopt.js | 54 + .../node_modules/nopt/examples/my-program.js | 30 + .../node_modules/nopt/lib/nopt.js | 414 ++ .../nopt/node_modules/abbrev/CONTRIBUTING.md | 3 + .../nopt/node_modules/abbrev/LICENSE | 23 + .../nopt/node_modules/abbrev/README.md | 23 + .../nopt/node_modules/abbrev/abbrev.js | 62 + .../nopt/node_modules/abbrev/package.json | 46 + .../nopt/node_modules/abbrev/test.js | 47 + .../node_modules/nopt/package.json | 57 + .../node_modules/nopt/test/basic.js | 251 + .../node-pre-gyp/node_modules/npmlog/.npmrc | 2 + .../node-pre-gyp/node_modules/npmlog/LICENSE | 27 + .../node_modules/npmlog/README.md | 153 + .../node_modules/npmlog/example.js | 39 + .../node-pre-gyp/node_modules/npmlog/log.js | 154 + .../npmlog/node_modules/ansi/.jshintrc | 4 + .../npmlog/node_modules/ansi/.npmignore | 1 + .../npmlog/node_modules/ansi/History.md | 16 + .../npmlog/node_modules/ansi/README.md | 98 + .../node_modules/ansi/examples/beep/index.js | 16 + .../node_modules/ansi/examples/clear/index.js | 15 + .../ansi/examples/cursorPosition.js | 32 + .../ansi/examples/progress/index.js | 87 + .../npmlog/node_modules/ansi/lib/ansi.js | 405 ++ .../npmlog/node_modules/ansi/lib/newlines.js | 71 + .../npmlog/node_modules/ansi/package.json | 54 + .../node_modules/npmlog/package.json | 51 + .../node_modules/npmlog/test/basic.js | 228 + .../node-pre-gyp/node_modules/rc/.npmignore | 3 + .../node_modules/rc/LICENSE.APACHE2 | 15 + .../node-pre-gyp/node_modules/rc/LICENSE.BSD | 26 + .../node-pre-gyp/node_modules/rc/LICENSE.MIT | 24 + .../node-pre-gyp/node_modules/rc/README.md | 128 + .../node-pre-gyp/node_modules/rc/browser.js | 7 + .../node-pre-gyp/node_modules/rc/index.js | 43 + .../node-pre-gyp/node_modules/rc/lib/utils.js | 91 + .../rc/node_modules/deep-extend/.npmignore | 1 + .../rc/node_modules/deep-extend/LICENSE | 20 + .../rc/node_modules/deep-extend/README.md | 52 + .../rc/node_modules/deep-extend/index.js | 90 + .../rc/node_modules/deep-extend/package.json | 59 + .../deep-extend/test/index.spec.js | 57 + .../node_modules/deep-extend/test/mocha.opts | 1 + .../node_modules/rc/node_modules/ini/LICENSE | 23 + .../rc/node_modules/ini/README.md | 79 + .../node_modules/rc/node_modules/ini/ini.js | 166 + .../rc/node_modules/ini/package.json | 50 + .../rc/node_modules/ini/test/bar.js | 23 + .../rc/node_modules/ini/test/fixtures/foo.ini | 47 + .../rc/node_modules/ini/test/foo.js | 71 + .../rc/node_modules/minimist/.travis.yml | 4 + .../rc/node_modules/minimist/LICENSE | 18 + .../rc/node_modules/minimist/example/parse.js | 2 + .../rc/node_modules/minimist/index.js | 187 + .../rc/node_modules/minimist/package.json | 67 + .../rc/node_modules/minimist/readme.markdown | 73 + .../rc/node_modules/minimist/test/bool.js | 119 + .../rc/node_modules/minimist/test/dash.js | 24 + .../minimist/test/default_bool.js | 20 + .../rc/node_modules/minimist/test/dotted.js | 22 + .../rc/node_modules/minimist/test/long.js | 31 + .../rc/node_modules/minimist/test/num.js | 36 + .../rc/node_modules/minimist/test/parse.js | 197 + .../minimist/test/parse_modified.js | 9 + .../rc/node_modules/minimist/test/short.js | 67 + .../node_modules/minimist/test/whitespace.js | 8 + .../node_modules/strip-json-comments/cli.js | 41 + .../strip-json-comments/package.json | 76 + .../strip-json-comments/readme.md | 74 + .../strip-json-comments.js | 64 + .../node-pre-gyp/node_modules/rc/package.json | 64 + .../node-pre-gyp/node_modules/rc/test/ini.js | 16 + .../node_modules/rc/test/nested-env-vars.js | 39 + .../node-pre-gyp/node_modules/rc/test/test.js | 56 + .../node_modules/request/.npmignore | 2 + .../node_modules/request/.travis.yml | 12 + .../node_modules/request/CHANGELOG.md | 954 +++ .../node_modules/request/CONTRIBUTING.md | 29 + .../node-pre-gyp/node_modules/request/LICENSE | 55 + .../node_modules/request/README.md | 543 ++ .../request/disabled.appveyor.yml | 36 + .../node_modules/request/index.js | 166 + .../node_modules/request/lib/cookies.js | 28 + .../node_modules/request/lib/copy.js | 8 + .../node_modules/request/lib/debug.js | 9 + .../node_modules/request/lib/helpers.js | 50 + .../node_modules/request/lib/optional.js | 13 + .../request/node_modules/aws-sign2/LICENSE | 55 + .../request/node_modules/aws-sign2/README.md | 4 + .../request/node_modules/aws-sign2/index.js | 202 + .../node_modules/aws-sign2/package.json | 47 + .../request/node_modules/bl/.jshintrc | 59 + .../request/node_modules/bl/.npmignore | 1 + .../request/node_modules/bl/.travis.yml | 11 + .../request/node_modules/bl/LICENSE.md | 13 + .../request/node_modules/bl/README.md | 195 + .../request/node_modules/bl/bl.js | 216 + .../node_modules/readable-stream/.npmignore | 5 + .../bl/node_modules/readable-stream/LICENSE | 27 + .../bl/node_modules/readable-stream/README.md | 15 + .../bl/node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 89 + .../lib/_stream_passthrough.js | 46 + .../readable-stream/lib/_stream_readable.js | 982 ++++ .../readable-stream/lib/_stream_transform.js | 210 + .../readable-stream/lib/_stream_writable.js | 386 ++ .../node_modules/core-util-is/README.md | 3 + .../node_modules/core-util-is/float.patch | 604 ++ .../node_modules/core-util-is/lib/util.js | 107 + .../node_modules/core-util-is/package.json | 54 + .../node_modules/core-util-is/util.js | 106 + .../node_modules/inherits/LICENSE | 16 + .../node_modules/inherits/README.md | 42 + .../node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 51 + .../node_modules/inherits/test.js | 25 + .../node_modules/isarray/README.md | 54 + .../node_modules/isarray/component.json | 19 + .../node_modules/isarray/index.js | 3 + .../node_modules/isarray/package.json | 54 + .../node_modules/string_decoder/.npmignore | 2 + .../node_modules/string_decoder/LICENSE | 20 + .../node_modules/string_decoder/README.md | 7 + .../node_modules/string_decoder/index.js | 221 + .../node_modules/string_decoder/package.json | 54 + .../node_modules/readable-stream/package.json | 69 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 6 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../request/node_modules/bl/package.json | 61 + .../node_modules/bl/test/basic-test.js | 541 ++ .../request/node_modules/bl/test/sauce.js | 38 + .../request/node_modules/bl/test/test.js | 9 + .../request/node_modules/caseless/README.md | 45 + .../request/node_modules/caseless/index.js | 65 + .../node_modules/caseless/package.json | 52 + .../request/node_modules/caseless/test.js | 33 + .../node_modules/forever-agent/LICENSE | 55 + .../node_modules/forever-agent/README.md | 4 + .../node_modules/forever-agent/index.js | 119 + .../node_modules/forever-agent/package.json | 46 + .../request/node_modules/form-data/License | 19 + .../request/node_modules/form-data/Readme.md | 175 + .../node_modules/form-data/lib/form_data.js | 351 ++ .../form-data/node_modules/async/.travis.yml | 3 + .../form-data/node_modules/async/LICENSE | 19 + .../form-data/node_modules/async/README.md | 1646 ++++++ .../node_modules/async/component.json | 11 + .../form-data/node_modules/async/lib/async.js | 1123 ++++ .../form-data/node_modules/async/package.json | 60 + .../node_modules/combined-stream/License | 19 + .../node_modules/combined-stream/Readme.md | 132 + .../combined-stream/lib/combined_stream.js | 186 + .../node_modules/delayed-stream/.npmignore | 2 + .../node_modules/delayed-stream/License | 19 + .../node_modules/delayed-stream/Makefile | 7 + .../node_modules/delayed-stream/Readme.md | 154 + .../delayed-stream/lib/delayed_stream.js | 99 + .../node_modules/delayed-stream/package.json | 38 + .../delayed-stream/test/common.js | 6 + .../integration/test-delayed-http-upload.js | 38 + .../test-delayed-stream-auto-pause.js | 21 + .../integration/test-delayed-stream-pause.js | 14 + .../test/integration/test-delayed-stream.js | 48 + .../integration/test-handle-source-errors.js | 15 + .../test/integration/test-max-data-size.js | 18 + .../test/integration/test-pipe-resumes.js | 13 + .../test/integration/test-proxy-readable.js | 13 + .../node_modules/delayed-stream/test/run.js | 7 + .../node_modules/combined-stream/package.json | 61 + .../form-data/node_modules/mime/LICENSE | 19 + .../form-data/node_modules/mime/README.md | 66 + .../form-data/node_modules/mime/mime.js | 114 + .../form-data/node_modules/mime/package.json | 59 + .../form-data/node_modules/mime/test.js | 84 + .../node_modules/mime/types/mime.types | 1588 +++++ .../node_modules/mime/types/node.types | 77 + .../node_modules/form-data/package.json | 80 + .../request/node_modules/hawk/.npmignore | 18 + .../request/node_modules/hawk/.travis.yml | 5 + .../request/node_modules/hawk/LICENSE | 24 + .../request/node_modules/hawk/Makefile | 10 + .../request/node_modules/hawk/README.md | 625 ++ .../node_modules/hawk/example/usage.js | 78 + .../request/node_modules/hawk/images/hawk.png | Bin 0 -> 6945 bytes .../request/node_modules/hawk/images/logo.png | Bin 0 -> 71732 bytes .../request/node_modules/hawk/index.js | 1 + .../request/node_modules/hawk/lib/browser.js | 507 ++ .../request/node_modules/hawk/lib/client.js | 371 ++ .../request/node_modules/hawk/lib/crypto.js | 118 + .../request/node_modules/hawk/lib/index.js | 15 + .../request/node_modules/hawk/lib/server.js | 523 ++ .../request/node_modules/hawk/lib/utils.js | 183 + .../hawk/node_modules/boom/.npmignore | 18 + .../hawk/node_modules/boom/.travis.yml | 5 + .../hawk/node_modules/boom/LICENSE | 24 + .../hawk/node_modules/boom/Makefile | 11 + .../hawk/node_modules/boom/README.md | 6 + .../hawk/node_modules/boom/images/boom.png | Bin 0 -> 29479 bytes .../hawk/node_modules/boom/index.js | 1 + .../hawk/node_modules/boom/lib/index.js | 207 + .../hawk/node_modules/boom/package.json | 64 + .../hawk/node_modules/boom/test/index.js | 245 + .../hawk/node_modules/cryptiles/.npmignore | 18 + .../hawk/node_modules/cryptiles/.travis.yml | 5 + .../hawk/node_modules/cryptiles/LICENSE | 24 + .../hawk/node_modules/cryptiles/Makefile | 11 + .../hawk/node_modules/cryptiles/README.md | 6 + .../hawk/node_modules/cryptiles/index.js | 1 + .../hawk/node_modules/cryptiles/lib/index.js | 68 + .../hawk/node_modules/cryptiles/package.json | 65 + .../hawk/node_modules/cryptiles/test/index.js | 101 + .../hawk/node_modules/hoek/.npmignore | 18 + .../hawk/node_modules/hoek/.travis.yml | 5 + .../hawk/node_modules/hoek/LICENSE | 33 + .../hawk/node_modules/hoek/Makefile | 10 + .../hawk/node_modules/hoek/README.md | 436 ++ .../hawk/node_modules/hoek/images/hoek.png | Bin 0 -> 37939 bytes .../hawk/node_modules/hoek/index.js | 1 + .../hawk/node_modules/hoek/lib/escape.js | 132 + .../hawk/node_modules/hoek/lib/index.js | 585 ++ .../hawk/node_modules/hoek/package.json | 70 + .../hawk/node_modules/hoek/test/escaper.js | 86 + .../hawk/node_modules/hoek/test/index.js | 1078 ++++ .../node_modules/hoek/test/modules/test1.js | 1 + .../node_modules/hoek/test/modules/test2.js | 1 + .../node_modules/hoek/test/modules/test3.js | 1 + .../hawk/node_modules/sntp/.npmignore | 18 + .../hawk/node_modules/sntp/.travis.yml | 5 + .../hawk/node_modules/sntp/LICENSE | 24 + .../hawk/node_modules/sntp/Makefile | 11 + .../hawk/node_modules/sntp/README.md | 68 + .../hawk/node_modules/sntp/examples/offset.js | 16 + .../hawk/node_modules/sntp/examples/time.js | 25 + .../hawk/node_modules/sntp/index.js | 1 + .../hawk/node_modules/sntp/lib/index.js | 409 ++ .../hawk/node_modules/sntp/package.json | 65 + .../hawk/node_modules/sntp/test/index.js | 359 ++ .../request/node_modules/hawk/package.json | 68 + .../request/node_modules/hawk/test/browser.js | 817 +++ .../request/node_modules/hawk/test/client.js | 206 + .../request/node_modules/hawk/test/crypto.js | 86 + .../request/node_modules/hawk/test/index.js | 316 + .../request/node_modules/hawk/test/message.js | 246 + .../request/node_modules/hawk/test/readme.js | 98 + .../request/node_modules/hawk/test/server.js | 686 +++ .../request/node_modules/hawk/test/uri.js | 456 ++ .../request/node_modules/hawk/test/utils.js | 120 + .../http-signature/.dir-locals.el | 6 + .../node_modules/http-signature/.npmignore | 7 + .../node_modules/http-signature/LICENSE | 18 + .../node_modules/http-signature/README.md | 75 + .../http-signature/http_signing.md | 296 + .../node_modules/http-signature/lib/index.js | 25 + .../node_modules/http-signature/lib/parser.js | 304 + .../node_modules/http-signature/lib/signer.js | 179 + .../node_modules/http-signature/lib/util.js | 249 + .../node_modules/http-signature/lib/verify.js | 42 + .../node_modules/asn1/.npmignore | 2 + .../http-signature/node_modules/asn1/LICENSE | 19 + .../node_modules/asn1/README.md | 50 + .../node_modules/asn1/lib/ber/errors.js | 13 + .../node_modules/asn1/lib/ber/index.js | 27 + .../node_modules/asn1/lib/ber/reader.js | 267 + .../node_modules/asn1/lib/ber/types.js | 36 + .../node_modules/asn1/lib/ber/writer.js | 317 + .../node_modules/asn1/lib/index.js | 20 + .../node_modules/asn1/package.json | 58 + .../node_modules/asn1/tst/ber/reader.test.js | 172 + .../node_modules/asn1/tst/ber/writer.test.js | 296 + .../node_modules/assert-plus/README.md | 126 + .../node_modules/assert-plus/assert.js | 196 + .../node_modules/assert-plus/package.json | 37 + .../node_modules/ctype/CHANGELOG | 71 + .../http-signature/node_modules/ctype/LICENSE | 24 + .../http-signature/node_modules/ctype/README | 82 + .../node_modules/ctype/README.old | 298 + .../http-signature/node_modules/ctype/ctf.js | 245 + .../http-signature/node_modules/ctype/ctio.js | 1485 +++++ .../node_modules/ctype/ctype.js | 944 +++ .../ctype/man/man3ctype/ctio.3ctype | 241 + .../node_modules/ctype/package.json | 34 + .../node_modules/ctype/tools/jsl.conf | 129 + .../node_modules/ctype/tools/jsstyle | 839 +++ .../node_modules/ctype/tst/ctf/float.json | 13 + .../node_modules/ctype/tst/ctf/int.json | 13 + .../node_modules/ctype/tst/ctf/psinfo.json | 104 + .../node_modules/ctype/tst/ctf/struct.json | 19 + .../node_modules/ctype/tst/ctf/tst.fail.js | 39 + .../node_modules/ctype/tst/ctf/tst.float.js | 14 + .../node_modules/ctype/tst/ctf/tst.int.js | 14 + .../node_modules/ctype/tst/ctf/tst.psinfo.js | 17 + .../node_modules/ctype/tst/ctf/tst.struct.js | 18 + .../node_modules/ctype/tst/ctf/tst.typedef.js | 15 + .../node_modules/ctype/tst/ctf/typedef.json | 14 + .../ctype/tst/ctio/float/tst.rfloat.js | 767 +++ .../ctype/tst/ctio/float/tst.wfloat.js | 753 +++ .../node_modules/ctype/tst/ctio/int/tst.64.js | 638 ++ .../ctype/tst/ctio/int/tst.rint.js | 101 + .../ctype/tst/ctio/int/tst.wbounds.js | 53 + .../ctype/tst/ctio/int/tst.wint.js | 92 + .../ctype/tst/ctio/uint/tst.64.js | 451 ++ .../ctype/tst/ctio/uint/tst.roundtrip.js | 81 + .../ctype/tst/ctio/uint/tst.ruint.js | 95 + .../ctype/tst/ctio/uint/tst.wuint.js | 156 + .../ctype/tst/ctype/tst.basicr.js | 50 + .../ctype/tst/ctype/tst.basicw.js | 44 + .../node_modules/ctype/tst/ctype/tst.char.js | 42 + .../ctype/tst/ctype/tst.endian.js | 45 + .../ctype/tst/ctype/tst.oldwrite.js | 28 + .../ctype/tst/ctype/tst.readSize.js | 128 + .../ctype/tst/ctype/tst.structw.js | 28 + .../ctype/tst/ctype/tst.writeStruct.js | 31 + .../node_modules/http-signature/package.json | 54 + .../node_modules/json-stringify-safe/LICENSE | 27 + .../json-stringify-safe/README.md | 49 + .../json-stringify-safe/package.json | 51 + .../json-stringify-safe/stringify.js | 39 + .../node_modules/json-stringify-safe/test.js | 128 + .../node_modules/mime-types/.npmignore | 14 + .../node_modules/mime-types/.travis.yml | 12 + .../request/node_modules/mime-types/LICENSE | 22 + .../request/node_modules/mime-types/Makefile | 9 + .../request/node_modules/mime-types/README.md | 101 + .../node_modules/mime-types/SOURCES.md | 17 + .../node_modules/mime-types/component.json | 16 + .../node_modules/mime-types/lib/custom.json | 27 + .../node_modules/mime-types/lib/index.js | 75 + .../node_modules/mime-types/lib/mime.json | 3317 +++++++++++ .../node_modules/mime-types/lib/node.json | 55 + .../node_modules/mime-types/package.json | 69 + .../request/node_modules/node-uuid/.npmignore | 2 + .../request/node_modules/node-uuid/LICENSE.md | 2 + .../request/node_modules/node-uuid/README.md | 207 + .../node-uuid/benchmark/README.md | 53 + .../node-uuid/benchmark/bench.gnu | 174 + .../node_modules/node-uuid/benchmark/bench.sh | 34 + .../node-uuid/benchmark/benchmark-native.c | 34 + .../node-uuid/benchmark/benchmark.js | 84 + .../node_modules/node-uuid/component.json | 18 + .../node_modules/node-uuid/package.json | 54 + .../node_modules/node-uuid/test/compare_v1.js | 63 + .../node_modules/node-uuid/test/test.html | 17 + .../node_modules/node-uuid/test/test.js | 228 + .../request/node_modules/node-uuid/uuid.js | 245 + .../request/node_modules/oauth-sign/LICENSE | 55 + .../request/node_modules/oauth-sign/README.md | 4 + .../request/node_modules/oauth-sign/index.js | 81 + .../node_modules/oauth-sign/package.json | 49 + .../request/node_modules/oauth-sign/test.js | 63 + .../request/node_modules/qs/.jshintignore | 1 + .../request/node_modules/qs/.jshintrc | 10 + .../request/node_modules/qs/.npmignore | 18 + .../request/node_modules/qs/.travis.yml | 4 + .../request/node_modules/qs/CONTRIBUTING.md | 1 + .../request/node_modules/qs/LICENSE | 28 + .../request/node_modules/qs/Makefile | 8 + .../request/node_modules/qs/README.md | 192 + .../request/node_modules/qs/index.js | 1 + .../request/node_modules/qs/lib/index.js | 15 + .../request/node_modules/qs/lib/parse.js | 155 + .../request/node_modules/qs/lib/stringify.js | 55 + .../request/node_modules/qs/lib/utils.js | 133 + .../request/node_modules/qs/package.json | 61 + .../request/node_modules/qs/test/parse.js | 301 + .../request/node_modules/qs/test/stringify.js | 129 + .../node_modules/stringstream/.npmignore | 15 + .../node_modules/stringstream/.travis.yml | 4 + .../node_modules/stringstream/LICENSE.txt | 4 + .../node_modules/stringstream/README.md | 38 + .../node_modules/stringstream/example.js | 27 + .../node_modules/stringstream/package.json | 48 + .../node_modules/stringstream/stringstream.js | 102 + .../node_modules/tough-cookie/.jshintrc | 70 + .../node_modules/tough-cookie/.npmignore | 3 + .../node_modules/tough-cookie/.travis.yml | 8 + .../request/node_modules/tough-cookie/LICENSE | 78 + .../node_modules/tough-cookie/README.md | 412 ++ .../tough-cookie/generate-pubsuffix.js | 239 + .../node_modules/tough-cookie/lib/cookie.js | 1107 ++++ .../node_modules/tough-cookie/lib/memstore.js | 123 + .../tough-cookie/lib/pubsuffix.js | 69 + .../node_modules/tough-cookie/lib/store.js | 37 + .../node_modules/punycode/LICENSE-MIT.txt | 20 + .../node_modules/punycode/README.md | 176 + .../node_modules/punycode/package.json | 87 + .../node_modules/punycode/punycode.js | 528 ++ .../node_modules/tough-cookie/package.json | 67 + .../tough-cookie/public-suffix.txt | 5229 +++++++++++++++++ .../request/node_modules/tough-cookie/test.js | 1625 +++++ .../node_modules/tunnel-agent/.jshintrc | 5 + .../request/node_modules/tunnel-agent/LICENSE | 55 + .../node_modules/tunnel-agent/README.md | 4 + .../node_modules/tunnel-agent/index.js | 236 + .../node_modules/tunnel-agent/package.json | 46 + .../node_modules/request/package.json | 80 + .../node_modules/request/request.js | 1497 +++++ .../node-pre-gyp/node_modules/rimraf/AUTHORS | 6 + .../node-pre-gyp/node_modules/rimraf/LICENSE | 23 + .../node_modules/rimraf/README.md | 30 + .../node-pre-gyp/node_modules/rimraf/bin.js | 33 + .../node_modules/rimraf/package.json | 73 + .../node_modules/rimraf/rimraf.js | 248 + .../node_modules/rimraf/test/run.sh | 16 + .../node_modules/rimraf/test/setup.sh | 47 + .../node_modules/rimraf/test/test-async.js | 5 + .../node_modules/rimraf/test/test-sync.js | 3 + .../node_modules/semver/.npmignore | 1 + .../node-pre-gyp/node_modules/semver/LICENSE | 27 + .../node-pre-gyp/node_modules/semver/Makefile | 24 + .../node_modules/semver/README.md | 158 + .../node_modules/semver/bin/semver | 125 + .../node-pre-gyp/node_modules/semver/foot.js | 6 + .../node-pre-gyp/node_modules/semver/head.js | 2 + .../node_modules/semver/package.json | 50 + .../node_modules/semver/semver.browser.js | 1035 ++++ .../node_modules/semver/semver.browser.js.gz | Bin 0 -> 7247 bytes .../node_modules/semver/semver.js | 1039 ++++ .../node_modules/semver/semver.min.js | 1 + .../node_modules/semver/semver.min.js.gz | Bin 0 -> 3318 bytes .../node_modules/semver/test/amd.js | 15 + .../node_modules/semver/test/clean.js | 25 + .../node_modules/semver/test/gtr.js | 173 + .../node_modules/semver/test/index.js | 588 ++ .../node_modules/semver/test/ltr.js | 175 + .../node_modules/semver/test/no-module.js | 19 + .../node_modules/tar-pack/.npmignore | 14 + .../node_modules/tar-pack/.travis.yml | 4 + .../node_modules/tar-pack/README.md | 81 + .../node_modules/tar-pack/index.js | 246 + .../tar-pack/node_modules/debug/Readme.md | 115 + .../tar-pack/node_modules/debug/debug.js | 137 + .../tar-pack/node_modules/debug/index.js | 5 + .../tar-pack/node_modules/debug/lib/debug.js | 147 + .../tar-pack/node_modules/debug/package.json | 62 + .../node_modules/fstream-ignore/.npmignore | 1 + .../node_modules/fstream-ignore/LICENSE | 27 + .../node_modules/fstream-ignore/README.md | 22 + .../fstream-ignore/example/basic.js | 13 + .../node_modules/fstream-ignore/ignore.js | 275 + .../node_modules/inherits/LICENSE | 16 + .../node_modules/inherits/README.md | 42 + .../node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 51 + .../node_modules/inherits/test.js | 25 + .../node_modules/minimatch/.npmignore | 1 + .../node_modules/minimatch/LICENSE | 23 + .../node_modules/minimatch/README.md | 218 + .../node_modules/minimatch/minimatch.js | 1055 ++++ .../node_modules/lru-cache/.npmignore | 1 + .../node_modules/lru-cache/CONTRIBUTORS | 14 + .../minimatch/node_modules/lru-cache/LICENSE | 23 + .../node_modules/lru-cache/README.md | 97 + .../node_modules/lru-cache/lib/lru-cache.js | 252 + .../node_modules/lru-cache/package.json | 50 + .../node_modules/lru-cache/test/basic.js | 369 ++ .../node_modules/lru-cache/test/foreach.js | 52 + .../lru-cache/test/memory-leak.js | 50 + .../minimatch/node_modules/sigmund/LICENSE | 27 + .../minimatch/node_modules/sigmund/README.md | 53 + .../minimatch/node_modules/sigmund/bench.js | 283 + .../node_modules/sigmund/package.json | 58 + .../minimatch/node_modules/sigmund/sigmund.js | 39 + .../node_modules/sigmund/test/basic.js | 24 + .../node_modules/minimatch/package.json | 57 + .../node_modules/minimatch/test/basic.js | 399 ++ .../minimatch/test/brace-expand.js | 33 + .../node_modules/minimatch/test/caching.js | 14 + .../node_modules/minimatch/test/defaults.js | 274 + .../test/extglob-ending-with-state-char.js | 8 + .../node_modules/fstream-ignore/package.json | 52 + .../node_modules/fstream-ignore/test/.ignore | 2 + .../fstream-ignore/test/.npmignore | 1 + .../fstream-ignore/test/00-setup.js | 71 + .../node_modules/fstream-ignore/test/basic.js | 28 + .../fstream-ignore/test/common.js | 40 + .../fstream-ignore/test/ignore-most.js | 41 + .../fstream-ignore/test/nested-ignores.js | 51 + .../fstream-ignore/test/unignore-child.js | 38 + .../fstream-ignore/test/zz-cleanup.js | 10 + .../tar-pack/node_modules/fstream/.npmignore | 5 + .../tar-pack/node_modules/fstream/.travis.yml | 3 + .../tar-pack/node_modules/fstream/LICENSE | 27 + .../tar-pack/node_modules/fstream/README.md | 76 + .../fstream/examples/filter-pipe.js | 131 + .../node_modules/fstream/examples/pipe.js | 115 + .../node_modules/fstream/examples/reader.js | 54 + .../fstream/examples/symlink-write.js | 24 + .../tar-pack/node_modules/fstream/fstream.js | 31 + .../node_modules/fstream/lib/abstract.js | 85 + .../node_modules/fstream/lib/collect.js | 67 + .../node_modules/fstream/lib/dir-reader.js | 251 + .../node_modules/fstream/lib/dir-writer.js | 171 + .../node_modules/fstream/lib/file-reader.js | 147 + .../node_modules/fstream/lib/file-writer.js | 104 + .../node_modules/fstream/lib/get-type.js | 32 + .../node_modules/fstream/lib/link-reader.js | 54 + .../node_modules/fstream/lib/link-writer.js | 95 + .../node_modules/fstream/lib/proxy-reader.js | 93 + .../node_modules/fstream/lib/proxy-writer.js | 109 + .../node_modules/fstream/lib/reader.js | 262 + .../node_modules/fstream/lib/socket-reader.js | 38 + .../node_modules/fstream/lib/writer.js | 389 ++ .../node_modules/graceful-fs/.npmignore | 1 + .../fstream/node_modules/graceful-fs/LICENSE | 27 + .../node_modules/graceful-fs/README.md | 36 + .../fstream/node_modules/graceful-fs/fs.js | 11 + .../node_modules/graceful-fs/graceful-fs.js | 158 + .../node_modules/graceful-fs/package.json | 66 + .../node_modules/graceful-fs/polyfills.js | 255 + .../node_modules/graceful-fs/test/open.js | 39 + .../graceful-fs/test/readdir-sort.js | 21 + .../fstream/node_modules/inherits/LICENSE | 16 + .../fstream/node_modules/inherits/README.md | 42 + .../fstream/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 51 + .../fstream/node_modules/inherits/test.js | 25 + .../node_modules/fstream/package.json | 57 + .../node_modules/graceful-fs/.npmignore | 1 + .../tar-pack/node_modules/graceful-fs/LICENSE | 27 + .../node_modules/graceful-fs/README.md | 33 + .../node_modules/graceful-fs/graceful-fs.js | 442 ++ .../node_modules/graceful-fs/package.json | 63 + .../node_modules/graceful-fs/test/open.js | 46 + .../node_modules/graceful-fs/test/ulimit.js | 158 + .../tar-pack/node_modules/once/LICENSE | 27 + .../tar-pack/node_modules/once/README.md | 33 + .../tar-pack/node_modules/once/once.js | 19 + .../tar-pack/node_modules/once/package.json | 56 + .../tar-pack/node_modules/once/test/once.js | 18 + .../node_modules/readable-stream/.npmignore | 5 + .../node_modules/readable-stream/LICENSE | 27 + .../node_modules/readable-stream/README.md | 15 + .../node_modules/readable-stream/duplex.js | 1 + .../readable-stream/lib/_stream_duplex.js | 89 + .../lib/_stream_passthrough.js | 46 + .../readable-stream/lib/_stream_readable.js | 982 ++++ .../readable-stream/lib/_stream_transform.js | 210 + .../readable-stream/lib/_stream_writable.js | 386 ++ .../node_modules/core-util-is/README.md | 3 + .../node_modules/core-util-is/float.patch | 604 ++ .../node_modules/core-util-is/lib/util.js | 107 + .../node_modules/core-util-is/package.json | 54 + .../node_modules/core-util-is/util.js | 106 + .../node_modules/inherits/LICENSE | 16 + .../node_modules/inherits/README.md | 42 + .../node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../node_modules/inherits/package.json | 51 + .../node_modules/inherits/test.js | 25 + .../node_modules/isarray/README.md | 54 + .../node_modules/isarray/component.json | 19 + .../node_modules/isarray/index.js | 3 + .../node_modules/isarray/package.json | 51 + .../node_modules/string_decoder/.npmignore | 2 + .../node_modules/string_decoder/LICENSE | 20 + .../node_modules/string_decoder/README.md | 7 + .../node_modules/string_decoder/index.js | 221 + .../node_modules/string_decoder/package.json | 54 + .../node_modules/readable-stream/package.json | 69 + .../readable-stream/passthrough.js | 1 + .../node_modules/readable-stream/readable.js | 6 + .../node_modules/readable-stream/transform.js | 1 + .../node_modules/readable-stream/writable.js | 1 + .../tar-pack/node_modules/tar/.npmignore | 5 + .../tar-pack/node_modules/tar/.travis.yml | 3 + .../tar-pack/node_modules/tar/LICENCE | 25 + .../tar-pack/node_modules/tar/README.md | 48 + .../node_modules/tar/examples/extracter.js | 11 + .../node_modules/tar/examples/packer.js | 10 + .../node_modules/tar/examples/reader.js | 36 + .../node_modules/tar/lib/buffer-entry.js | 30 + .../node_modules/tar/lib/entry-writer.js | 169 + .../tar-pack/node_modules/tar/lib/entry.js | 213 + .../tar/lib/extended-header-writer.js | 191 + .../node_modules/tar/lib/extended-header.js | 140 + .../tar-pack/node_modules/tar/lib/extract.js | 78 + .../tar/lib/global-header-writer.js | 14 + .../tar-pack/node_modules/tar/lib/header.js | 385 ++ .../tar-pack/node_modules/tar/lib/pack.js | 231 + .../tar-pack/node_modules/tar/lib/parse.js | 271 + .../tar/node_modules/block-stream/LICENCE | 25 + .../tar/node_modules/block-stream/README.md | 14 + .../block-stream/bench/block-stream-pause.js | 70 + .../block-stream/bench/block-stream.js | 68 + .../block-stream/bench/dropper-pause.js | 70 + .../block-stream/bench/dropper.js | 68 + .../node_modules/block-stream/block-stream.js | 209 + .../node_modules/block-stream/package.json | 54 + .../node_modules/block-stream/test/basic.js | 27 + .../block-stream/test/nopad-thorough.js | 68 + .../node_modules/block-stream/test/nopad.js | 57 + .../block-stream/test/pause-resume.js | 73 + .../block-stream/test/thorough.js | 68 + .../block-stream/test/two-stream.js | 59 + .../tar/node_modules/inherits/LICENSE | 16 + .../tar/node_modules/inherits/README.md | 42 + .../tar/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../tar/node_modules/inherits/package.json | 51 + .../tar/node_modules/inherits/test.js | 25 + .../tar-pack/node_modules/tar/package.json | 54 + .../tar-pack/node_modules/tar/tar.js | 173 + .../tar/test/00-setup-fixtures.js | 53 + .../tar-pack/node_modules/tar/test/extract.js | 367 ++ .../node_modules/tar/test/fixtures.tgz | Bin 0 -> 19205 bytes .../tar-pack/node_modules/tar/test/header.js | 183 + .../tar/test/pack-no-proprietary.js | 854 +++ .../tar-pack/node_modules/tar/test/pack.js | 897 +++ .../tar-pack/node_modules/tar/test/parse.js | 359 ++ .../node_modules/tar/test/zz-cleanup.js | 20 + .../tar-pack/node_modules/uid-number/LICENCE | 25 + .../node_modules/uid-number/README.md | 17 + .../node_modules/uid-number/get-uid-gid.js | 24 + .../node_modules/uid-number/package.json | 45 + .../node_modules/uid-number/uid-number.js | 54 + .../node_modules/tar-pack/package.json | 54 + .../tar-pack/test/fixtures/packed-file.txt | 1 + .../tar-pack/test/fixtures/packed.tar | Bin 0 -> 3584 bytes .../tar-pack/test/fixtures/packed.tar.gz | Bin 0 -> 152 bytes .../tar-pack/test/fixtures/to-pack/bar.txt | 1 + .../tar-pack/test/fixtures/to-pack/foo.txt | 1 + .../node_modules/tar-pack/test/index.js | 67 + .../node-pre-gyp/node_modules/tar/.npmignore | 5 + .../node-pre-gyp/node_modules/tar/.travis.yml | 3 + .../node-pre-gyp/node_modules/tar/LICENCE | 25 + .../node-pre-gyp/node_modules/tar/README.md | 48 + .../node_modules/tar/examples/extracter.js | 11 + .../node_modules/tar/examples/packer.js | 10 + .../node_modules/tar/examples/reader.js | 36 + .../node_modules/tar/lib/buffer-entry.js | 30 + .../node_modules/tar/lib/entry-writer.js | 169 + .../node_modules/tar/lib/entry.js | 213 + .../tar/lib/extended-header-writer.js | 191 + .../node_modules/tar/lib/extended-header.js | 140 + .../node_modules/tar/lib/extract.js | 78 + .../tar/lib/global-header-writer.js | 14 + .../node_modules/tar/lib/header.js | 385 ++ .../node-pre-gyp/node_modules/tar/lib/pack.js | 231 + .../node_modules/tar/lib/parse.js | 271 + .../tar/node_modules/block-stream/LICENCE | 25 + .../tar/node_modules/block-stream/README.md | 14 + .../block-stream/bench/block-stream-pause.js | 70 + .../block-stream/bench/block-stream.js | 68 + .../block-stream/bench/dropper-pause.js | 70 + .../block-stream/bench/dropper.js | 68 + .../node_modules/block-stream/block-stream.js | 209 + .../node_modules/block-stream/package.json | 54 + .../node_modules/block-stream/test/basic.js | 27 + .../block-stream/test/nopad-thorough.js | 68 + .../node_modules/block-stream/test/nopad.js | 57 + .../block-stream/test/pause-resume.js | 73 + .../block-stream/test/thorough.js | 68 + .../block-stream/test/two-stream.js | 59 + .../tar/node_modules/fstream/.npmignore | 5 + .../tar/node_modules/fstream/.travis.yml | 3 + .../tar/node_modules/fstream/LICENSE | 27 + .../tar/node_modules/fstream/README.md | 76 + .../fstream/examples/filter-pipe.js | 131 + .../tar/node_modules/fstream/examples/pipe.js | 115 + .../node_modules/fstream/examples/reader.js | 54 + .../fstream/examples/symlink-write.js | 24 + .../tar/node_modules/fstream/fstream.js | 31 + .../tar/node_modules/fstream/lib/abstract.js | 85 + .../tar/node_modules/fstream/lib/collect.js | 67 + .../node_modules/fstream/lib/dir-reader.js | 251 + .../node_modules/fstream/lib/dir-writer.js | 171 + .../node_modules/fstream/lib/file-reader.js | 147 + .../node_modules/fstream/lib/file-writer.js | 104 + .../tar/node_modules/fstream/lib/get-type.js | 32 + .../node_modules/fstream/lib/link-reader.js | 54 + .../node_modules/fstream/lib/link-writer.js | 95 + .../node_modules/fstream/lib/proxy-reader.js | 93 + .../node_modules/fstream/lib/proxy-writer.js | 109 + .../tar/node_modules/fstream/lib/reader.js | 262 + .../node_modules/fstream/lib/socket-reader.js | 38 + .../tar/node_modules/fstream/lib/writer.js | 392 ++ .../node_modules/graceful-fs/.npmignore | 1 + .../fstream/node_modules/graceful-fs/LICENSE | 27 + .../node_modules/graceful-fs/README.md | 36 + .../fstream/node_modules/graceful-fs/fs.js | 11 + .../node_modules/graceful-fs/graceful-fs.js | 158 + .../node_modules/graceful-fs/package.json | 66 + .../node_modules/graceful-fs/polyfills.js | 255 + .../node_modules/graceful-fs/test/open.js | 39 + .../graceful-fs/test/readdir-sort.js | 21 + .../tar/node_modules/fstream/package.json | 57 + .../tar/node_modules/inherits/LICENSE | 16 + .../tar/node_modules/inherits/README.md | 42 + .../tar/node_modules/inherits/inherits.js | 1 + .../node_modules/inherits/inherits_browser.js | 23 + .../tar/node_modules/inherits/package.json | 51 + .../tar/node_modules/inherits/test.js | 25 + .../node_modules/tar/package.json | 55 + .../node-pre-gyp/node_modules/tar/tar.js | 173 + .../tar/test/00-setup-fixtures.js | 53 + .../node_modules/tar/test/extract-move.js | 132 + .../node_modules/tar/test/extract.js | 367 ++ .../node_modules/tar/test/fixtures.tgz | Bin 0 -> 19352 bytes .../node_modules/tar/test/header.js | 183 + .../tar/test/pack-no-proprietary.js | 886 +++ .../node_modules/tar/test/pack.js | 934 +++ .../node_modules/tar/test/parse.js | 359 ++ .../node_modules/tar/test/zz-cleanup.js | 20 + .../node_modules/node-pre-gyp/package.json | 70 + node_modules/sqlite3/package.json | 143 + node_modules/sqlite3/sqlite3.js | 1 + node_modules/sqlite3/src/async.h | 89 + node_modules/sqlite3/src/database.cc | 673 +++ node_modules/sqlite3/src/database.h | 189 + node_modules/sqlite3/src/gcc-preinclude.h | 4 + node_modules/sqlite3/src/macros.h | 150 + node_modules/sqlite3/src/node_sqlite3.cc | 107 + node_modules/sqlite3/src/statement.cc | 900 +++ node_modules/sqlite3/src/statement.h | 249 + node_modules/sqlite3/src/threading.h | 48 + 815 files changed, 101370 insertions(+) create mode 100644 node_modules/sqlite3/CHANGELOG.md create mode 100644 node_modules/sqlite3/LICENSE create mode 100644 node_modules/sqlite3/README.md create mode 100644 node_modules/sqlite3/appveyor.yml create mode 100644 node_modules/sqlite3/binding.gyp create mode 100644 node_modules/sqlite3/deps/common-sqlite.gypi create mode 100644 node_modules/sqlite3/deps/extract.py create mode 100644 node_modules/sqlite3/deps/sqlite-autoconf-3080600.tar.gz create mode 100755 node_modules/sqlite3/deps/sqlite3.gyp create mode 100755 node_modules/sqlite3/lib/binding/node-v11-linux-x64/node_sqlite3.node create mode 100644 node_modules/sqlite3/lib/index.js create mode 100644 node_modules/sqlite3/lib/sqlite3.js create mode 100644 node_modules/sqlite3/lib/trace.js create mode 120000 node_modules/sqlite3/node_modules/.bin/node-pre-gyp create mode 100644 node_modules/sqlite3/node_modules/nan/.dntrc create mode 100644 node_modules/sqlite3/node_modules/nan/CHANGELOG.md create mode 100644 node_modules/sqlite3/node_modules/nan/LICENSE create mode 100644 node_modules/sqlite3/node_modules/nan/README.md create mode 100644 node_modules/sqlite3/node_modules/nan/appveyor.yml create mode 100644 node_modules/sqlite3/node_modules/nan/include_dirs.js create mode 100644 node_modules/sqlite3/node_modules/nan/nan.h create mode 100644 node_modules/sqlite3/node_modules/nan/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/CHANGELOG.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/appveyor.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/build.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/clean.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/info.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/install.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/node-pre-gyp.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/package.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/pre-binding.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/publish.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/rebuild.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/reinstall.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/reveal.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/testbinary.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/testpackage.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/unpublish.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/compile.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/s3_setup.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/versioning.js create mode 120000 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/mkdirp create mode 120000 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/nopt create mode 120000 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rc create mode 120000 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rimraf create mode 120000 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/semver create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/.npmrc create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/example.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/log.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.jshintrc create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/History.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/beep/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/clear/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/cursorPosition.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/progress/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/lib/ansi.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/lib/newlines.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/LICENSE.APACHE2 create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/LICENSE.BSD create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/LICENSE.MIT create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/browser.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/index.spec.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/mocha.opts create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/bar.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/fixtures/foo.ini create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/foo.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/ini.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/disabled.appveyor.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/copy.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/debug.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/optional.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/util.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/basic-test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/sauce.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/Readme.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/component.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/License create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/mime.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/types/mime.types create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/mime/types/node.types create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.npmignore create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.travis.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/LICENSE create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/Makefile create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/example/usage.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/hawk.png create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/logo.png create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/browser.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/client.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/crypto.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/server.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/utils.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/Makefile create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/Makefile create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/Makefile create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/browser.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/client.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/crypto.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/message.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/readme.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/server.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/uri.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/utils.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.dir-locals.el create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/http_signing.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/parser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/signer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/util.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/verify.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/errors.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/types.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/reader.test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/writer.test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/CHANGELOG create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/README create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/README.old create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/ctf.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/ctio.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/ctype.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/man/man3ctype/ctio.3ctype create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsl.conf create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsstyle create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/stringify.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/Makefile create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/SOURCES.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/component.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/lib/custom.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/lib/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/lib/mime.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/lib/node.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/LICENSE.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintrc create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/Makefile create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.jshintrc create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/public-suffix.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/.jshintrc create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/request.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/AUTHORS create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/bin.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/run.sh create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/setup.sh create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-async.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-sync.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/Makefile create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/bin/semver create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/foot.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/head.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js.gz create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.min.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.min.js.gz create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/amd.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/clean.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/gtr.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/ltr.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/no-module.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/Readme.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/debug.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/lib/debug.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/example/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/foreach.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/bench.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/sigmund.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/brace-expand.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/caching.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/defaults.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/extglob-ending-with-state-char.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.ignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/00-setup.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/common.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/ignore-most.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/nested-ignores.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/unignore-child.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/zz-cleanup.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/ulimit.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/test/once.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/util.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/LICENCE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/extracter.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/packer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/buffer-entry.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/entry-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/entry.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extract.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/global-header-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/header.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/pack.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/LICENCE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/block-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/pause-resume.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/thorough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/two-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/tar.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/00-setup-fixtures.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/extract.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/fixtures.tgz create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/header.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/pack-no-proprietary.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/pack.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/zz-cleanup.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENCE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md create mode 100755 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar.gz create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/LICENCE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/buffer-entry.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/entry-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/header.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/basic.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/pause-resume.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/thorough.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/two-stream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/.npmignore create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/open.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/package.json create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/tar.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/fixtures.tgz create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/header.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/parse.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js create mode 100644 node_modules/sqlite3/node_modules/node-pre-gyp/package.json create mode 100644 node_modules/sqlite3/package.json create mode 100644 node_modules/sqlite3/sqlite3.js create mode 100644 node_modules/sqlite3/src/async.h create mode 100644 node_modules/sqlite3/src/database.cc create mode 100644 node_modules/sqlite3/src/database.h create mode 100644 node_modules/sqlite3/src/gcc-preinclude.h create mode 100644 node_modules/sqlite3/src/macros.h create mode 100644 node_modules/sqlite3/src/node_sqlite3.cc create mode 100644 node_modules/sqlite3/src/statement.cc create mode 100644 node_modules/sqlite3/src/statement.h create mode 100644 node_modules/sqlite3/src/threading.h diff --git a/node_modules/sqlite3/CHANGELOG.md b/node_modules/sqlite3/CHANGELOG.md new file mode 100644 index 0000000..d51086f --- /dev/null +++ b/node_modules/sqlite3/CHANGELOG.md @@ -0,0 +1,103 @@ +# Changelog + +## 3.0.2 + + - Republish for possibly busted npm package. + +## 3.0.1 + + - Use ~ in node-pre-gyp semver for more flexible dep management. + +## 3.0.0 + +Released September 20nd, 2014 + + - Backwards-incompatible change: node versions 0.8.x are no longer supported. + - Updated to node-pre-gyp@0.5.27 + - Updated NAN to 1.3.0 + - Updated internal libsqlite3 to v3.8.6 + +## 2.2.7 + +Released August 6th, 2014 + + - Removed usage of `npm ls` with `prepublish` target (which breaks node v0.8.x) + +## 2.2.6 + +Released August 6th, 2014 + + - Fix bundled version of node-pre-gyp + +## 2.2.5 + +Released August 5th, 2014 + + - Fix leak in complete() callback of Database.each() (#307) + - Started using `engineStrict` and improved `engines` declaration to make clear only >= 0.11.13 is supported for the 0.11.x series. + +## 2.2.4 + +Released July 14th, 2014 + + - Now supporting node v0.11.x (specifically >=0.11.13) + - Fix db opening error with absolute path on windows + - Updated to node-pre-gyp@0.5.18 + - updated internal libsqlite3 from 3.8.4.3 -> 3.8.5 (http://www.sqlite.org/news.html) + +## 2.2.3 + + - Fixed regression in v2.2.2 for installing from binaries on windows. + +## 2.2.2 + + - Fixed packaging problem whereby a `config.gypi` was unintentially packaged and could cause breakages for OS X builds. + +## 2.2.1 + + - Now shipping with 64bit FreeBSD binaries against both node v0.10.x and node v0.8.x. + - Fixed solaris/smartos source compile by passing `-std=c99` when building internally bundled libsqlite3 (#201) + - Reduced size of npm package by ignoring tests and examples. + - Various fixes and improvements for building against node-webkit + - Upgraded to node-pre-gyp@0.5.x from node-pre-gyp@0.2.5 + - Improved ability to build from source against `sqlcipher` by passing custom library name: `--sqlite_libname=sqlcipher` + - No changes to C++ Core / Existing binaries are exactly the same + +## 2.2.0 + +Released Jan 13th, 2014 + + - updated internal libsqlite3 from 3.7.17 -> 3.8.2 (http://www.sqlite.org/news.html) which includes the next-generation query planner http://www.sqlite.org/queryplanner-ng.html + - improved binary deploy system using https://github.com/springmeyer/node-pre-gyp + - binary install now supports http proxies + - source compile now supports freebsd + - fixed support for node-webkit + +## 2.1.19 + +Released October 31st, 2013 + + - Started respecting `process.env.npm_config_tmp` as location to download binaries + - Removed uneeded `progress` dependency + +## 2.1.18 + +Released October 22nd, 2013 + + - `node-sqlite3` moved to mapbox github group + - Fixed reporting of node-gyp errors + - Fixed support for node v0.6.x + +## 2.1.17 + - Minor fixes to binary deployment + +## 2.1.16 + - Support for binary deployment + +## 2.1.15 + +Released August 7th, 2013 + + - Minor readme additions and code optimizations + + diff --git a/node_modules/sqlite3/LICENSE b/node_modules/sqlite3/LICENSE new file mode 100644 index 0000000..6c4ce40 --- /dev/null +++ b/node_modules/sqlite3/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) MapBox +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. +- Neither the name "MapBox" nor the names of its contributors may 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 HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/node_modules/sqlite3/README.md b/node_modules/sqlite3/README.md new file mode 100644 index 0000000..90a9904 --- /dev/null +++ b/node_modules/sqlite3/README.md @@ -0,0 +1,186 @@ +Asynchronous, non-blocking [SQLite3](http://sqlite.org/) bindings for [Node.js](http://nodejs.org/). + +[![NPM](https://nodei.co/npm/sqlite3.png?downloads=true&downloadRank=true)](https://nodei.co/npm/sqlite3/) + +[![Build Status](https://travis-ci.org/mapbox/node-sqlite3.svg?branch=master)](https://travis-ci.org/mapbox/node-sqlite3) + +[![Build status](https://ci.appveyor.com/api/projects/status/gvm7ul0hpmdawqom)](https://ci.appveyor.com/project/Mapbox/node-sqlite3) + +## Supported platforms + +The `sqlite3` module works with Node.js v0.10.x or v0.11.x (though only v0.11.13 and above). + +Binaries for most Node versions and platforms are provided by default via [node-pre-gyp](https://github.com/springmeyer/node-pre-gyp). + +The `sqlite3` module also works with [node-webkit](https://github.com/rogerwang/node-webkit) if node-webkit contains a supported version of Node.js engine. [(See below.)](#building-for-node-webkit) + +SQLite's [SQLCipher extension](https://github.com/sqlcipher/sqlcipher) is also supported. [(See below.)](#building-for-sqlcipher) + +# Usage + +**Note:** the module must be [installed](#installing) before use. + +``` js +var sqlite3 = require('sqlite3').verbose(); +var db = new sqlite3.Database(':memory:'); + +db.serialize(function() { + db.run("CREATE TABLE lorem (info TEXT)"); + + var stmt = db.prepare("INSERT INTO lorem VALUES (?)"); + for (var i = 0; i < 10; i++) { + stmt.run("Ipsum " + i); + } + stmt.finalize(); + + db.each("SELECT rowid AS id, info FROM lorem", function(err, row) { + console.log(row.id + ": " + row.info); + }); +}); + +db.close(); +``` + +# Features + + - Straightforward query and parameter binding interface + - Full Buffer/Blob support + - Extensive [debugging support](https://github.com/mapbox/node-sqlite3/wiki/Debugging) + - [Query serialization](https://github.com/mapbox/node-sqlite3/wiki/Control-Flow) API + - [Extension support](https://github.com/mapbox/node-sqlite3/wiki/Extensions) + - Big test suite + - Written in modern C++ and tested for memory leaks + + +# API + +See the [API documentation](https://github.com/mapbox/node-sqlite3/wiki) in the wiki. + + +# Installing + +You can use [`npm`](https://github.com/isaacs/npm) to download and install: + +* The latest `sqlite3` package: `npm install sqlite3` + +* GitHub's `master` branch: `npm install https://github.com/mapbox/node-sqlite3/tarball/master` + +In both cases the module is automatically built with npm's internal version of `node-gyp`, +and thus your system must meet [node-gyp's requirements](https://github.com/TooTallNate/node-gyp#installation). + +It is also possible to make your own build of `sqlite3` from its source instead of its npm package ([see below](#building-from-the-source)). + +It is possible to use the installed package in [node-webkit](https://github.com/rogerwang/node-webkit) instead of the vanilla Node.js. See [Building for node-webkit](#building-for-node-webkit) for details. + +## Source install + +Unless building via `npm install` (which uses its own `node-gyp`) you will need `node-gyp` installed globally: + + npm install node-gyp -g + +The sqlite3 module depends only on libsqlite3. However, by default, an internal/bundled copy of sqlite will be built and statically linked, so an externally installed sqlite3 is not required. + +If you wish to install against an external sqlite then you need to pass the `--sqlite` argument to `node-gyp`, `npm install` or the `configure` wrapper. + + ./configure --sqlite=/usr/local + make + +Or, using the node-gyp directly: + + node-gyp --sqlite=/usr/local + make + +Or, using npm: + + npm install --sqlite=/usr/local + +If building against an external sqlite3 make sure to have the development headers available. Mac OS X ships with these by default. If you don't have them installed, install the `-dev` package with your package manager, e.g. `apt-get install libsqlite3-dev` for Debian/Ubuntu. Make sure that you have at least `libsqlite3` >= 3.6. + +Note, if building against homebrew-installed sqlite on OS X you can do: + + ./configure --sqlite=/usr/local/opt/sqlite/ + make + +## Building for node-webkit + +Because of ABI differences, `sqlite3` must be built in a custom to be used with [node-webkit](https://github.com/rogerwang/node-webkit). + +To build node-sqlite3 for node-webkit: + +1. Install [`nw-gyp`](https://github.com/rogerwang/nw-gyp) globally: `npm install nw-gyp -g` *(unless already installed)* + +2. Build the module with the custom flags of `--runtime`, `--target_arch`, and `--target`: + +```sh +NODE_WEBKIT_VERSION="0.8.6" # see latest version at https://github.com/rogerwang/node-webkit#downloads +npm install sqlite3 --build-from-source --runtime=node-webkit --target_arch=ia32 --target=$(NODE_WEBKIT_VERSION) +``` + +This command internally calls out to [`node-pre-gyp`](https://github.com/mapbox/node-pre-gyp) which itself calls out to [`nw-gyp`](https://github.com/rogerwang/nw-gyp) when the `--runtime=node-webkit` option is passed. + +You can also run this command from within a `node-sqlite3` checkout: + +```sh +npm install --build-from-source --runtime=node-webkit --target_arch=ia32 --target=$(NODE_WEBKIT_VERSION) +``` + +Remember the following: + +* You must provide the right `--target_arch` flag. `ia32` is needed to target 32bit node-webkit builds, while `x64` will target 64bit node-webkit builds (if available for your platform). + +* After the `sqlite3` package is built for node-webkit it cannot run in the vanilla Node.js (and vice versa). + * For example, `npm test` of the node-webkit's package would fail. + +Visit the “[Using Node modules](https://github.com/rogerwang/node-webkit/wiki/Using-Node-modules)” article in the node-webkit's wiki for more details. + +## Building for sqlcipher + +To run node-sqlite3 against sqlcipher you need to compile from source by passing build options like: + + npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=/usr/ + +If your sqlcipher is installed in a custom location, say if you installed it with homebrew on OS X you also need to do: + + export LDFLAGS="-L`brew --prefix`/opt/sqlcipher/lib" + export CPPFLAGS="-I`brew --prefix`/opt/sqlcipher/include" + npm install sqlite3 --build-from-source --sqlite_libname=sqlcipher --sqlite=`brew --prefix` + +# Testing + +[mocha](https://github.com/visionmedia/mocha) is required to run unit tests. + +In sqlite3's directory (where its `package.json` resides) run the following: + + npm install mocha + npm test + + +# Contributors + +* [Konstantin Käfer](https://github.com/kkaefer) +* [Dane Springmeyer](https://github.com/springmeyer) +* [Will White](https://github.com/willwhite) +* [Orlando Vazquez](https://github.com/orlandov) +* [Artem Kustikov](https://github.com/artiz) +* [Eric Fredricksen](https://github.com/grumdrig) +* [John Wright](https://github.com/mrjjwright) +* [Ryan Dahl](https://github.com/ry) +* [Tom MacWright](https://github.com/tmcw) +* [Carter Thaxton](https://github.com/carter-thaxton) +* [Audrius Kažukauskas](https://github.com/audriusk) +* [Johannes Schauer](https://github.com/pyneo) +* [Mithgol](https://github.com/Mithgol) + + +# Acknowledgments + +Thanks to [Orlando Vazquez](https://github.com/orlandov), +[Eric Fredricksen](https://github.com/grumdrig) and +[Ryan Dahl](https://github.com/ry) for their SQLite bindings for node, and to mraleph on Freenode's #v8 for answering questions. + +Development of this module is sponsored by [MapBox](http://mapbox.org/). + + +# License + +`node-sqlite3` is [BSD licensed](https://github.com/mapbox/node-sqlite3/raw/master/LICENSE). diff --git a/node_modules/sqlite3/appveyor.yml b/node_modules/sqlite3/appveyor.yml new file mode 100644 index 0000000..ae215be --- /dev/null +++ b/node_modules/sqlite3/appveyor.yml @@ -0,0 +1,45 @@ +environment: + node_pre_gyp_accessKeyId: + secure: 7DrSVc5eIGtmMcki5H+iRft+Tk3MJTwDBQEUuJHWaQ4= + node_pre_gyp_secretAccessKey: + secure: 1amwJJw9fu0j6dXnc5KsAQbSYf7Cjw/dapT6OZWABa6nc52grkKeLQ+DGaOfQz8i + matrix: + - nodejs_version: 0.10.30 + nw_version: 0.8.6 + PLATFORM: x86 + - nodejs_version: 0.10.30 + nw_version: 0.8.6 + PLATFORM: x64 + - nodejs_version: 0.11.13 + nw_version: 0.10.5 + PLATFORM: x86 + - nodejs_version: 0.11.13 + nw_version: 0.10.5 + PLATFORM: x64 + +install: + - ps: Update-NodeJsInstallation $env:nodejs_version $env:Platform + - node --version + - npm --version + - echo %PLATFORM% + - SET PATH=c:\python27;%PATH% + - SET PATH=C:\Program Files (x86)\MSBuild\12.0\bin\;%PATH% + - SET PATH=%APPDATA%\npm;%PATH% + # add local node-pre-gyp dir to path + - SET PATH=node_modules\.bin;%PATH% + # # work around old npm problem with ^ + - npm update npm -g + - npm --version + # upgrade node-gyp to support --msvs_version=2013 + - npm install node-gyp + - npm install --build-from-source --msvs_version=2013 + - npm test + - node-pre-gyp package + # make commit message env var shorter + - SET CM=%APPVEYOR_REPO_COMMIT_MESSAGE% + - if not "%CM%" == "%CM:[publish binary]=%" node-pre-gyp --msvs_version=2013 publish + - call scripts\build_for_node_webkit.cmd %PLATFORM% + +build: OFF +test: OFF +deploy: OFF diff --git a/node_modules/sqlite3/binding.gyp b/node_modules/sqlite3/binding.gyp new file mode 100644 index 0000000..eeef876 --- /dev/null +++ b/node_modules/sqlite3/binding.gyp @@ -0,0 +1,52 @@ +{ + "includes": [ "deps/common-sqlite.gypi" ], + "variables": { + "sqlite%":"internal", + "sqlite_libname%":"sqlite3" + }, + "targets": [ + { + "target_name": "<(module_name)", + "include_dirs": ["wD8shb1}NNuHn zljt$F74(Wm@*}lB{&x2~B-tWtHe2U@xTMO{GwSZ?nd#?95uc;5;Fen!sh=hj%ju8% zqkjM3hrjW!4}V9)A-49>uupya@Q_;d_k%rfj+{e#Fc<)y?HnFCKd|B7Da2!cr6}B- zu^$3Ac><5;;y)qKfA&v2a{kx}r#(@6-#^D!&)@D3?W0k3{x*!;!^6?&2iE`osh|G) ze}4Yk|6m7Rm>h^%XPdpGLoai;2-Aek-6#ws2x^e0Wf3Nv2|o|Bq6gRv@UvAOPG<#s z{&J7m$H#+x{B`K}kbZ~sJEGqs`W@5n@jh`FfClX2uT8%L`gQ2{kbZ~sJEGqs`W@5n zG5*?p&BZ2qd%#}hoU`k6QY_q@vsY=E$R+Hv^Th9UIz3>(}hpx9^xxQ}l?E12Pvp@i|K;%w@6b z&v3JVOJUfGayo^%1q`_byS{jH*5Cw;d^ce;Hwgfla1@&!W9J16QZ87M7A%ajXtf~- z5`!@73z^`4Xq*$aN=uq0=RqinJoL%}& zaL!+O!gDubm!%hlK6@SdJQ19^f@L@&W;|dXvO$8!PUM8~5T5634u*wFHqcWje)}xV zfyZ;$2oO7GX@+EbAnS@nZc$OzmYwD4Gsy3T#5~TxuqS1N ziUhdq_w$?IF5ca+)3@*0@26K+r*CiGp8#$#1N~=w≪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 bOLJdyR&{oN@z6n$gRF>IVED5wq_= zW3u7?oIT3i@u=4^njCk6++z-b=#Jzf7>p4wfpc0R@|y%AueF9{GSVlK;`OXy+rpvX$D!&L)>|!=b8GgYqSiskd zQxScZ6GTwiAg5iCyVS+l83qAw@*=1|HZEkgEN6kCOq7|I4{!==-^g`%-ptMy*HlH9 z!W?Q2^Vj3`(n*aAGKkR+5P9u`5z1Wdk6talwr48DJR~ z8cJvXeh88rl)iJRT2Q#@_g2u38-GI3-TQm z%%ZZV!pj=*n_Xhnx#qWQw$!xn$yx8&Gk9B8Em$Nb0agyOdXU0bvs5Azl6=!lqEIE|^5)=h^XpfeK8yGCU46b- zTtgRQ2RoHiN*Ovv#puvb(P#|jy|^ZXf_3_e#liaWx^}CmWSpr+g^1-~*&I;mVDdk(XBcizsE5&nH4{WIJQLO5*Ff7$8aa8 zhw>q)W3onuQsCDULM$HxXGz{D$2xcA2?g`u{@i7JU$%fKBo<;hEI>+Ryxs?wbnJ?; zChJt;WVOnaI1sV}amG>n-W^o_s zvP=D9bjhi=5Ir%gj&YOa~|L>o!sT|yns_vu+&E_VrqvG`FE%&eOeEn*~i z2N-AuDrue;4Sw-hm2?Y{n}q_rn)#iB<4lIwJBW^1u{%Odg|MY&8==DnRcc&{=&5UX zB=O_R?g&QnEaXKhv>)ypB!i>+e5^*o7F(ECvK-0uzQ$F<=xHRiG9VK| zb`3i=aIQcYLPdo%xq95Z?UW{HCK=|u6ekcYdYqS8{;N{{eWjgT&{`tj&k1RKp7Jdf zeb~t7+{ki5L9niBAj_I_F1}*WTJ`msp^A_L3=|x!|;=ugz(9%P5klD?tv#uUaHIzmA|yH z^tDQDMA>Uy)WqHv)YA3v7Ho#4p>GL|g3&opOxQq|HIq(d^Jr^#H&7nce3w*VrQyrv z!$~J}BskXc(E3+m5_apM<1g*ro2|{GW5^8h!;)7YHiPau-vr+5Rra4FP&5a?S#I&r!BDVe+`!+JKXwk*>uX03%jn^m(9hEEr8dx{3?a5KP6 zrN*gGDI~`+TlE?ixCwHXVpPJlz~Lmy>opycb$RaC^(xtTnjqF{V870fgpxDzU(GrD z(bZhN0}Dn$o~FhbCkq!)G5Rom;V@s!0{3QKS(nV%Wk=GnGXyy# zU(p47?ICMP}1Y#%pfALWm>wRMuSOyXy3geFY z&IbtZ1P8!k)>>g)U(EJwK{i&Cyx5WM zT8W%bpdq6<8#RC%tPNL6d`qz0qF8#Fa5l=O04~9(**DX+ZIJ6uNe3`QbN)wQLTb~c zdFpc#=_ejg9K3YEicp*!c4h2Tz^`SJ7}ae<|3>V@^$2?A&2-#QEEU)gh3&mn?(EIX zv9e#v1!%8wCIBie(-yy2R9l5Ujf6_Am}dElT8Rkv_q0O~6-hdWW^^I@@U)cKc7b0j zpYP(+#6iMKI7dveRKRxHjFjTj;xrXI*hDpx-CW8DdRdx>r6u6^)QlhKe_IMjH}4aL zvyZp;SP7tB>ovG+Km%a{X{S9sstGY^y=Ng3`$PA-rjzBNKROn1P4D2KyN9uOCTb2ogMa)IKH*oIfrU?+++h3?{MXi zGLX+>oFDhQ*a;j)mMVTv22ttB17JwE#dg;g<`Ro+AH~qq zLproToXkJsX5lYnbyzITH=&)2Gz9CM4svCek(=`Bpsw! z_8PM>hh3T(BeQDtHjSH$@Yvn?c+?vYeDoRIBb-v=XWX=$z~ELGaUR$gmq=Z#$jYTn zVr&QvP($)d=vh>ibv8s{tT525@OZlalB%SkgO*6?9pxm20n4FF4bu`bMU9Fk=zcO? zpWb+3-lugyA+vNS4lXN$lDTApnz+g%L_f5QST`QkZ^Zz^i2#&4Na4Lq3>w;zB$Nc9 zlksc?`>$A@h8Mdj6?cI@=1ybcE-xd%q}3RdvFEYBY?q1PUECvd&Jpq*M-zAsC55ToZ2cek!7 zu~Ho=Y)Ts7hUmYridGA8s18!DlEeDPbqu4MU-iHgC*M(xq_9lL&#KwB)XXAs#p8;w zila1{;tc0$!umtPvN8s6IiH|7Lh$%m(64%c5hl$u?Xg&4~3w+jK3VM zS-2E+ZlYAW4q@Z8VwVHySbeGU8Gz-wl)kPK=~@sF|C>fE6c0~r@EK?%uJ0wMZ!Z0 zNhw>qr88^U>QUS+gL5a_?8*6aWtD$10^xR$8j)o zs^fY{&BF0?aw!$t*%}Aqh6-(Ysy5Sm5#Bm4HoZF8oLy>R;xuSVQxY6tL9$i6Id<5q zIr%y_k!mFID)c*Bc~ z)xK_iQgWE2O~;uHs@5zMnp|Amkm_PwU*_m=9D}I7S6`J-Yf7i^tVDxn4OjSy27fr| zQ!d~NF`CF5-UbMgs|2(mlMQKk<4D-3p=a*cMblGoC+|~U714F|qiF4cdXJW$3 z#zYD*CPUec(O^9>RYYvTei7s72JDYZXMG{iK$IdDcgHVQoA}fqAvKePbiF?m!ojJw zgDg-zy@>WVLjg;TPRl4+2NTVrQu|g~;ht|qm#yeI3olW)&BOzDcE_?I&U4_+<7qvF zm>pj)3HRsYX;3b--eGqPNDJ42h=@?CBvV=)D~l|b);w)J(yRz+qe;#;q~k%=Xk4EU=4VzTqOS|C|Qc+frVnOz%EV{man z0ipmHd@WneQUftPmZ4k8n22)p)IZcGg8)02?-*RFu|!RNs2L^#$;L!3l-ExR+4ycH?WxIZEPS1b z)u6Ok)P$e21Lzbxh8vkZ+!M%ps9{a--y;0&ThA0F%A#oSTPcr<;c{$YkdoL zUk~hTvQ9pYJ=h6&u9A?mFtD)fI8k6w8J?^eCt`@JwzyfgVtA5D4&1rbpb+XKs*Z3q zVPU_S-jbbnzzz;}f#DJoJPE8(FPkJK-@HiESpkhL^~(73kc@h^fQ5W%!N8Q+tUj_J z#Om?zY!E&sH5k>rN!9G=M+93064!s55*j|UxBO=FCVpCdjC*&@jI4+Qe9x%VgG85l z{CLg3M%Vn$cntzU_r0}8OZ@WbiUf78Z%ufD{|BxKT}l6k5Q;t%9+7~FwN?7e%hmA; z(5$K*z4W3p(V^)mN{dD?F|H17Ju@qc*JDPYPPitMyEGzQ6Q5)LQ-Y-d1C4(ja2m13 z=M-21_euKJ_AzD$&M!_+DO!HTE!>tKYj9~6eVQ4k+`Y#G&?p}kF554$ev;hF%8Yc6_6a`|mN8@4HoCa*LD(=#aKJnO>%;AJ5b z5O{YBccA6PUTL8hv^NnBFw27pD&o~>e8XW#Gt$0qM$;QXN7oh%E84$2sBT9VJAOHp zWcB$dhz}H?d@J^*yJ|S)J!&pIwi6&d-9kI&Y`dsGChXdD)eQE`xZ39rZ)^1ahT@nz zAcqfb04V9>WWaMlEW>1R^Pu;A_Z$^_ zN~V_PUAj6tJPU*JS-Mp|5iQas^mMHQP+5q zSsy89D|&7f*O-)uC0;b9_(&?;_>B841}YmH!qwS^ zgx}*Z*PI#Yes-E+0~9za+g~p@j7}^!_u1I;rBhs}>f^*kW(5*s!)mRZ)vzHrW1mE4 zEKN}tPt43vdfpTtOU(QEaFU5|d$}83T>WT*YxC*mBJ?~7FUrQ3+zr;~?R3VrLovvNiz6J4CB>~)(YTpSfJ+X&Co)af=`f}Ef3Q?u0H_IJ+A%G5`543-+ z2Wg_;I$!rb9rLWK5I*Qk^xI>%>gyn1%L2YxD6) zzoD(u_?OhJkoGIkFb4Ky%OM2GTrdb2NOw>mnfd}y-FJG@(3XOT`{E80BWyN+T-U=< z8I1uL^R|y#JD6ktNbyZay+d^Ra|W*(X=7SRAPy>OpQ8%1`+P& zboy4nENY>tH8W518A(RLUZj|?M}ANW>+a<57#r;eJ3Enx)U*p%vQ9SjfJ<241UBnx zk`w7?wuqx6F) z2_J+eVgu{p-dWKsy92m{CPU=a256K9?Bc`GlF$8|6G1d)KAOl-^#N9pk9v{x(V*lBLA_oR{xeulrs< z`_Sc1(r_O3N^&c7UhR?Ht4;HAn)trOYMC6j-LCVd>=|uE2;xgalRxN+;5t=&nkrR9XX^MKq%)k6#^vSsHP`7*L> z#-kmvUC;rjm2s_GY2H}zjN2>G-3fRkcuXgR zO?BI{=Z0PCZsxIeD|b(Le3?(RyG)M?kyjc6ujxtVw@*rEjo#NNi9}1mz+FkU{b1?l zSwTF#qhiFnqjTI`5~ZUf$YVGjb_^m}CSeB+D zkU+R$qLYFgvvl)#N0MW;zZ?^ zxH3nz_vI6sM<;8&XEEC;Gp=x+OjE;VchaZ@lO|#bvMVvISwtz>t(#W5vG?&Y;{e%7 zrW+Ixjb2IbM4DUZwhwbi4bI$CkjWECPri=0=<{ytj(0OdLs(AAr|ecsEHG_4BOlWc zXX8quJw#+xC#n)&Pc%}$S2Yzzx_i-aNwH7tIZ2fzdEqsA(W&|b>W+Eidxt%_D6~SM z7~4FZn(`;ZpvRZgAG*sjA^zy&RG`^u1Yf_M?U4jzEj6_{^9K!tYq{%9=mK9mku{lr z{@2^`dx8KSwDEB-3Rd^7dqv&&t~E@cdg=_A?80=-@VH%K~uq}b;VAgLL(E}Ji8FgkFUh!q|gvZ8G z=r&@RH(b@Tcal1+k;g(T8t2orQ5Xvg1-y2vesxJo!usevwbXLZ`}|z18%CS-F>FYv zW;e8&ErxxAMk?2cm{X*PJX<1c?0IQ-_E}II)g&Si%Vr}PjuK|ndz(H;fK60u##Y=^ z0UK=p=w>63%`^trvjw%hl{u$NxWVOUep)ZyFJb@L!Pmt|2+~A8Ga)Ck{{;$G960T3Ci4@0nz*%3mU1UZx{b1c@*RyUtw3ua^XibAj+Jwp^P6E#sU- zXhu|GQzh0af6`L^hfRB4&xV$v4ht+a)m*$U4ue_4_nmNN9~~M|&yvt)rGxL8Hlm<% zp!y=%52@v@>WZ6cI&_WPV-zM}m+Y2pF4m)|rnF&SgJ^q%=A92;auQdl!0$dIvPD^=CcF+ae%&ZK% zlo&|$?&*B_V`ZX%#qPR%8e(eVf$p9Lb%D+7*5rb<7K7zc)M>CY&K(g4Gz8Ar82k6* zZOZ{g(>7NCHnKu@ALQG}wT7Ri9(vYZRt)!2^K%lo(%%2}Kq5;tz)__9 z63pe2K|!R$&Ap@DoxNiblzPU2&S=_Ws}U4!Vc-!LC@myBpq}d`CI=peozis)%i(6$ zydzyB(*w0H;cr&&+8ct%r$Lcuu-1~bPb^{xfv9Hynvr6}5a-WFGmYlk`nP}6vn)k6%tsT=_5_Cl z`Y4Ogdtz7RbDh93ESn{H81k96m1da8Oe42=z(fT{oF*vIi6rw;Khy}18#$Q~OM^`H zgKQqrZ9pHMO&&NO@vi@R`&Q>@qC74|RT%Q5z-6Dgikr*E21izt;vh^fs_r7MZ=Cz@;2cn!v&JKHl{pG{Hnj+Y&MWH$+JU?wCnqP9BVE&0^S>FmYy_bl(J@N{( zWF#E$P9!8%>evTP*Lb4flVNW-GC!^C9f8x|#e>1oYOYa>#Up^p<{l&?quqn!^8bU&TL)c;Qg?J;XnXgpP{*= z&-?i7>3ljpYc7);0qnFjVvU@WTGEvO=$*wiT9hNHK2j$ww9Gd!(yk?0>;3^vrq`qE zUp}5L3^&8hE*k&}ij}WM(4WC;Kfq+^uU?+?5_}3mQ*+G}}sg-65Ut0yi;%_7y4N9ESg<7Z4)KM0UlX>_|APg|OlLKTz ztQ{E!2Ei3R&|Rjn zkm)YsW1sx(Z{AY=$9)Yzl8FMspm58|_%WCAZOSwF02$$zjMRw)GFtMHkj1e_0x$@U z_b!#eNu{}DFyo1<(Wpd&iFMHmViYG=9x`KosQr)LVnV#QXklzlN)o`#;K|)<{uP*tr1Cm_@1XwjLQh&WmTm$+HnpwAc(RTz^>Kzr*QrYmFl-qk zS)fFftEeCiDm8_%wchR=B?)hBo!*RQd}B=~mW07zB1uDeQA#7jKjfGw4liw{~$oa<<6Q6xnHSElPwT%D=D~6gn$O)!xD=vK5s&P7 zVxw*5=2}`JB1lQvC5Dg>H0$Vw!s>W`#ay$H6!~}|<*RqxrB%#w4AIUsQf;1s7zZQ# zGsOuM<2tKpFx|(nO4ibP2B{GRUBzwl-o!ohEO3HW&6o@9KCo=ER?DT7Y=G)9N)x?I zbMch&VzWA*GgeP0@M3CI5_O#0-)f{_o!EWaHuOV_+*Bl@59J zbe;8+bi;kLX(yK)Ey17_2p&Tp;YgD@T>`p}(XTfIq^95@Jvgsb8gt_pCbKpTUlEiu4gmQuu0<7`nPwZ(VA1w! zAqnU(byWlJ?#pp7Q3&RBJ#i+S;ROA1~kg1R|KxQ@wIV6j_Pgt4xj@N=28??bJ?!=n=*lav%G= z#8<2ec4x5QpklRVjY^?14F24#esoLY(!80rjrx7HECJ^^${piOYXeKv9CT_p%q@mv zAQrM{jHcS?edFzcmk-o+%S6d83j2ZK<;A*rJB@|*3Pe)R{ONIQ7A>78S75cuhpTXe zn02m+ahJ>VVeB+C@UL)M!b2z#hjEJq#}kZuMz-GoKKhnsdNyJjh~=%RywqqmZ$^f> z4MTv?)8?Rh&c2Q*f6O&C<_kg#M|`;NNm>PGi;T3ml`)Q%0Io3*EtjNkVWm^;aftHn>E8B?&4}(izCJIGEza;iets59sW7YIYkkh zLQKbqNzQ5s;9FmO`M7UYzF2T==*3qqshmdVjcetdN@-}pj0g4)kq3|2&02*9~R`Mr4a3240Vt6a5cJaM<^CDtLInBdAX{WpyG)?o$Pr$ z!e*`!$=AYgnl=H#X0sMo>*ONxIi#~zkC;Hv4`*s}&RGmNE}`}Lf_yo^P7g8*`MW5H z945x0Sqjg>Dx&OY#Jl9v>o6~M?~g_!py7X3B^A77`6=XhH0;KEW)CQe&wb#}@r*`L z-=M7KkiLNOt#bU{$^rNqyzlDc_gkz=DIy{%DqA$kxo?_zO0 zlK?suko5BC=dG;1`BD~$+pj&!pAD2l9eAwXuAW!bOp-f_sz~nvrHZO~tq#rN6$=V7 zJqx3A%UGN0NKHXlX19jMK<-}jjzI(Wu-tlca=&!t#VRc^3{oKa`c&Ud3-Xc*5l(5k z8P}RQY-Js7MC&}Ft~$AD1v?5?|DdF+Y95LDh#tjI8-@LGYVDH!Nh2OhizmE4Z?;KG zGl&&P2vOe2Og#e9NiLeic2l;@;Fr0;ozme**rSk+TY&UlG^|&UlOhQcEqq@BwbC; zXLmOwEi17rhNWU{STdtZ%ar<#%*xc08Z@^_EM>!rAIEokY~9c>7KXE{tdg9$aTjMn zJ`98eNJlyN4gS0|vCE({?mk z&DY`}$RP(;Gn#B%i_JLH8~%-FrJ(L97v9<1eExFhbZh5ufBT{H#={>rbAILL&i#Be zn+|`S*>_Sc7wrw@yzeL|4e*aPtD~!+R#(RjN|xzyHXq!01O!57rnX!sWjm6tP4b^~ zVYoNyk|gwEw(YwD!PjAF8W#83G>RxGgPR7-xX{P;E(kc+F+W%;QdAf-M5v%PwpJ_5 zb;q!Tvr#)83p|fm>ln?EHth_dIjDa zSIaU4Iurm^2hQ`4bb$WW{j zd(23JrIeNE+LgC;n_vB%_VR@7#!UK9FeRifoL=i4=#Ew~T<0hzx)l5;jsF!ma)6qL z6BH&bVsCvzu7+77_=4$_T*tD`i5V532=m!=ayh;OrVQ7Ok)x%CgYKR%&}kCnCoq)A zsIU?676i8UT~G)Kvh{E=0f$%(UmPBDgv0a2+{%)&Su-r&9FtYB%c~%ykMELNyPRs| zCPPh4MAHXDr5N7Z8O*GHtyL)~kQpVOh4#!L3DW@kZ~99A1X3H1F6;BVv~CXqMXof) zo?=w#zG8wP5h83^Qg~w5Y96=s#fWWI_0WaNBvXL#gCSpP1JhMRb8JCaV@7}YfL6t? zSogaFP)d~}GsPFecq0wGeV|NY9dkDxM=3D#zmgm{f3DA6wqy_ zcEkvD=JL8e0naV&8+8l`0Bb!@SehiwB@x$oq&2`qUXTf7G$R5qL)r52i03v5pr=)f zaZiQSz`)>6q60V@gLaF9Ol%l3P|d-RF>pX}tct=oRuMIun#jCN^auy=NH%M8k)MK= zSDB<9o;2N=!UCFks_x?o0edC#&+n55ExuU0Mq^2MkA=AIS^o&4By0fF+Tl7YxL%@A zBf$hq8}#7hCcep%8u~8RFpwFbHP?>rtrgZ=Q%720_6}eDTE}k=-(i3cAAtqnsFIZeIqvH;21gcRl`Po;DvNi48DFkTRe)h#j zXJ3g`)9#@-aSdG)z~pdkB2mQzzc=0ll;WDvH$h1~@#R1UzV_io5F8e>SRxVkVnQgX zw1G20-c2NIGsvLi)iOjSy>m6ag_lsOyYm?#Sepg#ss62c8ov1W^Uqnhz9tws zeR5De831-;dSTzKaf{!Dv$GXiJ)R;Oix7!dw+>*P##?xNP^~{5RI#svGm0aaPYW`6 zMb#0r;$3I*Up3p4w1m>*4Z!qNZP_KsjUYIra6SnVw*EJ+C$0l_f<|au+wz z=K4Q^@c*WQFfGx4Cqa1Wc>YHa{>=s9rR!f3gqPfoXlvQ+cua;wm|++5>H606`Z~<^ zm4M6qW#@^G#3^LNCK37DjrU){rdqS_{pAyiricWWiBHGA9hR$bAzq0Jz&?ubPQjGluxO{eS~U;psIm z)v7cSkyJIZ;686Xozraf6bi@K_*Ca==T}5#WSO|8Wa%8|k@DRsJE4_a z@qU%oBU}~67D4&@n@Fmkr13>EQcOr&m(gX-F?W$x?_Vs&;{(-YQa{-n zQpkWyD5YApPV3zD>76Fz%{YToG3rMH&N;J$7a8dyX5&G>Nc{P+TnlKtu3jJR(o%Jl zuX5?mObBr#mP98Mf(^_iA89|;Wr+mxh~12yijtlN z)f0NDnd`S7!9@Z}TYqXb-z5AcH3h`=our3j3ETIx_&KYGyMW!s@8<=?-MDgzFSoa* z2%0H!bi03Vjsm+X*7qo18aLZ#0=~&_N(!B<-z0Z4_YO^XY-x(c(UgSEIF`V1%1yQ5 z2(%ZC1|d-W2T2OKNUr~Z19M40-+J#mo6xrC_=RG?wEnmc0!<%<`$;n41TZ;|(aIPi z33Ev~1%6%97&@g>O4k(nj)yxA$A~j5;UIe&`&y1hhk&&i#&tNANYcIOJZNHKM(;+a zCt=w1_UYAh`ZiNHIQF!aHKYb0W2Ue--RSW|o(wxFQhfFIin|Krb0R9h#3kyG!2wdg z1pwsen8`@JEeeuLpVnhpN(C@QS*_o4@~XCk={vdm=Pf`s-e0l=NDuR|))r?kFnD4D zOftwdQqc;TvJDN?M?>-f)2XgHaC~T_uQaVxBA+wVBnd`3#d0>CBY^F}*5Dw6v`v;r z9!OxKUDoJ9oV^94qzhjvDTRy8WtWyY5Q|LU15(N(a#l2L#cFNAgF*))baw-GAG8ThQ#FVNF5f0Fvvb^Bh%rQh{+|q4O9A{qGoqh z9haJ{I1$db)R=m~hQxP~A~Kmb;|Ti8Y?o%hE0p0{wWz8qx&<4|g1~iY1@U+V#YmK{ zVNsp1!a3wNV}+A*N>!0|0QEA_vM^%Y?>Hy#1KD= z*e8^z%wanO`_fDnBdhT2u*6+=@fbVq5?PCxj7rQUwIMNY$tWYqp^fZFy{U|!1%^>O z3d6fr8N`k2KasNDk`QyNMo0F+7-e-h-V61xEM}DH8AT$>j_TepZQWq~%&gAF_Gsd1 z7{B^Gxm3eAR&)_oyn@|IxF@;Qr>Ox5z|xvZt)Zhe*HA)>agnC6LT|RZK2?cLki5#! zM$#Ff^In71*(hTD_uO}!FP!Iwrrcw3Go(mezDQ3JV7Dc8i2MZ<6HSm;sA-K-NvME( z^tgOa#dds>O66NB)lEpkhGA!DM%JLH7c$4)GW22ak zNy}$8ke%k8H)2Kz&l0U$?B7G>r^JZx^Q5M@nBB~_t`6m-M5)ckCEfUFK4ikB*&cUR zHW$-kil3ndCrNd(6Gej9$fszHE=kGT-8`>&6y!~O4e zw@+Nx)^AKEo+Kd%sUSP>E1^O`smI|W#*)n_G{K`;=uLvvhk0OsuiDz*d+~C2i?mh$ z>2T-Z<>uB-kT%Ek4v8jvQ`_TwBz_2;Zet?!n|Y8kx%|b=ytx)%`iY70R;8x3iq0LO zPFzJ+{0!wOC;*J*BqU`e8Cj-bB)j!n>j|#2|Awl9A6=>le2CC~7UVfMk!F_gmR~Nm z_g&?gqU#0Z2PwM0l1}S2*s{!(*l)5$%uE|6e2!e1fMqr0-C~q7fTK)>gx>+oy=?h? zoPJ1AN;Pr#aS;Pz2cGI`e^za?&Qu*;!OnS56NJ_lxmg@%b{s9SA#U&tXn z2+|ZY;PCHjwt`m-365w_tt497JXqe0`c582cU>a?Y+wR{;iZ0fG3_Ub{Ii9P#ytIn z=Pm*TxJ36Ku_87}*GJNjrBTl*ZdIeqm}&97SSz=y+sN6h()q_5f82PoQK9%Mh1JUU z?oqD&A;TcgjE*Dj$1qxG#Hp>JRO7q!x;;-Og+K<8Lo2+{*IURMDKj7tHNk|5tS zb6>)K@nv#u=m!O^p}S}nqr{cSdM%*Su~19 zt{~k9JCxm@Y~)4FP`N!Fng?r0knfeN(;Ckg~4*omcpjJ;#YoD#2;3MW;zM#7FE|yrPE1 z;f!t7Dot%Z>;Zk)Ussc+S3l&QUlIohaZ3844 zlFLdL_x1+ms!RFUN8W?kS(G@0L4Nf#o}p750~3r|Oz+zr-AyhvKE3fl)$Gn&vVR}4 zdEJ#=7N50?QsrUaUN&SK-k&hHIck0ymA0*&UIfuIJaIav=S$Vo!o~VgI5XjJ%)~K` z+bFzP;T@HdBebn&LsHBUC|t2Ph9&UwS<~{my$7ONq3>2q zj~+4ZD%^+NdA9SK%Us%&&<_0jjAIhCUD3z52aj2J8RQL(WDg(Ha7(sRQ>;@V!Y3cM zm=RA_+ELmMnwy%KBc?!kx3kaPdl!LCJ-%G&yvL#aBOPy^89ltn1 zgf*L6r$Buw)}``z;X%5PMiYRF+j%J4mE+P&sy_0!uHOK&DSrFT??hFAWmhI@~~iCl<+p?Ik|nQ@kk*C zV)mff9BgfFeY5k7=dzKkxa&{(uejU4T*=@K{7=@>X8W66rbU!drFI}cYP`j@42 z9Lkz88w>5dKo~3XKYe;mQ1%lp9XG$~YOjCV__)ltpfEEPvx(=jo(&=21%l9cZ-MG~ z(7mokv+mVyhW4uZ?m+_FppWsnLDTKYsIeW9T>6u}4c)v&xa-=))HrutF zUW*h@KVsdvU0hxQa|SoM+-^ESPt>j2(uPy6P8cuL5lRJ%y#c_3xVgOYh)a*KBS*v& zhlG?q@6JkQV+jnhMzC78i7Vz_=^EyWW_G@~rXm>xJV_z*Gf^Ep(7$wAT;^-O#x=;l znJiJ4dxGC!U0ZTxq|fb@!&$?!^Hv_w03rIZAh_$3&bD_B4#SZ>-q}u6?G_dFtO-4R z9lLS&HcJhYIkX?yZG$!lj196Nh2Q4W8F{f&zz#OKvUMY@H(_xkv>^rqvC|}ie`!qK zm+OQkr~%OA2An1O3-> ze`b;x%nKZg7)X36gqz84kq!>Y8mUxd~=OnZ6@g zDL{L@ql93pBEic&m();TkxKz#+o0u(pRPPha5hY&f?|KEwPe8~>}vQmE1O*H$u>>3 z5Mb;Q%0BCZNwsP_E#8nB7DA1BBDc$3VrHw1VE@Q?XmAO{g7QlyyuslTHqhuQ=Rs0y zyxGk}?gS_#5SIxIti74C=YAyEkOY+G=8_o$eq8+`!5;{M5HIx^(2>7fdAcIs&c6C$ ze)Uy#VAPL~`$+Qm;%xTS@!idczYBcdLx#oIhhNcxRQQL3kL52AEi(^|B+q}+`@Etv zDneQpzBg&;PudVMO8vtZ$3a0Lg+ds|6|z9~_K(?(7K5si=01IBb4|?3hM(_n_toa% z50r44wD;!^Xz$JD>*M|1y{*G2A%5`@c8#~nBT7Vr`*Eb!ZgFZW(HtW$jOc|^fTNGj z$F&B6(0j*K`FT9K@f)CA&f_cI6abovv_^HjX`@w9v124*fQsc)~%#d~_Yif+aOd zI4z3rwphez#vUo<%7rGRn+=8Suxv4yAqvkg8|*{JL#2wLShuD^D?SYU4fV`^R;@^H zEBafPEW$(2clW|b>>1L6sEFie)f4^dX4YI&w%Xg#-DlNP{gxsPDVlc%o+ghofJ*M( zO0f3FQ-W@AmI8LnwwW;(7#tg%C2Lk4j*<*&{$gg>cH-mFWIMzP861<{&hd(hg)=S) z-*PFL3Y|&k*P$EIV#cG3IZLxk-KVWZEeG|gT^3(aY`L# z@P*j-;AnvlFm)BEw40&5?!SEfYA>iZ$D7-m$D1eB);h&ws8_6N@2<~+O8-c;>Dr#h@W3bB^De64 z@y$;(5V}S6`Tf_&2d|Gwjgk{>$F2A}mAg0^{nbXNuWxnva~uLK`{SFv>3nZN_Rf4o zwGF+53fH0{AG+oa_zVLWd1-UPIrV}(_=|6apa;T{?{0HXD|9Omw1csU4CUJtqL;)J zHYcPQjV5j4KuSC^#5~|5lq+ha&)d;3GZHQ65NxCv2t+NN+Uvb8RB$V~Y4Sc#tW!}C zqL~!noj*}hbOOlvYaVvDAyV3VP9E`VhbGk0CW5l!{8;h}D;_$rU4 z9GJnLRbY^;wD@dSfkCkYWflKcZQw~RVtd=moI&maTco%&O%}k_;hJZLGEvJWgA1_^ zJBRaX#W=LC<0(P*tS|u31>3d^wU3~!;fdkHw?LqZB$8`G-*W>Jfgp_fd&#qCaZp7P zrIe1@I%ejo*pU(+=C^sYwYwYsb#qmpjpnS*n~d0c!bA6V4#osLz4FmYnx|^EdF<>4 zOH@!qG<`>aimDabSRbwWfD0;tk* z1)v-UCYHvA4dutq}v$)^;K%+8~{roV-FP=#|dE6DLVLjwEOk zJXp*#Qe?g3f)7C74cm>nj3o1tNk(ZYToyGSCxvHdN8!W~Uh>s+%(iQW6|6f!T@ntz zm{|6DQY7!qD5q12%Y%kbVZC66?8Z}i?Y<*$HzV>jbLJdb3kXuS7b=@qa?x_0jT60=qcYOReA-#Qp+v|GObjH z*P5qkuZ>n1j{*f(%4p-%#yqvIw8%mr_spYCll4RzCxY@?c=HojQvq(x%0`K)#JZL?omIZnH*2^$d3rOsYvUTrIN|)CUf+ z6bMNQlogiRTuuPH>zwm`by;RAm^@1GxQYr(FZyx%-_n~S{l&9wW4y&@Sk#O4OKzG| zLuq_`b9}X!y!Eg3g3FrjuSF-~s9n%I0vx!mICK7iLj@$f&?u?EW@PZNNp*qj(pc@2 zQv@D&?PN{OZEQ8GwedW!lB!vA1P8%Q*LQ8Sq-aD*V3Fa+YcP_#>0&_XlSB}j zZsSdJ{2G9vWg84zqi;SzIHTy1pGNJVx|K^sTr%<8X%838d$NCNH7(?az&_qk4%0v` z#B0i2z(}~H%^Vw~b=6{anfKMp@YG=zqisHVM4}qiYRlw`cj3|G!{>cZ(iq=||Gk(N zzUqC8nmi?2%5+xxuJ^s`>2NU~WgiO%>06mG8|C*=9)g~T(7suVe@oYhzg4(joHonc z8?dpcAq%C#VOJ}q_g4lLJ4!DgpUt~rl?ao0lf2s!r|k9`O?DKTHog;A{?&Bol2g&E zUFn-uX;4o6Ao?JC6SPOlL%yM?Dysf2UM7w@Gc=Pp7+ApSR<8k%rGPYIeo@YCUZ$4E z0V!(M^P?58wFqxwSmJDElyUVcvqM>N38j1%KqZFF1!7Jx8JT?OF?yiOIvTJ@TH!8a zYLOPYt6)jj!gJU*phHQjdb2QbR}xfkfXj6LH}QWo-*ULy=kl3qqGP$%GAt5!O5Rfz zZ1P9%1Rd!-MNh=PABXSXbzVsLKu}3;z6~d7z!4Xe+7XAr)A*;4Zkv|b|AK$#E#$&^_RkVo78itd*yfr!tVHC+M;aln% zb~@P6EnbwmyLv~~XVZ6FGbP+~8a@2f4D5oMBA0|z@!bhhVO8Jh%1M!N zK8msFB_S}85y;s|v5rwLZA3Jc0ws2_jxsUGtE;SAlDtthahzhWgj9S!LJ=HD3O8ft zi+>Yu2I!R$XgZg>L_#=`i~ph-jfWa<|M>Cl@7Hje5By=>Zxw<74nEdXWox>f0yKylY z=H#W7E15ARWMcn-)T>!mg9=ZxF*H07cJIqU^{?ak=ls9);gUXtGeQ6OlFO8?a&nKM z?Q+Zj(0AZ&H0Nb9osH>@sH3s0vv=g~?rraUPl-K8$A_D{d&j3c|6cvQ>idz?0fRIx z4&+r<7HJcv3Q?$`A~qn1X~~!xzL;cQ>2HfxBM^@dU+;)z`4LCp&D5wcBdv7(3Q@m7 zoz=uV@gNay6Bl|}7_PDlF~w=2P8c>7_#6Vm&5;uuX-ub}5|M)}vG6y5RSZ3hs1mHB zhiV054O`2rv7%Nlt_H=qnJsVwFQUJVX*Hp@W+EZ%&X;}3L4(&M_$CkYFpTIi5b_sH zlugG>>!<^iNFTv!;mA*Ea)mCuXOOa8-qjI-&CzGd2)IZS=M;N*tH^mc>wy{xOmgS2 zdj5kgL+hz~pTee}-@Oq{W(VjbVPN1t@}nK!+T~6Znodx(9amG924w`%18$*Slg0hb z3EOU)l*jWVZeb}-V$i{8iL0?#sV3|o`=Q6Lo*>fUkwg~d^lgXB$DgNrN2wA@{z`9W zRH9c)kZ4!y6#M{#aDxPocQh7?cu*cBlkfH;Dh5j7G!bDIqBA$|Jl)NhH*isgc$d%flXVoFA#(z}^}i+edF8 z{R{9dSMOnSPVSqJZdjw{g3)OJR~r}}(b3j4 zkUxv)g5@EGIPZbuN?U-e9XC{| zzG{ilGfbfPl$e%q6!!o!=erzFFIV^0IM=<~H`zTWu~=3D$SeJu^@aMRW+?kOoE$0o z4Q$-Sr1|SYZb5`765hZ)V=S)rA^CQft#(86eF%0v$sQrzi@evb`dYlHA_O-Tidq8HajjC*H;IKxDy5Qx90yN?71=qZxc?av-88 z3wN}@d@m9?3!P{kK`k_1o+PmgtCCc$o-J^jAuv+B92^QiUeH3E&+7KdurFhT%-Tlp zD#lvlNFsoL6s+TnOQjGyi6JV@nauf=_m|j^c`?B@K@y@5iKA{tA%!(kJU)K%&PusHRO+GHa$Rgn9`l5z9ix^%U{(bDd9a?;q9Uy1WH3{5>o~uND$FQY4@5^2Uu+ z39)!#^lvBbo4`{(U@wJJl~;Z^YR^B9uVCegk8JN8Z3S861>|x1Vv|1GGL}o?@_LnJGIPflj`9GRVk8W9$HLK#;%bB`4|WB4lJ61gp=jz3r*M zMGZ$NDAj77Qc8;jih-b}Mhq5^@&$4O|^pa9+I5hY|B&_gdmQTat7|tV6hqaXnR5=w9XbHe9n%9Y#BivgrSU~Z8A~I= zfMbOFNo3R-Tw*856F*cu;a#_$9WvZd4c$`Urx=<)H-6!U{1={GuZ3gh-)ZHa-TU0v z$MoDE?tSj%4n6nj{m-Gjr=Q&4F&g~%{t>>~Jl^`I`s5F#hzNG01xY!xT;?!9Dx|if zShpDBlQ0r>$N|^rw#WEaNpUyI`DR-%XQF6GyYuRCFd01x&n0_8yDgu%bb2u_yUNQF zNCWd`;3J9!nm5to;609QBJ(13J5HA+2_{GaNeKY61!%yI&#aFwWUgB)Z$i+{01@M)HO8)EylWG7CR#yq2W9{phkg5GEI4cC94sGX^9k1rkKNko^%ayP97A#j z#KS6}$Li=jF^7VTurxq1nNEZtvhWLH!eV1`W$b4oi#p0w+n%7758KgQ^H~##gX+HSl-UiUX2(K;f2ayawFNBaZi_ z+NYx#?%6i)(+aT3=DJ=OcxT*#T3pa|6RTS#RmZw3MX`=;7d$hINJs;6$V?TJp_aEV zh-q5CFOGd_#8}e%@|0E*YIs9@h@)d`ax^iJZZ1fY=bERN$gA$HEDquE&4Ax}Rg5^{ zH^uMoHZ+m8-7%!M<#>Ih2TQU?9a_yXLP1|A6ry*9I6PX zts4iUG|<2XrZZeR?cxO$--5FeQPBT6 zJ3(nalRF6lmOcn`fe?;40!tZlZo6iAM^gRVU~yeaOUYP%+_Y*c$zni zjbV238FFT@ftnf_%1=rMdp{X9XT#4FyjtqXYS6z}A*C5Yh!h-yQYhu$`k4iv)6ZkT z0{>u2b$Xzps(LuO=%~+*W9?Tj_xA|!D{DpT(hf63a)s>Y@Or`ubm1|P+ zmDK3F8}UHa!y)}YusFjzaws0A5psmoeSAnGsj^T`{`McgoJ%>6bjZxKBCr zl3nf{Jehc}F$1nP^>`XIQmgEl%bDRsY)KdNo{EvCX(URoC=CcmtNvc$zb7sbBGXK` z@C~k%L_6rThuAb~5dSb|RXQ}Ck~X65qd_J9Bl^eA^aB57i=5U=;FvBGxE;fn5eT0z zvQLe*CQclkQi$agbzOpw{rkDD4(}{ag_XjpB z;r(5vUt}Og+mG^?NQ6K|J5_on^@`FM!{7Yi3OWfG*%6mL0is}XpuKYQ5H+jro*6r` zlI`TPA>;(PIQxqI-qq^-N)>t(FbU!n#hJ(50{yjX4i-8M&8DyJ;({%c?WKF{k_(Pa zNf1z9ntujZZv#yH|D&Tq#EQH z%-+`II!OHM49~juKbcCuFjL8;>sQ|}JlFA*aF`&aJb$_WJQei*Mqf#s&Oee*t%`P= zlWxX}Xp_;7FGhUsf=r}lA~X5sEU*+L)CSqc;G+UHq_D_`brGAVSWnuX=*8XKo zL?@nkxN_^nC7PPl)qN51O}Zs_-Ij&jO7D-j2%rLZ zUK}lj9p`_XC>z0#0zuA)fUCg<*>s@sdV=mYkPDHq;pj=Ty#KU)_PM;>t#(285xU__ zTdg@A_%qioJ-aKyElLq{>AZSzxc`d!*^utp4X?#Wzr=_g7(l#O1pwe;Twk`S8NE=e zn|Drgs=Gr=BNE55;yn%MJ3JyYBU`y0g@dse$&UYRqOrX*Lye@y-UfN? zLI^uteLSc)ba^+I6a4Bz6i#ql1-57)V`t0t2aTnAbAHu?T@1~iB)#jJ$7+=@rze<$ zGIe&y2&5KYxQzPK>RoTIQB;tDh>rwXk!)H84C<(g+}w<6Qqs(@vUx-UCd!PJhU_)= z?oXH^C1-f^_;_>c8{tV>0-aLxQY_6ud6JBQ9bZ1)d37KnY~LF|%Z~Bz`v&SYNbA;R zFq$eD`IC;PXj|qI$vO?H)Xnq2Vm7M%xr3Qn3eYL9NTrZ?`PTq4HHU^ln0Z7})Gz9H z(8X>!96Q>(9CZ4-rgorOvl%_!xds&Q^F;3DvGOt#$2W3{)Oiu+pMmVMIO@Dqh_ZsO ztF~H7B$^XM2$jK$rL@bJ8G~q`Cu$`vj{!;+$TqTF*Ui|#S|T8QB!*op)-0CE%JX&X z1Q&m6W5r~WRvBQ?ie10aYS`2%UBj-V@Cib_)}<_@97D$!r7!9s$c~)jLgDokw7Qbi z!<NP&Z1%9L8#EAoCcc0+!YHLAyc9-05GWOL@95pQ?K%&QiH%6LHoc& zlAdT+RLc^q7Er9Kak2S)|L|CN#Ojumppb(n89dx%Qg8|1phwt+!^Q`m2qKvx;TmGQ z*p%>C;x&et5^hLR-n8lkSIG#g$xzX1g(n^_W!Go*q~#LFm6qLX1=mrk6gzeFwTRvK z%0RG0NDU@02q_nri|`DbN1T%)D%JQF5R`(EDP*CwN)xF(ylsOLat6#D%@SPDs!e%u zj3b4q^TaAs5>wrz3_eCcsIoHQ>?mM6QdeLgjGpCsoQ><7dC+^PnRQCRkPWR2GqfXO z8zy3EyE1!YI2Ldb)+nj4pwcemQT=ux^>}c;)B8*!Hd7Kmvm!5j9+_Od=vCDtDfoiT zT}0*1SCB_L--^uK2`z(UEj|v&r2Y{s>SMh#O186CNFQQK6TK2FW-r|Tq2)+U{wj8v z6i`}gG4;S!LR|{G(?o?vjQUy%-9Zh2f$R0FM#SsUXdV~*oX%GeTNt}-*2Bxz!8_;P z3Mp(saUIBp!-YbG57X^L(5t*HNy;E3OsObk*!*ihnsVj#8+?zA5gHKk64EjV0mMHRf zbYrHRN66i#1G~N+4I32nmKn$dP0ZMcFlIgXa&POn7g)kotA!T*TPC~P>6S5;rS_g` zPCMTp>>Tb=*^bSZT~;eglCr)Gd!Ps#Hs%_ujs@x@@KZE_CHKdMe~3>WerAkfE*B~u zE$}%nF0qiL`FC26f~7VQSgEZ*l;Lye87YAV(@F@IkPzB|5+t=#f^@@GS-l~jy$EmD z00C4(2FcT)vzCjV`=XjOf&n{ltmd-TTeUK)5gP_qqEEEC;CET{X=0hF)h)-$*s6Fz zvMuVdNlq`zpb*~|9NW^gZ@CcARP_Loi$FdtAK`)PPx5{6Jt)1#^n8lrL$U_HCKTLNNAHPY#yN7B3J0V zq~@V;9}v~?Ok%%VwL^tY@M=?yyIO_gCd|dmY0C4=OF`o6XxJkV2{&3R;uPK|B(XG= z9^5k88x|M7QWD3>Q<@sUG3mqHimH~=#GIO01?C!+>rwGU*U0Q30!fc_023=9H?V#Y z<#$Yl=+pwNk>kiY*euAkKhhC1LsXUZ1n|B_OYXe3DiI&?>q+QUr^AGTpvz(gFfLb=_TPAM8H9d)JXB3 z5uKlX5J6L#t!r7=ppTIdy;1E&^5z7JQ)j^Cayz4v-Lj$l z1KTwP+51?q)qs|`LX{V`&AxB07uO=eQl9g_$w1bePso*wb|C@x*f}EToCkqmicn%u z3sOoCh|ErkW<(jPXh-TAe+%NLNpWTu#xj{{w_ALPYcMk8J0;Wh)ekcg`X9culrQz6 z?Iy~=z5ENinajW&JpCUW3$P~uXF|vY-u4|VE?{oE#6OlXw_e`HW*a_tj5}0fZcOUS znA?v_xSKH>&*3a135R zPq-Y!8gBPP=~DO^%`uNEc;5f%w}N0EOnKLDYF9Fvo(n@?)W65I;k~ z$$%kr{0#g)X)XxU1qQ%k1~Mb%QC$yKhbr*K5i@EPljkvq&eUKYxQ;1v?m&lxXNs9O zIlW1vruU*E{eWvyIPin+$^W@1|7jPc7}M^(CwV*bi;^wwd|mz|p>y|Mml{rrvOq^% z<4t0lWUvuf7_~C_k=1Ws9IZ+ArOn~pMSCJaSbPx#$`+F(msgoGv#8Gn9)=4_GVI>? z4p}Q&Z?58w!q&W^WOr$XoH)ali?1=ifZ7|LNAeSw0}ey8C=FjpLNl|js6q1cEy!I@ z4UoSeyd^4bn)%B$M#N^FJmewgjsM1E0T+EltVZhr6|+6V%AE!p8kVY?<++?RJ3G}YW4D_Bt55exrNyyH^hzZY{Z|APBf@49_K7g0s@yddQA%y znihk>kDvAZw70*1fZsj}?Wc%`o#*m|ELhS>l>#gbub{~U z;_oDT(U`(*-?HR2EM3@)HVOxV-1F;9g0#dj+f$=yigTy7A4Tt>O}xC|g#m;Ky`D7h z*^M!*z6*!jgXIx7GGeVd1+&wBHxCZBcV1M!J~lN1h#SjSSjD?5>)VA_zkIr~riF8- zOr%}nVdt43#o0ilq~u1mJ7ID5T-0RDEUqT|#9_@q7)kgPbYDIXowP}xg($sf}usLkz!YE?tQ|r?hF!uIT>MFvRdY=eDSnzBr@cSA7sh;w*86+}5RrG7wKo zc%)gLN)=U;_wgAhjfhdej$t``CA&mWYvvXct-mW?1V>Ls$jw^XI*0p8qQA7qVMOO( z5h3V6i%DP^g10>TP!Oq_DCk_txzFz*s%fr|AG;!}R z!eM=S?-S2@_^VWkzMaMms8&0RjcqTlvlw##xLVwBi)drkO5zS4FdQKLf<;1#GNH6W z1$pV&S~a0kkUG)vWJDaUo;8$NH7&f2X~=C`BX zF?Lss2XLWbIBHM4W$5UYAJ|#S2$mZ0G7}(SNw|+K$$Yk1yK_?EhFQj=Dq%Y&9bhQ4R+MUJ4?TvzxJKZlAhAXKdu-PeiyohD!wY7-T!7_@31`h9n zzUDgh=)2veXX&H7_=OA>0y3P$JQLrQr-?4F5>sa1E}QR#I7E@0sDXIVMlG28rhHw* z%F=yLn@_39s>|`V#5)^l;4UA_@i|$lq&c4XRa6}D5)%G6tGH;=;lT@>h>8(Zp*ji@ zX_-E|@Y7{=EC>SIY(%C|sdmk8@K~vhbVD?J)%p}wH>VJ*Y;~rxHW8GD8r=yE`oU5I3U77IgDx2gTX!>^c%wNG z^&t$3!k+?&^q+pKT`?(|z|@h!wjm2m*p)kmFTwD{Ad-Sb+P-g~Ax{J=I_Bm})2s!g z8}UfIQzJ>Ts-hLhjiF*h=(x42DbVY08}{7EXp-u(%S>dlMkWO?sgB-XHD??Ji5bUt zCk89RFraoJxR|;lGGX&29oQvG+rF>q${(nDS^fEsYnu11$=Bi;o<)m;N(m{7k)xQf z_4^a?QAvM;(sQO{$ETsl|{vKMua1Ji6RQK+a^!s1LT{uDZ0=LB?+`bn0l zX5&%)&hu2Frq*N{Eno|qk?~g};sVuHswipiD##kQQsc2+69{B8Jb<)mCQ}Vu)Ihn; zOP-l#(2K$drxK99(MjGlAAU#j67Eyn-+^59<;8@(#+&!W!ob%b!6ADq4ps_r2#ABb+%*I(;W@!S{SpnEej2Nq*tv+pEQVNJ2<9ZT;R) znlARj!BWzZu{14!ZqDZ#0E}Ei+!0}ch}@)Vxur3-5r$GmA+ndSvYcc_a*SCcVxc8( zp+g`lF5B7_pnY|vio4a_ptwdZ2$lNaEEVR9@ZxDSIENrnMw={Y{*gcTP8 zDj>n(Af}WHv93eB79%Isxag2*+GlzdikdH@iPgeOL+%@IS^$ZfT5UGMEEt-_=?Qdq z>U}-QnHCnT9bH01X=9dUV+io+sMfsGI5L;O9(}F7Gu0Oe>;jg8x&2@nLkw^)Fc@i5 z-S`ogV_S(UkYm_5w!~Q2JI;-@{7c8?NO_PHVKOpwlQko=uyOE^Q@Q=e?lX!urZ&e> zP?t?@0R((JI?5*=iGLLOSldp|$%)#ou`L#`YGdPVn_?vH@66f6RLINBL80AmM2gHB zt?yiWFhF$1&+U;7o&ot21H3JaSNk0%zS{$(639!X3q%4K6fuxoBT}x983v*p^#<}n zhZ-Z(V9lTex`#M)7Ueka2$@B3jQl-)9@ylBu#y@5hrs|@KNb)U?us#sdf~a4Ln_-S ze*1Z+vVHQ77Pw!19B05l=DysqF0K0|(**S)Z1M*K#%HB%1V!=RZ*I=S5c4B%sHUkyW zh_TLydAP9T7?Pp(qG;YIg%>g6rL{PTjRL9IxkPj{_3&MzMKK}uu%ath43w16YhfS} z1e33kToN@He?LB)a6Vodj?)$eNJOlCb1OC%U7GZvnI&Nap=l&jPiN?Y{ynI?ggG$p zT4D-IRGqGaGnX`U5mIc~Fnp*OIs*=&IA<6X1eA%Xt%og@QpeCd~6tdw#oZ7E&FSXiKfb^Qqs7!4xTb=;h^qxBe^tKb3sC}9PH&* zNObvOhD#l2=dFJs@P>=NyXKg@sP1m*Qyv{U769WkjxXUTY?r$?3dxJ=5?z>i_(}AW zBy%KeO((|q)m{;y`6r|I^P;z%GInOde|4#f8%EUCSL z0fl;R&L!{vo|K=9PCEH}T7E8xtD@&R)!FjcDrxUyK*#42e$_Yb`2I6~{|{1^;@B!u zEPIbaw)}h2@AG*O;`Wi=b6*P-(#0+OF&X(R+=?g_*!QE3Em&i7C~FQq>#yW z{(zTd+JE|>X&=~n|H%*fAoTm{fh$f?X57T5T=-GMGD@Iw@tpU!A`|%YFKgvvCdMcC zv{C}cm^Gt!BX>ctepbMRi86%8QY!^vc9_zM6&#{N4vz$ZM*#_2Ff}x(u#D3wc{h{f zT4w$wnGbJR(!q75NpeTpNlcXKebk3IlYI4x31(V$n-o8Ve*f?`dnj)eUVRa4AHdgyefN;Z?3}5T( zk^=HJVzX(UiRIQT#psp%Y<)czn3AgK&etM9y&euy0KHNX(R+cy;DP;5GnJXaEO0TJ zxqa!P{YGyI7k(rSgv&H$5rRH>Qk5RD#xV^*yp#es(_~8k5|vbyY#pLzfmT!;^KeGG zh5m823xT?P+F19s0s`%E)c0O&?H#{7eX;v;=k#EIcaJVwephK@dgGGlxxfRKz(+F9 z(=^EB2%WexX<@@WoT{!udqbPY?LiI^vi^hLh%85r7{ z&=gB)Cc2x_6)j^B*5f?7hjpX0VVS;@7ZJ{_If?NE0Tdh>J%AIskkl5* zf|U9s1+kL51Yz@713}JXee`-n(Mh6SbNtU#%ELxyU;&pIgPA42Ffy~m(YR$QF+9s7 z_nLyA12J;-?gt3Hq zf*ggpk^7J_JKH%s4o%NZ6b+kZ$n9%xEBgf9!pQwB^&I&1gP&;46pW)Ba)l zR;Mt0=arp&bbso7<@xUMw>w+-oW9bjQy-_l`TFJY>F!>*V}fw&{{GzG%g)~J*L$b0 z!VCLbr{C=F|K&*Z*8aKd>}~Ic={*18IGO&_j^V{#**rShIV^0<(~b=$zVh|KND{)$V@;oqd1LclNY@_jiw^I8)wB|Lz}c9c~_PeZ!0F zU+Lfd@ZjdlFt#1u)c8vO?(ckm@N#o^@AT;SRkGAi`*(kD=i8mb)2;o(!`BD?ooD^K z|Lyj33SJBEZGP>S`dR<(6QP9lVyl~frGNK#k9PNV3k375fA?SJ_QLo|hlR^+b4aMS zLHMK8q=nPlb1@(aL1LPj$%`#s3=eaiMF~W&&j5CNWread_E59@Sv1iQMQ)i)xD;?W z#Xzd7aFO5EsMuZ4-ewY#T?UOrR;p=uI8yDHH6f|-oZyy)D}YJ}A`Rj&Xcw0gDQOZL ziM}`~krd_-STj%7@$J9sCXi73`sg%Vm?yF3i_0hTYG)$enPVSP;^Uhwek1DAv<{SD z7(^(ll&IM7>8s(zZ*;vRb4BhGtm_K_I3XvLE9sOr?HfjQX)--f6RzzHvy2lL+s*TdkZm?_sThicxGzHo%7$IkSsB(Y32mSrQeIAEvhMGST&0QyMSXJWoBX7haR0@S<5b_gNqO(9omcyZ zKb(@U<>VxAfiH&huX>;O;-l~@w>JC=k) z`3#1$7-A>-hT5^xNPQ9Fq-go#eKT%I8z;}$y20q{8ZB$+AP7!dn_J)PoG2$UbP_G9 z;WtD~WU>#DTL>=t;#x1(7|;jX3_Eh#2ym}4;#31ZC%RZa5vL_ryVTvQ|Es!SQ)#5fz-*QR^VO!A6h={SS-L7xF#G@$nPYR zPfajcEZPAW~DtT+W}F*C0cUhO;1k*DP}gu57H8OVW`60i?lBGR{ByxjjT zEE5ZP%a%$X{_y28fM)pnjjOq%$Zn4Wou>`IwBCW(yFk>IAUv}Ham41Nb3V}&X>x(c z#nS1Ht842jBD>xkjwoa3$_0aTxQMDdaZ)4kY|3m0D9?9XI|X03N`ouyPb7x%-!KD*wobA3RSlC2rLw zvWn+bIg2U~r%Em&Nfeor8^Ay#4UJ1x6pL{_is5RiE+{}bQlQD~uH#H)5tk8%3O>#C zXpl)c>e?e&C0`uTx}vn1uZAmv21LP!ZKmU?%Qo~^;HGUy()?u{RX6lk;HRR6CTvw0 zs=c4aqsrkQ4UAkz+BM)8Q;b?R-Vox$<(*qZf z{k2VN=?>xwBV3rKAG7k!4?i3qhOS?2evct+?;IR|7OplMM#m7}!#447#{tvT65|9r zu9pHO*ux#COHt&Jhdb_;!Wp)fJC2ruB4rQ%xocappunwI#_v~jG*r>kVApanP_y54 zFz>H7m_%7&h_mUXB5)peg9ITiWX=e-i471j;G$?aR^5v!+s}Dv#V6993?MUOY!>H{ z`3@96pNA!PnS{YFZ5stmP*o77mT7f~`lMli3~(ob1J1UZ1iBSn8u3<3xM0^Lu7)b_ zeqeBl@P8vR7n&EM;{&*zi*G~SJ7U^g=GrK?ZH^Hx^Z{T5;pfTpiWp)kGEyr=xF`}wtMvf-ru-1wB__7oS(lH(*GNN#ra;tI=X{NU2Zrq56 zzveTx5(Kofb|tYQTcsoO0;VU`g1Sq#_Y_-RZ#49h-eOD7OSPl;lXw%Ctri{~Hm%l} z54@xlECLIXk3MC$=8WNP%EML&)OIlw#|DU*0+J}N&EcuuGi{GV=hL4e#e&maFxaZi zge;GXi6E1aVIs`iL2dNf?v(^iU+(Y!W%FovyKD^WdF;bAlJRu+h>|Q9oB0m5 zy!$P9h4Fl|+c7+rpZdT-v$~>Cg2d%`b-J>H>7&@l9Wsm%$-^PC7W!xB zR_)0~?}8nL$6swOUorR0Z@Xla^*h&EaBWzz>zcF6!aBx;nnLmrNG9qB>qvkJ5@#U% zfdtRrS-#EsXc$`~d{SF$D#zS)DSHfR9#qSLIDDNBs*x4cX6!s3xV%ki+gG*K=;45d zk{Bjui^T|jL+sU%MEOXKCM04FH-0X8xUGC3eH_0!zK1&WiC>>KXy-cIC^=l+V)gkF zC`b8qkC{z6Uqv?A-NT=ji6i#J&vPdVs|oW_j<394OD+<{|9s9823Dy${h`yQi|n3x z(<8rZ;@3@US$Dtg)M;!#d+y&IhA;1#Jf8XR*$GsZxox{VO?b8>3=|83Zp@&c^)YBY? zRD`+1v!mv6Lg}<@WSG^67F-=titCJ(+2;CsG^9mXi?v(DY&0Fe)e3~E=N{gIJLg7qF82EzJX-RrSV)meso;DI+kt)C8(8nA&IMZ>=}GYf&3ek&CrYh z>QJNeBiF>KQu7}-PG&v6VN8I(o=%#%9C)8#K)IoTO^;?|d^@*9Kb;{2XOBqs!UOFK z(3Nw#!_pYE{hPMBBur<5cYl9Qm3vg+>pVQFXHdcbB1jmR;l8+S2V%5=b&nv^*myrA z!{3P8QozveX22=J*8y|~>4}V;VbQMs|LnbcS0l->FZw^9qKxnH02VX?`ZY5>`v?%- z@_>XT(cRc+@Y{_30WB$P^Di&cKUREKa0%!-iBu#}AZz{X9Xe2m1;B)WhGcLC3?vl}72g{` z<;Wy|lsAh+xm$LHdB8bC5V}fv<)C#LD_&>4lLq9iH7|`=H!^5DyL<}8Q0DoTjAI*!xtfI`Fh zMI-{#n+bm!FoR!a;!$vc)#&xC$V~jkS!i7KJFWI<^JC>y*eBMR54gR+hnk>Mhk{-} z8A_4YQ=hD>8l4hSPsp!$Yvu=%*U)QymyBo8Uo#Ld=F2G;zWaAi>j2BMVZwF-9~Jx0 znQK5oN(y2^iUa2#5js2tu5bd9y`jxOo?M#u7po6Af4|PMd@<@c)Jife@D7-t+Of$) zGF&bcgm+k|xM3DaBq1UI;jXX%(wr(W@$Gp~KYDre>hQ(UOTMMo>IVB_frhOt0XUft zk5*M%WQ&-*lV2cJklb#RX=WN8(m zHh0kfGa!F`^&(xP6^RE90+f-Y(1LVkej)@IP%8Q$o;Ea`1_8WIR=eO=-7jPD$NnPvNOXsA0833Yg7r8Ddu1UYLT)yv&yqU6qI|$M+~Zaj?BLIyeua z8z313FsNx%v(b99Yz)=9oB;uC>=K=5Yv~YuP$F{DB78G^Jm(P$Jm4JZ0MHZExYBS< z67jN+WCIFzCNY$CZB8qZ2zY$1O2MkEk{$;1KP zBPqb|^NRxUVb0gyjx;CPEM?H(skI9LbK>j%*9}d3<6u_hyaxEnh*@ zAt0N2Y`r{oh($;iP>kbtoDE_MKyVu)kBCb$2EHv(UF03b(sVT4t*W;I?x!+Tp`su= zUTXRIJD*WOZMmM}o>Db>6#FagkDeiCGV9Itgu742x$~GpvoH>pGCSW*F_>WM#YZk(_~a)xO%Qs zIbErmB%9Z(&TA3c*fPvTku;h@tt`*NLY%cU1g1{G> zPT$LEVPT|HCfEp-ya~ucg2{q@8^`|wu%*Py2@;oW0zN39Ln$tRNYY~g5N@% z7Q6#bZ$ZMvX;MpQ3tOZ9!{pryrJSyPn=^MDJm2@r?na!dCz3^M>2d$2>g_h1%)BQ? z_U*8*e6&=%oTQFTIYdI`mhpvyRyKL%2oW(!AtHXwJ>?Q5B-<^(F1rBK<^?DPB(#A{ zCBuqcR#yq7S%t;heO`+OmrFwvwDp>JH^fCoGmgPxc;?vRM^(-h_r=G&VY5hxk|0jo zNG3uG65km8J>e1}TC~QazRS|8(4>-fp-T`aT+o5hev7p^;1VFbCN3=*0U4z(E(*a_8 zLTN!GiNi&L6Ug4DDKlR{12;O0s|F{uGSw{@o9Y$$qTF2T6HGH@8f~(OxQV5UxD9Rs z&WQXk6fkS{Ep8L|Z*%W(1Lt}ycq1>N!&A%~x^v8anl9(_*@V-@M^0Uup?RDzkUNqO4V?5}u`B%&K##_C&@K=qk%x*@hF79F8GxrFst3H?Sr}3D( za0M4dgrb+zy6}`gaE*ZGCIhmZsz6&mYv`steL~gL7$UH61XDsG4cwCCd1Q# zOd!XSS`DtTh<(BkNr}3ULNx_TRp!)}4 z?mT{H{f+5DFXBB{iNgx98Rq9&M?E>b2k5SRQ#Yd=E$-gDdj7vmuhZM8ht)Tl<?+y*wJk=>E?6YoS?%AgVHhIXI!K_Z|fL-l<9rB*pMev3A(xz)EjTqa^ z&3tFeeEcX{4#qE%;8A>!;cGu8RHRuI5VSkRtTiSk@Z4A{M+F@irYaG^!7L;_IN=vQ z`@jWo(CbdBBg|TVzMKxVm8+%%TkN3h`^v08_Gz8n;5)B0Fq z0%3MeCc=h*db?V@f&SH8PzH&jv_%RY^&K1`pfq8A4OaE2`Gt|NDD;9EJQ(27Y*FDv z!JCnbo)k?1y}Nlj{k&qHLsnbcNLOV~sYI;eOdQHWHW4#VSREZK+F*&j@x8zfKDrzn zQD(&~^<@JiI>ua#3*P{9K_saL{CzSW?+!q01cjqeeVSI0Oj;cCFi7&n8nFt_*%&W`|O%Kp#mzg^uE_6nN2c3b5B^@jfF*H}7y_pVwQw9s>jd zFXa9+@A0VM4YxLx4HB+xAG7fYFCO~=-5}l@gvYKLEAeQr8FP~Gq`FN3=Q8w+3s%wg zv1|b4rOfH}x2IRXlOo6NMa#wlh7tr><+NqsdnUt&RdRm?%7sGOHqaBxVjJtNci_^R zlQkP`43HKGG1X*iH-~qSjv+FYtz&B*){2jxII23r=)dJ;{&yZm8rQ$`^x+hI{c+=F z|CbNeKSIF%M$v|_oMW>m&2?58A~>M$ZFC?(2vS))FT!lV4%cjYo7n97}|6^YPMTW-Z_zr4;VIGp`f<`!;0nW@12B~nv8`CnsQzZi+9I!!oG*`AZDoYIh zM49>fwBo4pSo}W&0d^&#TFn~RPbustFWOT*&=O#tK-G5!H$GOCLk^ekMZa+}Js&@W+k$Bva-0({ zu^N5e?Bg6^aWxJu(Qa@V13t9$s|l9&p_RW$WcDidf*EetNZN?=G^Mz;al(EL!oh$? zl=Bbn25!KpSET1jcObxTUfqi&7Zl|0*(~6aA<<(uhLERXZ#mjQ)JqN|TmkYSd3#b% z8Vr$~QZCl?;wy0Qs(T#uKEID2t;^)Uw)&Z~36uu0eWnozFmN%& z%2liTB7CUO8%(~W;*7DU(&>(b)VngL{Q0=yO|01h8ySj{wC1>C9f!4lx9Wc=C+-!6TH<0az7 zf&y)AxPixIdedY|ZJ&ag}2@*L{ix~U$H+capBM`>Gz z#0-BkTbWsQnk2q-e*CoebzP!u0WmEsl?$FBo;BKS59l<#)It`^g;@Jx9RHs=hPwkjTX#Dpm_35UB~8P%r5r^A{l4yqapg3+GuM83FhWyaSG=cI zy^)>yBGRrpPv9e;l7*cj3SAHzXp6h-wFb3~4vcUw$B&lz<2AW3=4MO4pS$v>9P>|X z%4aO&Xe%WZJylE&Qc2huh(su2&qaFYF6 zw}Q(B6%_xgaf=|Fj1xeTi9ZEjG5!es>szgxui+WB5?f-KrpyN1DAXe31w{4*5?2tZ z&UEY125zhx$Q~o3pg$IvmfVjLLS{s|MLZTl+x{>d8&>#*P8V4!ORNj{14mQ%&%1C~ z%7Ba@+`$^!R!Mfs-Y^eOPfD%<^koP$4i6`Mt4Gm)H8ITU$@6We!vej+*gnZj6wjx) zzQ-}(1Xfwts*cilO!CIDs&f>uxhV^pNRtw|UOA9jkQhtjlWas1<|G~M-p33yFy|y0 zJO7;6;?S0}5v3j% z3z=1EJ=Vk@(tEVsZ9~Ppg!eDS3-k3-kXa>$Q|@)mKJQ6z2iNTE7h)TcEv8D$7E4Cv8-H>2Z&OA zNpAIA0xP@$aGP>{VW@2-zLhFPlf*ZOP!YZhJcP3;Im-wDyC~xH2}`MWIhE05f~}wj zT1PT6V=X;@%E z@l6i>Z=Mas8rc?0keCaUsol8CMr!}~=id3J*3Qlc0y#yF^DRe?@AWS1;AJg`l5ZQ& zP^fNR0X$?RYI!}}SVNovb`?BQHVu$bX}~H4Tw1bRNKj1SZi<%{BW+WM=wUYPNj4R{ z%`3Dz8xpog+&k19@}gIW$%pOQ+9=C%h`yk21Y{crww%v0xcSHeR`y?NpC=4d>Wf(X zH_Ji;l@d9xLh|?EJW(m6NM+B<7;t)=_d+dLaWa+ErN=t76G_q&@-+57h#ZP(2)~n|XFS2MK}dvDW^FJQob?BQ_vY3FZKFixfM>TU{@L!|7oK5{=l<>aXxtB2$U~0pxQz4gC061&zxjp+ zN`{xXOU!6YDIQESckyRZR^5Q;?&Mg1HrK{3!CTZygrl5lR%z|KRc?`O3IoEcgd@Q1 zcCmg7Rx$YEE#fd2g2;A4%j$wKqn#PV{MAZ1at=H0G{gtk1c&%>h*5&D=+VwE@N^qP z8rCI+ZhIu;`qaZKs-jnhP_J->Rd$CSgbuAiMS8ORT@|pkUaR6nbBW6-gqc1`fiIB~ zjVBwrP5t$4-Hs2nErl0eP0>=>&K6i*g>MX$Pteez*fp`+UB|6!+JNPxA2{{Jh=-!? zME6nM|Vy^V)LJ#qFV6l=w_B@da&Cvo!i0loEyy(1gw99e&C=j}LQ16y` zJ269WMN3l!Hkfp3K0xbHYGV($Q-ax~YMs)2kJAB$3u!DDFJDbotJ!WGpEs|s+OTZb z?M}aSW>n#mT@O4xf1C`maioB4fyAoN&cL3F&XO2_%A6|RD^5ExZfi@&ISU(5;dX&S zIRuOEYI5oz(VCdy2akw+kuDZ&AA_vQj53;1s_JXwRq05?`dwQ9Fgum3zJUwtodlt!TR~Q{$Ufv<8cGJ~lohW{4VIk#0ld)y{g%Ypom{{t;$j1HlwwPG-&^sxi zLS)D$kJ$|)ZWhg%M&3<~dW#+ue@J-jDNQjJ*MkqPyTrY5J%zoYvfNzYVrhouUWjuW zQBtTRp-&_oasO0`nVheA??eV>F1Vi==nx5Z8rq8Cea+^XN*xbA1Yxt&>Navgacy80#;gS zs_=a3d1MiuDz#VlS5*ThQ7r|`q1i0)wP2OSSY8O_0In64-;les(2YGWsGwqV!ZcBy zJqJzO_yRIgxQ6xnAtT(mg}!LInm0uHbx-ngy7rh$=WX zG;?~*jXh7rHzGSjJ+E>TdciJp>t_Q@IE2NW0;m}@+okDr3nWKXvNKR&Dord3=uhwG zdxZoNSRDb;xI<8R_2zKj{9J#6>a)GZJTcBP8&grVm0grmEqAYv%TobP;M^THXBusv z;i<%VFb8xjEGaMt#5F4jz^b8IkMLJS32#ipm*i4slD;X5y?;I;P4e*YfRc|hnCc@90G{DxrPDW@$N3!=<72CZY+AY%p$3!P)kcH? z>xX@kk$n*EVJlBS*&k>3+qKH|Czv!g6{Cy7dUUj%QzoTl25eEb7a&m-J(889BRN8L zcGQLV>%jscZVc+*cMWk$pSr4h6qC$vo@on;!n%L!VOmsL)MKuJ! zfbS6`Syi-)LGL55tM=>q&42o0~8t> zRlJ~)=gWyeP_Ug`wg7w_+5>J0Vn3?mK2B8(j}w}y5Sn>Y;*9HLL4%>*Ea&1X;k~?t z;z*uNxiXaLBC6Mt#Nb2Lvu>cUQ}s+^@G@JKOJ(=e0r&_T1_r>RF5FK)ed8ZDiO;qt z4vmTF#Awd*v9`tnou4#qQaJ5veY!lrDJz>k8I+7sk!D8)?gk1pr4VMy{o&!Fc#djz zx=_BuzS*Ui+DoNphRGDFW%$O@;_bu90`3CCWtZ(ld?3cHK7C3G=30carL&FF2vEpX zeaEaKCwf*Wx>$fETP@Q#mPR~ZUT8)ir{ZXoYGlP86t+p@Ynh~o)3jA`HWDd{$Hg7M z9zC`2$M{kZU01|c4ym&D%6Vg3`-E77)s?dIooNkNQVdyvWDzjmRtz{f(ucHeJ>qk`mM&aB=2rIOGBo=$*1E zr=#C%o;OeWg|dx!4S_JMQiiFRqNmAO>a`MYa56IN>0*4kjdFZ*2EcG~rZMIQ2J) z=es&4Mp)@mL)X&>=1qz*xmrwHI}d08eW zS!Q-qiG!gNfO382rnBaa^lJ|86FV43=y~N~U->)n7qjC+8?lL;`aHXZC_i(<^DYar zm~nRNRZ}K2I$TDQfKH`lp$**trUiOXAmw2&24AVQ0~D&vop;`TGD|Hiwp_5v#_f%{ zuK**AN-f*femO&!BiYQTLoNq7Kvz!}3L_z=OktM;?q+;yB*5w71_o*RaGOlAdIP() zAcw?k22i%>722NaO_7?Rlz5b_HU^6I;8Am0H1m)MFSSs~zYgm+9upRjHLBLcSE&-~ zBO`2bEENg|8x)^($4(DMn<<)c(K;*ekzV&}X4g`>_6EgmDQ#pB<2WXI?1hQ9z_W!~ zN>*1EU4~M(b@&ce?Ih7D_myaxS3ZnZe-~`Z(c?6pa9tjUyh)Mq4Dbjkw04&&pDHP; zH|aw%+8rm;Tc~@%*!k?bS)g@JB+LRGkgYjkh$$ua(VdY4F*wegJflH@<&xkt$9&(JIY;GiT}d-&F`sD^^6(u-@b&Q1CTg z$|MHkz+5g8ynJ@?$|9>F0|IGGpX^2>_UtO7F?aYT11qfS0MC@~rzq4w5$(6I&t289 z6irJsMVak5aC}s+>~{B&z>CYsDQgx-zkqfC$QO}^I6f1R)>5ajvR!_K*W3Lsq(ta`DbuBGb4 zQwQKRkVxt{m@i{0=!u`p&qA2^?Iiw0rGi*74-P>9t!c&J1ZC#lAP#EN;=)by1OwDc ziX`d&r54UuL7=@bq#dy|)a+O8zTT;UmRMtJ!p=tM#y*j>6qMu49PGMDsJyZZ^Lkoq zlg0%BFc7aZXQNeVL1g3<^c1764U^;|PAfsG_?-F`Gxhz1Tm6P=Alul#!u739o^1|5 zMW^TuuvBX*EK3E12N3<&CFk6dx<=_Lu>~fw6$6MTp8-*IUyRb6B3$htkY(5*N|)FqP&>x`{bxmhg$1d&=cnsD8Lw(yZHg<8}SG{&Mj5%SNx) zdf#-hu7tz@@kHSb&9!vVBnI_>SVk!yLD5Dfq6k!)9D>5IUd;afzIUxO&l*?f{c9t5 zUN^4#os)OXlOHcTt#%*J2bIwy&1ESWL&aH2ZE0+X28N*GR1%A*{4et@c<_d7)96bw zS}`cv6RO%kL7A9XGF*<0@}QK&Rd$B}f3YUo(SS^;?I0&}`y$pELSYu>u`k~c#(c@k zE*M20$r)3{o_G!vLrO*>^Pt-r1Hmlj6nG9ES+kY+FMUKPX(^%r8jaI?v*G)^PZe%O zNb5P3*eljnKqL8k=|)8zMXdaKKM+?pcgX}}qo&zzHVeSvJu#zlv~pIuo<2ruF7S0% zEYVdr^>24Hv%p3;Gt=y|8?B!pe&9e&PsM9bZ4^Xz;ZMxw|YJ6qll6{s+Uf zhrm#GAg2ol(TjIB3%jEMM;l0{otN)huIuO3puuwtNha=!w`Jl+jOI34{2=y7%Zaaf zlYc)NF%+^MF=W_5zzqo`s-lRkYpnuceBp_RVTAWQ7hGqo&XO^b;9k^woDPXu3@C$< z%Bd9uAj1=g7@|cfmd2GyC#<!9rNZJx&sAfTe z1=JT%sjX%fr}4}jPKcLX5PR0rVsPDPRi##&8lMl2K$C*;2s|l;uIC=+Ij4-(h!kWf z!=0kcOE|pMi(>e1ztQc7*5y8%e^$E*-QG6FqOh(tDTVA3#v?T?B1qY(fP^1jc2~~o zH!L|dp>=<9NxjLY5+5|&WSSdUSHQe&k_BNkjiv0OhnDBlVwk7gA0&~puOAq}ol~Cw zUF#fu|BRR%{B8u0*%S=EENrxKop8hM*e|3^^j#Uu!|r0SYTAKuC?c6hD2E%~b@F+( z2)|6eafPfyFVs9u-oE8bVT4N{hA^GuqTAhDdCB(xLj1pBbUbo6iqbC^>^sY5ONtl; zFA6$Kt1nw?9a1o2UT8T?$~4o69xg#}z_4rCjc48BG-$MM@XG9B^~vIlv(J9AoTfwa zT2b_g7|{}odJPrG=!i)|j7Hnrbc5QAf<|g$Oa!p#up$Is&F#)A37`lMRNhOKd!mif+-pG-AJfjp1BU1{b zHt85YF{RE1Jg=GzRQ*);6y06^aLH+>N30we675Q_vC}RfnjTOhGN}*>>b{u7IkXYT zc#z00_qSi9AyJOfA!2NWc;O;1gNuf;g9k8%LH5N>SVa%%ga~WVvzq2^Zy^p>p#!D2 z+qBQ%hUPfpTo`-2a3G+?%aX0(VNo;ME!>bR#LNx!t&yl{gTYh`_+HhC3GQ^@*46+9 zBDqq9S&YGgu4qtWhoz?$^ZdAYe@{f`AiQKGsNRq9{5(6ttrsq*o@iGEAg3CFu743a3 zw4Q zU^ZO3pae8P+ zpztzAjaXO|2dIae(rsIIZ-eF3EInsell+ce4ZM73E}v3n*14h3w?)#Oc1D@ICUN0~ z@B58oh%xN-yA4?N-qq!0r`!Luw;e@iBq;G~P=u9K`Ozq`1wwC@kUG1HbAB-+mqVKFyGqlU*I5B1NpRN?xNK+A=(#9!4Q0- z(ScA}#tnvE9!&69B)1?#MdJE_dsqQj6ldoiq6V;2_UO_%mQyWN!TB6jErNuKkjg~( zlE}*EG054_A(4i?O|fM}qv4&1G3?~q=DH*<6^dBR6=HqbJ{7}U+?0J%BPO>t_RB`( zq#i;uLL=NnKX=*@1n!=w`qC8XDCYA+9 zkXKHyAdeK|(1SwdigIFtPi1pEd$jBySij4A^|Bc&a?wbqJnDUFi#0(R1I@ywE>F7Q0w>LO5| z%djH^FCJEDZA~w`&CBz~Nz*DHRofX4V`ychOevw!(qW1vm9F$kax~G#r3sa7^?t?P zVSHUOD>G~p#t5JgY>otv0Q1KdOnYJ$+C(a1hV6QP41Ckz-ltu&M;gIUq@>aq=)#syl@oaqywD zkVc((jTR}*Ei5hDJ1lY)wbEu3yYg5eCF2f(NNGGKIZ)O2tR?@A~(HiSyns^o2%3Gzr6 zWT`ENk{WIL_LlOf?~>J5qzk_<%-NHYpFWaSU#<$`!(|6}xABseIb*QAADcgY=yXqe z-$uUeMq@+E)LGFc_gl9f=DO>*R6X0$Fn74$KI&?g)jLMK8T(@Llj1vp(fqaU2{DvzXi?;niUQMZy^?T6xp}4H>Q;`qB``novZPQ7JhO(=j7zA3-d~`> z!Y<8ddIN>oh4){yjM9GIY4ls|x7VnjZ~UILMRRQ~&BomLePS-Sn+<4aRR4dVv86ec zV;g-#b$+7Flg)3)9FB89jp#qn;+kG~c>V4gzUO&3*st$LjpZ%e(ue!X_d`nsp_0RK zoKC2|;~aCrk&S?nmv9=f$RJAYbSGvkm5+^Bi>{^=;C6NTHVI7@KEDk(wVkJ$|E&D6#|M4x7XG;;7L5(O~?YnZL17XeN;*3}_IIWZljF4pRfH20z-rinx*6mzG-(&ZFh(5e) z8h%TELC)k4(M6+w@-F&+unSx8JQ_lCw8X5q%>8|FEdwf=!Hd>ycuS3~!&^HK@aOhc zm?l|;YUK&W6o4I@0}$=ZPRR16Apsg5Oq$agozX;UAK{iuEoK~>gfZs}*^)vbkWqR- zJQOxwH6Po!2Unl9UrQtTE@Uo0;e0N6NGFV4&#!NlKT zptki_pIPF?>mFG99(8K%XT_uI*nH@C*1Q#@Ba!hU?ri@n4{!0@=0nV2F0W|u7^BL* zYPPn+!Z~G#J~#hOP{L!i+;tqQGa$^yFfNvI@wves#}K-{(g*we8?;i3=l5vU;tf?-ZTs{bP|H@d$M3N@TiW~~ zT0)bDRg_qE9GlZ^I0(O$Hv|t1d8Ie;B+{i_!!imZH01D8R0*VGszc?ao15Ke9>6=` zJEB1M0j4RtfjMV9HTZy*sM4sOf!#Du2kDsM@xwGKT3Z_ENk>9Rr>gI^*M7qf6qyUb zS2z^Zyu4eoLBMkoW(2bp;4gdJPt>XQyn%a`fp({V{h`%=*J^V|_PH}u!bd7Nf@722 zt7c;8@&vv^a)l7PY;^nQKPh^3kC>|h1SzcJc$QaE0!O$e6dib!C{&M8oH%vOjI~J3 z*SeE6wQfyc&CV(O2o0&r0-8$X5XjgIs|3fVpu4BFzmJSHTyx zri0Pnp|zL~3{ym*yE`jB~OcYqZ&(2Sxq zyX$w2_swe`BIlj?lDn`;^!M&Im15=(T6#-^J5MJm43GKABprd1!cKB&?Bz*3hER2i z_4Y}wy(k-KY1w~?Mu?Xi|6^tO_gYzYq7Ca)fK?-oklUz%af&c2W)IveST&Fvq|)|= z+xxIgllUQ>EGG)CCXV{ekLWfy2C%LaDo89aah2W+_Ec!iuR?AtIvRM12qTXCO$hKc zN*;9RwVA#VH5RXT>~57fIy~4Nn6I4V0ES6ui!n0G>B7G8+vwoG4(q#hc*{Zk=;hI? z!xu*{#gsBtwv>y;$LsTE`)%Kxw#c`jy00*umwpO{kv@B_7HYn19GKgLz>~(y$uw6p z5d3ONlM-(BB~9+_H~j=Kh53AA0_9kx6R=yy+ULW~*zV1s*l`I}G~DWKw{vwF9b;T) zr+eD$!teC5o z**I|+5XpFqXOEozSQW&4v`f$^P$^UeSHg44e2I51c|w5%unqLryTcqCzVb_gMVJxB zSFPkDEwkxY17bUob4j= z_FmQjok5t3fZM>_>Zou^B(DYOnlJJ4SQK5$%rclvnkzaLb7X#9#ULmGVEdkvIPS7F~gAJ zO-dyP;D$=<%^*P0Ai6#X*Ch-p*GmUfV^!FFyPOd8=`0E~t@m74J^>HpkjqsZFBdBI zy0Bt>+ZMmQchw_>21)@7Of0~n1y$?T{CL^DK5brBteg89*KNg$x!B%?aIhF>3UL;K z{H}k;_(yDy%cvk$Wuu$|#WKRX8;hzrPaw2keD?&VX1V}ug|O;SDYyZQSGdcGr2_>H zekt`Fym}dFpDbE&<<%M`yqftzW{1)XAe=cibO?OzhzN0Q+gNV{$mS-Lkqr)u;*&KE zcSTL&g6E@}OI=)cuG**9^jHPE@}7yFueqezY={Y6*q`^O$4x4^8zbr=SjjX5x7)?R zenRu>&SkKF{9SbLeBI6FP%NoFh6aMH>cQDn`=sCMw67c8x4~}c2cr7H%e8uvPIn1k zQEH7-Q7Q=rpyCNCN1B8@7MUZ+h{>=HB4J(fAuoWVARhH~ul1K^U}%Adii0aZ5_xx5 z1;u{z;&L6bh3BG*{UvBDrE~x);J%z-erYK)+=UaCbEaK2dBReFXpGSESEI~S4yycU zv_3B^=Q4@q7X#o1Fsj8pMA_{VLl{Lb4g}@~1-SvTLc%8(SJ;*SbT3Z1R2#{ zfU|fG7E}xxg__f|MJ3y4bX!>evwd}O-0X(ghyP6U`t@tIN=6B#Zo&CPB`7@6O0Y7& zymBZ-z^s>Jq7Z@P~EA{aZS)YRY&zI_S@U%97~*5!3-pw|oGEuN1@=E})qZkR*KKJb~+*2F+_$TAsHzV_C( zM2&6h(kNJ^>MqOhYCzF-PQ$aC(*+VPiY!{u!85>wAch*Wp8HBk>gkmVJ{7&Hzdi_T zm*B%|ZJB?jGb^_a@12X%%}zpIN+s`n)Pjv2&+=vV4{%TfrPb_*gEg&u_<+^YugOkF z=vl7N8$HaC2yjDy=Mu6)=W%K_);1`6^W~J{qQtK5z(otxF>|VFQE?JZjG7SEA>7yI z)W1A@c~pOOa9B8M7rxMF4XAGbt);#}r8Uw#Z@SU%H@oeX zrpfYiAd!|tw~M0D!Ph7`Vmc4#^>x(eCGSC=6y+#*p-`PIpmURQ`6BxQ-(;XjPqQNJ zT(o;yU5tsR;z!k*SHIhO`?k4C-S?g-O1a*T?~?i|&jyH}N#S%eKYL(AobZIa1nYs1A^!)h#6IG#qaaQ2mlxFeo)tyecn9W|LL;X^IDk4F*IDYQSz7z zYU1ow1n02Wh`Fm3szS?i$q%xBFEUkW775=wFCOa&7zct;J#a;MryTtu6V zcCWRGV*wF5vw2T!Oo48hQO_3hYYM=p#JMXlIW3k`hX0|9j{|twvh7f%7;eS(qsF=0 zgk}!MRUWMoyg6pFVS=n(WMF&(yhyvtWlMemRme`enTb2hPIgmn2c8Z;n~DAX;j0(> z-?B}2{AIFxI~?vF?H$-260yb%d^JWg`-~<~QAf5oQ0Wg_TL_%Jy}$kQ$4}dw#G`6-J+h`1z6M6rd0D%g7M0#a>&joVw-h07Bi&Fas#QuecA7x zw$9G3;lRKNryw5zxZz|vK-0rr^Y-Kf8A{=fg45aW04>w;$c>^z9>!H_ZJvSFh6uL? zknyUv$=Gz?@gU${C)jTZs`-G(e`2tv8%3d&VDVbV^-e*o;VTkCPrj?VC*|E z*u+z^qqCpDru>SPMI-{^0D#7o$2VZga>A(haBlQUcHesG@^|U&T|&|C)|KMuEg(eo zAWRX7jR ztv%&D5y&+yEE6uo2aAe83>=O$gwG5gEgQ3ZptRhud(>g`zlaJOOTFIxYM#TKla-Ix z;Q+KQF29YsyZbK>ULNco931Yyrk$=+x@2!&f{F+Wsfs#af+`p+Sp(&(ft5;5mIQHI z;fN&B?x`G$&WC0fdUM@*-|T+qn$Odcr{gLPBi(8 z=0&gH=wJ1!j~-*rAVgoCAOsc;BpG1AsLHzeTJWWAl9=!ZRDJY~9i3tg5oqq+1?WmU z$xL&vpvD8K0WHov9gUJHEAXEF?(&WVD+3BvR_@Bugp^rZdCrOx+*#d>XG`pQL0iggH3(J9w3#~Y@ zy@zhhM#u}~%$%P#kFVYqZ?k8jws`e-b@ZcfjfwEr!RF~kMifvg?;f6(- zHPmc7`p=Ch`eX4KJ@*xlsLfRIgzS&)AL_u=F?D&ff1ec*7u|96k|F&7Tt+}LFH&=Y z!je=+g2_vB@i%>Io(v7R7TR95;+C$t)@q!a+Qj>ReOBMR*)Op}e@hfuVM|%h@Kp6W zXZ`E*)v#zG;1G6uJ?z|b^O|p?; zGzjE{MjjjE!i7wv@+FF77x6Ia^rDYwvB<;=yC_eTN3mc^x;|}m&9*9;n64X_ zm*-8i`$ggTcu_JNw~3o8Y*PLJj;fI-^OPcgji|vajxPtQc$rw(1?fdwHfs4|htH+t zrbB{pK{r4T-9eN1Ga{nn3rGqfWK}4&I<3Mu3f0S%78L};lA!I|Pp#+XJq z5cNdI@5^nX;nAVwfgba}0~zH61hz(<<%!X|}|5VG*#r!+4>*E#xg#^>WdJMM({hqJ=qaW8_2gF<*9jO!~z zMyLMU5(TFOi&*lgQcm#5`JTuzhnj3|Jj7=s!B}vu;8jA=^ydr$Bp+gET2mcEGJcsJ zzkMhs>d9Eo}lSK)0z+5~>zXig>O&0=)iuD+w_$$aN zL+HK{e)Ibjij4baXqpl+L!ePBk8U$Dx}w2=aXKD+z_~GaCs?4jDfxvU{o2}4 z+zGR>5^xc?O@T2Dp7N1bGuglYy~uLB30JH~Mv1fdu{cBO+rkX>I2=5O>j{OTm@d62 zo}jy2M$MJUF{GELiwcB|(_dnBiJ5C>Ib-h!7!T%w%Mmyjz@y+r&UYflX~66vUx9j* z@tjh!ZF|t<$S^o!{!-A+*}ONm!IIXwL^+K%iNN%b?`5E}`Tl)lGXetB#|gR4azQlO ze4orMbYm@gZ&f#fL2L|%MlVYV%wdxvrfJLE8#bv51z^1#+6?Ax2+aaDkFg>x+~H9C zYqXrR9&Fzz(PD*IMY$7YeJ#o0>Z@-9=c94{q486Xgp8)yTw>@j903F73=_-{UcyEB z=WO1#r#S7p&^uENCl33JoSD2+memeh3qU469wBFycchYwV;0EK|nLFzaj1NhmhtM70m_N!=XzvSs^7X`W^IrH0p z)W6+gjpti;H{ z)z%ZP;|&JMf=VWXI5!}TO)11uCd$@=M}-t7{cbtIG$1Jm=H{D6M!OBS8h>FY6PMxR zc6D<3ondHSkyXw=E0fEaWVu!Kk4i4D8|{8(L=FgBJUH0+pB(dlcaFJEcvg`|Hqa9{ zFvN|RW!()S3vYj!n;QAT>u}@ehyJvMm@WS2q<5uzftho7`Ih``+H}4 zhX0g+0O7-?>8kyOfc_d*EWuF;UUFWH$}dC}NhfSFpk%C6Vk;>b3nZjj{5Qk(cXzq| z;D!j9Y;ME2AF4IPsYRG`FefPTN0vCkSWZA|ltNGvN?Io>1498-AsF$a^4A%DxIm90 zns;$vHUb>;Q+XCPQKlWi3XmkUDM@SQ?;G1iE)RmoZRkM7OB2H(#&rEiNS9G+zgf7i zKC^$`9|2CGE`yhh*>=Z0RSSxS&8f>_Mr_1K@caU}|2WMltrPaf9${s`cq! zy!Jd0YM@W=ay()QI#rV0rm(iPQxdMXDMgz+4VN-PvcOlYxTA z8Lnn$K~l~Xw7}f_V++H`NO^2v)ggVAatB@YKzXe_ki-qy4}nrOx$JDQKxCapagf1n z*o&EnNa;K_1XGk=v6skUQCFD8x3=7z+esS144KWZMZhbXI)_B)aH)7#NT<~HEW>8u zN-5YtN5zB50%q+fSRS{7d)P++>suH&*(&0HM1)0xWTJtYtrGoO3StWNIVyM7Yg6tv zr!u8E(PApD=SJo5fusP;(Shyp2oM1)MCu>W&fVfWMuwu(C&MjI`%`Qlmfx}Z$Y(NG zl4OCneNS^1WKp+fWVIq2>vSEs6)~%QLD6oo8;xWHU-^{Ig-}GxWbP z^*)PLf7;X#_L-2W`U{f3mm7(y)2;*6a=SlLl>${MH}t zw!e#J=6~uN*sEK!?d@MTBwWSFDLs3%Xj-E;k!t}Tm=@njgJ;jEk_VIx!2AtNj)SM@ ziGOGvtJtM?sMx;S-u(f&(stlM>|t{o%?VBOAe_0-bJ#ES92}`_jTG-5HA_oR@}sco z+c1!JrypJQnx_%!P~nzvH9>3c4K^*d6(4cv#?h<3QT3h^xDM3p;Pp`IVj0L?z@r zpRbzTpH|U6)K44AD+rsPBmMMo^X;mBK=lLlbidnZ_ZkR(5q|oGe)_a|*6eo8POSQQ zsh@6LTr^Kx8WPRVG-LCF3KJBfgt!+{Dw6~VM z#``9tM1-IA*0S3?Z#H_BV~pzFTJ}3DyB*d2wFD3Rs;9lRJn1%9ERA{EU(2&6dg84m zaIBS2zxG$Y)$8}FpFZ%`5->+r(LV6j@_gm95m?Cd>OA$dx0a0+ea5G~wFCsx&Q
  • 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

    I?*j*O$lw?Ve)wQHMmGF3VWC^W%Mp4Y2Vb); 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�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

    +TtEei)4HoS`m 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

    >s<|LLm-LT)HMQABOH3Ep$_=t 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

  • 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≧&Ub8b#pYm5GavcN;TfA-byNusHf+5kHD25!KZ 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
    fe1!zX?Uf=*w3M3d{7 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

    mohC~38O4hvP9r7(O*pFDwC1;oLtmEMl7Q?Jt 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%0ADgg)TD{;_t}x(D?u?^1sS+8Cqb5fD%O+J);F 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

    @^23rfk#nFIg**7yIW|m?9fl#^DFxB$Icj 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 qvW&vbmPNxy!UUUzm@cC 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 2) { + // Value is an object + for (var i = 0; i < rows.length; i++) { + result[rows[i][key]] = rows[i]; + } + } else { + var value = keys[1]; + // Value is a plain value + for (var i = 0; i < rows.length; i++) { + result[rows[i][key]] = rows[i][value]; + } + } + } + callback(err, result); + }); + return this.all.apply(this, params); +}; + +var isVerbose = false; + +var supportedEvents = [ 'trace', 'profile', 'insert', 'update', 'delete' ]; + +Database.prototype.addListener = Database.prototype.on = function(type) { + var val = EventEmitter.prototype.addListener.apply(this, arguments); + if (supportedEvents.indexOf(type) >= 0) { + this.configure(type, true); + } + return val; +}; + +Database.prototype.removeListener = function(type) { + var val = EventEmitter.prototype.removeListener.apply(this, arguments); + if (supportedEvents.indexOf(type) >= 0 && !this._events[type]) { + this.configure(type, false); + } + return val; +}; + +Database.prototype.removeAllListeners = function(type) { + var val = EventEmitter.prototype.removeAllListeners.apply(this, arguments); + if (supportedEvents.indexOf(type) >= 0) { + this.configure(type, false); + } + return val; +}; + +// Save the stack trace over EIO callbacks. +sqlite3.verbose = function() { + if (!isVerbose) { + var trace = require('./trace'); + [ + 'prepare', + 'get', + 'run', + 'all', + 'each', + 'map', + 'close', + 'exec' + ].forEach(function (name) { + trace.extendTrace(Database.prototype, name); + }); + [ + 'bind', + 'get', + 'run', + 'all', + 'each', + 'map', + 'reset', + 'finalize', + ].forEach(function (name) { + trace.extendTrace(Statement.prototype, name); + }); + isVerbose = true; + } + + return this; +}; diff --git a/node_modules/sqlite3/lib/trace.js b/node_modules/sqlite3/lib/trace.js new file mode 100644 index 0000000..3ea20bd --- /dev/null +++ b/node_modules/sqlite3/lib/trace.js @@ -0,0 +1,42 @@ +// Inspired by https://github.com/tlrobinson/long-stack-traces +var EventEmitter = require('events').EventEmitter; +var util = require('util'); + +function extendTrace(object, property, pos) { + var old = object[property]; + object[property] = function() { + var error = new Error(); + var name = object.constructor.name + '#' + property + '(' + + Array.prototype.slice.call(arguments).map(function(el) { + return util.inspect(el, false, 0); + }).join(', ') + ')'; + + if (typeof pos === 'undefined') pos = -1; + if (pos < 0) pos += arguments.length; + var cb = arguments[pos]; + if (typeof arguments[pos] === 'function') { + arguments[pos] = function replacement() { + try { + return cb.apply(this, arguments); + } catch (err) { + if (err && err.stack && !err.__augmented) { + err.stack = filter(err).join('\n'); + err.stack += '\n--> in ' + name; + err.stack += '\n' + filter(error).slice(1).join('\n'); + err.__augmented = true; + } + throw err; + } + }; + } + return old.apply(this, arguments); + }; +} +exports.extendTrace = extendTrace; + + +function filter(error) { + return error.stack.split('\n').filter(function(line) { + return line.indexOf(__filename) < 0; + }); +} diff --git a/node_modules/sqlite3/node_modules/.bin/node-pre-gyp b/node_modules/sqlite3/node_modules/.bin/node-pre-gyp new file mode 120000 index 0000000..47a90a5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/.bin/node-pre-gyp @@ -0,0 +1 @@ +../node-pre-gyp/bin/node-pre-gyp \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/nan/.dntrc b/node_modules/sqlite3/node_modules/nan/.dntrc new file mode 100644 index 0000000..47971da --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/.dntrc @@ -0,0 +1,30 @@ +## DNT config file +## see https://github.com/rvagg/dnt + +NODE_VERSIONS="\ + master \ + v0.11.13 \ + v0.10.30 \ + v0.10.29 \ + v0.10.28 \ + v0.10.26 \ + v0.10.25 \ + v0.10.24 \ + v0.10.23 \ + v0.10.22 \ + v0.10.21 \ + v0.10.20 \ + v0.10.19 \ + v0.8.28 \ + v0.8.27 \ + v0.8.26 \ + v0.8.24 \ +" +OUTPUT_PREFIX="nan-" +TEST_CMD=" \ + cd /dnt/ && \ + npm install && \ + node_modules/.bin/node-gyp --nodedir /usr/src/node/ rebuild --directory test && \ + node_modules/.bin/tap --gc test/js/*-test.js \ +" + diff --git a/node_modules/sqlite3/node_modules/nan/CHANGELOG.md b/node_modules/sqlite3/node_modules/nan/CHANGELOG.md new file mode 100644 index 0000000..146cbb5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/CHANGELOG.md @@ -0,0 +1,200 @@ +# NAN ChangeLog + +### Version 1.3.0: current Node unstable: 0.11.13, Node stable: 0.10.30 + + +**1.3.0 Aug 2 2014** + + - Added NanNew(std::string) + - Added NanNew(std::string&) + - Added NanAsciiString helper class + - Added NanUtf8String helper class + - Added NanUcs2String helper class + - Deprecated NanRawString() + - Deprecated NanCString() + - Added NanGetIsolateData(v8::Isolate *isolate) + - Added NanMakeCallback(v8::Handle target, v8::Handle func, int argc, v8::Handle* argv) + - Added NanMakeCallback(v8::Handle target, v8::Handle symbol, int argc, v8::Handle* argv) + - Added NanMakeCallback(v8::Handle target, const char* method, int argc, v8::Handle* argv) + - Added NanSetTemplate(v8::Handle templ, v8::Handle name , v8::Handle value, v8::PropertyAttribute attributes) + - Added NanSetPrototypeTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) + - Added NanSetInstanceTemplate(v8::Local templ, const char *name, v8::Handle value) + - Added NanSetInstanceTemplate(v8::Local templ, v8::Handle name, v8::Handle value, v8::PropertyAttribute attributes) + +**1.2.0 Jun 5 2014** + + - Add NanSetPrototypeTemplate + - Changed NAN_WEAK_CALLBACK internals, switched _NanWeakCallbackData to class, + introduced _NanWeakCallbackDispatcher + - Removed -Wno-unused-local-typedefs from test builds + - Made test builds Windows compatible ('Sleep()') + +**1.1.2 May 28 2014** + + - Release to fix more stuff-ups in 1.1.1 + +**1.1.1 May 28 2014** + + - Release to fix version mismatch in nan.h and lack of changelog entry for 1.1.0 + +**1.1.0 May 25 2014** + + - Remove nan_isolate, use v8::Isolate::GetCurrent() internally instead + - Additional explicit overloads for NanNew(): (char*,int), (uint8_t*[,int]), + (uint16_t*[,int), double, int, unsigned int, bool, v8::String::ExternalStringResource*, + v8::String::ExternalAsciiStringResource* + - Deprecate NanSymbol() + - Added SetErrorMessage() and ErrorMessage() to NanAsyncWorker + +**1.0.0 May 4 2014** + + - Heavy API changes for V8 3.25 / Node 0.11.13 + - Use cpplint.py + - Removed NanInitPersistent + - Removed NanPersistentToLocal + - Removed NanFromV8String + - Removed NanMakeWeak + - Removed NanNewLocal + - Removed NAN_WEAK_CALLBACK_OBJECT + - Removed NAN_WEAK_CALLBACK_DATA + - Introduce NanNew, replaces NanNewLocal, NanPersistentToLocal, adds many overloaded typed versions + - Introduce NanUndefined, NanNull, NanTrue and NanFalse + - Introduce NanEscapableScope and NanEscapeScope + - Introduce NanMakeWeakPersistent (requires a special callback to work on both old and new node) + - Introduce NanMakeCallback for node::MakeCallback + - Introduce NanSetTemplate + - Introduce NanGetCurrentContext + - Introduce NanCompileScript and NanRunScript + - Introduce NanAdjustExternalMemory + - Introduce NanAddGCEpilogueCallback, NanAddGCPrologueCallback, NanRemoveGCEpilogueCallback, NanRemoveGCPrologueCallback + - Introduce NanGetHeapStatistics + - Rename NanAsyncWorker#SavePersistent() to SaveToPersistent() + +**0.8.0 Jan 9 2014** + + - NanDispose -> NanDisposePersistent, deprecate NanDispose + - Extract _NAN_*_RETURN_TYPE, pull up NAN_*() + +**0.7.1 Jan 9 2014** + + - Fixes to work against debug builds of Node + - Safer NanPersistentToLocal (avoid reinterpret_cast) + - Speed up common NanRawString case by only extracting flattened string when necessary + +**0.7.0 Dec 17 2013** + + - New no-arg form of NanCallback() constructor. + - NanCallback#Call takes Handle rather than Local + - Removed deprecated NanCallback#Run method, use NanCallback#Call instead + - Split off _NAN_*_ARGS_TYPE from _NAN_*_ARGS + - Restore (unofficial) Node 0.6 compatibility at NanCallback#Call() + - Introduce NanRawString() for char* (or appropriate void*) from v8::String + (replacement for NanFromV8String) + - Introduce NanCString() for null-terminated char* from v8::String + +**0.6.0 Nov 21 2013** + + - Introduce NanNewLocal(v8::Handle value) for use in place of + v8::Local::New(...) since v8 started requiring isolate in Node 0.11.9 + +**0.5.2 Nov 16 2013** + + - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public + +**0.5.1 Nov 12 2013** + + - Use node::MakeCallback() instead of direct v8::Function::Call() + +**0.5.0 Nov 11 2013** + + - Added @TooTallNate as collaborator + - New, much simpler, "include_dirs" for binding.gyp + - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros + +**0.4.4 Nov 2 2013** + + - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+ + +**0.4.3 Nov 2 2013** + + - Include node_object_wrap.h, removed from node.h for Node 0.11.8. + +**0.4.2 Nov 2 2013** + + - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for + Node 0.11.8 release. + +**0.4.1 Sep 16 2013** + + - Added explicit `#include ` as it was removed from node.h for v0.11.8 + +**0.4.0 Sep 2 2013** + + - Added NAN_INLINE and NAN_DEPRECATED and made use of them + - Added NanError, NanTypeError and NanRangeError + - Cleaned up code + +**0.3.2 Aug 30 2013** + + - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent + in NanAsyncWorker + +**0.3.1 Aug 20 2013** + + - fix "not all control paths return a value" compile warning on some platforms + +**0.3.0 Aug 19 2013** + + - Made NAN work with NPM + - Lots of fixes to NanFromV8String, pulling in features from new Node core + - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API + - Added optional error number argument for NanThrowError() + - Added NanInitPersistent() + - Added NanReturnNull() and NanReturnEmptyString() + - Added NanLocker and NanUnlocker + - Added missing scopes + - Made sure to clear disposed Persistent handles + - Changed NanAsyncWorker to allocate error messages on the heap + - Changed NanThrowError(Local) to NanThrowError(Handle) + - Fixed leak in NanAsyncWorker when errmsg is used + +**0.2.2 Aug 5 2013** + + - Fixed usage of undefined variable with node::BASE64 in NanFromV8String() + +**0.2.1 Aug 5 2013** + + - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for + NanFromV8String() + +**0.2.0 Aug 5 2013** + + - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR, + NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY + - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS, + _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS, + _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS, + _NAN_PROPERTY_QUERY_ARGS + - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer + - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT, + NAN_WEAK_CALLBACK_DATA, NanMakeWeak + - Renamed THROW_ERROR to _NAN_THROW_ERROR + - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*) + - Added NanBufferUse(char*, uint32_t) + - Added NanNewContextHandle(v8::ExtensionConfiguration*, + v8::Handle, v8::Handle) + - Fixed broken NanCallback#GetFunction() + - Added optional encoding and size arguments to NanFromV8String() + - Added NanGetPointerSafe() and NanSetPointerSafe() + - Added initial test suite (to be expanded) + - Allow NanUInt32OptionValue to convert any Number object + +**0.1.0 Jul 21 2013** + + - Added `NAN_GETTER`, `NAN_SETTER` + - Added `NanThrowError` with single Local argument + - Added `NanNewBufferHandle` with single uint32_t argument + - Added `NanHasInstance(Persistent&, Handle)` + - Added `Local NanCallback#GetFunction()` + - Added `NanCallback#Call(int, Local[])` + - Deprecated `NanCallback#Run(int, Local[])` in favour of Call diff --git a/node_modules/sqlite3/node_modules/nan/LICENSE b/node_modules/sqlite3/node_modules/nan/LICENSE new file mode 100644 index 0000000..d502e18 --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/LICENSE @@ -0,0 +1,46 @@ +Copyright 2013, NAN contributors: + - Rod Vagg + - Benjamin Byholm + - Trevor Norris + - Nathan Rajlich + - Brett Lawson + - Ben Noordhuis +(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/node_modules/sqlite3/node_modules/nan/README.md b/node_modules/sqlite3/node_modules/nan/README.md new file mode 100644 index 0000000..2904a38 --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/README.md @@ -0,0 +1,1054 @@ +Native Abstractions for Node.js +=============================== + +**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10 and 0.11, and eventually 0.12.** + +***Current version: 1.3.0*** + +*(See [nan.h](https://github.com/rvagg/nan/blob/master/CHANGELOG.md) for complete ChangeLog)* + +[![NPM](https://nodei.co/npm/nan.png?downloads=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6)](https://nodei.co/npm/nan/) + +[![Build Status](https://secure.travis-ci.org/rvagg/nan.png)](http://travis-ci.org/rvagg/nan) +[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan) + +Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.11/0.12, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle. + +This project also contains some helper utilities that make addon development a bit more pleasant. + + * **[News & Updates](#news)** + * **[Usage](#usage)** + * **[Example](#example)** + * **[API](#api)** + + +## News & Updates + +### Aug-2014: 1.3.0 release + +* `NanCString()` and `NanRawString()` have been deprecated in favour of new NanAsciiString, NanUtf8String and NanUcs2String. These classes manage the underlying memory for you in a safer way than just handing off an allocated array. You should now `*NanAsciiString(handle)` to access the raw `char` data, you can also allocate on the heap if you need to keep a reference. +* Two more NanMakeCallback overloads have been added to for parity with Node core. +* You can now `NanNew(std::string)` (use `NanNew(std::string&)` to pass by reference) +* NanSetTemplate, NanSetPrototypeTemplate and NanSetInstanceTemplate have been added. + +### May-2014: 1.1.0 release + +* We've deprecated `NanSymbol()`, you should just use `NanNew()` now. +* `NanNull()`, `NanUndefined()`, `NanTrue()`, `NanFalse()` all return `Local`s now. +* `nan_isolate` is gone, it was intended to be internal-only but if you were using it then you should switch to `v8::Isolate::GetCurrent()`. +* `NanNew()` has received some additional overload-love so you should be able to give it many kinds of values without specifying the ``. +* Lots of small fixes and additions to expand the V8 API coverage, *use the source, Luke*. + + +### May-2014: Major changes for V8 3.25 / Node 0.11.13 + +Node 0.11.11 and 0.11.12 were both broken releases for native add-ons, you simply can't properly compile against either of them for different reasons. But we now have a 0.11.13 release that jumps a couple of versions of V8 ahead and includes some more, major (traumatic) API changes. + +Because we are now nearing Node 0.12 and estimate that the version of V8 we are using in Node 0.11.13 will be close to the API we get for 0.12, we have taken the opportunity to not only *fix* NAN for 0.11.13 but make some major changes to improve the NAN API. + +We have **removed support for Node 0.11 versions prior to 0.11.13**. As usual, our tests are run against (and pass) the last 5 versions of Node 0.8 and Node 0.10. We also include Node 0.11.13 obviously. + +The major change is something that [Benjamin Byholm](kkoopa) has put many hours in to. We now have a fantastic new `NanNew(args)` interface for creating new `Local`s, this replaces `NanNewLocal()` and much more. If you look in [./nan.h](nan.h) you'll see a large number of overloaded versions of this method. In general you should be able to `NanNew(arguments)` for any type you want to make a `Local` from. This includes `Persistent` types, so we now have a `Local NanNew(const Persistent arg)` to replace `NanPersistentToLocal()`. + +We also now have `NanUndefined()`, `NanNull()`, `NanTrue()` and `NanFalse()`. Mainly because of the new requirement for an `Isolate` argument for each of the native V8 versions of this. + +V8 has now introduced an `EscapableHandleScope` from which you `scope.Escape(Local value)` to *return* a value from a one scope to another. This replaces the standard `HandleScope` and `scope.Close(Local value)`, although `HandleScope` still exists for when you don't need to return a handle to the caller. For NAN we are exposing it as `NanEscapableScope()` and `NanEscapeScope()`, while `NanScope()` is still how you create a new scope that doesn't need to return handles. For older versions of Node/V8, it'll still map to the older `HandleScope` functionality. + +`NanFromV8String()` was deprecated and has now been removed. You should use `NanCString()` or `NanRawString()` instead. + +Because `node::MakeCallback()` now takes an `Isolate`, and because it doesn't exist in older versions of Node, we've introduced `NanMakeCallback()`. You should *always* use this when calling a JavaScript function from C++. + +There's lots more, check out the Changelog in nan.h or look through [#86](https://github.com/rvagg/nan/pull/86) for all the gory details. + +### Dec-2013: NanCString and NanRawString + +Two new functions have been introduced to replace the functionality that's been provided by `NanFromV8String` until now. NanCString has sensible defaults so it's super easy to fetch a null-terminated c-style string out of a `v8::String`. `NanFromV8String` is still around and has defaults that allow you to pass a single handle to fetch a `char*` while `NanRawString` requires a little more attention to arguments. + +### Nov-2013: Node 0.11.9+ breaking V8 change + +The version of V8 that's shipping with Node 0.11.9+ has changed the signature for new `Local`s to: `v8::Local::New(isolate, value)`, i.e. introducing the `isolate` argument and therefore breaking all new `Local` declarations for previous versions. NAN 0.6+ now includes a `NanNewLocal(value)` that can be used in place to work around this incompatibility and maintain compatibility with 0.8->0.11.9+ (minus a few early 0.11 releases). + +For example, if you wanted to return a `null` on a callback you will have to change the argument from `v8::Local::New(v8::Null())` to `NanNewLocal(v8::Null())`. + +### Nov-2013: Change to binding.gyp `"include_dirs"` for NAN + +Inclusion of NAN in a project's binding.gyp is now greatly simplified. You can now just use `" +## Usage + +Simply add **NAN** as a dependency in the *package.json* of your Node addon: + +``` bash +$ npm install --save nan +``` + +Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include ` in your *.cpp* files: + +``` python +"include_dirs" : [ + "` when compiling your addon. + + +## Example + +See **[LevelDOWN](https://github.com/rvagg/node-leveldown/pull/48)** for a full example of **NAN** in use. + +For a simpler example, see the **[async pi estimation example](https://github.com/rvagg/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**. + +Compare to the current 0.10 version of this example, found in the [node-addon-examples](https://github.com/rvagg/node-addon-examples/tree/master/9_async_work) repository and also a 0.11 version of the same found [here](https://github.com/kkoopa/node-addon-examples/tree/5c01f58fc993377a567812597e54a83af69686d7/9_async_work). + +Note that there is no embedded version sniffing going on here and also the async work is made much simpler, see below for details on the `NanAsyncWorker` class. + +```c++ +// addon.cc +#include +#include +// ... + +using v8::FunctionTemplate; +using v8::Handle; +using v8::Object; +using v8::String; + +void InitAll(Handle exports) { + exports->Set(NanNew("calculateSync"), + NanNew(CalculateSync)->GetFunction()); + + exports->Set(NanNew("calculateAsync"), + NanNew(CalculateAsync)->GetFunction()); +} + +NODE_MODULE(addon, InitAll) +``` + +```c++ +// sync.h +#include +#include + +NAN_METHOD(CalculateSync); +``` + +```c++ +// sync.cc +#include +#include +#include "./sync.h" +// ... + +using v8::Number; + +// Simple synchronous access to the `Estimate()` function +NAN_METHOD(CalculateSync) { + NanScope(); + + // expect a number as the first argument + int points = args[0]->Uint32Value(); + double est = Estimate(points); + + NanReturnValue(NanNew(est)); +} +``` + +```c++ +// async.h +#include +#include + +NAN_METHOD(CalculateAsync); +``` + +```c++ +// async.cc +#include +#include +#include "./async.h" + +// ... + +using v8::Function; +using v8::Local; +using v8::Null; +using v8::Number; +using v8::Value; + +class PiWorker : public NanAsyncWorker { + public: + PiWorker(NanCallback *callback, int points) + : NanAsyncWorker(callback), points(points) {} + ~PiWorker() {} + + // Executed inside the worker-thread. + // It is not safe to access V8, or V8 data structures + // here, so everything we need for input and output + // should go on `this`. + void Execute () { + estimate = Estimate(points); + } + + // Executed when the async work is complete + // this function will be run inside the main event loop + // so it is safe to use V8 again + void HandleOKCallback () { + NanScope(); + + Local argv[] = { + NanNull() + , NanNew(estimate) + }; + + callback->Call(2, argv); + }; + + private: + int points; + double estimate; +}; + +// Asynchronous access to the `Estimate()` function +NAN_METHOD(CalculateAsync) { + NanScope(); + + int points = args[0]->Uint32Value(); + NanCallback *callback = new NanCallback(args[1].As()); + + NanAsyncQueueWorker(new PiWorker(callback, points)); + NanReturnUndefined(); +} +``` + + +## API + + * NAN_METHOD + * NAN_GETTER + * NAN_SETTER + * NAN_PROPERTY_GETTER + * NAN_PROPERTY_SETTER + * NAN_PROPERTY_ENUMERATOR + * NAN_PROPERTY_DELETER + * NAN_PROPERTY_QUERY + * NAN_INDEX_GETTER + * NAN_INDEX_SETTER + * NAN_INDEX_ENUMERATOR + * NAN_INDEX_DELETER + * NAN_INDEX_QUERY + * NAN_WEAK_CALLBACK + * NAN_DEPRECATED + * NAN_INLINE + * NanNew + * NanUndefined + * NanNull + * NanTrue + * NanFalse + * NanReturnValue + * NanReturnUndefined + * NanReturnNull + * NanReturnEmptyString + * NanScope + * NanEscapableScope + * NanEscapeScope + * NanLocker + * NanUnlocker + * NanGetInternalFieldPointer + * NanSetInternalFieldPointer + * NanObjectWrapHandle + * NanSymbol + * NanGetPointerSafe + * NanSetPointerSafe + * NanRawString + * NanCString + * NanAsciiString + * NanUtf8String + * NanUcs2String + * NanBooleanOptionValue + * NanUInt32OptionValue + * NanError, NanTypeError, NanRangeError + * NanThrowError, NanThrowTypeError, NanThrowRangeError, NanThrowError(Handle), NanThrowError(Handle, int) + * NanNewBufferHandle(char *, size_t, FreeCallback, void *), NanNewBufferHandle(char *, uint32_t), NanNewBufferHandle(uint32_t) + * NanBufferUse(char *, uint32_t) + * NanNewContextHandle + * NanGetCurrentContext + * NanHasInstance + * NanDisposePersistent + * NanAssignPersistent + * NanMakeWeakPersistent + * NanSetTemplate + * NanSetPrototypeTemplate + * NanSetInstanceTemplate + * NanMakeCallback + * NanCompileScript + * NanRunScript + * NanAdjustExternalMemory + * NanAddGCEpilogueCallback + * NanAddGCPrologueCallback + * NanRemoveGCEpilogueCallback + * NanRemoveGCPrologueCallback + * NanGetHeapStatistics + * NanCallback + * NanAsyncWorker + * NanAsyncQueueWorker + + +### NAN_METHOD(methodname) + +Use `NAN_METHOD` to define your V8 accessible methods: + +```c++ +// .h: +class Foo : public node::ObjectWrap { + ... + + static NAN_METHOD(Bar); + static NAN_METHOD(Baz); +} + + +// .cc: +NAN_METHOD(Foo::Bar) { + ... +} + +NAN_METHOD(Foo::Baz) { + ... +} +``` + +The reason for this macro is because of the method signature change in 0.11: + +```c++ +// 0.10 and below: +Handle name(const Arguments& args) + +// 0.11 and above +void name(const FunctionCallbackInfo& args) +``` + +The introduction of `FunctionCallbackInfo` brings additional complications: + + +### NAN_GETTER(methodname) + +Use `NAN_GETTER` to declare your V8 accessible getters. You get a `Local` `property` and an appropriately typed `args` object that can act like the `args` argument to a `NAN_METHOD` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_GETTER`. + + +### NAN_SETTER(methodname) + +Use `NAN_SETTER` to declare your V8 accessible setters. Same as `NAN_GETTER` but you also get a `Local` `value` object to work with. + + +### NAN_PROPERTY_GETTER(cbname) +Use `NAN_PROPERTY_GETTER` to declare your V8 accessible property getters. You get a `Local` `property` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_GETTER`. + + +### NAN_PROPERTY_SETTER(cbname) +Use `NAN_PROPERTY_SETTER` to declare your V8 accessible property setters. Same as `NAN_PROPERTY_GETTER` but you also get a `Local` `value` object to work with. + + +### NAN_PROPERTY_ENUMERATOR(cbname) +Use `NAN_PROPERTY_ENUMERATOR` to declare your V8 accessible property enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_PROPERTY_GETTER` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_ENUMERATOR`. + + +### NAN_PROPERTY_DELETER(cbname) +Use `NAN_PROPERTY_DELETER` to declare your V8 accessible property deleters. Same as `NAN_PROPERTY_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_DELETER`. + + +### NAN_PROPERTY_QUERY(cbname) +Use `NAN_PROPERTY_QUERY` to declare your V8 accessible property queries. Same as `NAN_PROPERTY_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_PROPERTY_QUERY`. + + +### NAN_INDEX_GETTER(cbname) +Use `NAN_INDEX_GETTER` to declare your V8 accessible index getters. You get a `uint32_t` `index` and an appropriately typed `args` object that can act similar to the `args` argument to a `NAN_METHOD` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_GETTER`. + + +### NAN_INDEX_SETTER(cbname) +Use `NAN_INDEX_SETTER` to declare your V8 accessible index setters. Same as `NAN_INDEX_GETTER` but you also get a `Local` `value` object to work with. + + +### NAN_INDEX_ENUMERATOR(cbname) +Use `NAN_INDEX_ENUMERATOR` to declare your V8 accessible index enumerators. You get an appropriately typed `args` object like the `args` argument to a `NAN_INDEX_GETTER` call. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_ENUMERATOR`. + + +### NAN_INDEX_DELETER(cbname) +Use `NAN_INDEX_DELETER` to declare your V8 accessible index deleters. Same as `NAN_INDEX_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_DELETER`. + + +### NAN_INDEX_QUERY(cbname) +Use `NAN_INDEX_QUERY` to declare your V8 accessible index queries. Same as `NAN_INDEX_GETTER`. + +You can use `NanReturnNull()`, `NanReturnEmptyString()`, `NanReturnUndefined()` and `NanReturnValue()` in a `NAN_INDEX_QUERY`. + + +### NAN_WEAK_CALLBACK(cbname) + +Use `NAN_WEAK_CALLBACK` to define your V8 WeakReference callbacks. There is an argument object `const _NanWeakCallbackData &data` allowing access to the weak object and the supplied parameter through its `GetValue` and `GetParameter` methods. You can even access the weak callback info object through the `GetCallbackInfo()`method, but you probably should not. `Revive()` keeps the weak object alive until the next GC round. + +```c++ +NAN_WEAK_CALLBACK(weakCallback) { + int *parameter = data.GetParameter(); + NanMakeCallback(NanGetCurrentContext()->Global(), data.GetValue(), 0, NULL); + if ((*parameter)++ == 0) { + data.Revive(); + } else { + delete parameter; + } +} +``` + + +### NAN_DEPRECATED +Declares a function as deprecated. + +```c++ +static NAN_DEPRECATED NAN_METHOD(foo) { + ... +} +``` + + +### NAN_INLINE +Inlines a function. + +```c++ +NAN_INLINE int foo(int bar) { + ... +} +``` + + +### Local<T> NanNew<T>( ... ) + +Use `NanNew` to construct almost all v8 objects and make new local handles. + +Note: Using NanNew with an std::string is possible, however, you should ensure +to use the overload version (`NanNew(stdString)`) rather than the template +version (`NanNew(stdString)`) as there is an unnecessary +performance penalty to using the template version because of the inability for +compilers to appropriately deduce to reference types on template specialization. + +```c++ +Local s = NanNew("value"); + +... + +Persistent o; + +... + +Local lo = NanNew(o); + +``` + + +### Local<Primitive> NanUndefined() + +Use instead of `Undefined()` + + +### Local<Primitive> NanNull() + +Use instead of `Null()` + + +### Local<Boolean> NanTrue() + +Use instead of `True()` + + +### Local<Boolean> NanFalse() + +Use instead of `False()` + + +### NanReturnValue(Handle<Value>) + +Use `NanReturnValue` when you want to return a value from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Bar) { + ... + + NanReturnValue(NanNew("FooBar!")); +} +``` + +No `return` statement required. + + +### NanReturnUndefined() + +Use `NanReturnUndefined` when you don't want to return anything from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Baz) { + ... + + NanReturnUndefined(); +} +``` + + +### NanReturnNull() + +Use `NanReturnNull` when you want to return `Null` from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Baz) { + ... + + NanReturnNull(); +} +``` + + +### NanReturnEmptyString() + +Use `NanReturnEmptyString` when you want to return an empty `String` from your V8 accessible method: + +```c++ +NAN_METHOD(Foo::Baz) { + ... + + NanReturnEmptyString(); +} +``` + + +### NanScope() + +The introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanScope()` necessary, use it in place of `HandleScope scope` when you do not wish to return handles (`Handle` or `Local`) to the surrounding scope (or in functions directly exposed to V8, as they do not return values in the normal sense): + +```c++ +NAN_METHOD(Foo::Bar) { + NanScope(); + + NanReturnValue(NanNew("FooBar!")); +} +``` + +This method is not directly exposed to V8, nor does it return a handle, so it uses an unescapable scope: + +```c++ +bool Foo::Bar() { + NanScope(); + + Local val = NanFalse(); + ... + return val->Value(); +} +``` + + +### NanEscapableScope() + +The separation of handle scopes into escapable and inescapable scopes makes `NanEscapableScope()` necessary, use it in place of `HandleScope scope` when you later wish to return a handle (`Handle` or `Local`) from the scope, this is for internal functions not directly exposed to V8: + +```c++ +Handle Foo::Bar() { + NanEscapableScope(); + + return NanEscapeScope(NanNew("FooBar!")); +} +``` + + +### Local<T> NanEscapeScope(Handle<T> value); +Use together with `NanEscapableScope` to escape the scope. Corresponds to `HandleScope::Close` or `EscapableHandleScope::Escape`. + + +### NanLocker() + +The introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanLocker()` necessary, use it in place of `Locker locker`: + +```c++ +NAN_METHOD(Foo::Bar) { + NanLocker(); + ... + NanUnlocker(); +} +``` + + +### NanUnlocker() + +The introduction of `isolate` references for many V8 calls in Node 0.11 makes `NanUnlocker()` necessary, use it in place of `Unlocker unlocker`: + +```c++ +NAN_METHOD(Foo::Bar) { + NanLocker(); + ... + NanUnlocker(); +} +``` + + +### void * NanGetInternalFieldPointer(Handle<Object>, int) + +Gets a pointer to the internal field with at `index` from a V8 `Object` handle. + +```c++ +Local obj; +... +NanGetInternalFieldPointer(obj, 0); +``` + +### void NanSetInternalFieldPointer(Handle<Object>, int, void *) + +Sets the value of the internal field at `index` on a V8 `Object` handle. + +```c++ +static Persistent dataWrapperCtor; +... +Local wrapper = NanNew(dataWrapperCtor)->NewInstance(); +NanSetInternalFieldPointer(wrapper, 0, this); +``` + + +### Local<Object> NanObjectWrapHandle(Object) + +When you want to fetch the V8 object handle from a native object you've wrapped with Node's `ObjectWrap`, you should use `NanObjectWrapHandle`: + +```c++ +NanObjectWrapHandle(iterator)->Get(NanNew("end")) +``` + + +### Local<String> NanSymbol(const char *) + +Deprecated. Use `NanNew` instead. +Use to create string symbol objects (i.e. `v8::String::NewSymbol(x)`), for getting and setting object properties, or names of objects. + +```c++ +bool foo = false; +if (obj->Has(NanNew("foo"))) + foo = optionsObj->Get(NanNew("foo"))->BooleanValue() +``` + + +### Type NanGetPointerSafe(Type *[, Type]) + +A helper for getting values from optional pointers. If the pointer is `NULL`, the function returns the optional default value, which defaults to `0`. Otherwise, the function returns the value the pointer points to. + +```c++ +char *plugh(uint32_t *optional) { + char res[] = "xyzzy"; + uint32_t param = NanGetPointerSafe(optional, 0x1337); + switch (param) { + ... + } + NanSetPointerSafe(optional, 0xDEADBEEF); +} +``` + + +### bool NanSetPointerSafe(Type *, Type) + +A helper for setting optional argument pointers. If the pointer is `NULL`, the function simply returns `false`. Otherwise, the value is assigned to the variable the pointer points to. + +```c++ +const char *plugh(size_t *outputsize) { + char res[] = "xyzzy"; + if !(NanSetPointerSafe(outputsize, strlen(res) + 1)) { + ... + } + + ... +} +``` + + +### void* NanRawString(Handle<Value>, enum Nan::Encoding, size_t *, void *, size_t, int) + +Deprecated. Use something else. + +When you want to convert a V8 `String` to a `char*` buffer, use `NanRawString`. You have to supply an encoding as well as a pointer to a variable that will be assigned the number of bytes in the returned string. It is also possible to supply a buffer and its length to the function in order not to have a new buffer allocated. The final argument allows setting `String::WriteOptions`. +Just remember that you'll end up with an object that you'll need to `delete[]` at some point unless you supply your own buffer: + +```c++ +size_t count; +void* decoded = NanRawString(args[1], Nan::BASE64, &count, NULL, 0, String::HINT_MANY_WRITES_EXPECTED); +... +delete[] reinterpret_cast(decoded); +``` + + +### char* NanCString(Handle<Value>, size_t *[, char *, size_t, int]) + +Deprecated. Use `NanUtf8String` instead. + +When you want to convert a V8 `String` to a null-terminated C `char*` use `NanCString`. The resulting `char*` will be UTF-8-encoded, and you need to supply a pointer to a variable that will be assigned the number of bytes in the returned string. It is also possible to supply a buffer and its length to the function in order not to have a new buffer allocated. The final argument allows optionally setting `String::WriteOptions`, which default to `v8::String::NO_OPTIONS`. +Just remember that you'll end up with an object that you'll need to `delete[]` at some point unless you supply your own buffer: + +```c++ +size_t count; +char* name = NanCString(args[0], &count); +... +delete[] name; +``` + + +### NanAsciiString + +Convert a `String` to zero-terminated, Ascii-encoded `char *`. + +```c++ +NAN_METHOD(foo) { + NanScope(); + NanReturnValue(NanNew(*NanAsciiString(arg[0]))); +} +``` + + +### NanUtf8String + +Convert a `String` to zero-terminated, Utf8-encoded `char *`. + +```c++ +NAN_METHOD(foo) { + NanScope(); + NanReturnValue(NanNew(*NanUtf8String(arg[0]))); +} +``` + + +### NanUcs2String + +Convert a `String` to zero-terminated, Ucs2-encoded `uint16_t *`. + +```c++ +NAN_METHOD(foo) { + NanScope(); + NanReturnValue(NanNew(*NanUcs2String(arg[0]))); +} +``` + + +### bool NanBooleanOptionValue(Handle<Value>, Handle<String>[, bool]) + +When you have an "options" object that you need to fetch properties from, boolean options can be fetched with this pair. They check first if the object exists (`IsEmpty`), then if the object has the given property (`Has`) then they get and convert/coerce the property to a `bool`. + +The optional last parameter is the *default* value, which is `false` if left off: + +```c++ +// `foo` is false unless the user supplies a truthy value for it +bool foo = NanBooleanOptionValue(optionsObj, NanNew("foo")); +// `bar` is true unless the user supplies a falsy value for it +bool bar = NanBooleanOptionValueDefTrue(optionsObj, NanNew("bar"), true); +``` + + +### uint32_t NanUInt32OptionValue(Handle<Value>, Handle<String>, uint32_t) + +Similar to `NanBooleanOptionValue`, use `NanUInt32OptionValue` to fetch an integer option from your options object. Can be any kind of JavaScript `Number` and it will be coerced to an unsigned 32-bit integer. + +Requires all 3 arguments as a default is not optional: + +```c++ +uint32_t count = NanUInt32OptionValue(optionsObj, NanNew("count"), 1024); +``` + + +### NanError(message), NanTypeError(message), NanRangeError(message) + +For making `Error`, `TypeError` and `RangeError` objects. + +```c++ +Local res = NanError("you must supply a callback argument"); +``` + + +### NanThrowError(message), NanThrowTypeError(message), NanThrowRangeError(message), NanThrowError(Local<Value>), NanThrowError(Local<Value>, int) + +For throwing `Error`, `TypeError` and `RangeError` objects. + +```c++ +NanThrowError("you must supply a callback argument"); +``` + +Can also handle any custom object you may want to throw. If used with the error code argument, it will add the supplied error code to the error object as a property called `code`. + + +### Local<Object> NanNewBufferHandle(char *, uint32_t), Local<Object> NanNewBufferHandle(uint32_t) + +The `Buffer` API has changed a little in Node 0.11, this helper provides consistent access to `Buffer` creation: + +```c++ +NanNewBufferHandle((char*)value.data(), value.size()); +``` + +Can also be used to initialize a `Buffer` with just a `size` argument. + +Can also be supplied with a `NanFreeCallback` and a hint for the garbage collector. + + +### Local<Object> NanBufferUse(char*, uint32_t) + +`Buffer::New(char*, uint32_t)` prior to 0.11 would make a copy of the data. +While it was possible to get around this, it required a shim by passing a +callback. So the new API `Buffer::Use(char*, uint32_t)` was introduced to remove +needing to use this shim. + +`NanBufferUse` uses the `char*` passed as the backing data, and will free the +memory automatically when the weak callback is called. Keep this in mind, as +careless use can lead to "double free or corruption" and other cryptic failures. + + +### bool NanHasInstance(Persistent<FunctionTemplate>&, Handle<Value>) + +Can be used to check the type of an object to determine it is of a particular class you have already defined and have a `Persistent` handle for. + + +### Local<Context> NanNewContextHandle([ExtensionConfiguration*, Handle<ObjectTemplate>, Handle<Value>]) +Creates a new `Local` handle. + +```c++ +Local ftmpl = NanNew(); +Local otmpl = ftmpl->InstanceTemplate(); +Local ctx = NanNewContextHandle(NULL, otmpl); +``` + + +### Local<Context> NanGetCurrentContext() + +Gets the current context. + +```c++ +Local ctx = NanGetCurrentContext(); +``` + + +### void NanDisposePersistent(Persistent<T> &) + +Use `NanDisposePersistent` to dispose a `Persistent` handle. + +```c++ +NanDisposePersistent(persistentHandle); +``` + + +### NanAssignPersistent(handle, object) + +Use `NanAssignPersistent` to assign a non-`Persistent` handle to a `Persistent` one. You can no longer just declare a `Persistent` handle and assign directly to it later, you have to `Reset` it in Node 0.11, so this makes it easier. + +In general it is now better to place anything you want to protect from V8's garbage collector as properties of a generic `Object` and then assign that to a `Persistent`. This works in older versions of Node also if you use `NanAssignPersistent`: + +```c++ +Persistent persistentHandle; + +... + +Local obj = NanNew(); +obj->Set(NanNew("key"), keyHandle); // where keyHandle might be a Local +NanAssignPersistent(persistentHandle, obj) +``` + + +### _NanWeakCallbackInfo<T, P>* NanMakeWeakPersistent(Handle<T>, P*, _NanWeakCallbackInfo<T, P>::Callback) + +Creates a weak persistent handle with the supplied parameter and `NAN_WEAK_CALLBACK`. + +```c++ +NAN_WEAK_CALLBACK(weakCallback) { + +... + +} + +Local func; + +... + +int *parameter = new int(0); +NanMakeWeakPersistent(func, parameter, &weakCallback); +``` + + +### NanSetTemplate(templ, name, value [, attributes]) + +Use to add properties on object and function templates. + + +### NanSetPrototypeTemplate(templ, name, value [, attributes]) + +Use to add prototype properties on function templates. + + +### NanSetInstanceTemplate(templ, name, value [, attributes]) + +Use to add instance properties on function templates. + + +### NanMakeCallback(target, func, argc, argv) + +Use instead of `node::MakeCallback` to call javascript functions. This is the only proper way of calling functions. + + +### NanCompileScript(Handle s [, const ScriptOrigin& origin]) + +Use to create new scripts bound to the current context. + + +### NanRunScript(script) + +Use to run both bound and unbound scripts. + + +### NanAdjustExternalMemory(int change_in_bytes) + +Simply does `AdjustAmountOfExternalAllocatedMemory`, note that the argument and returned value have type `int`. + + +### NanAddGCEpilogueCallback(GCEpilogueCallback callback, GCType gc_type_filter=kGCTypeAll) + +Simply does `AddGCEpilogueCallback` + + +### NanAddGCPrologueCallback(GCPrologueCallback callback, GCType gc_type_filter=kGCTypeAll) + +Simply does `AddGCPrologueCallback` + + +### NanRemoveGCEpilogueCallback(GCEpilogueCallback callback) + +Simply does `RemoveGCEpilogueCallback` + + +### NanRemoveGCPrologueCallback(GCPrologueCallback callback) + +Simply does `RemoveGCPrologueCallback` + + +### NanGetHeapStatistics(HeapStatistics *heap_statistics) + +Simply does `GetHeapStatistics` + + +### NanCallback + +Because of the difficulties imposed by the changes to `Persistent` handles in V8 in Node 0.11, creating `Persistent` versions of your `Handle` is annoyingly tricky. `NanCallback` makes it easier by taking your handle, making it persistent until the `NanCallback` is deleted and even providing a handy `Call()` method to fetch and execute the callback `Function`. + +```c++ +Local callbackHandle = args[0].As(); +NanCallback *callback = new NanCallback(callbackHandle); +// pass `callback` around and it's safe from GC until you: +delete callback; +``` + +You can execute the callback like so: + +```c++ +// no arguments: +callback->Call(0, NULL); + +// an error argument: +Handle argv[] = { + NanError(NanNew("fail!")) +}; +callback->Call(1, argv); + +// a success argument: +Handle argv[] = { + NanNull(), + NanNew("w00t!") +}; +callback->Call(2, argv); +``` + +`NanCallback` also has a `Local GetCallback()` method that you can use +to fetch a local handle to the underlying callback function, as well as a +`void SetFunction(Handle)` for setting the callback on the +`NanCallback`. You can check if a `NanCallback` is empty with the `bool IsEmpty()` method. Additionally a generic constructor is available for using +`NanCallback` without performing heap allocations. + + +### NanAsyncWorker + +`NanAsyncWorker` is an abstract class that you can subclass to have much of the annoying async queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the async work is in progress. + +See a rough outline of the implementation: + +```c++ +class NanAsyncWorker { +public: + NanAsyncWorker (NanCallback *callback); + + // Clean up persistent handles and delete the *callback + virtual ~NanAsyncWorker (); + + // Check the `ErrorMessage()` and call HandleOKCallback() + // or HandleErrorCallback depending on whether it has been set or not + virtual void WorkComplete (); + + // You must implement this to do some async work. If there is an + // error then use `SetErrorMessage()` to set an error message and the callback will + // be passed that string in an Error object + virtual void Execute (); + + // Save a V8 object in a Persistent handle to protect it from GC + void SaveToPersistent(const char *key, Local &obj); + + // Fetch a stored V8 object (don't call from within `Execute()`) + Local GetFromPersistent(const char *key); + + // Get the error message (or NULL) + const char *ErrorMessage(); + + // Set an error message + void SetErrorMessage(const char *msg); + +protected: + // Default implementation calls the callback function with no arguments. + // Override this to return meaningful data + virtual void HandleOKCallback (); + + // Default implementation calls the callback function with an Error object + // wrapping the `errmsg` string + virtual void HandleErrorCallback (); +}; +``` + + +### NanAsyncQueueWorker(NanAsyncWorker *) + +`NanAsyncQueueWorker` will run a `NanAsyncWorker` asynchronously via libuv. Both the *execute* and *after_work* steps are taken care of for you—most of the logic for this is embedded in `NanAsyncWorker`. + +### Contributors + +NAN is only possible due to the excellent work of the following contributors: + + + + + + + + +
    Rod VaggGitHub/rvaggTwitter/@rvagg
    Benjamin ByholmGitHub/kkoopa-
    Trevor NorrisGitHub/trevnorrisTwitter/@trevnorris
    Nathan RajlichGitHub/TooTallNateTwitter/@TooTallNate
    Brett LawsonGitHub/brett19Twitter/@brett19x
    Ben NoordhuisGitHub/bnoordhuisTwitter/@bnoordhuis
    + +Licence & copyright +----------------------- + +Copyright (c) 2014 NAN contributors (listed above). + +Native Abstractions for Node.js is licensed under an MIT +no-false-attribs license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/sqlite3/node_modules/nan/appveyor.yml b/node_modules/sqlite3/node_modules/nan/appveyor.yml new file mode 100644 index 0000000..657eed6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/appveyor.yml @@ -0,0 +1,32 @@ +# http://www.appveyor.com/docs/appveyor-yml + +# Test against these versions of Node.js. +environment: + matrix: + - nodejs_version: "0.8" + - nodejs_version: "0.10" + - nodejs_version: "0.11" + +# Install scripts. (runs after repo cloning) +install: + # Get the latest stable version of Node 0.STABLE.latest + - npm install npm + - move node_modules npm + - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) + # Typical npm stuff. + - npm/.bin/npm install + - npm/.bin/npm run rebuild-tests + +# Post-install test scripts. +test_script: + # Output useful info for debugging. + - node --version + - npm --version + - cmd: npm test + +# Don't actually build. +build: off + +# Set build version format here instead of in the admin panel. +version: "{build}" + diff --git a/node_modules/sqlite3/node_modules/nan/include_dirs.js b/node_modules/sqlite3/node_modules/nan/include_dirs.js new file mode 100644 index 0000000..4f1dfb4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/include_dirs.js @@ -0,0 +1 @@ +console.log(require('path').relative('.', __dirname)); diff --git a/node_modules/sqlite3/node_modules/nan/nan.h b/node_modules/sqlite3/node_modules/nan/nan.h new file mode 100644 index 0000000..063de4e --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/nan.h @@ -0,0 +1,2331 @@ +/********************************************************************************** + * NAN - Native Abstractions for Node.js + * + * Copyright (c) 2014 NAN contributors: + * - Rod Vagg + * - Benjamin Byholm + * - Trevor Norris + * - Nathan Rajlich + * - Brett Lawson + * - Ben Noordhuis + * + * MIT +no-false-attribs License + * + * Version 1.3.0: current Node unstable: 0.11.13, Node stable: 0.10.30 + * + * See https://github.com/rvagg/nan for the latest update to this file + **********************************************************************************/ + +#ifndef NAN_H_ +#define NAN_H_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(__GNUC__) && !defined(DEBUG) +# define NAN_INLINE inline __attribute__((always_inline)) +#elif defined(_MSC_VER) && !defined(DEBUG) +# define NAN_INLINE __forceinline +#else +# define NAN_INLINE inline +#endif + +#if defined(__GNUC__) && !V8_DISABLE_DEPRECATIONS +# define NAN_DEPRECATED __attribute__((deprecated)) +#elif defined(_MSC_VER) && !V8_DISABLE_DEPRECATIONS +# define NAN_DEPRECATED __declspec(deprecated) +#else +# define NAN_DEPRECATED +#endif + +// some generic helpers + +template NAN_INLINE bool NanSetPointerSafe( + T *var + , T val +) { + if (var) { + *var = val; + return true; + } else { + return false; + } +} + +template NAN_INLINE T NanGetPointerSafe( + T *var + , T fallback = reinterpret_cast(0) +) { + if (var) { + return *var; + } else { + return fallback; + } +} + +NAN_INLINE bool NanBooleanOptionValue( + v8::Local optionsObj + , v8::Handle opt, bool def +) { + if (def) { + return optionsObj.IsEmpty() + || !optionsObj->Has(opt) + || optionsObj->Get(opt)->BooleanValue(); + } else { + return !optionsObj.IsEmpty() + && optionsObj->Has(opt) + && optionsObj->Get(opt)->BooleanValue(); + } +} + +NAN_INLINE bool NanBooleanOptionValue( + v8::Local optionsObj + , v8::Handle opt +) { + return NanBooleanOptionValue(optionsObj, opt, false); +} + +NAN_INLINE uint32_t NanUInt32OptionValue( + v8::Local optionsObj + , v8::Handle opt + , uint32_t def +) { + return !optionsObj.IsEmpty() + && optionsObj->Has(opt) + && optionsObj->Get(opt)->IsNumber() + ? optionsObj->Get(opt)->Uint32Value() + : def; +} + +#if (NODE_MODULE_VERSION > 0x000B) +// Node 0.11+ (0.11.3 and below won't compile with these) + +# define _NAN_METHOD_ARGS_TYPE const v8::FunctionCallbackInfo& +# define _NAN_METHOD_ARGS _NAN_METHOD_ARGS_TYPE args +# define _NAN_METHOD_RETURN_TYPE void + +# define _NAN_GETTER_ARGS_TYPE const v8::PropertyCallbackInfo& +# define _NAN_GETTER_ARGS _NAN_GETTER_ARGS_TYPE args +# define _NAN_GETTER_RETURN_TYPE void + +# define _NAN_SETTER_ARGS_TYPE const v8::PropertyCallbackInfo& +# define _NAN_SETTER_ARGS _NAN_SETTER_ARGS_TYPE args +# define _NAN_SETTER_RETURN_TYPE void + +# define _NAN_PROPERTY_GETTER_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_PROPERTY_GETTER_ARGS _NAN_PROPERTY_GETTER_ARGS_TYPE args +# define _NAN_PROPERTY_GETTER_RETURN_TYPE void + +# define _NAN_PROPERTY_SETTER_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_PROPERTY_SETTER_ARGS _NAN_PROPERTY_SETTER_ARGS_TYPE args +# define _NAN_PROPERTY_SETTER_RETURN_TYPE void + +# define _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_PROPERTY_ENUMERATOR_ARGS _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE args +# define _NAN_PROPERTY_ENUMERATOR_RETURN_TYPE void + +# define _NAN_PROPERTY_DELETER_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_PROPERTY_DELETER_ARGS \ + _NAN_PROPERTY_DELETER_ARGS_TYPE args +# define _NAN_PROPERTY_DELETER_RETURN_TYPE void + +# define _NAN_PROPERTY_QUERY_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_PROPERTY_QUERY_ARGS _NAN_PROPERTY_QUERY_ARGS_TYPE args +# define _NAN_PROPERTY_QUERY_RETURN_TYPE void + +# define _NAN_INDEX_GETTER_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_INDEX_GETTER_ARGS _NAN_INDEX_GETTER_ARGS_TYPE args +# define _NAN_INDEX_GETTER_RETURN_TYPE void + +# define _NAN_INDEX_SETTER_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_INDEX_SETTER_ARGS _NAN_INDEX_SETTER_ARGS_TYPE args +# define _NAN_INDEX_SETTER_RETURN_TYPE void + +# define _NAN_INDEX_ENUMERATOR_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_INDEX_ENUMERATOR_ARGS _NAN_INDEX_ENUMERATOR_ARGS_TYPE args +# define _NAN_INDEX_ENUMERATOR_RETURN_TYPE void + +# define _NAN_INDEX_DELETER_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_INDEX_DELETER_ARGS _NAN_INDEX_DELETER_ARGS_TYPE args +# define _NAN_INDEX_DELETER_RETURN_TYPE void + +# define _NAN_INDEX_QUERY_ARGS_TYPE \ + const v8::PropertyCallbackInfo& +# define _NAN_INDEX_QUERY_ARGS _NAN_INDEX_QUERY_ARGS_TYPE args +# define _NAN_INDEX_QUERY_RETURN_TYPE void + + typedef v8::FunctionCallback NanFunctionCallback; + + template + NAN_INLINE v8::Local NanNew() { + return T::New(v8::Isolate::GetCurrent()); + } + + template + NAN_INLINE v8::Local NanNew(P arg1) { + return T::New(v8::Isolate::GetCurrent(), arg1); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Handle receiver + , int argc + , v8::Handle argv[] = 0) { + return v8::Signature::New(v8::Isolate::GetCurrent(), receiver, argc, argv); + } + + template + NAN_INLINE v8::Local NanNew( + NanFunctionCallback callback + , v8::Handle data = v8::Handle() + , v8::Handle signature = v8::Handle()) { + return T::New(v8::Isolate::GetCurrent(), callback, data, signature); + } + + template + NAN_INLINE v8::Local NanNew(v8::Handle arg1) { + return v8::Local::New(v8::Isolate::GetCurrent(), arg1); + } + + template + NAN_INLINE v8::Local NanNew(const v8::Persistent &arg1) { + return v8::Local::New(v8::Isolate::GetCurrent(), arg1); + } + + template + NAN_INLINE v8::Local NanNew(P arg1, int arg2) { + return T::New(v8::Isolate::GetCurrent(), arg1, arg2); + } + + template<> + NAN_INLINE v8::Local NanNew() { + return v8::Array::New(v8::Isolate::GetCurrent()); + } + + template<> + NAN_INLINE v8::Local NanNew(int length) { + return v8::Array::New(v8::Isolate::GetCurrent(), length); + } + + template<> + NAN_INLINE v8::Local NanNew(double time) { + return v8::Date::New(v8::Isolate::GetCurrent(), time).As(); + } + + template<> + NAN_INLINE v8::Local NanNew(int time) { + return v8::Date::New(v8::Isolate::GetCurrent(), time).As(); + } + + typedef v8::UnboundScript NanUnboundScript; + typedef v8::Script NanBoundScript; + + template + NAN_INLINE v8::Local NanNew( + P s + , const v8::ScriptOrigin& origin + ) { + v8::ScriptCompiler::Source source(s, origin); + return v8::ScriptCompiler::CompileUnbound( + v8::Isolate::GetCurrent(), &source); + } + + template<> + NAN_INLINE v8::Local NanNew( + v8::Local s + ) { + v8::ScriptCompiler::Source source(s); + return v8::ScriptCompiler::CompileUnbound( + v8::Isolate::GetCurrent(), &source); + } + + template<> + NAN_INLINE v8::Local NanNew(bool value) { + return v8::BooleanObject::New(value).As(); + } + + template<> + NAN_INLINE v8::Local + NanNew >( + v8::Local value) { + return v8::StringObject::New(value).As(); + } + + template<> + NAN_INLINE v8::Local + NanNew >( + v8::Handle value) { + return v8::StringObject::New(value).As(); + } + + template<> + NAN_INLINE v8::Local NanNew(double val) { + return v8::NumberObject::New( + v8::Isolate::GetCurrent(), val).As(); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Handle pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Local pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Handle pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Local pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template<> + NAN_INLINE v8::Local NanNew(int32_t val) { + return v8::Uint32::NewFromUnsigned( + v8::Isolate::GetCurrent(), val)->ToUint32(); + } + + template<> + NAN_INLINE v8::Local NanNew(uint32_t val) { + return v8::Uint32::NewFromUnsigned( + v8::Isolate::GetCurrent(), val)->ToUint32(); + } + + template<> + NAN_INLINE v8::Local NanNew(int32_t val) { + return v8::Int32::New(v8::Isolate::GetCurrent(), val)->ToInt32(); + } + + template<> + NAN_INLINE v8::Local NanNew(uint32_t val) { + return v8::Int32::New(v8::Isolate::GetCurrent(), val)->ToInt32(); + } + + template<> + NAN_INLINE v8::Local NanNew( + char *arg + , int length) { + return v8::String::NewFromUtf8( + v8::Isolate::GetCurrent() + , arg + , v8::String::kNormalString + , length); + } + + template<> + NAN_INLINE v8::Local NanNew( + const char *arg + , int length) { + return v8::String::NewFromUtf8( + v8::Isolate::GetCurrent() + , arg + , v8::String::kNormalString + , length); + } + + template<> + NAN_INLINE v8::Local NanNew(char *arg) { + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), arg); + } + + template<> + NAN_INLINE v8::Local NanNew( + const char *arg) { + return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), arg); + } + + template<> + NAN_INLINE v8::Local NanNew( + uint8_t *arg + , int length) { + return v8::String::NewFromOneByte( + v8::Isolate::GetCurrent() + , arg + , v8::String::kNormalString + , length); + } + + template<> + NAN_INLINE v8::Local NanNew( + const uint8_t *arg + , int length) { + return v8::String::NewFromOneByte( + v8::Isolate::GetCurrent() + , arg + , v8::String::kNormalString + , length); + } + + template<> + NAN_INLINE v8::Local NanNew(uint8_t *arg) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), arg); + } + + template<> + NAN_INLINE v8::Local NanNew( + const uint8_t *arg) { + return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), arg); + } + + template<> + NAN_INLINE v8::Local NanNew( + uint16_t *arg + , int length) { + return v8::String::NewFromTwoByte( + v8::Isolate::GetCurrent() + , arg + , v8::String::kNormalString + , length); + } + + template<> + NAN_INLINE v8::Local NanNew( + const uint16_t *arg + , int length) { + return v8::String::NewFromTwoByte( + v8::Isolate::GetCurrent() + , arg + , v8::String::kNormalString + , length); + } + template<> + NAN_INLINE v8::Local NanNew( + uint16_t *arg) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), arg); + } + + template<> + NAN_INLINE v8::Local NanNew( + const uint16_t *arg) { + return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), arg); + } + + template<> + NAN_INLINE v8::Local NanNew( + std::string arg) { + return NanNew(arg.c_str(), arg.size()); + } + + template<> + NAN_INLINE v8::Local NanNew() { + return v8::String::Empty(v8::Isolate::GetCurrent()); + } + + NAN_INLINE v8::Local NanNew(const char* arg, int length = -1) { + return NanNew(arg, length); + } + + NAN_INLINE v8::Local NanNew( + const uint8_t* arg + , int length = -1) { + return NanNew(arg, length); + } + + NAN_INLINE v8::Local NanNew( + const uint16_t* arg + , int length = -1) { + return NanNew(arg, length); + } + + NAN_INLINE v8::Local NanNew( + const std::string& arg) { + return NanNew(arg.c_str(), arg.size()); + } + + NAN_INLINE v8::Local NanNew(double val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew(int val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew(unsigned int val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew(bool val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew( + v8::String::ExternalStringResource *resource) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), resource); + } + + NAN_INLINE v8::Local NanNew( + v8::String::ExternalAsciiStringResource *resource) { + return v8::String::NewExternal(v8::Isolate::GetCurrent(), resource); + } + +# define NanScope() v8::HandleScope scope(v8::Isolate::GetCurrent()) +# define NanEscapableScope() \ + v8::EscapableHandleScope scope(v8::Isolate::GetCurrent()) + + template + NAN_INLINE v8::Local _NanEscapeScopeHelper(v8::Handle val) { + return NanNew(val); + } + + template + NAN_INLINE v8::Local _NanEscapeScopeHelper(v8::Local val) { + return val; + } + +# define NanEscapeScope(val) scope.Escape(_NanEscapeScopeHelper(val)) +# define NanLocker() v8::Locker locker(v8::Isolate::GetCurrent()) +# define NanUnlocker() v8::Unlocker unlocker(v8::Isolate::GetCurrent()) +# define NanReturnValue(value) return args.GetReturnValue().Set(value) +# define NanReturnUndefined() return +# define NanReturnNull() return args.GetReturnValue().SetNull() +# define NanReturnEmptyString() return args.GetReturnValue().SetEmptyString() + +# define NanObjectWrapHandle(obj) obj->handle() + + NAN_INLINE v8::Local NanUndefined() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::Undefined(v8::Isolate::GetCurrent()))); + } + + NAN_INLINE v8::Local NanNull() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::Null(v8::Isolate::GetCurrent()))); + } + + NAN_INLINE v8::Local NanTrue() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::True(v8::Isolate::GetCurrent()))); + } + + NAN_INLINE v8::Local NanFalse() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::False(v8::Isolate::GetCurrent()))); + } + + NAN_INLINE int NanAdjustExternalMemory(int bc) { + return static_cast( + v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc)); + } + + NAN_INLINE void NanSetTemplate( + v8::Handle templ + , const char *name + , v8::Handle value) { + templ->Set(v8::Isolate::GetCurrent(), name, value); + } + + NAN_INLINE void NanSetTemplate( + v8::Handle templ + , v8::Handle name + , v8::Handle value + , v8::PropertyAttribute attributes) { + templ->Set(name, value, attributes); + } + + NAN_INLINE v8::Local NanGetCurrentContext() { + return v8::Isolate::GetCurrent()->GetCurrentContext(); + } + + NAN_INLINE void* NanGetInternalFieldPointer( + v8::Handle object + , int index) { + return object->GetAlignedPointerFromInternalField(index); + } + + NAN_INLINE void NanSetInternalFieldPointer( + v8::Handle object + , int index + , void* value) { + object->SetAlignedPointerInInternalField(index, value); + } + + NAN_INLINE void NanAddGCEpilogueCallback( + v8::Isolate::GCEpilogueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter); + } + + NAN_INLINE void NanRemoveGCEpilogueCallback( + v8::Isolate::GCEpilogueCallback callback) { + v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback); + } + + NAN_INLINE void NanAddGCPrologueCallback( + v8::Isolate::GCPrologueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter); + } + + NAN_INLINE void NanRemoveGCPrologueCallback( + v8::Isolate::GCPrologueCallback callback) { + v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback); + } + + NAN_INLINE void NanGetHeapStatistics( + v8::HeapStatistics *heap_statistics) { + v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics); + } + + NAN_DEPRECATED NAN_INLINE v8::Local NanSymbol( + const char* data, int length = -1) { + return NanNew(data, length); + } + + template + NAN_INLINE void NanAssignPersistent( + v8::Persistent& handle + , v8::Handle obj) { + handle.Reset(v8::Isolate::GetCurrent(), obj); + } + + template + NAN_INLINE void NanAssignPersistent( + v8::Persistent& handle + , const v8::Persistent& obj) { + handle.Reset(v8::Isolate::GetCurrent(), obj); + } + + template + class _NanWeakCallbackData; + + template + struct _NanWeakCallbackInfo { + typedef void (*Callback)(const _NanWeakCallbackData& data); + NAN_INLINE _NanWeakCallbackInfo(v8::Handle handle, P* param, Callback cb) + : parameter(param), callback(cb) { + NanAssignPersistent(persistent, handle); + } + + NAN_INLINE ~_NanWeakCallbackInfo() { + persistent.Reset(); + } + + P* const parameter; + Callback const callback; + v8::Persistent persistent; + }; + + template + class _NanWeakCallbackData { + public: + NAN_INLINE _NanWeakCallbackData(_NanWeakCallbackInfo *info) + : info_(info) { } + + NAN_INLINE v8::Local GetValue() const { + return NanNew(info_->persistent); + } + + NAN_INLINE P* GetParameter() const { return info_->parameter; } + + NAN_INLINE bool IsNearDeath() const { + return info_->persistent.IsNearDeath(); + } + + NAN_INLINE void Revive() const; + + NAN_INLINE _NanWeakCallbackInfo* GetCallbackInfo() const { + return info_; + } + + NAN_DEPRECATED NAN_INLINE void Dispose() const { + } + + private: + _NanWeakCallbackInfo* info_; + }; + + template + static void _NanWeakCallbackDispatcher( + const v8::WeakCallbackData > &data) { + _NanWeakCallbackInfo *info = data.GetParameter(); + _NanWeakCallbackData wcbd(info); + info->callback(wcbd); + if (wcbd.IsNearDeath()) { + delete wcbd.GetCallbackInfo(); + } + } + + template + NAN_INLINE void _NanWeakCallbackData::Revive() const { + info_->persistent.SetWeak(info_, &_NanWeakCallbackDispatcher); + } + +template +NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( + v8::Handle handle + , P* parameter + , typename _NanWeakCallbackInfo::Callback callback) { + _NanWeakCallbackInfo *cbinfo = + new _NanWeakCallbackInfo(handle, parameter, callback); + cbinfo->persistent.SetWeak(cbinfo, &_NanWeakCallbackDispatcher); + return cbinfo; +} + +# define NAN_WEAK_CALLBACK(name) \ + template \ + static void name(const _NanWeakCallbackData &data) + +# define _NAN_ERROR(fun, errmsg) fun(NanNew(errmsg)) + +# define _NAN_THROW_ERROR(fun, errmsg) \ + do { \ + NanScope(); \ + v8::Isolate::GetCurrent()->ThrowException(_NAN_ERROR(fun, errmsg)); \ + } while (0); + + NAN_INLINE v8::Local NanError(const char* errmsg) { + return _NAN_ERROR(v8::Exception::Error, errmsg); + } + + NAN_INLINE void NanThrowError(const char* errmsg) { + _NAN_THROW_ERROR(v8::Exception::Error, errmsg); + } + + NAN_INLINE void NanThrowError(v8::Handle error) { + NanScope(); + v8::Isolate::GetCurrent()->ThrowException(error); + } + + NAN_INLINE v8::Local NanError( + const char *msg + , const int errorNumber + ) { + v8::Local err = v8::Exception::Error(NanNew(msg)); + v8::Local obj = err.As(); + obj->Set(NanNew("code"), NanNew(errorNumber)); + return err; + } + + NAN_INLINE void NanThrowError( + const char *msg + , const int errorNumber + ) { + NanThrowError(NanError(msg, errorNumber)); + } + + NAN_INLINE v8::Local NanTypeError(const char* errmsg) { + return _NAN_ERROR(v8::Exception::TypeError, errmsg); + } + + NAN_INLINE void NanThrowTypeError(const char* errmsg) { + _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg); + } + + NAN_INLINE v8::Local NanRangeError(const char* errmsg) { + return _NAN_ERROR(v8::Exception::RangeError, errmsg); + } + + NAN_INLINE void NanThrowRangeError(const char* errmsg) { + _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg); + } + + template NAN_INLINE void NanDisposePersistent( + v8::Persistent &handle + ) { + handle.Reset(); + } + + NAN_INLINE v8::Local NanNewBufferHandle ( + char *data + , size_t length + , node::smalloc::FreeCallback callback + , void *hint + ) { + return node::Buffer::New( + v8::Isolate::GetCurrent(), data, length, callback, hint); + } + + NAN_INLINE v8::Local NanNewBufferHandle ( + const char *data + , uint32_t size + ) { + return node::Buffer::New(v8::Isolate::GetCurrent(), data, size); + } + + NAN_INLINE v8::Local NanNewBufferHandle (uint32_t size) { + return node::Buffer::New(v8::Isolate::GetCurrent(), size); + } + + NAN_INLINE v8::Local NanBufferUse( + char* data + , uint32_t size + ) { + return node::Buffer::Use(v8::Isolate::GetCurrent(), data, size); + } + + NAN_INLINE bool NanHasInstance( + v8::Persistent& function_template + , v8::Handle value + ) { + return NanNew(function_template)->HasInstance(value); + } + + NAN_INLINE v8::Local NanNewContextHandle( + v8::ExtensionConfiguration* extensions = NULL + , v8::Handle tmpl = v8::Handle() + , v8::Handle obj = v8::Handle() + ) { + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + return v8::Local::New( + isolate + , v8::Context::New(isolate, extensions, tmpl, obj) + ); + } + + NAN_INLINE v8::Local NanCompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + v8::ScriptCompiler::Source source(s, origin); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); + } + + NAN_INLINE v8::Local NanCompileScript( + v8::Local s + ) { + v8::ScriptCompiler::Source source(s); + return v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source); + } + + NAN_INLINE v8::Local NanRunScript( + v8::Handle script + ) { + return script->BindToCurrentContext()->Run(); + } + + NAN_INLINE v8::Local NanRunScript( + v8::Handle script + ) { + return script->Run(); + } + + NAN_INLINE v8::Local NanMakeCallback( + v8::Handle target + , v8::Handle func + , int argc + , v8::Handle* argv) { + return NanNew(node::MakeCallback( + v8::Isolate::GetCurrent(), target, func, argc, argv)); + } + + NAN_INLINE v8::Local NanMakeCallback( + v8::Handle target + , v8::Handle symbol + , int argc + , v8::Handle* argv) { + return NanNew(node::MakeCallback( + v8::Isolate::GetCurrent(), target, symbol, argc, argv)); + } + + NAN_INLINE v8::Local NanMakeCallback( + v8::Handle target + , const char* method + , int argc + , v8::Handle* argv) { + return NanNew(node::MakeCallback( + v8::Isolate::GetCurrent(), target, method, argc, argv)); + } + + template + NAN_INLINE void NanSetIsolateData( + v8::Isolate *isolate + , T *data + ) { + isolate->SetData(0, data); + } + + template + NAN_INLINE T *NanGetIsolateData( + v8::Isolate *isolate + ) { + return static_cast(isolate->GetData(0)); + } + + class NanAsciiString { + public: + NAN_INLINE explicit NanAsciiString(v8::Handle from) { + v8::Local toStr = from->ToString(); + int buf_size = toStr->Length() + 1; + buf = new char[buf_size]; + size = toStr->WriteOneByte( + reinterpret_cast(buf), 0, buf_size); + } + + NAN_INLINE int Size() const { + return size; + } + + NAN_INLINE char* operator*() { return buf; } + + NAN_INLINE ~NanAsciiString() { + delete[] buf; + } + + private: + char *buf; + int size; + }; + + class NanUtf8String { + public: + NAN_INLINE explicit NanUtf8String(v8::Handle from) { + v8::Local toStr = from->ToString(); + int buf_size = toStr->Utf8Length() + 1; + buf = new char[buf_size]; + size = toStr->WriteUtf8(buf, buf_size); + } + + NAN_INLINE int Size() const { + return size; + } + + NAN_INLINE char* operator*() { return buf; } + + NAN_INLINE ~NanUtf8String() { + delete[] buf; + } + + private: + char *buf; + int size; + }; + + class NanUcs2String { + public: + NAN_INLINE explicit NanUcs2String(v8::Handle from) { + v8::Local toStr = from->ToString(); + int buf_size = toStr->Length() + 1; + buf = new uint16_t[buf_size]; + size = toStr->Write(buf, 0, buf_size); + } + + NAN_INLINE int Size() const { + return size; + } + + NAN_INLINE uint16_t* operator*() { return buf; } + + NAN_INLINE ~NanUcs2String() { + delete[] buf; + } + + private: + uint16_t *buf; + int size; + }; + +#else +// Node 0.8 and 0.10 + +# define _NAN_METHOD_ARGS_TYPE const v8::Arguments& +# define _NAN_METHOD_ARGS _NAN_METHOD_ARGS_TYPE args +# define _NAN_METHOD_RETURN_TYPE v8::Handle + +# define _NAN_GETTER_ARGS_TYPE const v8::AccessorInfo & +# define _NAN_GETTER_ARGS _NAN_GETTER_ARGS_TYPE args +# define _NAN_GETTER_RETURN_TYPE v8::Handle + +# define _NAN_SETTER_ARGS_TYPE const v8::AccessorInfo & +# define _NAN_SETTER_ARGS _NAN_SETTER_ARGS_TYPE args +# define _NAN_SETTER_RETURN_TYPE void + +# define _NAN_PROPERTY_GETTER_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_PROPERTY_GETTER_ARGS _NAN_PROPERTY_GETTER_ARGS_TYPE args +# define _NAN_PROPERTY_GETTER_RETURN_TYPE v8::Handle + +# define _NAN_PROPERTY_SETTER_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_PROPERTY_SETTER_ARGS _NAN_PROPERTY_SETTER_ARGS_TYPE args +# define _NAN_PROPERTY_SETTER_RETURN_TYPE v8::Handle + +# define _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_PROPERTY_ENUMERATOR_ARGS _NAN_PROPERTY_ENUMERATOR_ARGS_TYPE args +# define _NAN_PROPERTY_ENUMERATOR_RETURN_TYPE v8::Handle + +# define _NAN_PROPERTY_DELETER_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_PROPERTY_DELETER_ARGS _NAN_PROPERTY_DELETER_ARGS_TYPE args +# define _NAN_PROPERTY_DELETER_RETURN_TYPE v8::Handle + +# define _NAN_PROPERTY_QUERY_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_PROPERTY_QUERY_ARGS _NAN_PROPERTY_QUERY_ARGS_TYPE args +# define _NAN_PROPERTY_QUERY_RETURN_TYPE v8::Handle + +# define _NAN_INDEX_GETTER_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_INDEX_GETTER_ARGS _NAN_INDEX_GETTER_ARGS_TYPE args +# define _NAN_INDEX_GETTER_RETURN_TYPE v8::Handle + +# define _NAN_INDEX_SETTER_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_INDEX_SETTER_ARGS _NAN_INDEX_SETTER_ARGS_TYPE args +# define _NAN_INDEX_SETTER_RETURN_TYPE v8::Handle + +# define _NAN_INDEX_ENUMERATOR_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_INDEX_ENUMERATOR_ARGS _NAN_INDEX_ENUMERATOR_ARGS_TYPE args +# define _NAN_INDEX_ENUMERATOR_RETURN_TYPE v8::Handle + +# define _NAN_INDEX_DELETER_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_INDEX_DELETER_ARGS _NAN_INDEX_DELETER_ARGS_TYPE args +# define _NAN_INDEX_DELETER_RETURN_TYPE v8::Handle + +# define _NAN_INDEX_QUERY_ARGS_TYPE const v8::AccessorInfo& +# define _NAN_INDEX_QUERY_ARGS _NAN_INDEX_QUERY_ARGS_TYPE args +# define _NAN_INDEX_QUERY_RETURN_TYPE v8::Handle + + typedef v8::InvocationCallback NanFunctionCallback; + + NAN_DEPRECATED NAN_INLINE v8::Local NanSymbol( + const char* data, int length = -1) { + return v8::String::NewSymbol(data, length); + } + + template + NAN_INLINE v8::Local NanNew() { + return v8::Local::New(T::New()); + } + + template + NAN_INLINE v8::Local NanNew(v8::Handle arg) { + return v8::Local::New(arg); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Handle receiver + , int argc + , v8::Handle argv[] = 0) { + return v8::Signature::New(receiver, argc, argv); + } + + template + NAN_INLINE v8::Local NanNew( + NanFunctionCallback callback + , v8::Handle data = v8::Handle() + , v8::Handle signature = v8::Handle()) { + return T::New(callback, data, signature); + } + + template + NAN_INLINE v8::Local NanNew(const v8::Persistent &arg) { + return v8::Local::New(arg); + } + + template + NAN_INLINE v8::Local NanNew(P arg) { + return v8::Local::New(T::New(arg)); + } + + template + NAN_INLINE v8::Local NanNew(P arg, int length) { + return v8::Local::New(T::New(arg, length)); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Handle pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Local pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Handle pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template + NAN_INLINE v8::Local NanNew( + v8::Local pattern, v8::RegExp::Flags flags) { + return v8::RegExp::New(pattern, flags); + } + + template<> + NAN_INLINE v8::Local NanNew() { + return v8::Array::New(); + } + + template<> + NAN_INLINE v8::Local NanNew(int length) { + return v8::Array::New(length); + } + + template<> + NAN_INLINE v8::Local NanNew(double time) { + return v8::Date::New(time).As(); + } + + template<> + NAN_INLINE v8::Local NanNew(int time) { + return v8::Date::New(time).As(); + } + + typedef v8::Script NanUnboundScript; + typedef v8::Script NanBoundScript; + + template + NAN_INLINE v8::Local NanNew( + P s + , const v8::ScriptOrigin& origin + ) { + return v8::Script::New(s, const_cast(&origin)); + } + + template<> + NAN_INLINE v8::Local NanNew( + v8::Local s + ) { + return v8::Script::New(s); + } + + template<> + NAN_INLINE v8::Local NanNew(bool value) { + return v8::BooleanObject::New(value).As(); + } + + template<> + NAN_INLINE v8::Local + NanNew >( + v8::Local value) { + return v8::StringObject::New(value).As(); + } + + template<> + NAN_INLINE v8::Local + NanNew >( + v8::Handle value) { + return v8::StringObject::New(value).As(); + } + + template<> + NAN_INLINE v8::Local NanNew(double val) { + return v8::NumberObject::New(val).As(); + } + + template<> + NAN_INLINE v8::Local NanNew(int32_t val) { + return v8::Uint32::NewFromUnsigned(val)->ToUint32(); + } + + template<> + NAN_INLINE v8::Local NanNew(uint32_t val) { + return v8::Uint32::NewFromUnsigned(val)->ToUint32(); + } + + template<> + NAN_INLINE v8::Local NanNew(int32_t val) { + return v8::Int32::New(val)->ToInt32(); + } + + template<> + NAN_INLINE v8::Local NanNew(uint32_t val) { + return v8::Int32::New(val)->ToInt32(); + } + + template<> + NAN_INLINE v8::Local NanNew( + uint8_t *arg + , int length) { + int len = length; + if (len < 0) { + size_t temp = strlen(reinterpret_cast(arg)); + assert(temp <= INT_MAX && "too long string"); + len = static_cast(temp); + } + uint16_t *warg = new uint16_t[len]; + for (int i = 0; i < len; i++) { + warg[i] = arg[i]; + } + v8::Local retval = v8::String::New(warg, len); + delete[] warg; + return retval; + } + + template<> + NAN_INLINE v8::Local NanNew( + const uint8_t *arg + , int length) { + int len = length; + if (len < 0) { + size_t temp = strlen(reinterpret_cast(arg)); + assert(temp <= INT_MAX && "too long string"); + len = static_cast(temp); + } + uint16_t *warg = new uint16_t[len]; + for (int i = 0; i < len; i++) { + warg[i] = arg[i]; + } + v8::Local retval = v8::String::New(warg, len); + delete[] warg; + return retval; + } + + template<> + NAN_INLINE v8::Local NanNew(uint8_t *arg) { + size_t temp = strlen(reinterpret_cast(arg)); + assert(temp <= INT_MAX && "too long string"); + int length = static_cast(temp); + uint16_t *warg = new uint16_t[length]; + for (int i = 0; i < length; i++) { + warg[i] = arg[i]; + } + + v8::Local retval = v8::String::New(warg, length); + delete[] warg; + return retval; + } + + template<> + NAN_INLINE v8::Local NanNew( + const uint8_t *arg) { + size_t temp = strlen(reinterpret_cast(arg)); + assert(temp <= INT_MAX && "too long string"); + int length = static_cast(temp); + uint16_t *warg = new uint16_t[length]; + for (int i = 0; i < length; i++) { + warg[i] = arg[i]; + } + v8::Local retval = v8::String::New(warg, length); + delete[] warg; + return retval; + } + + template<> + NAN_INLINE v8::Local NanNew( + std::string arg) { + return NanNew(arg.c_str(), arg.size()); + } + + template<> + NAN_INLINE v8::Local NanNew() { + return v8::String::Empty(); + } + + NAN_INLINE v8::Local NanNew(const char* arg, int length = -1) { + return NanNew(arg, length); + } + + NAN_INLINE v8::Local NanNew( + const uint8_t* arg + , int length = -1) { + return NanNew(arg, length); + } + + NAN_INLINE v8::Local NanNew( + const uint16_t* arg + , int length = -1) { + return NanNew(arg, length); + } + + NAN_INLINE v8::Local NanNew( + std::string& arg) { + return NanNew(arg.c_str(), arg.size()); + } + + NAN_INLINE v8::Local NanNew(double val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew(int val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew(unsigned int val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew(bool val) { + return NanNew(val); + } + + NAN_INLINE v8::Local NanNew( + v8::String::ExternalStringResource *resource) { + return v8::String::NewExternal(resource); + } + + NAN_INLINE v8::Local NanNew( + v8::String::ExternalAsciiStringResource *resource) { + return v8::String::NewExternal(resource); + } + +# define NanScope() v8::HandleScope scope +# define NanEscapableScope() v8::HandleScope scope +# define NanEscapeScope(val) scope.Close(val) +# define NanLocker() v8::Locker locker +# define NanUnlocker() v8::Unlocker unlocker +# define NanReturnValue(value) return scope.Close(value) +# define NanReturnUndefined() return v8::Undefined() +# define NanReturnNull() return v8::Null() +# define NanReturnEmptyString() return v8::String::Empty() +# define NanObjectWrapHandle(obj) v8::Local::New(obj->handle_) + + NAN_INLINE v8::Local NanUndefined() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::Undefined())); + } + + NAN_INLINE v8::Local NanNull() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::Null())); + } + + NAN_INLINE v8::Local NanTrue() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::True())); + } + + NAN_INLINE v8::Local NanFalse() { + NanEscapableScope(); + return NanEscapeScope(NanNew(v8::False())); + } + + NAN_INLINE int NanAdjustExternalMemory(int bc) { + return static_cast(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc)); + } + + NAN_INLINE void NanSetTemplate( + v8::Handle templ + , const char *name + , v8::Handle value) { + templ->Set(name, value); + } + + NAN_INLINE void NanSetTemplate( + v8::Handle templ + , v8::Handle name + , v8::Handle value + , v8::PropertyAttribute attributes) { + templ->Set(name, value, attributes); + } + + NAN_INLINE v8::Local NanGetCurrentContext() { + return v8::Context::GetCurrent(); + } + + NAN_INLINE void* NanGetInternalFieldPointer( + v8::Handle object + , int index) { + return object->GetPointerFromInternalField(index); + } + + NAN_INLINE void NanSetInternalFieldPointer( + v8::Handle object + , int index + , void* value) { + object->SetPointerInInternalField(index, value); + } + + NAN_INLINE void NanAddGCEpilogueCallback( + v8::GCEpilogueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::V8::AddGCEpilogueCallback(callback, gc_type_filter); + } + NAN_INLINE void NanRemoveGCEpilogueCallback( + v8::GCEpilogueCallback callback) { + v8::V8::RemoveGCEpilogueCallback(callback); + } + NAN_INLINE void NanAddGCPrologueCallback( + v8::GCPrologueCallback callback + , v8::GCType gc_type_filter = v8::kGCTypeAll) { + v8::V8::AddGCPrologueCallback(callback, gc_type_filter); + } + NAN_INLINE void NanRemoveGCPrologueCallback( + v8::GCPrologueCallback callback) { + v8::V8::RemoveGCPrologueCallback(callback); + } + NAN_INLINE void NanGetHeapStatistics( + v8::HeapStatistics *heap_statistics) { + v8::V8::GetHeapStatistics(heap_statistics); + } + + template + NAN_INLINE void NanAssignPersistent( + v8::Persistent& handle + , v8::Handle obj) { + handle.Dispose(); + handle = v8::Persistent::New(obj); + } + + template + class _NanWeakCallbackData; + + template + struct _NanWeakCallbackInfo { + typedef void (*Callback)(const _NanWeakCallbackData &data); + NAN_INLINE _NanWeakCallbackInfo(v8::Handle handle, P* param, Callback cb) + : parameter(param) + , callback(cb) + , persistent(v8::Persistent::New(handle)) { } + + NAN_INLINE ~_NanWeakCallbackInfo() { + persistent.Dispose(); + persistent.Clear(); + } + + P* const parameter; + Callback const callback; + v8::Persistent persistent; + }; + + template + class _NanWeakCallbackData { + public: + NAN_INLINE _NanWeakCallbackData(_NanWeakCallbackInfo *info) + : info_(info) { } + + NAN_INLINE v8::Local GetValue() const { + return NanNew(info_->persistent); + } + + NAN_INLINE P* GetParameter() const { return info_->parameter; } + + NAN_INLINE bool IsNearDeath() const { + return info_->persistent.IsNearDeath(); + } + + NAN_INLINE void Revive() const; + + NAN_INLINE _NanWeakCallbackInfo* GetCallbackInfo() const { + return info_; + } + + NAN_DEPRECATED NAN_INLINE void Dispose() const { + } + + private: + _NanWeakCallbackInfo* info_; + }; + + template + static void _NanWeakPersistentDispatcher( + v8::Persistent object, void *data) { + _NanWeakCallbackInfo* info = + static_cast<_NanWeakCallbackInfo*>(data); + _NanWeakCallbackData wcbd(info); + info->callback(wcbd); + if (wcbd.IsNearDeath()) { + delete wcbd.GetCallbackInfo(); + } + } + + template + NAN_INLINE void _NanWeakCallbackData::Revive() const { + info_->persistent.MakeWeak( + info_ + , &_NanWeakPersistentDispatcher); + } + + template + NAN_INLINE _NanWeakCallbackInfo* NanMakeWeakPersistent( + v8::Handle handle + , P* parameter + , typename _NanWeakCallbackInfo::Callback callback) { + _NanWeakCallbackInfo *cbinfo = + new _NanWeakCallbackInfo(handle, parameter, callback); + cbinfo->persistent.MakeWeak( + cbinfo + , &_NanWeakPersistentDispatcher); + return cbinfo; + } + +# define NAN_WEAK_CALLBACK(name) \ + template \ + static void name(const _NanWeakCallbackData &data) + +# define _NAN_ERROR(fun, errmsg) \ + fun(v8::String::New(errmsg)) + +# define _NAN_THROW_ERROR(fun, errmsg) \ + do { \ + NanScope(); \ + return v8::Local::New( \ + v8::ThrowException(_NAN_ERROR(fun, errmsg))); \ + } while (0); + + NAN_INLINE v8::Local NanError(const char* errmsg) { + return _NAN_ERROR(v8::Exception::Error, errmsg); + } + + NAN_INLINE v8::Local NanThrowError(const char* errmsg) { + _NAN_THROW_ERROR(v8::Exception::Error, errmsg); + } + + NAN_INLINE v8::Local NanThrowError( + v8::Handle error + ) { + NanScope(); + return v8::Local::New(v8::ThrowException(error)); + } + + NAN_INLINE v8::Local NanError( + const char *msg + , const int errorNumber + ) { + v8::Local err = v8::Exception::Error(v8::String::New(msg)); + v8::Local obj = err.As(); + obj->Set(v8::String::New("code"), v8::Int32::New(errorNumber)); + return err; + } + + NAN_INLINE v8::Local NanThrowError( + const char *msg + , const int errorNumber + ) { + return NanThrowError(NanError(msg, errorNumber)); + } + + NAN_INLINE v8::Local NanTypeError(const char* errmsg) { + return _NAN_ERROR(v8::Exception::TypeError, errmsg); + } + + NAN_INLINE v8::Local NanThrowTypeError( + const char* errmsg + ) { + _NAN_THROW_ERROR(v8::Exception::TypeError, errmsg); + } + + NAN_INLINE v8::Local NanRangeError( + const char* errmsg + ) { + return _NAN_ERROR(v8::Exception::RangeError, errmsg); + } + + NAN_INLINE v8::Local NanThrowRangeError( + const char* errmsg + ) { + _NAN_THROW_ERROR(v8::Exception::RangeError, errmsg); + } + + template + NAN_INLINE void NanDisposePersistent( + v8::Persistent &handle) { // NOLINT(runtime/references) + handle.Dispose(); + handle.Clear(); + } + + NAN_INLINE v8::Local NanNewBufferHandle ( + char *data + , size_t length + , node::Buffer::free_callback callback + , void *hint + ) { + return NanNew( + node::Buffer::New(data, length, callback, hint)->handle_); + } + + NAN_INLINE v8::Local NanNewBufferHandle ( + const char *data + , uint32_t size + ) { +#if NODE_MODULE_VERSION >= 0x000B + return NanNew(node::Buffer::New(data, size)->handle_); +#else + return NanNew( + node::Buffer::New(const_cast(data), size)->handle_); +#endif + } + + NAN_INLINE v8::Local NanNewBufferHandle (uint32_t size) { + return NanNew(node::Buffer::New(size)->handle_); + } + + NAN_INLINE void FreeData(char *data, void *hint) { + delete[] data; + } + + NAN_INLINE v8::Local NanBufferUse( + char* data + , uint32_t size + ) { + return NanNew( + node::Buffer::New(data, size, FreeData, NULL)->handle_); + } + + NAN_INLINE bool NanHasInstance( + v8::Persistent& function_template + , v8::Handle value + ) { + return function_template->HasInstance(value); + } + + NAN_INLINE v8::Local NanNewContextHandle( + v8::ExtensionConfiguration* extensions = NULL + , v8::Handle tmpl = v8::Handle() + , v8::Handle obj = v8::Handle() + ) { + v8::Persistent ctx = v8::Context::New(extensions, tmpl, obj); + v8::Local lctx = NanNew(ctx); + ctx.Dispose(); + return lctx; + } + + NAN_INLINE v8::Local NanCompileScript( + v8::Local s + , const v8::ScriptOrigin& origin + ) { + return v8::Script::Compile(s, const_cast(&origin)); + } + + NAN_INLINE v8::Local NanCompileScript( + v8::Local s + ) { + return v8::Script::Compile(s); + } + + NAN_INLINE v8::Local NanRunScript(v8::Handle script) { + return script->Run(); + } + + NAN_INLINE v8::Local NanMakeCallback( + v8::Handle target + , v8::Handle func + , int argc + , v8::Handle* argv) { +# if NODE_VERSION_AT_LEAST(0, 8, 0) + return NanNew(node::MakeCallback(target, func, argc, argv)); +# else + v8::TryCatch try_catch; + v8::Local result = NanNew(func->Call(target, argc, argv)); + if (try_catch.HasCaught()) { + node::FatalException(try_catch); + } + return result; +# endif + } + + NAN_INLINE v8::Local NanMakeCallback( + v8::Handle target + , v8::Handle symbol + , int argc + , v8::Handle* argv) { +# if NODE_VERSION_AT_LEAST(0, 8, 0) + return NanNew(node::MakeCallback(target, symbol, argc, argv)); +# else + v8::Local callback = target->Get(symbol).As(); + return NanMakeCallback(target, callback, argc, argv); +# endif + } + + NAN_INLINE v8::Local NanMakeCallback( + v8::Handle target + , const char* method + , int argc + , v8::Handle* argv) { +# if NODE_VERSION_AT_LEAST(0, 8, 0) + return NanNew(node::MakeCallback(target, method, argc, argv)); +# else + return NanMakeCallback(target, NanNew(method), argc, argv); +# endif + } + + template + NAN_INLINE void NanSetIsolateData( + v8::Isolate *isolate + , T *data + ) { + isolate->SetData(data); + } + + template + NAN_INLINE T *NanGetIsolateData( + v8::Isolate *isolate + ) { + return static_cast(isolate->GetData()); + } + + class NanAsciiString { + public: + NAN_INLINE explicit NanAsciiString(v8::Handle from) { + v8::Local toStr = from->ToString(); + int buf_size = toStr->Length() + 1; + buf = new char[buf_size]; + size = toStr->WriteAscii(buf, 0, buf_size); + } + + NAN_INLINE int Size() const { + return size; + } + + NAN_INLINE char* operator*() { return buf; } + + NAN_INLINE ~NanAsciiString() { + delete[] buf; + } + + private: + char *buf; + int size; + }; + + class NanUtf8String { + public: + NAN_INLINE explicit NanUtf8String(v8::Handle from) { + v8::Local toStr = from->ToString(); + int buf_size = toStr->Utf8Length() + 1; + buf = new char[buf_size]; + size = toStr->WriteUtf8(buf, buf_size); + } + + NAN_INLINE int Size() const { + return size; + } + + NAN_INLINE char* operator*() { return buf; } + + NAN_INLINE ~NanUtf8String() { + delete[] buf; + } + + private: + char *buf; + int size; + }; + + class NanUcs2String { + public: + NAN_INLINE explicit NanUcs2String(v8::Handle from) { + v8::Local toStr = from->ToString(); + int buf_size = toStr->Length() + 1; + buf = new uint16_t[buf_size]; + size = toStr->Write(buf, 0, buf_size); + } + + NAN_INLINE int Size() const { + return size; + } + + NAN_INLINE uint16_t* operator*() { return buf; } + + NAN_INLINE ~NanUcs2String() { + delete[] buf; + } + + private: + uint16_t *buf; + int size; + }; + +#endif // NODE_MODULE_VERSION + +typedef void (*NanFreeCallback)(char *data, void *hint); + +#define NAN_METHOD(name) _NAN_METHOD_RETURN_TYPE name(_NAN_METHOD_ARGS) +#define NAN_GETTER(name) \ + _NAN_GETTER_RETURN_TYPE name( \ + v8::Local property \ + , _NAN_GETTER_ARGS) +#define NAN_SETTER(name) \ + _NAN_SETTER_RETURN_TYPE name( \ + v8::Local property \ + , v8::Local value \ + , _NAN_SETTER_ARGS) +#define NAN_PROPERTY_GETTER(name) \ + _NAN_PROPERTY_GETTER_RETURN_TYPE name( \ + v8::Local property \ + , _NAN_PROPERTY_GETTER_ARGS) +#define NAN_PROPERTY_SETTER(name) \ + _NAN_PROPERTY_SETTER_RETURN_TYPE name( \ + v8::Local property \ + , v8::Local value \ + , _NAN_PROPERTY_SETTER_ARGS) +#define NAN_PROPERTY_ENUMERATOR(name) \ + _NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name(_NAN_PROPERTY_ENUMERATOR_ARGS) +#define NAN_PROPERTY_DELETER(name) \ + _NAN_PROPERTY_DELETER_RETURN_TYPE name( \ + v8::Local property \ + , _NAN_PROPERTY_DELETER_ARGS) +#define NAN_PROPERTY_QUERY(name) \ + _NAN_PROPERTY_QUERY_RETURN_TYPE name( \ + v8::Local property \ + , _NAN_PROPERTY_QUERY_ARGS) +# define NAN_INDEX_GETTER(name) \ + _NAN_INDEX_GETTER_RETURN_TYPE name(uint32_t index, _NAN_INDEX_GETTER_ARGS) +#define NAN_INDEX_SETTER(name) \ + _NAN_INDEX_SETTER_RETURN_TYPE name( \ + uint32_t index \ + , v8::Local value \ + , _NAN_INDEX_SETTER_ARGS) +#define NAN_INDEX_ENUMERATOR(name) \ + _NAN_INDEX_ENUMERATOR_RETURN_TYPE name(_NAN_INDEX_ENUMERATOR_ARGS) +#define NAN_INDEX_DELETER(name) \ + _NAN_INDEX_DELETER_RETURN_TYPE name( \ + uint32_t index \ + , _NAN_INDEX_DELETER_ARGS) +#define NAN_INDEX_QUERY(name) \ + _NAN_INDEX_QUERY_RETURN_TYPE name(uint32_t index, _NAN_INDEX_QUERY_ARGS) + +class NanCallback { + public: + NanCallback() { + NanScope(); + v8::Local obj = NanNew(); + NanAssignPersistent(handle, obj); + } + + explicit NanCallback(const v8::Handle &fn) { + NanScope(); + v8::Local obj = NanNew(); + NanAssignPersistent(handle, obj); + SetFunction(fn); + } + + ~NanCallback() { + if (handle.IsEmpty()) return; + NanDisposePersistent(handle); + } + + NAN_INLINE void SetFunction(const v8::Handle &fn) { + NanScope(); + NanNew(handle)->Set(kCallbackIndex, fn); + } + + NAN_INLINE v8::Local GetFunction() const { + NanEscapableScope(); + return NanEscapeScope(NanNew(handle)->Get(kCallbackIndex) + .As()); + } + + NAN_INLINE bool IsEmpty() const { + NanScope(); + return NanNew(handle)->Get(kCallbackIndex)->IsUndefined(); + } + + v8::Handle Call(int argc, v8::Handle argv[]) const { + NanEscapableScope(); +#if (NODE_MODULE_VERSION > 0x000B) // 0.11.12+ + v8::Isolate* isolate = v8::Isolate::GetCurrent(); + v8::Local callback = NanNew(handle)-> + Get(kCallbackIndex).As(); + return NanEscapeScope(node::MakeCallback( + isolate + , isolate->GetCurrentContext()->Global() + , callback + , argc + , argv + )); +#else +#if NODE_VERSION_AT_LEAST(0, 8, 0) + v8::Local callback = handle-> + Get(kCallbackIndex).As(); + return NanEscapeScope(node::MakeCallback( + v8::Context::GetCurrent()->Global() + , callback + , argc + , argv + )); +#else + v8::Local callback = handle-> + Get(kCallbackIndex).As(); + return NanEscapeScope(NanMakeCallback( + v8::Context::GetCurrent()->Global(), callback, argc, argv)); +#endif +#endif + } + + private: + v8::Persistent handle; + static const uint32_t kCallbackIndex = 0; +}; + +/* abstract */ class NanAsyncWorker { + public: + explicit NanAsyncWorker(NanCallback *callback) + : callback(callback), errmsg_(NULL) { + request.data = this; + + NanScope(); + v8::Local obj = NanNew(); + NanAssignPersistent(persistentHandle, obj); + } + + virtual ~NanAsyncWorker() { + NanScope(); + + if (!persistentHandle.IsEmpty()) + NanDisposePersistent(persistentHandle); + if (callback) + delete callback; + if (errmsg_) + delete[] errmsg_; + } + + virtual void WorkComplete() { + NanScope(); + + if (errmsg_ == NULL) + HandleOKCallback(); + else + HandleErrorCallback(); + delete callback; + callback = NULL; + } + + NAN_INLINE void SaveToPersistent( + const char *key, const v8::Local &obj) { + v8::Local handle = NanNew(persistentHandle); + handle->Set(NanNew(key), obj); + } + + v8::Local GetFromPersistent(const char *key) const { + NanEscapableScope(); + v8::Local handle = NanNew(persistentHandle); + return NanEscapeScope(handle->Get(NanNew(key)).As()); + } + + virtual void Execute() = 0; + + uv_work_t request; + + protected: + v8::Persistent persistentHandle; + NanCallback *callback; + + virtual void HandleOKCallback() { + NanScope(); + + callback->Call(0, NULL); + } + + virtual void HandleErrorCallback() { + NanScope(); + + v8::Local argv[] = { + v8::Exception::Error(NanNew(ErrorMessage())) + }; + callback->Call(1, argv); + } + + void SetErrorMessage(const char *msg) { + if (errmsg_) { + delete[] errmsg_; + } + + size_t size = strlen(msg) + 1; + errmsg_ = new char[size]; + memcpy(errmsg_, msg, size); + } + + const char* ErrorMessage() const { + return errmsg_; + } + + private: + char *errmsg_; +}; + +NAN_INLINE void NanAsyncExecute (uv_work_t* req) { + NanAsyncWorker *worker = static_cast(req->data); + worker->Execute(); +} + +NAN_INLINE void NanAsyncExecuteComplete (uv_work_t* req) { + NanAsyncWorker* worker = static_cast(req->data); + worker->WorkComplete(); + delete worker; +} + +NAN_INLINE void NanAsyncQueueWorker (NanAsyncWorker* worker) { + uv_queue_work( + uv_default_loop() + , &worker->request + , NanAsyncExecute + , (uv_after_work_cb)NanAsyncExecuteComplete + ); +} + +//// Base 64 //// + +#define _nan_base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4) + +// Doesn't check for padding at the end. Can be 1-2 bytes over. +NAN_INLINE size_t _nan_base64_decoded_size_fast(size_t size) { + size_t remainder = size % 4; + + size = (size / 4) * 3; + if (remainder) { + if (size == 0 && remainder == 1) { + // special case: 1-byte input cannot be decoded + size = 0; + } else { + // non-padded input, add 1 or 2 extra bytes + size += 1 + (remainder == 3); + } + } + + return size; +} + +template +NAN_INLINE size_t _nan_base64_decoded_size( + const T* src + , size_t size +) { + if (size == 0) + return 0; + + if (src[size - 1] == '=') + size--; + if (size > 0 && src[size - 1] == '=') + size--; + + return _nan_base64_decoded_size_fast(size); +} + +// supports regular and URL-safe base64 +static const int _nan_unbase64_table[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -2, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 62, -1, 63 + , 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1 + , -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 + , 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63 + , -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 + , 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + , -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; + +#define _nan_unbase64(x) _nan_unbase64_table[(uint8_t)(x)] + +template static size_t _nan_base64_decode( + char* buf + , size_t len + , const T* src + , const size_t srcLen +) { + char* dst = buf; + char* dstEnd = buf + len; + const T* srcEnd = src + srcLen; + + while (src < srcEnd && dst < dstEnd) { + ptrdiff_t remaining = srcEnd - src; + char a, b, c, d; + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining == 0 || *src == '=') break; + a = _nan_unbase64(*src++); + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining <= 1 || *src == '=') break; + b = _nan_unbase64(*src++); + + *dst++ = (a << 2) | ((b & 0x30) >> 4); + if (dst == dstEnd) break; + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining <= 2 || *src == '=') break; + c = _nan_unbase64(*src++); + + *dst++ = ((b & 0x0F) << 4) | ((c & 0x3C) >> 2); + if (dst == dstEnd) break; + + while (_nan_unbase64(*src) < 0 && src < srcEnd) src++, remaining--; + if (remaining <= 3 || *src == '=') break; + d = _nan_unbase64(*src++); + + *dst++ = ((c & 0x03) << 6) | (d & 0x3F); + } + + return dst - buf; +} + +//// HEX //// + +template unsigned _nan_hex2bin(T c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return 10 + (c - 'A'); + if (c >= 'a' && c <= 'f') return 10 + (c - 'a'); + return static_cast(-1); +} + +template static size_t _nan_hex_decode( + char* buf + , size_t len + , const T* src + , const size_t srcLen +) { + size_t i; + for (i = 0; i < len && i * 2 + 1 < srcLen; ++i) { + unsigned a = _nan_hex2bin(src[i * 2 + 0]); + unsigned b = _nan_hex2bin(src[i * 2 + 1]); + if (!~a || !~b) return i; + buf[i] = a * 16 + b; + } + + return i; +} + +static bool _NanGetExternalParts( + v8::Handle val + , const char** data + , size_t* len +) { + if (node::Buffer::HasInstance(val)) { + *data = node::Buffer::Data(val.As()); + *len = node::Buffer::Length(val.As()); + return true; + } + + assert(val->IsString()); + v8::Local str = NanNew(val.As()); + + if (str->IsExternalAscii()) { + const v8::String::ExternalAsciiStringResource* ext; + ext = str->GetExternalAsciiStringResource(); + *data = ext->data(); + *len = ext->length(); + return true; + + } else if (str->IsExternal()) { + const v8::String::ExternalStringResource* ext; + ext = str->GetExternalStringResource(); + *data = reinterpret_cast(ext->data()); + *len = ext->length(); + return true; + } + + return false; +} + +namespace Nan { + enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER}; +} + +/* NAN_DEPRECATED */ NAN_INLINE void* _NanRawString( + v8::Handle from + , enum Nan::Encoding encoding + , size_t *datalen + , void *buf + , size_t buflen + , int flags +) { + NanScope(); + + size_t sz_; + size_t term_len = !(flags & v8::String::NO_NULL_TERMINATION); + char *data = NULL; + size_t len; + bool is_extern = _NanGetExternalParts( + from + , const_cast(&data) + , &len); + + if (is_extern && !term_len) { + NanSetPointerSafe(datalen, len); + return data; + } + + v8::Local toStr = from->ToString(); + + char *to = static_cast(buf); + + switch (encoding) { + case Nan::ASCII: +#if NODE_MODULE_VERSION < 0x000C + sz_ = toStr->Length(); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len && "too small buffer"); + } + NanSetPointerSafe( + datalen + , toStr->WriteAscii(to, 0, static_cast(sz_ + term_len), flags)); + return to; +#endif + case Nan::BINARY: + case Nan::BUFFER: + sz_ = toStr->Length(); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len && "too small buffer"); + } +#if NODE_MODULE_VERSION < 0x000C + { + uint16_t* twobytebuf = new uint16_t[sz_ + term_len]; + + size_t len = toStr->Write(twobytebuf, 0, + static_cast(sz_ + term_len), flags); + + for (size_t i = 0; i < sz_ + term_len && i < len + term_len; i++) { + unsigned char *b = reinterpret_cast(&twobytebuf[i]); + to[i] = *b; + } + + NanSetPointerSafe(datalen, len); + + delete[] twobytebuf; + return to; + } +#else + NanSetPointerSafe( + datalen, + toStr->WriteOneByte( + reinterpret_cast(to) + , 0 + , static_cast(sz_ + term_len) + , flags)); + return to; +#endif + case Nan::UTF8: + sz_ = toStr->Utf8Length(); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len && "too small buffer"); + } + NanSetPointerSafe( + datalen + , toStr->WriteUtf8(to, static_cast(sz_ + term_len) + , NULL, flags) + - term_len); + return to; + case Nan::BASE64: + { + v8::String::Value value(toStr); + sz_ = _nan_base64_decoded_size(*value, value.length()); + if (to == NULL) { + to = new char[sz_ + term_len]; + } else { + assert(buflen >= sz_ + term_len); + } + NanSetPointerSafe( + datalen + , _nan_base64_decode(to, sz_, *value, value.length())); + if (term_len) { + to[sz_] = '\0'; + } + return to; + } + case Nan::UCS2: + { + sz_ = toStr->Length(); + if (to == NULL) { + to = new char[(sz_ + term_len) * 2]; + } else { + assert(buflen >= (sz_ + term_len) * 2 && "too small buffer"); + } + + int bc = 2 * toStr->Write( + reinterpret_cast(to) + , 0 + , static_cast(sz_ + term_len) + , flags); + NanSetPointerSafe(datalen, bc); + return to; + } + case Nan::HEX: + { + v8::String::Value value(toStr); + sz_ = value.length(); + assert(!(sz_ & 1) && "bad hex data"); + if (to == NULL) { + to = new char[sz_ / 2 + term_len]; + } else { + assert(buflen >= sz_ / 2 + term_len && "too small buffer"); + } + NanSetPointerSafe( + datalen + , _nan_hex_decode(to, sz_ / 2, *value, value.length())); + } + if (term_len) { + to[sz_ / 2] = '\0'; + } + return to; + default: + assert(0 && "unknown encoding"); + } + return to; +} + +NAN_DEPRECATED NAN_INLINE void* NanRawString( + v8::Handle from + , enum Nan::Encoding encoding + , size_t *datalen + , void *buf + , size_t buflen + , int flags +) { + return _NanRawString(from, encoding, datalen, buf, buflen, flags); +} + + +NAN_DEPRECATED NAN_INLINE char* NanCString( + v8::Handle from + , size_t *datalen + , char *buf = NULL + , size_t buflen = 0 + , int flags = v8::String::NO_OPTIONS +) { + return static_cast( + _NanRawString(from, Nan::UTF8, datalen, buf, buflen, flags) + ); +} + +NAN_INLINE void NanSetPrototypeTemplate( + v8::Local templ + , const char *name + , v8::Handle value +) { + NanSetTemplate(templ->PrototypeTemplate(), name, value); +} + +NAN_INLINE void NanSetPrototypeTemplate( + v8::Local templ + , v8::Handle name + , v8::Handle value + , v8::PropertyAttribute attributes +) { + NanSetTemplate(templ->PrototypeTemplate(), name, value, attributes); +} + +NAN_INLINE void NanSetInstanceTemplate( + v8::Local templ + , const char *name + , v8::Handle value +) { + NanSetTemplate(templ->InstanceTemplate(), name, value); +} + +NAN_INLINE void NanSetInstanceTemplate( + v8::Local templ + , v8::Handle name + , v8::Handle value + , v8::PropertyAttribute attributes +) { + NanSetTemplate(templ->InstanceTemplate(), name, value, attributes); +} + +#endif // NAN_H_ diff --git a/node_modules/sqlite3/node_modules/nan/package.json b/node_modules/sqlite3/node_modules/nan/package.json new file mode 100644 index 0000000..25a90e8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/nan/package.json @@ -0,0 +1,79 @@ +{ + "name": "nan", + "version": "1.3.0", + "description": "Native Abstractions for Node.js: C++ header for Node 0.8->0.12 compatibility", + "main": "include_dirs.js", + "repository": { + "type": "git", + "url": "git://github.com/rvagg/nan.git" + }, + "scripts": { + "test": "tap --gc test/js/*-test.js", + "rebuild-tests": "node-gyp rebuild --directory test" + }, + "contributors": [ + { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + { + "name": "Benjamin Byholm", + "email": "bbyholm@abo.fi", + "url": "https://github.com/kkoopa/" + }, + { + "name": "Trevor Norris", + "email": "trev.norris@gmail.com", + "url": "https://github.com/trevnorris" + }, + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "https://github.com/TooTallNate" + }, + { + "name": "Brett Lawson", + "email": "brett19@gmail.com", + "url": "https://github.com/brett19" + }, + { + "name": "Ben Noordhuis", + "email": "info@bnoordhuis.nl", + "url": "https://github.com/bnoordhuis" + } + ], + "devDependencies": { + "bindings": "~1.2.1", + "node-gyp": "~1.0.1", + "tap": "~0.4.12", + "xtend": "~4.0.0" + }, + "license": "MIT", + "gitHead": "e482fbe142e58373d5a24f4e5a60c61e22a13f83", + "bugs": { + "url": "https://github.com/rvagg/nan/issues" + }, + "homepage": "https://github.com/rvagg/nan", + "_id": "nan@1.3.0", + "_shasum": "9a5b8d5ef97a10df3050e59b2c362d3baf779742", + "_from": "nan@1.3.0", + "_npmVersion": "1.4.21", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "9a5b8d5ef97a10df3050e59b2c362d3baf779742", + "tarball": "http://registry.npmjs.org/nan/-/nan-1.3.0.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/nan/-/nan-1.3.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/CHANGELOG.md b/node_modules/sqlite3/node_modules/node-pre-gyp/CHANGELOG.md new file mode 100644 index 0000000..c3194b4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/CHANGELOG.md @@ -0,0 +1,161 @@ +# node-pre-gyp changelog + +## 0.5.27 + + - Fixed support for auto-detecting s3 bucket name when it contains `.` - @taavo + - Fixed support for installing when path contains a `'` - @halfdan + - Ported tests to mocha + +## 0.5.26 + + - Fix node-webkit support when `--target` option is not provided + +## 0.5.25 + + - Fix bundling of deps + +## 0.5.24 + + - Updated ABI crosswalk to incldue node v0.10.30 and v0.10.31 + +## 0.5.23 + + - Added `reveal` command. Pass no options to get all versioning data as json. Pass a second arg to grab a single versioned property value + - Added support for `--silent` (shortcut for `--loglevel=silent`) + +## 0.5.22 + + - Fixed node-webkit versioning name (NOTE: node-webkit support still experimental) + +## 0.5.21 + + - New package to fix `shasum check failed` error with v0.5.20 + +## 0.5.20 + + - Now versioning node-webkit binaries based on major.minor.patch - assuming no compatible ABI across versions (#90) + +## 0.5.19 + + - Updated to know about more node-webkit releases + +## 0.5.18 + + - Updated to know about more node-webkit releases + +## 0.5.17 + + - Updated to know about node v0.10.29 release + +## 0.5.16 + + - Now supporting all aws-sdk configuration parameters (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html) (#86) + +## 0.5.15 + + - Fixed installation of windows packages sub directories on unix systems (#84) + +## 0.5.14 + + - Finished support for cross building using `--target_platform` option (#82) + - Now skipping binary validation on install if target arch/platform do not match the host. + - Removed multi-arch validing for OS X since it required a FAT node.js binary + +## 0.5.13 + + - Fix problem in 0.5.12 whereby the wrong versions of mkdirp and semver where bundled. + +## 0.5.12 + + - Improved support for node-webkit (@Mithgol) + +## 0.5.11 + + - Updated target versions listing + +## 0.5.10 + + - Fixed handling of `-debug` flag passed directory to node-pre-gyp (#72) + - Added optional second arg to `node_pre_gyp.find` to customize the default versioning options used to locate the runtime binary + - Failed install due to `testbinary` check failure no longer leaves behind binary (#70) + +## 0.5.9 + + - Fixed regression in `testbinary` command causing installs to fail on windows with 0.5.7 (#60) + +## 0.5.8 + + - Started bundling deps + +## 0.5.7 + + - Fixed the `testbinary` check, which is used to determine whether to re-download or source compile, to work even in complex dependency situations (#63) + - Exposed the internal `testbinary` command in node-pre-gyp command line tool + - Fixed minor bug so that `fallback_to_build` option is always respected + +## 0.5.6 + + - Added support for versioning on the `name` value in `package.json` (#57). + - Moved to using streams for reading tarball when publishing (#52) + +## 0.5.5 + + - Improved binary validation that also now works with node-webkit (@Mithgol) + - Upgraded test apps to work with node v0.11.x + - Improved test coverage + +## 0.5.4 + + - No longer depends on external install of node-gyp for compiling builds. + +## 0.5.3 + + - Reverted fix for debian/nodejs since it broke windows (#45) + +## 0.5.2 + + - Support for debian systems where the node binary is named `nodejs` (#45) + - Added `bin/node-pre-gyp.cmd` to be able to run command on windows locally (npm creates an .npm automatically when globally installed) + - Updated abi-crosswalk with node v0.10.26 entry. + +## 0.5.1 + + - Various minor bug fixes, several improving windows support for publishing. + +## 0.5.0 + + - Changed property names in `binary` object: now required are `module_name`, `module_path`, and `host`. + - Now `module_path` supports versioning, which allows developers to opt-in to using a versioned install path (#18). + - Added `remote_path` which also supports versioning. + - Changed `remote_uri` to `host`. + +## 0.4.2 + + - Added support for `--target` flag to request cross-compile against a specific node/node-webkit version. + - Added preliminary support for node-webkit + - Fixed support for `--target_arch` option being respected in all cases. + +## 0.4.1 + + - Fixed exception when only stderr is available in binary test (@bendi / #31) + +## 0.4.0 + + - Enforce only `https:` based remote publishing access. + - Added `node-pre-gyp info` command to display listing of published binaries + - Added support for changing the directory node-pre-gyp should build in with the `-C/--directory` option. + - Added support for S3 prefixes. + +## 0.3.1 + + - Added `unpublish` command. + - Fixed module path construction in tests. + - Added ability to disable falling back to build behavior via `npm install --fallback-to-build=false` which overrides setting in a depedencies package.json `install` target. + +## 0.3.0 + + - Support for packaging all files in `module_path` directory - see `app4` for example + - Added `testpackage` command. + - Changed `clean` command to only delete `.node` not entire `build` directory since node-gyp will handle that. + - `.node` modules must be in a folder of there own since tar-pack will remove everything when it unpacks. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/LICENSE new file mode 100644 index 0000000..888c4bd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/LICENSE @@ -0,0 +1,27 @@ +Copyright (c), MapBox +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. + +* Neither the name of the {organization} nor the names of its + contributors may 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 HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/README.md new file mode 100644 index 0000000..f77133e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/README.md @@ -0,0 +1,515 @@ +# node-pre-gyp + +#### node-pre-gyp makes it easy to publish and install Node.js C++ addons from binaries + +[![NPM](https://nodei.co/npm/node-pre-gyp.png)](https://nodei.co/npm/node-pre-gyp/) + +[![Build Status](https://api.travis-ci.org/mapbox/node-pre-gyp.svg)](https://travis-ci.org/mapbox/node-pre-gyp) +[![Build status](https://ci.appveyor.com/api/projects/status/3nxewb425y83c0gv)](https://ci.appveyor.com/project/Mapbox/node-pre-gyp) +[![Dependencies](https://david-dm.org/mapbox/node-pre-gyp.svg)](https://david-dm.org/mapbox/node-pre-gyp) + +`node-pre-gyp` stands between [npm](https://github.com/npm/npm) and [node-gyp](https://github.com/Tootallnate/node-gyp) and offers a cross-platform method of binary deployment. + +### Features + + - A command line tool called `node-pre-gyp` that can install your package's c++ module from a binary. + - A variety of developer targeted commands for packaging, testing, and publishing binaries. + - A Javascript module that can dynamically require your installed binary: `require('node-pre-gyp').find` + +For a hello world example of a module packaged with `node-pre-gyp` see and [the wiki ](https://github.com/mapbox/node-pre-gyp/wiki/Modules-using-node-pre-gyp) for real world examples. + +## Credits + + - The module is modeled after [node-gyp](https://github.com/Tootallnate/node-gyp) by [@Tootallnate](https://github.com/Tootallnate) + - Motivation for initial development came from [@ErisDS](https://github.com/ErisDS) and the [Ghost Project](https://github.com/TryGhost/Ghost). + - Development is sponsored by [Mapbox](https://www.mapbox.com/) + +## Depends + + - Node.js 0.10.x or 0.8.x + +## Install + +`node-pre-gyp` is designed to be installed as a local dependency of your Node.js C++ addon and accessed like: + + ./node_modules/.bin/node-pre-gyp --help + +But you can also install it globally: + + npm install node-pre-gyp -g + +## Usage + +### Commands + +View all possible commands: + + node-pre-gyp --help + +- clean - Removes the entire folder containing the compiled .node module +- install - Attempts to install pre-built binary for module +- reinstall - Runs "clean" and "install" at once +- build - Attempts to compile the module by dispatching to node-gyp or nw-gyp +- rebuild - Runs "clean" and "build" at once +- package - Packs binary into tarball +- testpackage - Tests that the staged package is valid +- publish - Publishes pre-built binary +- unpublish - Unpublishes pre-built binary +- info - Fetches info on published binaries + +You can also chain commands: + + node-pre-gyp clean build unpublish publish info + +### Options + +Options include: + + - `-C/--directory`: run the command in this directory + - `--build-from-source`: build from source instead of using pre-built binary + - `--runtime=node-webkit`: customize the runtime: `node` and `node-webkit` are the valid options + - `--fallback-to-build`: fallback to building from source if pre-built binary is not available + - `--target=0.10.25`: Pass the target node or node-webkit version to compile against + - `--target_arch=ia32`: Pass the target arch and override the host `arch`. Valid values are 'ia32','x64', or `arm`. + - `--target_platform=win32`: Pass the target platform and override the host `platform`. Valid values are `linux`, `darwin`, `win32`, `sunos`, `freebsd`, `openbsd`, and `aix`. + +Both `--build-from-source` and `--fallback-to-build` can be passed alone or they can provide values. You can pass `--fallback-to-build=false` to override the option as declared in package.json. In addition to being able to pass `--build-from-source` you can also pass `--build-from-source=myapp` where `myapp` is the name of your module. + +For example: `npm install --build-from-source=myapp`. This is useful if: + + - `myapp` is referenced in the package.json of a larger app and therefore `myapp` is being installed as a dependent with `npm install`. + - The larger app also depends on other modules installed with `node-pre-gyp` + - You only want to trigger a source compile for `myapp` and the other modules. + +### Configuring + +This is a guide to configuring your module to use node-pre-gyp. + +#### 1) Add new entries to your `package.json` + + - Add `node-pre-gyp` to `bundledDependencies` + - Add `aws-sdk` as a `devDependency` + - Add a custom `install` script + - Declare a `binary` object + +This looks like: + +```js + "dependencies" : { + "node-pre-gyp": "0.5.x" + }, + "bundledDependencies":["node-pre-gyp"], + "devDependencies": { + "aws-sdk": "~2.0.0-rc.15" + } + "scripts": { + "install": "node-pre-gyp install --fallback-to-build", + }, + "binary": { + "module_name": "your_module", + "module_path": "./lib/binding/", + "host": "https://your_module.s3-us-west-1.amazonaws.com" + } +``` + +For a full example see [node-addon-examples's package.json](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/package.json#L11-L22). + +##### The `binary` object has three required properties + +###### module_name + +The name of your native node module. This value must: + + - Match the name passed to [the NODE_MODULE macro](http://nodejs.org/api/addons.html#addons_hello_world) + - Must be a valid C variable name (e.g. it cannot contain `-`) + - Should not include the `.node` extension. + +###### module_path + +The location your native module is placed after a build. This should be an empty directory without other javascript files. This entire directory will be packaged in the binary tarball. When installing from a remote package this directory will be overwritten with the contents of the tarball. + +Note: This property supports variables based on [Versioning](#versioning). + +###### host + +A url to the remote location where you've published tarball binaries (must be `https` not `http`). + +It is highly recommended that you use Amazon S3. The reasons are: + + - Various node-pre-gyp commands like `publish` and `info` only work with an S3 host. + - S3 is a very solid hosting platform for distributing large files, even [Github recommends using it instead of github](https://help.github.com/articles/distributing-large-binaries). + - We provide detail documentation for using [S3 hosting](#s3-hosting) with node-pre-gyp. + +Why then not require S3? Because while some applications using node-pre-gyp need to distribute binaries as large as 20-30 MB, others might have very small binaries and might wish to store them in a github repo. This is not recommended, but if an author really wants to host in a non-s3 location then it should be possible. + +##### The `binary` object has two optional properties + +###### remote_path + +It **is recommended** that you customize this property. This is an extra path to use for publishing and finding remote tarballs. The default value for `remote_path` is `""` meaning that if you do not provide it then all packages will be published at the base of the `host`. It is recommended to provide a value like `./{name}/v{version}` to help organize remote packages in the case that you choose to publish multiple node addons to the same `host`. + +Note: This property supports variables based on [Versioning](#versioning). + +###### package_name + +It is **not recommended** to override this property unless you are also overriding the `remote_path`. This is the versioned name of the remote tarball containing the binary `.node` module and any supporting files you've placed inside the `module_path` directory. Unless you specify `package_name` in your `package.json` then it defaults to `{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz` which allows your binary to work across node versions, platforms, and architectures. If you are using `remote_path` that is also versioned by `./{module_name}/v{version}` then you could remove these variables from the `package_name` and just use: `{node_abi}-{platform}-{arch}.tar.gz`. Then your remote tarball will be looked up at, for example, `https://example.com/your-module/v0.1.0/node-v11-linux-x64.tar.gz`. + +Note: This property supports variables based on [Versioning](#versioning). + +#### 2) Add a new target to binding.gyp + +`node-pre-gyp` calls out to `node-gyp` to compile the module and passes variables along like [module_name](#module_name) and [module_path](#module_path). + +A new target must be added to `binding.gyp` that moves the compiled `.node` module from `./build/Release/module_name.node` into the directory specified by `module_path`. + +Add a target like this at the end of your `targets` list: + +```js + { + "target_name": "action_after_build", + "type": "none", + "dependencies": [ "<(module_name)" ], + "copies": [ + { + "files": [ "<(PRODUCT_DIR)/<(module_name).node" ], + "destination": "<(module_path)" + } + ] + } +``` + +For a full example see [node-addon-example's binding.gyp](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/binding.gyp). + +#### 3) Dynamically require your `.node` + +Inside the main js file that requires your addon module you are likely currently doing: + +```js +var binding = require('../build/Release/binding.node'); +``` + +or: + +```js +var bindings = require('./bindings') +``` + +Change those lines to: + +```js +var binary = require('node-pre-gyp'); +var path = require('path'); +var binding_path = binary.find(path.resolve(path.join(__dirname,'./package.json'))); +var binding = require(binding_path); +``` + +For a full example see [node-addon-example's index.js](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/index.js#L1-L4) + +#### 4) Build and package your app + +Now build your module from source: + + npm install --build-from-source + +The `--build-from-source` tells `node-pre-gyp` to not look for a remote package and instead dispatch to node-gyp to build. + +Now `node-pre-gyp` should now also be installed as a local dependency so the command line tool it offers can be found at `./node_modules/.bin/node-pre-gyp`. + +#### 5) Test + +Now `npm test` should work just as it did before. + +#### 6) Publish the tarball + +Then package your app: + + ./node_modules/.bin/node-pre-gyp package + +Once packaged, now you can publish: + + ./node_modules/.bin/node-pre-gyp publish + +Currently the `publish` command pushes your binary to S3. This requires: + + - You have installed `aws-sdk` with `npm install aws-sdk` + - You have created a bucket already. + - The `host` points to an S3 http or https endpoint. + - You have configured node-pre-gyp to read your S3 credentials (see [S3 hosting](#s3-hosting) for details). + +You can also host your binaries elsewhere. To do this requires: + + - You manually publish the binary created by the `package` command to an `https` endpoint + - Ensure that the `host` value points to your custom `https` endpoint. + +#### 7) Automate builds + +Now you need to publish builds for all the platforms and node versions you wish to support. This is best automated. + + - See [Appveyor Automation](#appveyor-automation) for how to auto-publish builds on Windows. + - See [Travis Automation](#travis-automation) for how to auto-publish builds on OS X and Linux. + +#### 8) You're done! + +Now publish your module to the npm registry. Users will now be able to install your module from a binary. + +What will happen is this: + +1. `npm install ` will pull from the npm registry +2. npm will run the `install` script which will call out to `node-pre-gyp` +3. `node-pre-gyp` will fetch the binary `.node` module and unpack in the right place +4. Assuming that all worked, you are done + +If a a binary was not available for a given platform and `--fallback-to-build` was used then `node-gyp rebuild` will be called to try to source compile the module. + +## S3 Hosting + +You can host wherever you choose but S3 is cheap, `node-pre-gyp publish` expects it, and S3 can be integrated well with [travis.ci](http://travis-ci.org) to automate builds for OS X and Ubuntu. Here is an approach to do this: + +First, get setup locally and test the workflow: + +#### 1) Create an S3 bucket + +And have your **key** and **secret key** ready for writing to the bucket. + +It is recommended to create a IAM user with a policy that only gives permissions to the specific bucket you plan to publish to. This can be done in the [IAM console](https://console.aws.amazon.com/iam/) by: 1) adding a new user, 2) choosing `Attach User Policy`, 3) Using the `Policy Generator`, 4) selecting `Amazon S3` for the service, 5) adding the actions: `DeleteObject`, `GetObject`, `GetObjectAcl`, `ListBucket`, `PutObject`, `PutObjectAcl`, 6) adding an ARN of `arn:aws:s3:::bucket/*` (replacing `bucket` with your bucket name), and finally 7) clicking `Add Statement` and saving the policy. It should generate a policy like: + +```js +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "Stmt1394587197000", + "Effect": "Allow", + "Action": [ + "s3:DeleteObject", + "s3:GetObject", + "s3:GetObjectAcl", + "s3:ListBucket", + "s3:PutObject", + "s3:PutObjectAcl" + ], + "Resource": [ + "arn:aws:s3:::node-pre-gyp-tests/*" + ] + } + ] +} +``` + +#### 2) Install node-pre-gyp + +Either install it globally: + + npm install node-pre-gyp -g + +Or put the local version on your PATH + + export PATH=`pwd`/node_modules/.bin/:$PATH + +#### 3) Configure AWS credentials + +There are several ways to do this. + +You can use any of the methods described at http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html. + +Or you can create a `~/.node_pre_gyprc` + +Or pass options in any way supported by [RC](https://github.com/dominictarr/rc#standards) + +A `~/.node_pre_gyprc` looks like: + +```js +{ + "accessKeyId": "xxx", + "secretAccessKey": "xxx" +} +``` + +Another way is to use your environment: + + export node_pre_gyp_accessKeyId=xxx + export node_pre_gyp_secretAccessKey=xxx + +You may also need to specify the `region` if it is not explicit in the `host` value you use. The `bucket` can also be specified but it is optional because `node-pre-gyp` will detect it from the `host` value. + +#### 4) Package and publish your build + +Install the `aws-sdk`: + + npm install aws-sdk + +Then publish: + + node-pre-gyp package publish + +Note: if you hit an error like `Hostname/IP doesn't match certificate's altnames` it may mean that you need to provide the `region` option in your config. + +## Appveyor Automation + +[Appveyor](http://www.appveyor.com/) can build binaries and publish the results per commit and supports: + + - Windows Visual Studio 2013 and related compilers + - Both 64 bit (x64) and 32 bit (x86) build configurations + - Multiple Node.js versions + +For an example of doing this see [node-sqlite3's appveyor.yml](https://github.com/mapbox/node-sqlite3/blob/master/appveyor.yml). + +Below is a guide to getting set up: + +#### 1) Create a free Appveyor account + +Go to https://ci.appveyor.com/signup/free and sign in with your github account. + +#### 2) Create a new project + +Go to https://ci.appveyor.com/projects/new and select the github repo for your module + +#### 3) Add appveyor.yml and push it + +Once you have committed an `appveyor.yml` ([appveyor.yml reference](http://www.appveyor.com/docs/appveyor-yml)) to your github repo and pushed it appveyor should automatically start building your project. + +#### 4) Create secure variables + +Encrypt your S3 AWS keys by going to and hitting the `encrypt` button. + +Then paste the result into your `appveyor.yml` + +```yml +environment: + node_pre_gyp_accessKeyId: + secure: Dn9HKdLNYvDgPdQOzRq/DqZ/MPhjknRHB1o+/lVU8MA= + node_pre_gyp_secretAccessKey: + secure: W1rwNoSnOku1r+28gnoufO8UA8iWADmL1LiiwH9IOkIVhDTNGdGPJqAlLjNqwLnL +``` + +NOTE: keys are per account but not per repo (this is difference than travis where keys are per repo but not related to the account used to encrypt them). + +#### 5) Hook up publishing + +Just put `node-pre-gyp package publish` in your `appveyor.yml` after `npm install`. + +#### 6) Publish when you want + +You might wish to publish binaries only on a specific commit. To do this you could borrow from the [travis.ci idea of commit keywords](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) and add special handling for commit messages with `[publish binary]`: + + SET CM=%APPVEYOR_REPO_COMMIT_MESSAGE% + if not "%CM%" == "%CM:[publish binary]=%" node-pre-gyp --msvs_version=2013 publish + +If your commit message contains special characters (e.g. `&`) this method might fail. An alternative is to use PowerShell, which gives you additional possibilites, like ignoring case by using `ToLower()`: + + ps: if($env:APPVEYOR_REPO_COMMIT_MESSAGE.ToLower().Contains('[publish binary]')) { node-pre-gyp --msvs_version=2013 publish } + +Remember this publishing is not the same as `npm publish`. We're just talking about the binary module here and not your entire npm package. To automate the publishing of your entire package to npm on travis see http://about.travis-ci.org/docs/user/deployment/npm/ + + +## Travis Automation + +[Travis](https://travis-ci.org/) can push to S3 after a successful build and supports both: + + - Ubuntu Precise and OS X + - Multiple Node.js versions + +For an example of doing this see [node-add-example's .travis.yml](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/.travis.yml). + +Below is a guide to getting set up: + +#### 1) Install the travis gem + + gem install travis + +#### 2) Create secure variables + +Make sure you run this command from within the directory of your module. + +Use `travis-encrypt` like: + + travis encrypt node_pre_gyp_accessKeyId=${node_pre_gyp_accessKeyId} + travis encrypt node_pre_gyp_secretAccessKey=${node_pre_gyp_secretAccessKey} + +Then put those values in your `.travis.yml` like: + +```yaml +env: + global: + - secure: F+sEL/v56CzHqmCSSES4pEyC9NeQlkoR0Gs/ZuZxX1ytrj8SKtp3MKqBj7zhIclSdXBz4Ev966Da5ctmcTd410p0b240MV6BVOkLUtkjZJyErMBOkeb8n8yVfSoeMx8RiIhBmIvEn+rlQq+bSFis61/JkE9rxsjkGRZi14hHr4M= + - secure: o2nkUQIiABD139XS6L8pxq3XO5gch27hvm/gOdV+dzNKc/s2KomVPWcOyXNxtJGhtecAkABzaW8KHDDi5QL1kNEFx6BxFVMLO8rjFPsMVaBG9Ks6JiDQkkmrGNcnVdxI/6EKTLHTH5WLsz8+J7caDBzvKbEfTux5EamEhxIWgrI= +``` + +More details on travis encryption at http://about.travis-ci.org/docs/user/encryption-keys/. + +#### 3) Hook up publishing + +Just put `node-pre-gyp package publish` in your `.travis.yml` after `npm install`. + +If you want binaries for OS X change you have two options: + + - Enable `multi-os` for your repo by emailing a request to `support@travis-ci.com`. More details at . An example of a repo using multi-os is [node-sqlite3](https://github.com/mapbox/node-sqlite3/blob/f69b89a078e2200fee54a9f897e6957bd627d8b7/.travis.yml#L4-L6). + - Or, you can change the `language` and push to a different branch to build on OS X just when you commit to that branch. Details on this below: + + +##### OS X publishing via a branch + +Tweak your `.travis.yml` to use: + +```yml +language: objective-c +``` + +Keep that change in a different git branch and sync that when you want binaries published. + +Note: using `language: objective-c` instead of `language: nodejs` looses node.js specific travis sugar like a matrix for multiple node.js versions. + +But you can replicate the lost behavior by replacing: + +```yml +node_js: + - "0.8" + - "0.10" +``` + +With: + +```yml +env: + matrix: + - export NODE_VERSION="0.8" + - export NODE_VERSION="0.10" + +before_install: + - git clone https://github.com/creationix/nvm.git ./.nvm + - source ./.nvm/nvm.sh + - nvm install $NODE_VERSION + - nvm use $NODE_VERSION +``` + +#### 4) Publish when you want + +You might wish to publish binaries only on a specific commit. To do this you could borrow from the [travis.ci idea of commit keywords](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) and add special handling for commit messages with `[publish binary]`: + + COMMIT_MESSAGE=$(git show -s --format=%B $TRAVIS_COMMIT | tr -d '\n') + if test "${COMMIT_MESSAGE#*'[publish binary]'}" != "$COMMIT_MESSAGE"; then node-pre-gyp publish; fi; + +Then you can trigger new binaries to be built like: + + git commit -a -m "[publish binary]" + +Or, if you don't have any changes to make simply run: + + git commit --allow-empty -m "[publish binary]" + +Remember this publishing is not the same as `npm publish`. We're just talking about the binary module here and not your entire npm package. To automate the publishing of your entire package to npm on travis see http://about.travis-ci.org/docs/user/deployment/npm/ + +# Versioning + +The `binary` properties of `module_path`, `remote_path`, and `package_name` support variable substitution. The strings are evaluated by `node-pre-gyp` depending on your system and any custom build flags you passed. + + - `configuration` - Either 'Release' or 'Debug' depending on if `--debug` is passed during the build. + - `module_name` - the `binary.module_name` attribute from `package.json`. + - `version` - the semver `version` value for your module from `package.json`. + - `major`, `minor`, `patch`, and `prelease` match the individual semver values for your module's `version` + - `node_abi`: The node C++ `ABI` number. This value is available in javascript as `process.versions.modules` as of [`>= v0.10.4 >= v0.11.7`](https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e) and in C++ as the `NODE_MODULE_VERSION` define much earlier. For versions of Node before this was available we fallback to the V8 major and minor version. + - `platform` matches node's `process.platform` like `linux`, `darwin`, and `win32` unless the user passed the `--target_platform` option to override. + - `arch` matches node's `process.arch` like `x64` or `ia32` unless the user passes the `--target_arch` option to override. + + +The options are visible in the code at diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/appveyor.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/appveyor.yml new file mode 100644 index 0000000..df2ffe4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/appveyor.yml @@ -0,0 +1,32 @@ +environment: + matrix: + #- nodejs_version: 0.8.28 + - nodejs_version: 0.10.32 + - nodejs_version: 0.11.13 + +platform: + - x64 + - x86 + +shallow_clone: true + +install: + #- ps: Update-NodeJsInstallation $env:nodejs_version $env:Platform + # http://help.appveyor.com/discussions/problems/618-nodejs-10030-doesnt-work-on-appveyor-cant-find-npm#comment_34002825 + - ps: Install-Product node $env:nodejs_version $env:Platform + - ps: gcm node + - ps: gcm npm + - node --version + - npm --version + - SET PATH=%APPDATA%\npm;%PATH% + - npm update -g npm + - npm --version + - node -e "console.log(process.arch);" + - SET PATH=C:\python27;%PATH% + - npm install + - npm test + - cmd: test.bat + +build: off +test: off +deploy: off \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp b/node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp new file mode 100755 index 0000000..d68d18b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp @@ -0,0 +1,130 @@ +#!/usr/bin/env node + +/** + * Set the title. + */ + +process.title = 'node-pre-gyp' + +/** + * Module dependencies. + */ + +var node_pre_gyp = require('../') +var log = require('npmlog') + +/** + * Process and execute the selected commands. + */ + +var prog = new node_pre_gyp.Run() +var completed = false +prog.parseArgv(process.argv) + +if (prog.todo.length === 0) { + if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) { + console.log('v%s', prog.version) + } else { + console.log('%s', prog.usage()) + } + return process.exit(0) +} + +// if --no-color is passed +if (prog.opts && prog.opts.hasOwnProperty('color') && !prog.opts.color) { + log.disableColor(); +} + +log.info('it worked if it ends with', 'ok') +log.verbose('cli', process.argv) +log.info('using', process.title + '@%s', prog.version) +log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform, process.arch) + + +/** + * Change dir if -C/--directory was passed. + */ + +var dir = prog.opts.directory +if (dir) { + var fs = require('fs') + try { + var stat = fs.statSync(dir) + if (stat.isDirectory()) { + log.info('chdir', dir) + process.chdir(dir) + } else { + log.warn('chdir', dir + ' is not a directory') + } + } catch (e) { + if (e.code === 'ENOENT') { + log.warn('chdir', dir + ' is not a directory') + } else { + log.warn('chdir', 'error during chdir() "%s"', e.message) + } + } +} + +function run () { + var command = prog.todo.shift() + if (!command) { + // done! + completed = true + log.info('ok') + return + } + + prog.commands[command.name](command.args, function (err) { + if (err) { + log.error(command.name + ' error') + log.error('stack', err.stack) + errorMessage() + log.error('not ok') + console.log(err.message); + return process.exit(1) + } + var args_array = [].slice.call(arguments, 1) + if (args_array.length) { + console.log.apply(console, args_array) + } + // now run the next command in the queue + process.nextTick(run) + }) +} + +process.on('exit', function (code) { + if (!completed && !code) { + log.error('Completion callback never invoked!') + issueMessage() + process.exit(6) + } +}) + +process.on('uncaughtException', function (err) { + log.error('UNCAUGHT EXCEPTION') + log.error('stack', err.stack) + issueMessage() + process.exit(7) +}) + +function errorMessage () { + // copied from npm's lib/util/error-handler.js + var os = require('os') + log.error('System', os.type() + ' ' + os.release()) + log.error('command', process.argv + .map(JSON.stringify).join(' ')) + log.error('cwd', process.cwd()) + log.error('node -v', process.version) + log.error(process.title+' -v', 'v' + prog.package.version) +} + +function issueMessage () { + errorMessage() + log.error('', [ 'This is a bug in `'+process.title+'`.' + , 'Try to update '+process.title+' and file an issue if it does not help:' + , ' ' + ].join('\n')) +} + +// start running the given commands! +run() diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd b/node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd new file mode 100644 index 0000000..46e14b5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd @@ -0,0 +1,2 @@ +@echo off +node "%~dp0\node-pre-gyp" %* diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/build.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/build.js new file mode 100644 index 0000000..ba81b4d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/build.js @@ -0,0 +1,52 @@ + +module.exports = exports = build + +exports.usage = 'Attempts to compile the module by dispatching to node-gyp or nw-gyp' + +var fs = require('fs') + , compile = require('./util/compile.js') + , versioning = require('./util/versioning.js') + , path = require('path') + , fs = require('fs') + , mkdirp = require('mkdirp') + +function build(gyp, argv, callback) { + var gyp_args = []; + if (argv.length && argv[0] == 'rebuild') { + gyp_args.push('rebuild'); + } else { + gyp_args.push('configure'); + gyp_args.push('build'); + } + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + // options look different depending on whether node-pre-gyp is called directly + // or whether it is called from npm install, hence the following line. + // TODO: check if this is really necessary with latest npm/nopt versions + var original_args = (typeof(gyp.opts.argv.original) === 'string') ? JSON.parse(gyp.opts.argv).original : gyp.opts.argv.original || []; + // add command line options to existing opts + original_args.forEach(function(opt) { + // we ignore any args like 'install' since we know + // we are either running 'build' or 'rebuild' but we + // do want to pass along to node-gyp/nw-gyp any command + // line options like --option or --option=value passed in + if (opt.length > 2 && opt.slice(0,2) == '--') { + var parts = opt.split('='); + if (parts.length > 1) { + var key = parts[0]; + opts[key.slice(2)] = parts[1]; + } + } + }) + var command_line_args = []; + // turn back into command line options + Object.keys(opts).forEach(function(o) { + var val = opts[o]; + if (val) { + command_line_args.push('--' + o + '=' + val); + } + }) + compile.run_gyp(gyp_args.concat(command_line_args),opts,function(err,gopts) { + return callback(err); + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/clean.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/clean.js new file mode 100644 index 0000000..a717e9c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/clean.js @@ -0,0 +1,24 @@ + +module.exports = exports = clean + +exports.usage = 'Removes the entire folder containing the compiled .node module' + +var fs = require('fs') + , rm = require('rimraf') + , path = require('path') + , exists = require('fs').exists || require('path').exists + , log = require('npmlog') + , versioning = require('./util/versioning.js') + +function clean (gyp, argv, callback) { + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + var to_delete = opts.module_path; + exists(to_delete, function(found) { + if (found) { + if (!gyp.opts.silent_clean) console.log('['+package_json.name+'] Removing "%s"', to_delete); + return rm(to_delete, callback); + } + return callback(); + }) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/info.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/info.js new file mode 100644 index 0000000..5a54d41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/info.js @@ -0,0 +1,40 @@ + +module.exports = exports = unpublish + +exports.usage = 'Lists all published binaries (requires aws-sdk)' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , versioning = require('./util/versioning.js') + , s3_setup = require('./util/s3_setup.js') + , config = require('rc')("node_pre_gyp",{acl:"public-read"}); + +function unpublish(gyp, argv, callback) { + var AWS = require("aws-sdk"); + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + s3_setup.detect(opts.hosted_path,config); + AWS.config.update(config); + var s3 = new AWS.S3(); + var s3_opts = { Bucket: config.bucket, + Prefix: config.prefix + }; + s3.listObjects(s3_opts, function(err, meta){ + if (err && err.code == 'NotFound') { + return callback(new Error('['+package_json.name+'] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/'+config.prefix)); + } else if(err) { + return callback(err); + } else { + log.verbose(JSON.stringify(meta,null,1)); + if (meta && meta.Contents) { + meta.Contents.forEach(function(obj) { + console.log(obj.Key); + }); + } else { + console.error('['+package_json.name+'] No objects found at https://' + s3_opts.Bucket + '.s3.amazonaws.com/'+config.prefix ) + } + return callback(); + } + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/install.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/install.js new file mode 100644 index 0000000..4d4f79a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/install.js @@ -0,0 +1,198 @@ + +module.exports = exports = install + +exports.usage = 'Attempts to install pre-built binary for module' + +var fs = require('fs') + , tar = require('tar') + , path = require('path') + , zlib = require('zlib') + , log = require('npmlog') + , request = require('request') + , existsAsync = fs.exists || path.exists + , versioning = require('./util/versioning.js') + , compile = require('./util/compile.js') + , testbinary = require('./testbinary.js') + , clean = require('./clean.js') + +function download(uri,opts,callback) { + log.http('GET', uri) + + var req = null + var requestOpts = { + uri: uri + , headers: { + 'User-Agent': 'node-pre-gyp (node ' + process.version + ')' + } + } + + var proxyUrl = opts.proxy + || process.env.http_proxy + || process.env.HTTP_PROXY + || process.env.npm_config_proxy + if (proxyUrl) { + if (/^https?:\/\//i.test(proxyUrl)) { + log.verbose('download', 'using proxy url: "%s"', proxyUrl) + requestOpts.proxy = proxyUrl + } else { + log.warn('download', 'ignoring invalid "proxy" config setting: "%s"', proxyUrl) + } + } + try { + req = request(requestOpts) + } catch (e) { + return callback(e) + } + if (req) { + req.on('response', function (res) { + log.http(res.statusCode, uri) + }) + } + return callback(null,req); +} + +function place_binary(from,to,opts,callback) { + download(from,opts,function(err,req) { + if (err) return callback(err); + if (!req) return callback(new Error("empty req")); + var badDownload = false + , extractCount = 0 + , gunzip = zlib.createGunzip() + , extracter = tar.Extract({ path: to, strip: 1}); + function afterTarball(err) { + if (err) return callback(err); + if (badDownload) return callback(new Error("bad download")); + if (extractCount === 0) { + return callback(new Error('There was a fatal problem while downloading/extracting the tarball')) + } + log.info('tarball', 'done parsing tarball') + callback(); + } + function filter_func(entry) { + // ensure directories are +x + // https://github.com/mapnik/node-mapnik/issues/262 + entry.props.mode |= (entry.props.mode >>> 2) & 0111; + log.info('install','unpacking ' + entry.path); + extractCount++ + } + gunzip.on('error', callback) + extracter.on('entry', filter_func) + extracter.on('error', callback) + extracter.on('end', afterTarball) + + req.on('error', function (err) { + badDownload = true + callback(err) + }) + + req.on('close', function () { + if (extractCount === 0) { + callback(new Error('Connection closed while downloading tarball file')) + } + }) + + req.on('response', function (res) { + if (res.statusCode !== 200) { + badDownload = true + if (res.statusCode == 404) { + return callback(new Error('Pre-built binary not available for your system')); + } else { + return callback(new Error(res.statusCode + ' status code downloading tarball')); + } + } + // start unzipping and untaring + req.pipe(gunzip).pipe(extracter) + }) + }); +} + +function do_build(gyp,argv,callback) { + gyp.todo.push( { name: 'build', args: ['rebuild'] } ); + process.nextTick(callback); +} + +function install(gyp, argv, callback) { + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var source_build = gyp.opts['build-from-source'] || gyp.opts['build_from_source']; + var should_do_source_build = source_build === package_json.name || (source_build === true || source_build === 'true'); + if (should_do_source_build) { + log.info('build','requesting source compile'); + return do_build(gyp,argv,callback); + } else { + var fallback_to_build = gyp.opts['fallback-to-build'] || gyp.opts['fallback_to_build']; + var should_do_fallback_build = fallback_to_build === package_json.name || (fallback_to_build === true || fallback_to_build === 'true'); + // but allow override from npm + if (process.env.npm_config_argv) { + var cooked = JSON.parse(process.env.npm_config_argv).cooked; + var match = cooked.indexOf("--fallback-to-build"); + if (match > -1 && cooked.length > match && cooked[match+1] == "false") { + should_do_fallback_build = false; + log.info('install','Build fallback disabled via npm flag: --fallback-to-build=false'); + } + } + try { + var opts = versioning.evaluate(package_json, gyp.opts); + } catch (err) { + return callback(err); + } + var from = opts.hosted_tarball; + var to = opts.module_path; + var binary_module = path.join(to,opts.module_name + '.node'); + if (existsAsync(binary_module,function(found) { + if (found) { + testbinary(gyp, argv, function(err) { + if (err) { + console.error('['+package_json.name+'] ' + err.message); + log.error("Testing local pre-built binary failed, attempting to re-download"); + place_binary(from,to,opts,function(err) { + if (err) { + if (should_do_fallback_build) { + log.http(err.message + ' (falling back to source compile with node-gyp)'); + return do_build(gyp,argv,callback); + } else { + return callback(err); + } + } else { + console.log('['+package_json.name+'] Success: "' + binary_module + '" is reinstalled via remote'); + return callback(); + } + }); + } else { + console.log('['+package_json.name+'] Success: "' + binary_module + '" already installed'); + console.log('Pass --build-from-source to recompile'); + return callback(); + } + }); + } else { + log.info('check','checked for "' + binary_module + '" (not found)') + place_binary(from,to,opts,function(err) { + if (err && should_do_fallback_build) { + log.http(err.message + ' (falling back to source compile with node-gyp)'); + return do_build(gyp,argv,callback); + } else if (err) { + return callback(err); + } else { + testbinary(gyp, argv, function(err) { + if (err) { + gyp.opts.silent_clean = true; + clean(gyp, argv, function(error) { + if (error) console.log(error); + if (should_do_fallback_build) { + console.error('['+package_json.name+'] ' + err.message); + log.error("Testing pre-built binary failed, attempting to source compile"); + return do_build(gyp,argv,callback); + } else { + return callback(err); + } + }); + } else { + console.log('['+package_json.name+'] Success: "' + binary_module + '" is installed via remote'); + return callback(); + } + }); + }; + }); + } + })); + } +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/node-pre-gyp.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/node-pre-gyp.js new file mode 100644 index 0000000..85e3d35 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/node-pre-gyp.js @@ -0,0 +1,194 @@ + +/** + * Module exports. + */ + +module.exports = exports; + +/** + * Module dependencies. + */ + +var fs = require('fs') + , path = require('path') + , nopt = require('nopt') + , log = require('npmlog') + , child_process = require('child_process') + , EE = require('events').EventEmitter + , inherits = require('util').inherits + , commands = [ + 'clean', + 'install', + 'reinstall', + 'build', + 'rebuild', + 'package', + 'testpackage', + 'publish', + 'unpublish', + 'info', + 'testbinary', + 'reveal' + ] + , aliases = { + } + +// differentiate node-pre-gyp's logs from npm's +log.heading = 'node-pre-gyp' + +exports.find = require('./pre-binding').find; + +function Run() { + var self = this + + this.commands = {} + + commands.forEach(function (command) { + self.commands[command] = function (argv, callback) { + log.verbose('command', command, argv) + return require('./' + command)(self, argv, callback) + } + }) +} +inherits(Run, EE) +exports.Run = Run +var proto = Run.prototype + +/** + * Export the contents of the package.json. + */ + +proto.package = require('../package') + +/** + * nopt configuration definitions + */ + +proto.configDefs = { + help: Boolean // everywhere + , arch: String // 'configure' + , debug: Boolean // 'build' + , directory: String // bin + , proxy: String // 'install' + , loglevel: String // everywhere +} + +/** + * nopt shorthands + */ + +proto.shorthands = { + release: '--no-debug' + , C: '--directory' + , debug: '--debug' + , j: '--jobs' + , silent: '--loglevel=silent' + , silly: '--loglevel=silly' + , verbose: '--loglevel=verbose' +} + +/** + * expose the command aliases for the bin file to use. + */ + +proto.aliases = aliases + +/** + * Parses the given argv array and sets the 'opts', + * 'argv' and 'command' properties. + */ + +proto.parseArgv = function parseOpts (argv) { + this.opts = nopt(this.configDefs, this.shorthands, argv) + this.argv = this.opts.argv.remain.slice() + + var commands = this.todo = [] + + // create a copy of the argv array with aliases mapped + argv = this.argv.map(function (arg) { + // is this an alias? + if (arg in this.aliases) { + arg = this.aliases[arg] + } + return arg + }, this) + + // process the mapped args into "command" objects ("name" and "args" props) + argv.slice().forEach(function (arg) { + if (arg in this.commands) { + var args = argv.splice(0, argv.indexOf(arg)) + argv.shift() + if (commands.length > 0) { + commands[commands.length - 1].args = args + } + commands.push({ name: arg, args: [] }) + } + }, this) + if (commands.length > 0) { + commands[commands.length - 1].args = argv.splice(0) + } + + // support for inheriting config env variables from npm + var npm_config_prefix = 'npm_config_' + Object.keys(process.env).forEach(function (name) { + if (name.indexOf(npm_config_prefix) !== 0) return + var val = process.env[name] + if (name === npm_config_prefix + 'loglevel') { + log.level = val + } else { + // add the user-defined options to the config + name = name.substring(npm_config_prefix.length) + // avoid npm argv clobber already present args + // which avoids problem of 'npm test' calling + // script that runs unique npm install commands + if (name === 'argv') { + if (this.opts.argv && + this.opts.argv.remain && + this.opts.argv.remain.length) { + // do nothing + } else { + this.opts[name] = val + } + } else { + this.opts[name] = val + } + } + }, this) + + if (this.opts.loglevel) { + log.level = this.opts.loglevel + } + log.resume() +} + +/** + * Returns the usage instructions for node-pre-gyp. + */ + +proto.usage = function usage () { + var str = [ + '' + , ' Usage: node-pre-gyp [options]' + , '' + , ' where is one of:' + , commands.map(function (c) { + return ' - ' + c + ' - ' + require('./' + c).usage + }).join('\n') + , '' + , 'node-pre-gyp@' + this.version + ' ' + path.resolve(__dirname, '..') + , 'node@' + process.versions.node + ].join('\n') + return str +} + +/** + * Version number getter. + */ + +Object.defineProperty(proto, 'version', { + get: function () { + return this.package.version + } + , enumerable: true +}) + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/package.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/package.js new file mode 100644 index 0000000..b01cb95 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/package.js @@ -0,0 +1,46 @@ + +module.exports = exports = package + +exports.usage = 'Packs binary (and enclosing directory) into locally staged tarball' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , versioning = require('./util/versioning.js') + , compile = require('./util/compile.js') + , write = require('fs').createWriteStream + , pack = require('tar-pack').pack + , existsAsync = fs.exists || path.exists + , mkdirp = require('mkdirp'); + +function package(gyp, argv, callback) { + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + var from = opts.module_path; + var binary_module = path.join(from,opts.module_name + '.node'); + existsAsync(binary_module,function(found) { + if (!found) { + return callback(new Error("Cannot package because " + binary_module + " missing: run `node-pre-gyp rebuild` first")) + } + var tarball = opts.staged_tarball; + var basedir = path.basename(from); + var filter_func = function (entry) { + // ensure directories are +x + // https://github.com/mapnik/node-mapnik/issues/262 + log.info('package','packing ' + entry.path); + return true; + } + mkdirp(path.dirname(tarball),function(err) { + pack(from, { filter: filter_func }) + .pipe(write(tarball)) + .on('error', function (err) { + if (err) console.error('['+package_json.name+'] ' + err.message); + return callback(err); + }) + .on('close', function () { + log.info('package','Binary staged at "' + tarball + '"'); + return callback(); + }) + }); + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/pre-binding.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/pre-binding.js new file mode 100644 index 0000000..d4b15db --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/pre-binding.js @@ -0,0 +1,24 @@ +var fs = require('fs'); +var versioning = require('../lib/util/versioning.js') +var existsSync = require('fs').existsSync || require('path').existsSync; +var path = require('path'); + +module.exports = exports; + +exports.usage = 'Finds the require path for the node-pre-gyp installed module' + +exports.validate = function(package_json) { + versioning.validate_config(package_json); +} + +exports.find = function(package_json_path,opts) { + if (!existsSync(package_json_path)) { + throw new Error("package.json does not exist at " + package_json_path); + } + var package_json = require(package_json_path); + versioning.validate_config(package_json); + opts = opts || {}; + if (!opts.module_root) opts.module_root = path.dirname(package_json_path); + var meta = versioning.evaluate(package_json,opts); + return meta.module; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/publish.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/publish.js new file mode 100644 index 0000000..c8e6b9c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/publish.js @@ -0,0 +1,58 @@ + +module.exports = exports = publish + +exports.usage = 'Publishes pre-built binary (requires aws-sdk)' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , versioning = require('./util/versioning.js') + , s3_setup = require('./util/s3_setup.js') + , mkdirp = require('mkdirp') + , existsAsync = fs.exists || path.exists + , url = require('url') + , config = require('rc')("node_pre_gyp",{acl:"public-read"}); + +function publish(gyp, argv, callback) { + var AWS = require("aws-sdk"); + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + var tarball = opts.staged_tarball; + existsAsync(tarball,function(found) { + if (!found) { + return callback(new Error("Cannot publish because " + tarball + " missing: run `node-pre-gyp package` first")) + } + s3_setup.detect(opts.hosted_path,config); + var key_name = url.resolve(config.prefix,opts.package_name) + AWS.config.update(config); + var s3 = new AWS.S3(); + var s3_opts = { Bucket: config.bucket, + Key: key_name + }; + s3.headObject(s3_opts, function(err, meta){ + if (err && err.code == 'NotFound') { + // we are safe to publish because + // the object does not already exist + var s3 = new AWS.S3(); + var s3_obj_opts = { ACL: config.acl, + Body: fs.createReadStream(tarball), + Bucket: config.bucket, + Key: key_name + }; + s3.putObject(s3_obj_opts, function(err, resp){ + if(err) return callback(err); + console.log('['+package_json.name+'] Success: published to https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key); + return callback(); + }); + } else if(err) { + return callback(err); + } else { + log.error('publish','Cannot publish over existing version'); + log.error('publish',"Update the 'version' field in package.json and try again"); + log.error('publish','If the previous version was published in error see:'); + log.error('publish','\t node-pre-gyp unpublish'); + return callback(new Error('Failed publishing to https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key)); + } + }); + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/rebuild.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/rebuild.js new file mode 100644 index 0000000..fe89096 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/rebuild.js @@ -0,0 +1,12 @@ + +module.exports = exports = rebuild + +exports.usage = 'Runs "clean" and "build" at once' + +function rebuild (gyp, argv, callback) { + gyp.todo.unshift( + { name: 'clean', args: [] } + , { name: 'build', args: ['rebuild'] } + ) + process.nextTick(callback) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/reinstall.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/reinstall.js new file mode 100644 index 0000000..fc15640 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/reinstall.js @@ -0,0 +1,12 @@ + +module.exports = exports = rebuild + +exports.usage = 'Runs "clean" and "install" at once' + +function rebuild (gyp, argv, callback) { + gyp.todo.unshift( + { name: 'clean', args: [] } + , { name: 'install', args: [] } + ) + process.nextTick(callback) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/reveal.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/reveal.js new file mode 100644 index 0000000..7ab9adc --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/reveal.js @@ -0,0 +1,28 @@ + +module.exports = exports = reveal + +exports.usage = 'Reveals data on the versioned binary' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , versioning = require('./util/versioning.js'); + +function reveal(gyp, argv, callback) { + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + var hit = false; + // if a second arg is passed look to see + // if it is a known option + var args = gyp.opts.argv.cooked; + var find_val = args[args.indexOf('reveal')+1]; + if (find_val && opts.hasOwnProperty(find_val)) { + console.log(opts[find_val]); + hit = true; + } + // otherwise return all options as json + if (!hit) { + console.log(JSON.stringify(opts,null,2)); + } + return callback(); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/testbinary.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/testbinary.js new file mode 100644 index 0000000..6aa75a6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/testbinary.js @@ -0,0 +1,71 @@ +module.exports = exports = testbinary + +exports.usage = 'Tests that the binary.node can be required' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , cp = require('child_process') + , versioning = require('./util/versioning.js') + , path = require('path') + +function testbinary(gyp, argv, callback) { + var args = []; + var options = {} + var shell_cmd = process.execPath; + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + // ensure on windows that / are used for require path + var binary_module = opts.module.replace(/\\/g, '/'); + var nw = (opts.runtime && opts.runtime === 'node-webkit'); + if (nw) { + options.timeout = 5000; + if (process.platform === 'darwin') { + shell_cmd = 'node-webkit'; + } else if (process.platform === 'win32') { + shell_cmd = 'nw.exe'; + } else { + shell_cmd = 'nw'; + } + var modulePath = path.resolve(binary_module); + var appDir = path.join(__dirname, 'util', 'nw-pre-gyp'); + args.push(appDir); + args.push(modulePath); + log.info("validate","Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'"); + cp.execFile(shell_cmd, args, options, function(err, stdout, stderr) { + // check for normal timeout for node-webkit + if (err) { + if (err.killed == true && err.signal && err.signal.indexOf('SIG') > -1) { + return callback(); + } + var stderrLog = stderr.toString(); + log.info('stderr', stderrLog); + if( /^\s*Xlib:\s*extension\s*"RANDR"\s*missing\s*on\s*display\s*":\d+\.\d+"\.\s*$/.test(stderrLog) ){ + log.info('RANDR', 'stderr contains only RANDR error, ignored'); + return callback(); + } + return callback(err); + } + return callback(); + }); + return; + } + if ((process.arch != opts.target_arch) || + (process.platform != opts.target_platform)) { + var msg = "skipping validation since host platform/arch ("; + msg += process.platform+'/'+process.arch+")"; + msg += " does not match target ("; + msg += opts.target_platform+'/'+opts.target_arch+")"; + log.info('validate', msg); + return callback(); + } + args.push('--eval'); + args.push("require('" + binary_module.replace(/\'/g, '\\\'') +"')"); + log.info("validate","Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'"); + cp.execFile(shell_cmd, args, options, function(err, stdout, stderr) { + if (err) { + return callback(err); + } + return callback(); + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/testpackage.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/testpackage.js new file mode 100644 index 0000000..c15d067 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/testpackage.js @@ -0,0 +1,49 @@ + +module.exports = exports = testpackage + +exports.usage = 'Tests that the staged package is valid' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , existsAsync = fs.exists || path.exists + , versioning = require('./util/versioning.js') + , testbinary = require('./testbinary.js') + , read = require('fs').createReadStream + , tar = require('tar') + , zlib = require('zlib') + +function testpackage(gyp, argv, callback) { + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + var tarball = opts.staged_tarball; + existsAsync(tarball, function(found) { + if (!found) { + return callback(new Error("Cannot test package because " + tarball + " missing: run `node-pre-gyp package` first")) + } + var to = opts.module_path; + var gunzip = zlib.createGunzip() + var extracter = tar.Extract({ path: to, strip: 1 }); + function filter_func(entry) { + // ensure directories are +x + // https://github.com/mapnik/node-mapnik/issues/262 + entry.props.mode |= (entry.props.mode >>> 2) & 0111; + log.info('install','unpacking ' + entry.path); + } + gunzip.on('error', callback) + extracter.on('error', callback) + extracter.on('entry', filter_func) + extracter.on('end', function(err) { + if (err) return callback(err); + testbinary(gyp,argv,function(err) { + if (err) { + return callback(err); + } else { + console.log('['+package_json.name+'] Package appears valid'); + return callback(); + } + }); + }); + read(tarball).pipe(gunzip).pipe(extracter); + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/unpublish.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/unpublish.js new file mode 100644 index 0000000..04118e0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/unpublish.js @@ -0,0 +1,41 @@ + +module.exports = exports = unpublish + +exports.usage = 'Unpublishes pre-built binary (requires aws-sdk)' + +var fs = require('fs') + , path = require('path') + , log = require('npmlog') + , versioning = require('./util/versioning.js') + , s3_setup = require('./util/s3_setup.js') + , url = require('url') + , config = require('rc')("node_pre_gyp",{acl:"public-read"}); + +function unpublish(gyp, argv, callback) { + var AWS = require("aws-sdk"); + var package_json = JSON.parse(fs.readFileSync('./package.json')); + var opts = versioning.evaluate(package_json, gyp.opts); + s3_setup.detect(opts.hosted_path,config); + AWS.config.update(config); + var key_name = url.resolve(config.prefix,opts.package_name) + var s3 = new AWS.S3(); + var s3_opts = { Bucket: config.bucket, + Key: key_name + }; + s3.headObject(s3_opts, function(err, meta) { + if (err && err.code == 'NotFound') { + console.log('['+package_json.name+'] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key); + return callback(); + } else if(err) { + return callback(err); + } else { + log.info(JSON.stringify(meta)); + s3.deleteObject(s3_opts, function(err, resp) { + if (err) return callback(err); + log.info(JSON.stringify(resp)); + console.log('['+package_json.name+'] Success: removed https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key); + return callback(); + }) + } + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json new file mode 100644 index 0000000..76bf20d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json @@ -0,0 +1,474 @@ +{ + "0.6.3": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.4": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.5": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.6": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.7": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.8": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.9": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.10": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.11": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.12": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.13": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.14": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.15": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.16": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.17": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.18": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.19": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.20": { + "node_abi": 1, + "v8": "3.6" + }, + "0.6.21": { + "node_abi": 1, + "v8": "3.6" + }, + "0.7.0": { + "node_abi": 1, + "v8": "3.8" + }, + "0.7.1": { + "node_abi": 1, + "v8": "3.8" + }, + "0.7.2": { + "node_abi": 1, + "v8": "3.8" + }, + "0.7.3": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.4": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.5": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.6": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.7": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.8": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.9": { + "node_abi": 1, + "v8": "3.11" + }, + "0.7.10": { + "node_abi": 1, + "v8": "3.9" + }, + "0.7.11": { + "node_abi": 1, + "v8": "3.11" + }, + "0.7.12": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.0": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.1": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.2": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.3": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.4": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.5": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.6": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.7": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.8": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.9": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.10": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.11": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.12": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.13": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.14": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.15": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.16": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.17": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.18": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.19": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.20": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.21": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.22": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.23": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.24": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.25": { + "node_abi": 1, + "v8": "3.11" + }, + "0.8.26": { + "node_abi": 1, + "v8": "3.11" + }, + "0.9.0": { + "node_abi": 1, + "v8": "3.11" + }, + "0.9.1": { + "node_abi": 10, + "v8": "3.11" + }, + "0.9.2": { + "node_abi": 10, + "v8": "3.11" + }, + "0.9.3": { + "node_abi": 10, + "v8": "3.13" + }, + "0.9.4": { + "node_abi": 10, + "v8": "3.13" + }, + "0.9.5": { + "node_abi": 10, + "v8": "3.13" + }, + "0.9.6": { + "node_abi": 10, + "v8": "3.15" + }, + "0.9.7": { + "node_abi": 10, + "v8": "3.15" + }, + "0.9.8": { + "node_abi": 10, + "v8": "3.15" + }, + "0.9.9": { + "node_abi": 11, + "v8": "3.15" + }, + "0.9.10": { + "node_abi": 11, + "v8": "3.15" + }, + "0.9.11": { + "node_abi": 11, + "v8": "3.14" + }, + "0.9.12": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.0": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.1": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.2": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.3": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.4": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.5": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.6": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.7": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.8": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.9": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.10": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.11": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.12": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.13": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.14": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.15": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.16": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.17": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.18": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.19": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.20": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.21": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.22": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.23": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.24": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.25": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.26": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.27": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.28": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.29": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.30": { + "node_abi": 11, + "v8": "3.14" + }, + "0.10.31": { + "node_abi": 11, + "v8": "3.14" + }, + "0.11.0": { + "node_abi": 12, + "v8": "3.17" + }, + "0.11.1": { + "node_abi": 12, + "v8": "3.18" + }, + "0.11.2": { + "node_abi": 12, + "v8": "3.19" + }, + "0.11.3": { + "node_abi": 12, + "v8": "3.19" + }, + "0.11.4": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.5": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.6": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.7": { + "node_abi": 12, + "v8": "3.20" + }, + "0.11.8": { + "node_abi": 13, + "v8": "3.21" + }, + "0.11.9": { + "node_abi": 13, + "v8": "3.22" + }, + "0.11.10": { + "node_abi": 13, + "v8": "3.22" + }, + "0.11.11": { + "node_abi": 14, + "v8": "3.22" + }, + "0.11.12": { + "node_abi": 14, + "v8": "3.22" + }, + "0.11.13": { + "node_abi": 14, + "v8": "3.25" + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/compile.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/compile.js new file mode 100644 index 0000000..2946ec2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/compile.js @@ -0,0 +1,80 @@ + +module.exports = exports; + +var fs = require('fs') + , tar = require('tar') + , path = require('path') + , zlib = require('zlib') + , log = require('npmlog') + , semver = require('semver') + , request = require('request') + , win = process.platform == 'win32' + , os = require('os') + , existsSync = fs.existsSync || path.existsSync + , cp = require('child_process') + +// try to build up the complete path to node-gyp +/* priority: + - node-gyp on NODE_PATH + - node-gyp inside npm on NODE_PATH + - node-gyp inside npm beside node exe +*/ +function which_node_gyp() { + try { + var node_gyp_main = require.resolve('node-gyp'); + var node_gyp_bin = path.join(path.dirname( + path.dirname(node_gyp_main)) + ,'bin/node-gyp.js'); + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } + } catch (err) { } + try { + var npm_main = require.resolve('npm'); + var node_gyp_bin = path.join(path.dirname( + path.dirname(npm_main)) + ,'node_modules/node-gyp/bin/node-gyp.js'); + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } + } catch (err) { } + var npm_base = path.join(path.dirname( + path.dirname(process.execPath)) + ,'lib/node_modules/npm/') + var node_gyp_bin = path.join(npm_base,'node_modules/node-gyp/bin/node-gyp.js'); + if (existsSync(node_gyp_bin)) { + return node_gyp_bin; + } +} + +module.exports.run_gyp = function(args,opts,callback) { + var shell_cmd = ''; + var cmd_args = []; + if (opts.runtime && opts.runtime == 'node-webkit') { + shell_cmd = 'nw-gyp'; + if (win) shell_cmd += '.cmd'; + } else { + var node_gyp_path = which_node_gyp(); + if (node_gyp_path) { + shell_cmd = process.execPath; + cmd_args.push(node_gyp_path); + } else { + shell_cmd = 'node-gyp'; + if (win) shell_cmd += '.cmd'; + } + } + var final_args = cmd_args.concat(args); + var cmd = cp.spawn(shell_cmd, final_args, {cwd: undefined, env: process.env, customFds: [ 0, 1, 2]}); + cmd.on('error', function (err) { + if (err) { + return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + err + ")")); + } + callback(null,opts); + }); + cmd.on('close', function (code, signal) { + if (code && code !== 0) { + return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + code + ")")); + } + callback(null,opts); + }); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html new file mode 100644 index 0000000..244466c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html @@ -0,0 +1,26 @@ + + + + +Node-webkit-based module test + + + +

    Node-webkit-based module test

    + + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json new file mode 100644 index 0000000..71d03f8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json @@ -0,0 +1,9 @@ +{ +"main": "index.html", +"name": "nw-pre-gyp-module-test", +"description": "Node-webkit-based module test.", +"version": "0.0.1", +"window": { + "show": false +} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/s3_setup.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/s3_setup.js new file mode 100644 index 0000000..e0609e4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/s3_setup.js @@ -0,0 +1,30 @@ + +module.exports = exports; + +var url = require('url') + +var URI_REGEX="^(.*)\.(s3(?:-.*)?)\.amazonaws\.com$"; + +module.exports.detect = function(to,config) { + var uri = url.parse(to); + var hostname_matches = uri.hostname.match(URI_REGEX); + + config.prefix = (!uri.pathname || uri.pathname == '/') ? '' : uri.pathname.replace('/',''); + + if(!hostname_matches) { + return; + } + + if (!config.bucket) { + config.bucket = hostname_matches[1]; + } + + if (!config.region) { + var s3_domain = hostname_matches[2]; + if (s3_domain.slice(0,3) == 's3-' && + s3_domain.length >= 3) { + // it appears the region is explicit in the url + config.region = s3_domain.replace('s3-',''); + } + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/versioning.js b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/versioning.js new file mode 100644 index 0000000..7dfa947 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/lib/util/versioning.js @@ -0,0 +1,159 @@ +module.exports = exports; + +var path = require('path') + , semver = require('semver') + , url = require('url') + , abi_crosswalk = require('./abi_crosswalk.json') + + +function get_node_abi(runtime, target) { + if (target) { + // abi_crosswalk generated with ./scripts/abi_crosswalk.js + var abi = ''; + if (runtime === 'node-webkit') { + return runtime + '-v' + target; + } else { + if (abi_crosswalk[target]) { + abi = abi_crosswalk[target].node_abi; + } + } + if (!abi) { + throw new Error("Unsupported target version: " + target); + } + if (abi > 1) { + return runtime+'-v' + (+abi); + } else { + // no support for node-webkit unless > 0.10.x + if (runtime != 'node') { + throw new Error("Runtime '" + runtime + "' unsupported for target version: " + target); + } + if (!abi_crosswalk[target]) { + throw new Error("Unsupported target version: " + target); + } + abi = abi_crosswalk[target].v8; + return 'v8-' + abi; + } + } else { + if (runtime === 'node-webkit') { + if (typeof process.versions['node-webkit'] === 'undefined') { + // erroneous CLI call + throw new Error("Empty target version is not supported if node-webkit is the target."); + } + return runtime + '-v' + process.versions['node-webkit']; + } + // process.versions.modules added in >= v0.10.4 and v0.11.7 + // https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e + return process.versions.modules ? runtime+'-v' + (+process.versions.modules) : + 'v8-' + process.versions.v8.split('.').slice(0,2).join('.'); + } +} + +var required_parameters = [ + 'module_name', + 'module_path', + 'host' +]; + +function validate_config(package_json,callback) { + var msg = package_json.name + ' package.json is not node-pre-gyp ready:\n'; + var missing = []; + if (!package_json.main) { + missing.push('main'); + } + if (!package_json.name) { + missing.push('name'); + } + if (!package_json.binary) { + missing.push('binary'); + } + var o = package_json.binary; + required_parameters.forEach(function(p) { + if (missing.indexOf('binary') > -1) { + missing.pop('binary'); + } + if (!o || o[p] == undefined) { + missing.push('binary.' + p); + } + }); + if (missing.length >= 1) { + throw new Error(msg+"package.json must declare these properties: \n" + missing.join('\n')); + } + if (o) { + // enforce https over http + var protocol = url.parse(o.host).protocol; + if (protocol === 'http:') { + throw new Error("'host' protocol ("+protocol+") is invalid - only 'https:' is accepted"); + } + } +}; + +module.exports.validate_config = validate_config; + +function eval_template(template,opts) { + Object.keys(opts).forEach(function(key) { + var pattern = '{'+key+'}'; + while (template.indexOf(pattern) > -1) { + template = template.replace(pattern,opts[key]); + } + }); + return template; +} + +// url.resolve needs single trailing slash +// to behave correctly, otherwise a double slash +// may end up in the url which breaks requests +// and a lacking slash may not lead to proper joining +function add_trailing_slash(pathname) { + if (pathname.slice(-1) != '/') { + return pathname + '/'; + } + return pathname; +} + +var default_package_name = '{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz'; +var default_remote_path = ''; + +module.exports.evaluate = function(package_json,options) { + options = options || {}; + validate_config(package_json); + var v = package_json.version; + var module_version = semver.parse(v); + var runtime = options.runtime || (process.versions['node-webkit'] ? 'node-webkit' : 'node'); + var opts = { + name: package_json.name + , configuration: Boolean(options.debug) ? 'Debug' : 'Release' + , debug: options.debug + , module_name: package_json.binary.module_name + , version: module_version.version + , prerelease: module_version.prerelease.length ? v.slice(v.indexOf(module_version.prerelease[0])) : '' + , major: module_version.major + , minor: module_version.minor + , patch: module_version.patch + , runtime: runtime + , node_abi: get_node_abi(runtime,options.target) + , target: options.target || '' + , platform: options.target_platform || process.platform + , target_platform: options.target_platform || process.platform + , arch: options.target_arch || process.arch + , target_arch: options.target_arch || process.arch + , module_main: package_json.main + } + opts.host = add_trailing_slash(eval_template(package_json.binary.host,opts)); + opts.module_path = eval_template(package_json.binary.module_path,opts); + // now we resolve the module_path to ensure it is absolute so that binding.gyp variables work predictably + if (options.module_root) { + // resolve relative to known module root: works for pre-binding require + opts.module_path = path.join(options.module_root,opts.module_path); + } else { + // resolve relative to current working directory: works for node-pre-gyp commands + opts.module_path = path.resolve(opts.module_path); + } + opts.module = path.join(opts.module_path,opts.module_name + '.node') + opts.remote_path = package_json.binary.remote_path ? add_trailing_slash(eval_template(package_json.binary.remote_path,opts)) : default_remote_path; + var package_name = package_json.binary.package_name ? package_json.binary.package_name : default_package_name; + opts.package_name = eval_template(package_name,opts); + opts.staged_tarball = path.join('build/stage',opts.remote_path,opts.package_name); + opts.hosted_path = url.resolve(opts.host,opts.remote_path); + opts.hosted_tarball = url.resolve(opts.hosted_path,opts.package_name); + return opts; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/mkdirp b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/mkdirp new file mode 120000 index 0000000..017896c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/mkdirp @@ -0,0 +1 @@ +../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/nopt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/nopt new file mode 120000 index 0000000..6b6566e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/nopt @@ -0,0 +1 @@ +../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rc new file mode 120000 index 0000000..a3f6fc7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rc @@ -0,0 +1 @@ +../rc/index.js \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rimraf b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rimraf new file mode 120000 index 0000000..4cd49a4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/rimraf @@ -0,0 +1 @@ +../rimraf/bin.js \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/semver b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/semver new file mode 120000 index 0000000..317eb29 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.npmignore new file mode 100644 index 0000000..9303c34 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.npmignore @@ -0,0 +1,2 @@ +node_modules/ +npm-debug.log \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml new file mode 100644 index 0000000..c693a93 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: + - 0.6 + - 0.8 + - "0.10" diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE new file mode 100644 index 0000000..432d1ae --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE @@ -0,0 +1,21 @@ +Copyright 2010 James Halliday (mail@substack.net) + +This project is free software released under the MIT/X11 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. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js new file mode 100755 index 0000000..d95de15 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +var mkdirp = require('../'); +var minimist = require('minimist'); +var fs = require('fs'); + +var argv = minimist(process.argv.slice(2), { + alias: { m: 'mode', h: 'help' }, + string: [ 'mode' ] +}); +if (argv.help) { + fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout); + return; +} + +var paths = argv._.slice(); +var mode = argv.mode ? parseInt(argv.mode, 8) : undefined; + +(function next () { + if (paths.length === 0) return; + var p = paths.shift(); + + if (mode === undefined) mkdirp(p, cb) + else mkdirp(p, mode, cb) + + function cb (err) { + if (err) { + console.error(err.message); + process.exit(1); + } + else next(); + } +})(); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt new file mode 100644 index 0000000..f952aa2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt @@ -0,0 +1,12 @@ +usage: mkdirp [DIR1,DIR2..] {OPTIONS} + + Create each supplied directory including any necessary parent directories that + don't yet exist. + + If the directory already exists, do nothing. + +OPTIONS are: + + -m, --mode If a directory needs to be created, set the mode as an octal + permission string. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js new file mode 100644 index 0000000..e692421 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js @@ -0,0 +1,6 @@ +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/index.js new file mode 100644 index 0000000..a1742b2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/index.js @@ -0,0 +1,97 @@ +var path = require('path'); +var fs = require('fs'); + +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; + +function mkdirP (p, opts, f, made) { + if (typeof opts === 'function') { + f = opts; + opts = {}; + } + else if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = 0777 & (~process.umask()); + } + if (!made) made = null; + + var cb = f || function () {}; + p = path.resolve(p); + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + mkdirP(path.dirname(p), opts, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, opts, cb, made); + }); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); +} + +mkdirP.sync = function sync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = 0777 & (~process.umask()); + } + if (!made) made = null; + + p = path.resolve(p); + + try { + xfs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; + + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = xfs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } + + return made; +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml new file mode 100644 index 0000000..cc4dba2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT 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. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js new file mode 100644 index 0000000..abff3e8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js @@ -0,0 +1,2 @@ +var argv = require('../')(process.argv.slice(2)); +console.dir(argv); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js new file mode 100644 index 0000000..584f551 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js @@ -0,0 +1,187 @@ +module.exports = function (args, opts) { + if (!opts) opts = {}; + + var flags = { bools : {}, strings : {} }; + + [].concat(opts['boolean']).filter(Boolean).forEach(function (key) { + flags.bools[key] = true; + }); + + [].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true; + }); + + var aliases = {}; + Object.keys(opts.alias || {}).forEach(function (key) { + aliases[key] = [].concat(opts.alias[key]); + aliases[key].forEach(function (x) { + aliases[x] = [key].concat(aliases[key].filter(function (y) { + return x !== y; + })); + }); + }); + + var defaults = opts['default'] || {}; + + var argv = { _ : [] }; + Object.keys(flags.bools).forEach(function (key) { + setArg(key, defaults[key] === undefined ? false : defaults[key]); + }); + + var notFlags = []; + + if (args.indexOf('--') !== -1) { + notFlags = args.slice(args.indexOf('--')+1); + args = args.slice(0, args.indexOf('--')); + } + + function setArg (key, val) { + var value = !flags.strings[key] && isNumber(val) + ? Number(val) : val + ; + setKey(argv, key.split('.'), value); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), value); + }); + } + + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + + if (/^--.+=/.test(arg)) { + // Using [\s\S] instead of . because js doesn't support the + // 'dotall' regex modifier. See: + // http://stackoverflow.com/a/1068308/13216 + var m = arg.match(/^--([^=]+)=([\s\S]*)$/); + setArg(m[1], m[2]); + } + else if (/^--no-.+/.test(arg)) { + var key = arg.match(/^--no-(.+)/)[1]; + setArg(key, false); + } + else if (/^--.+/.test(arg)) { + var key = arg.match(/^--(.+)/)[1]; + var next = args[i + 1]; + if (next !== undefined && !/^-/.test(next) + && !flags.bools[key] + && (aliases[key] ? !flags.bools[aliases[key]] : true)) { + setArg(key, next); + i++; + } + else if (/^(true|false)$/.test(next)) { + setArg(key, next === 'true'); + i++; + } + else { + setArg(key, flags.strings[key] ? '' : true); + } + } + else if (/^-[^-]+/.test(arg)) { + var letters = arg.slice(1,-1).split(''); + + var broken = false; + for (var j = 0; j < letters.length; j++) { + var next = arg.slice(j+2); + + if (next === '-') { + setArg(letters[j], next) + continue; + } + + if (/[A-Za-z]/.test(letters[j]) + && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { + setArg(letters[j], next); + broken = true; + break; + } + + if (letters[j+1] && letters[j+1].match(/\W/)) { + setArg(letters[j], arg.slice(j+2)); + broken = true; + break; + } + else { + setArg(letters[j], flags.strings[letters[j]] ? '' : true); + } + } + + var key = arg.slice(-1)[0]; + if (!broken && key !== '-') { + if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) + && !flags.bools[key] + && (aliases[key] ? !flags.bools[aliases[key]] : true)) { + setArg(key, args[i+1]); + i++; + } + else if (args[i+1] && /true|false/.test(args[i+1])) { + setArg(key, args[i+1] === 'true'); + i++; + } + else { + setArg(key, flags.strings[key] ? '' : true); + } + } + } + else { + argv._.push( + flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) + ); + } + } + + Object.keys(defaults).forEach(function (key) { + if (!hasKey(argv, key.split('.'))) { + setKey(argv, key.split('.'), defaults[key]); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), defaults[key]); + }); + } + }); + + notFlags.forEach(function(key) { + argv._.push(key); + }); + + return argv; +}; + +function hasKey (obj, keys) { + var o = obj; + keys.slice(0,-1).forEach(function (key) { + o = (o[key] || {}); + }); + + var key = keys[keys.length - 1]; + return key in o; +} + +function setKey (obj, keys, value) { + var o = obj; + keys.slice(0,-1).forEach(function (key) { + if (o[key] === undefined) o[key] = {}; + o = o[key]; + }); + + var key = keys[keys.length - 1]; + if (o[key] === undefined || typeof o[key] === 'boolean') { + o[key] = value; + } + else if (Array.isArray(o[key])) { + o[key].push(value); + } + else { + o[key] = [ o[key], value ]; + } +} + +function isNumber (x) { + if (typeof x === 'number') return true; + if (/^0x[0-9a-f]+$/i.test(x)) return true; + return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); +} + +function longest (xs) { + return Math.max.apply(null, xs.map(function (x) { return x.length })); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json new file mode 100644 index 0000000..09e9ec4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json @@ -0,0 +1,67 @@ +{ + "name": "minimist", + "version": "0.0.8", + "description": "parse argument options", + "main": "index.js", + "devDependencies": { + "tape": "~1.0.4", + "tap": "~0.4.0" + }, + "scripts": { + "test": "tap test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/6..latest", + "ff/5", + "firefox/latest", + "chrome/10", + "chrome/latest", + "safari/5.1", + "safari/latest", + "opera/12" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/substack/minimist.git" + }, + "homepage": "https://github.com/substack/minimist", + "keywords": [ + "argv", + "getopt", + "parser", + "optimist" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/substack/minimist/issues" + }, + "_id": "minimist@0.0.8", + "dist": { + "shasum": "857fcabfc3397d2625b8228262e86aa7a011b05d", + "tarball": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "_from": "minimist@0.0.8", + "_npmVersion": "1.4.3", + "_npmUser": { + "name": "substack", + "email": "mail@substack.net" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + } + ], + "directories": {}, + "_shasum": "857fcabfc3397d2625b8228262e86aa7a011b05d", + "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown new file mode 100644 index 0000000..c256353 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown @@ -0,0 +1,73 @@ +# minimist + +parse argument options + +This module is the guts of optimist's argument parser without all the +fanciful decoration. + +[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist) + +[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist) + +# example + +``` js +var argv = require('minimist')(process.argv.slice(2)); +console.dir(argv); +``` + +``` +$ node example/parse.js -a beep -b boop +{ _: [], a: 'beep', b: 'boop' } +``` + +``` +$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz +{ _: [ 'foo', 'bar', 'baz' ], + x: 3, + y: 4, + n: 5, + a: true, + b: true, + c: true, + beep: 'boop' } +``` + +# methods + +``` js +var parseArgs = require('minimist') +``` + +## var argv = parseArgs(args, opts={}) + +Return an argument object `argv` populated with the array arguments from `args`. + +`argv._` contains all the arguments that didn't have an option associated with +them. + +Numeric-looking arguments will be returned as numbers unless `opts.string` or +`opts.boolean` is set for that argument name. + +Any arguments after `'--'` will not be parsed and will end up in `argv._`. + +options can be: + +* `opts.string` - a string or array of strings argument names to always treat as +strings +* `opts.boolean` - a string or array of strings to always treat as booleans +* `opts.alias` - an object mapping string names to strings or arrays of string +argument names to use as aliases +* `opts.default` - an object mapping string argument names to default values + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install minimist +``` + +# license + +MIT diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js new file mode 100644 index 0000000..8b034b9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js @@ -0,0 +1,24 @@ +var parse = require('../'); +var test = require('tape'); + +test('-', function (t) { + t.plan(5); + t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] }); + t.deepEqual(parse([ '-' ]), { _: [ '-' ] }); + t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] }); + t.deepEqual( + parse([ '-b', '-' ], { boolean: 'b' }), + { b: true, _: [ '-' ] } + ); + t.deepEqual( + parse([ '-s', '-' ], { string: 's' }), + { s: '-', _: [] } + ); +}); + +test('-a -- b', function (t) { + t.plan(3); + t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] }); + t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); + t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js new file mode 100644 index 0000000..f0041ee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js @@ -0,0 +1,20 @@ +var test = require('tape'); +var parse = require('../'); + +test('boolean default true', function (t) { + var argv = parse([], { + boolean: 'sometrue', + default: { sometrue: true } + }); + t.equal(argv.sometrue, true); + t.end(); +}); + +test('boolean default false', function (t) { + var argv = parse([], { + boolean: 'somefalse', + default: { somefalse: false } + }); + t.equal(argv.somefalse, false); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js new file mode 100644 index 0000000..ef0ae34 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js @@ -0,0 +1,16 @@ +var parse = require('../'); +var test = require('tape'); + +test('dotted alias', function (t) { + var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); + t.equal(argv.a.b, 22); + t.equal(argv.aa.bb, 22); + t.end(); +}); + +test('dotted default', function (t) { + var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); + t.equal(argv.a.b, 11); + t.equal(argv.aa.bb, 11); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js new file mode 100644 index 0000000..5d3a1e0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js @@ -0,0 +1,31 @@ +var test = require('tape'); +var parse = require('../'); + +test('long opts', function (t) { + t.deepEqual( + parse([ '--bool' ]), + { bool : true, _ : [] }, + 'long boolean' + ); + t.deepEqual( + parse([ '--pow', 'xixxle' ]), + { pow : 'xixxle', _ : [] }, + 'long capture sp' + ); + t.deepEqual( + parse([ '--pow=xixxle' ]), + { pow : 'xixxle', _ : [] }, + 'long capture eq' + ); + t.deepEqual( + parse([ '--host', 'localhost', '--port', '555' ]), + { host : 'localhost', port : 555, _ : [] }, + 'long captures sp' + ); + t.deepEqual( + parse([ '--host=localhost', '--port=555' ]), + { host : 'localhost', port : 555, _ : [] }, + 'long captures eq' + ); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js new file mode 100644 index 0000000..8a90646 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js @@ -0,0 +1,318 @@ +var parse = require('../'); +var test = require('tape'); + +test('parse args', function (t) { + t.deepEqual( + parse([ '--no-moo' ]), + { moo : false, _ : [] }, + 'no' + ); + t.deepEqual( + parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), + { v : ['a','b','c'], _ : [] }, + 'multi' + ); + t.end(); +}); + +test('comprehensive', function (t) { + t.deepEqual( + parse([ + '--name=meowmers', 'bare', '-cats', 'woo', + '-h', 'awesome', '--multi=quux', + '--key', 'value', + '-b', '--bool', '--no-meep', '--multi=baz', + '--', '--not-a-flag', 'eek' + ]), + { + c : true, + a : true, + t : true, + s : 'woo', + h : 'awesome', + b : true, + bool : true, + key : 'value', + multi : [ 'quux', 'baz' ], + meep : false, + name : 'meowmers', + _ : [ 'bare', '--not-a-flag', 'eek' ] + } + ); + t.end(); +}); + +test('nums', function (t) { + var argv = parse([ + '-x', '1234', + '-y', '5.67', + '-z', '1e7', + '-w', '10f', + '--hex', '0xdeadbeef', + '789' + ]); + t.deepEqual(argv, { + x : 1234, + y : 5.67, + z : 1e7, + w : '10f', + hex : 0xdeadbeef, + _ : [ 789 ] + }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv.y, 'number'); + t.deepEqual(typeof argv.z, 'number'); + t.deepEqual(typeof argv.w, 'string'); + t.deepEqual(typeof argv.hex, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); + +test('flag boolean', function (t) { + var argv = parse([ '-t', 'moo' ], { boolean: 't' }); + t.deepEqual(argv, { t : true, _ : [ 'moo' ] }); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('flag boolean value', function (t) { + var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { + boolean: [ 't', 'verbose' ], + default: { verbose: true } + }); + + t.deepEqual(argv, { + verbose: false, + t: true, + _: ['moo'] + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('flag boolean default false', function (t) { + var argv = parse(['moo'], { + boolean: ['t', 'verbose'], + default: { verbose: false, t: false } + }); + + t.deepEqual(argv, { + verbose: false, + t: false, + _: ['moo'] + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); + +}); + +test('boolean groups', function (t) { + var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], { + boolean: ['x','y','z'] + }); + + t.deepEqual(argv, { + x : true, + y : false, + z : true, + _ : [ 'one', 'two', 'three' ] + }); + + t.deepEqual(typeof argv.x, 'boolean'); + t.deepEqual(typeof argv.y, 'boolean'); + t.deepEqual(typeof argv.z, 'boolean'); + t.end(); +}); + +test('newlines in params' , function (t) { + var args = parse([ '-s', "X\nX" ]) + t.deepEqual(args, { _ : [], s : "X\nX" }); + + // reproduce in bash: + // VALUE="new + // line" + // node program.js --s="$VALUE" + args = parse([ "--s=X\nX" ]) + t.deepEqual(args, { _ : [], s : "X\nX" }); + t.end(); +}); + +test('strings' , function (t) { + var s = parse([ '-s', '0001234' ], { string: 's' }).s; + t.equal(s, '0001234'); + t.equal(typeof s, 'string'); + + var x = parse([ '-x', '56' ], { string: 'x' }).x; + t.equal(x, '56'); + t.equal(typeof x, 'string'); + t.end(); +}); + +test('stringArgs', function (t) { + var s = parse([ ' ', ' ' ], { string: '_' })._; + t.same(s.length, 2); + t.same(typeof s[0], 'string'); + t.same(s[0], ' '); + t.same(typeof s[1], 'string'); + t.same(s[1], ' '); + t.end(); +}); + +test('empty strings', function(t) { + var s = parse([ '-s' ], { string: 's' }).s; + t.equal(s, ''); + t.equal(typeof s, 'string'); + + var str = parse([ '--str' ], { string: 'str' }).str; + t.equal(str, ''); + t.equal(typeof str, 'string'); + + var letters = parse([ '-art' ], { + string: [ 'a', 't' ] + }); + + t.equal(letters.a, ''); + t.equal(letters.r, true); + t.equal(letters.t, ''); + + t.end(); +}); + + +test('slashBreak', function (t) { + t.same( + parse([ '-I/foo/bar/baz' ]), + { I : '/foo/bar/baz', _ : [] } + ); + t.same( + parse([ '-xyz/foo/bar/baz' ]), + { x : true, y : true, z : '/foo/bar/baz', _ : [] } + ); + t.end(); +}); + +test('alias', function (t) { + var argv = parse([ '-f', '11', '--zoom', '55' ], { + alias: { z: 'zoom' } + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.f, 11); + t.end(); +}); + +test('multiAlias', function (t) { + var argv = parse([ '-f', '11', '--zoom', '55' ], { + alias: { z: [ 'zm', 'zoom' ] } + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.z, argv.zm); + t.equal(argv.f, 11); + t.end(); +}); + +test('nested dotted objects', function (t) { + var argv = parse([ + '--foo.bar', '3', '--foo.baz', '4', + '--foo.quux.quibble', '5', '--foo.quux.o_O', + '--beep.boop' + ]); + + t.same(argv.foo, { + bar : 3, + baz : 4, + quux : { + quibble : 5, + o_O : true + } + }); + t.same(argv.beep, { boop : true }); + t.end(); +}); + +test('boolean and alias with chainable api', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + herp: { alias: 'h', boolean: true } + }; + var aliasedArgv = parse(aliased, { + boolean: 'herp', + alias: { h: 'herp' } + }); + var propertyArgv = parse(regular, { + boolean: 'herp', + alias: { h: 'herp' } + }); + var expected = { + herp: true, + h: true, + '_': [ 'derp' ] + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias with options hash', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + alias: { 'h': 'herp' }, + boolean: 'herp' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + '_': [ 'derp' ] + }; + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias using explicit true', function (t) { + var aliased = [ '-h', 'true' ]; + var regular = [ '--herp', 'true' ]; + var opts = { + alias: { h: 'herp' }, + boolean: 'h' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + '_': [ ] + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +// regression, see https://github.com/substack/node-optimist/issues/71 +test('boolean and --x=true', function(t) { + var parsed = parse(['--boool', '--other=true'], { + boolean: 'boool' + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'true'); + + parsed = parse(['--boool', '--other=false'], { + boolean: 'boool' + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'false'); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js new file mode 100644 index 0000000..21851b0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js @@ -0,0 +1,9 @@ +var parse = require('../'); +var test = require('tape'); + +test('parse with modifier functions' , function (t) { + t.plan(1); + + var argv = parse([ '-b', '123' ], { boolean: 'b' }); + t.deepEqual(argv, { b: true, _: ['123'] }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js new file mode 100644 index 0000000..d513a1c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js @@ -0,0 +1,67 @@ +var parse = require('../'); +var test = require('tape'); + +test('numeric short args', function (t) { + t.plan(2); + t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] }); + t.deepEqual( + parse([ '-123', '456' ]), + { 1: true, 2: true, 3: 456, _: [] } + ); +}); + +test('short', function (t) { + t.deepEqual( + parse([ '-b' ]), + { b : true, _ : [] }, + 'short boolean' + ); + t.deepEqual( + parse([ 'foo', 'bar', 'baz' ]), + { _ : [ 'foo', 'bar', 'baz' ] }, + 'bare' + ); + t.deepEqual( + parse([ '-cats' ]), + { c : true, a : true, t : true, s : true, _ : [] }, + 'group' + ); + t.deepEqual( + parse([ '-cats', 'meow' ]), + { c : true, a : true, t : true, s : 'meow', _ : [] }, + 'short group next' + ); + t.deepEqual( + parse([ '-h', 'localhost' ]), + { h : 'localhost', _ : [] }, + 'short capture' + ); + t.deepEqual( + parse([ '-h', 'localhost', '-p', '555' ]), + { h : 'localhost', p : 555, _ : [] }, + 'short captures' + ); + t.end(); +}); + +test('mixed short bool and capture', function (t) { + t.same( + parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ] + } + ); + t.end(); +}); + +test('short and long', function (t) { + t.deepEqual( + parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ] + } + ); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js new file mode 100644 index 0000000..8a52a58 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js @@ -0,0 +1,8 @@ +var parse = require('../'); +var test = require('tape'); + +test('whitespace should be whitespace' , function (t) { + t.plan(1); + var x = parse([ '-x', '\t' ]).x; + t.equal(x, '\t'); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/package.json new file mode 100644 index 0000000..a6de8f3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/package.json @@ -0,0 +1,58 @@ +{ + "name": "mkdirp", + "description": "Recursively mkdir, like `mkdir -p`", + "version": "0.5.0", + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "main": "./index", + "keywords": [ + "mkdir", + "directory" + ], + "repository": { + "type": "git", + "url": "https://github.com/substack/node-mkdirp.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "minimist": "0.0.8" + }, + "devDependencies": { + "tap": "~0.4.0", + "mock-fs": "~2.2.0" + }, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/substack/node-mkdirp/issues" + }, + "homepage": "https://github.com/substack/node-mkdirp", + "_id": "mkdirp@0.5.0", + "dist": { + "shasum": "1d73076a6df986cd9344e15e71fcc05a4c9abf12", + "tarball": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz" + }, + "_from": "mkdirp@~0.5.0", + "_npmVersion": "1.4.3", + "_npmUser": { + "name": "substack", + "email": "mail@substack.net" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + } + ], + "directories": {}, + "_shasum": "1d73076a6df986cd9344e15e71fcc05a4c9abf12", + "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown new file mode 100644 index 0000000..3cc1315 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown @@ -0,0 +1,100 @@ +# mkdirp + +Like `mkdir -p`, but in node.js! + +[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) + +# example + +## pow.js + +```js +var mkdirp = require('mkdirp'); + +mkdirp('/tmp/foo/bar/baz', function (err) { + if (err) console.error(err) + else console.log('pow!') +}); +``` + +Output + +``` +pow! +``` + +And now /tmp/foo/bar/baz exists, huzzah! + +# methods + +```js +var mkdirp = require('mkdirp'); +``` + +## mkdirp(dir, opts, cb) + +Create a new directory and any necessary subdirectories at `dir` with octal +permission string `opts.mode`. If `opts` is a non-object, it will be treated as +the `opts.mode`. + +If `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +`cb(err, made)` fires with the error or the first directory `made` +that had to be created, if any. + +You can optionally pass in an alternate `fs` implementation by passing in +`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and +`opts.fs.stat(path, cb)`. + +## mkdirp.sync(dir, opts) + +Synchronously create a new directory and any necessary subdirectories at `dir` +with octal permission string `opts.mode`. If `opts` is a non-object, it will be +treated as the `opts.mode`. + +If `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`. + +Returns the first directory that had to be created, if any. + +You can optionally pass in an alternate `fs` implementation by passing in +`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and +`opts.fs.statSync(path)`. + +# usage + +This package also ships with a `mkdirp` command. + +``` +usage: mkdirp [DIR1,DIR2..] {OPTIONS} + + Create each supplied directory including any necessary parent directories that + don't yet exist. + + If the directory already exists, do nothing. + +OPTIONS are: + + -m, --mode If a directory needs to be created, set the mode as an octal + permission string. + +``` + +# install + +With [npm](http://npmjs.org) do: + +``` +npm install mkdirp +``` + +to get the library, or + +``` +npm install -g mkdirp +``` + +to get the command. + +# license + +MIT diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js new file mode 100644 index 0000000..520dcb8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js @@ -0,0 +1,38 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +test('chmod-pre', function (t) { + var mode = 0744 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); + t.end(); + }); + }); +}); + +test('chmod', function (t) { + var mode = 0755 + mkdirp(file, mode, function (er) { + t.ifError(er, 'should not error'); + fs.stat(file, function (er, stat) { + t.ifError(er, 'should exist'); + t.ok(stat && stat.isDirectory(), 'should be directory'); + t.end(); + }); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js new file mode 100644 index 0000000..0eb7099 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js @@ -0,0 +1,37 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +var ps = [ '', 'tmp' ]; + +for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); +} + +var file = ps.join('/'); + +// a file in the way +var itw = ps.slice(0, 3).join('/'); + + +test('clobber-pre', function (t) { + console.error("about to write to "+itw) + fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); + + fs.stat(itw, function (er, stat) { + t.ifError(er) + t.ok(stat && stat.isFile(), 'should be file') + t.end() + }) +}) + +test('clobber', function (t) { + t.plan(2); + mkdirp(file, 0755, function (err) { + t.ok(err); + t.equal(err.code, 'ENOTDIR'); + t.end(); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js new file mode 100644 index 0000000..3b624dd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js @@ -0,0 +1,26 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('woo', function (t) { + t.plan(5); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + t.ifError(err); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }) + }) + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js new file mode 100644 index 0000000..f1fbeca --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js @@ -0,0 +1,27 @@ +var mkdirp = require('../'); +var path = require('path'); +var test = require('tap').test; +var mockfs = require('mock-fs'); + +test('opts.fs', function (t) { + t.plan(5); + + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/beep/boop/' + [x,y,z].join('/'); + var xfs = mockfs.fs(); + + mkdirp(file, { fs: xfs, mode: 0755 }, function (err) { + t.ifError(err); + xfs.exists(file, function (ex) { + t.ok(ex, 'created file'); + xfs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }); + }); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js new file mode 100644 index 0000000..224b506 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js @@ -0,0 +1,25 @@ +var mkdirp = require('../'); +var path = require('path'); +var test = require('tap').test; +var mockfs = require('mock-fs'); + +test('opts.fs sync', function (t) { + t.plan(4); + + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/beep/boop/' + [x,y,z].join('/'); + var xfs = mockfs.fs(); + + mkdirp.sync(file, { fs: xfs, mode: 0755 }); + xfs.exists(file, function (ex) { + t.ok(ex, 'created file'); + xfs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js new file mode 100644 index 0000000..2c97590 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js @@ -0,0 +1,30 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('async perm', function (t) { + t.plan(5); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); + + mkdirp(file, 0755, function (err) { + t.ifError(err); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }) + }) + }); +}); + +test('async root perm', function (t) { + mkdirp('/tmp', 0755, function (err) { + if (err) t.fail(err); + t.end(); + }); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js new file mode 100644 index 0000000..327e54b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js @@ -0,0 +1,34 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('sync perm', function (t) { + t.plan(4); + var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; + + mkdirp.sync(file, 0755); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }); + }); +}); + +test('sync root perm', function (t) { + t.plan(3); + + var file = '/tmp'; + mkdirp.sync(file, 0755); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.ok(stat.isDirectory(), 'target not a directory'); + }) + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js new file mode 100644 index 0000000..7c295f4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js @@ -0,0 +1,40 @@ +var mkdirp = require('../').mkdirp; +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('race', function (t) { + t.plan(6); + var ps = [ '', 'tmp' ]; + + for (var i = 0; i < 25; i++) { + var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + ps.push(dir); + } + var file = ps.join('/'); + + var res = 2; + mk(file, function () { + if (--res === 0) t.end(); + }); + + mk(file, function () { + if (--res === 0) t.end(); + }); + + function mk (file, cb) { + mkdirp(file, 0755, function (err) { + t.ifError(err); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + if (cb) cb(); + }); + }) + }); + } +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js new file mode 100644 index 0000000..d1f175c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js @@ -0,0 +1,30 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('rel', function (t) { + t.plan(5); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var cwd = process.cwd(); + process.chdir('/tmp'); + + var file = [x,y,z].join('/'); + + mkdirp(file, 0755, function (err) { + t.ifError(err); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + process.chdir(cwd); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }) + }) + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js new file mode 100644 index 0000000..bce68e5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js @@ -0,0 +1,25 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('return value', function (t) { + t.plan(4); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + // should return the first dir created. + // By this point, it would be profoundly surprising if /tmp didn't + // already exist, since every other test makes things in there. + mkdirp(file, function (err, made) { + t.ifError(err); + t.equal(made, '/tmp/' + x); + mkdirp(file, function (err, made) { + t.ifError(err); + t.equal(made, null); + }); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js new file mode 100644 index 0000000..7c222d3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js @@ -0,0 +1,24 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('return value', function (t) { + t.plan(2); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + // should return the first dir created. + // By this point, it would be profoundly surprising if /tmp didn't + // already exist, since every other test makes things in there. + // Note that this will throw on failure, which will fail the test. + var made = mkdirp.sync(file); + t.equal(made, '/tmp/' + x); + + // making the same file again should have no effect. + made = mkdirp.sync(file); + t.equal(made, null); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js new file mode 100644 index 0000000..97ad7a2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js @@ -0,0 +1,18 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var test = require('tap').test; + +test('root', function (t) { + // '/' on unix, 'c:/' on windows. + var file = path.resolve('/'); + + mkdirp(file, 0755, function (err) { + if (err) throw err + fs.stat(file, function (er, stat) { + if (er) throw er + t.ok(stat.isDirectory(), 'target is a directory'); + t.end(); + }) + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js new file mode 100644 index 0000000..88fa432 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js @@ -0,0 +1,30 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('sync', function (t) { + t.plan(4); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + try { + mkdirp.sync(file, 0755); + } catch (err) { + t.fail(err); + return t.end(); + } + + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0755); + t.ok(stat.isDirectory(), 'target not a directory'); + }); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js new file mode 100644 index 0000000..82c393a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js @@ -0,0 +1,26 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('implicit mode from umask', function (t) { + t.plan(5); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + mkdirp(file, function (err) { + t.ifError(err); + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, 0777 & (~process.umask())); + t.ok(stat.isDirectory(), 'target not a directory'); + }); + }) + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js new file mode 100644 index 0000000..e537fbe --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js @@ -0,0 +1,30 @@ +var mkdirp = require('../'); +var path = require('path'); +var fs = require('fs'); +var exists = fs.exists || path.exists; +var test = require('tap').test; + +test('umask sync modes', function (t) { + t.plan(4); + var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); + + var file = '/tmp/' + [x,y,z].join('/'); + + try { + mkdirp.sync(file); + } catch (err) { + t.fail(err); + return t.end(); + } + + exists(file, function (ex) { + t.ok(ex, 'file created'); + fs.stat(file, function (err, stat) { + t.ifError(err); + t.equal(stat.mode & 0777, (0777 & (~process.umask()))); + t.ok(stat.isDirectory(), 'target not a directory'); + }); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/README.md new file mode 100644 index 0000000..5aba088 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/README.md @@ -0,0 +1,209 @@ +If you want to write an option parser, and have it be good, there are +two ways to do it. The Right Way, and the Wrong Way. + +The Wrong Way is to sit down and write an option parser. We've all done +that. + +The Right Way is to write some complex configurable program with so many +options that you go half-insane just trying to manage them all, and put +it off with duct-tape solutions until you see exactly to the core of the +problem, and finally snap and write an awesome option parser. + +If you want to write an option parser, don't write an option parser. +Write a package manager, or a source control system, or a service +restarter, or an operating system. You probably won't end up with a +good one of those, but if you don't give up, and you are relentless and +diligent enough in your procrastination, you may just end up with a very +nice option parser. + +## USAGE + + // my-program.js + var nopt = require("nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + , "many" : [String, Array] + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag"] + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + console.log(parsed) + +This would give you support for any of the following: + +```bash +$ node my-program.js --foo "blerp" --no-flag +{ "foo" : "blerp", "flag" : false } + +$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag +{ bar: 7, foo: "Mr. Hand", flag: true } + +$ node my-program.js --foo "blerp" -f -----p +{ foo: "blerp", flag: true, pick: true } + +$ node my-program.js -fp --foofoo +{ foo: "Mr. Foo", flag: true, pick: true } + +$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. +{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } + +$ node my-program.js --blatzk -fp # unknown opts are ok. +{ blatzk: true, flag: true, pick: true } + +$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value +{ blatzk: 1000, flag: true, pick: true } + +$ node my-program.js --no-blatzk -fp # unless they start with "no-" +{ blatzk: false, flag: true, pick: true } + +$ node my-program.js --baz b/a/z # known paths are resolved. +{ baz: "/Users/isaacs/b/a/z" } + +# if Array is one of the types, then it can take many +# values, and will always be an array. The other types provided +# specify what types are allowed in the list. + +$ node my-program.js --many 1 --many null --many foo +{ many: ["1", "null", "foo"] } + +$ node my-program.js --many foo +{ many: ["foo"] } +``` + +Read the tests at the bottom of `lib/nopt.js` for more examples of +what this puppy can do. + +## Types + +The following types are supported, and defined on `nopt.typeDefs` + +* String: A normal string. No parsing is done. +* path: A file system path. Gets resolved against cwd if not absolute. +* url: A url. If it doesn't parse, it isn't accepted. +* Number: Must be numeric. +* Date: Must parse as a date. If it does, and `Date` is one of the options, + then it will return a Date object, not a string. +* Boolean: Must be either `true` or `false`. If an option is a boolean, + then it does not need a value, and its presence will imply `true` as + the value. To negate boolean flags, do `--no-whatever` or `--whatever + false` +* NaN: Means that the option is strictly not allowed. Any value will + fail. +* Stream: An object matching the "Stream" class in node. Valuable + for use when validating programmatically. (npm uses this to let you + supply any WriteStream on the `outfd` and `logfd` config options.) +* Array: If `Array` is specified as one of the types, then the value + will be parsed as a list of options. This means that multiple values + can be specified, and that the value will always be an array. + +If a type is an array of values not on this list, then those are +considered valid values. For instance, in the example above, the +`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, +and any other value will be rejected. + +When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be +interpreted as their JavaScript equivalents. + +You can also mix types and values, or multiple types, in a list. For +instance `{ blah: [Number, null] }` would allow a value to be set to +either a Number or null. When types are ordered, this implies a +preference, and the first type that can be used to properly interpret +the value will be used. + +To define a new type, add it to `nopt.typeDefs`. Each item in that +hash is an object with a `type` member and a `validate` method. The +`type` member is an object that matches what goes in the type list. The +`validate` method is a function that gets called with `validate(data, +key, val)`. Validate methods should assign `data[key]` to the valid +value of `val` if it can be handled properly, or return boolean +`false` if it cannot. + +You can also call `nopt.clean(data, types, typeDefs)` to clean up a +config object and remove its invalid properties. + +## Error Handling + +By default, nopt outputs a warning to standard error when invalid +options are found. You can change this behavior by assigning a method +to `nopt.invalidHandler`. This method will be called with +the offending `nopt.invalidHandler(key, val, types)`. + +If no `nopt.invalidHandler` is assigned, then it will console.error +its whining. If it is assigned to boolean `false` then the warning is +suppressed. + +## Abbreviations + +Yes, they are supported. If you define options like this: + +```javascript +{ "foolhardyelephants" : Boolean +, "pileofmonkeys" : Boolean } +``` + +Then this will work: + +```bash +node program.js --foolhar --pil +node program.js --no-f --pileofmon +# etc. +``` + +## Shorthands + +Shorthands are a hash of shorter option names to a snippet of args that +they expand to. + +If multiple one-character shorthands are all combined, and the +combination does not unambiguously match any other option or shorthand, +then they will be broken up into their constituent parts. For example: + +```json +{ "s" : ["--loglevel", "silent"] +, "g" : "--global" +, "f" : "--force" +, "p" : "--parseable" +, "l" : "--long" +} +``` + +```bash +npm ls -sgflp +# just like doing this: +npm ls --loglevel silent --global --force --long --parseable +``` + +## The Rest of the args + +The config object returned by nopt is given a special member called +`argv`, which is an object with the following fields: + +* `remain`: The remaining args after all the parsing has occurred. +* `original`: The args as they originally appeared. +* `cooked`: The args after flags and shorthands are expanded. + +## Slicing + +Node programs are called with more or less the exact argv as it appears +in C land, after the v8 and node-specific options have been plucked off. +As such, `argv[0]` is always `node` and `argv[1]` is always the +JavaScript program being run. + +That's usually not very useful to you. So they're sliced off by +default. If you want them, then you can pass in `0` as the last +argument, or any other number that you'd like to slice off the start of +the list. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js new file mode 100755 index 0000000..3232d4c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js @@ -0,0 +1,54 @@ +#!/usr/bin/env node +var nopt = require("../lib/nopt") + , path = require("path") + , types = { num: Number + , bool: Boolean + , help: Boolean + , list: Array + , "num-list": [Number, Array] + , "str-list": [String, Array] + , "bool-list": [Boolean, Array] + , str: String + , clear: Boolean + , config: Boolean + , length: Number + , file: path + } + , shorthands = { s: [ "--str", "astring" ] + , b: [ "--bool" ] + , nb: [ "--no-bool" ] + , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ] + , "?": ["--help"] + , h: ["--help"] + , H: ["--help"] + , n: [ "--num", "125" ] + , c: ["--config"] + , l: ["--length"] + , f: ["--file"] + } + , parsed = nopt( types + , shorthands + , process.argv + , 2 ) + +console.log("parsed", parsed) + +if (parsed.help) { + console.log("") + console.log("nopt cli tester") + console.log("") + console.log("types") + console.log(Object.keys(types).map(function M (t) { + var type = types[t] + if (Array.isArray(type)) { + return [t, type.map(function (type) { return type.name })] + } + return [t, type && type.name] + }).reduce(function (s, i) { + s[i[0]] = i[1] + return s + }, {})) + console.log("") + console.log("shorthands") + console.log(shorthands) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js new file mode 100755 index 0000000..142447e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js @@ -0,0 +1,30 @@ +#!/usr/bin/env node + +//process.env.DEBUG_NOPT = 1 + +// my-program.js +var nopt = require("../lib/nopt") + , Stream = require("stream").Stream + , path = require("path") + , knownOpts = { "foo" : [String, null] + , "bar" : [Stream, Number] + , "baz" : path + , "bloo" : [ "big", "medium", "small" ] + , "flag" : Boolean + , "pick" : Boolean + } + , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] + , "b7" : ["--bar", "7"] + , "m" : ["--bloo", "medium"] + , "p" : ["--pick"] + , "f" : ["--flag", "true"] + , "g" : ["--flag"] + , "s" : "--flag" + } + // everything is optional. + // knownOpts and shorthands default to {} + // arg list defaults to process.argv + // slice defaults to 2 + , parsed = nopt(knownOpts, shortHands, process.argv, 2) + +console.log("parsed =\n"+ require("util").inspect(parsed)) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js new file mode 100644 index 0000000..5309a00 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js @@ -0,0 +1,414 @@ +// info about each config option. + +var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG + ? function () { console.error.apply(console, arguments) } + : function () {} + +var url = require("url") + , path = require("path") + , Stream = require("stream").Stream + , abbrev = require("abbrev") + +module.exports = exports = nopt +exports.clean = clean + +exports.typeDefs = + { String : { type: String, validate: validateString } + , Boolean : { type: Boolean, validate: validateBoolean } + , url : { type: url, validate: validateUrl } + , Number : { type: Number, validate: validateNumber } + , path : { type: path, validate: validatePath } + , Stream : { type: Stream, validate: validateStream } + , Date : { type: Date, validate: validateDate } + } + +function nopt (types, shorthands, args, slice) { + args = args || process.argv + types = types || {} + shorthands = shorthands || {} + if (typeof slice !== "number") slice = 2 + + debug(types, shorthands, args, slice) + + args = args.slice(slice) + var data = {} + , key + , remain = [] + , cooked = args + , original = args.slice(0) + + parse(args, data, remain, types, shorthands) + // now data is full + clean(data, types, exports.typeDefs) + data.argv = {remain:remain,cooked:cooked,original:original} + Object.defineProperty(data.argv, 'toString', { value: function () { + return this.original.map(JSON.stringify).join(" ") + }, enumerable: false }) + return data +} + +function clean (data, types, typeDefs) { + typeDefs = typeDefs || exports.typeDefs + var remove = {} + , typeDefault = [false, true, null, String, Array] + + Object.keys(data).forEach(function (k) { + if (k === "argv") return + var val = data[k] + , isArray = Array.isArray(val) + , type = types[k] + if (!isArray) val = [val] + if (!type) type = typeDefault + if (type === Array) type = typeDefault.concat(Array) + if (!Array.isArray(type)) type = [type] + + debug("val=%j", val) + debug("types=", type) + val = val.map(function (val) { + // if it's an unknown value, then parse false/true/null/numbers/dates + if (typeof val === "string") { + debug("string %j", val) + val = val.trim() + if ((val === "null" && ~type.indexOf(null)) + || (val === "true" && + (~type.indexOf(true) || ~type.indexOf(Boolean))) + || (val === "false" && + (~type.indexOf(false) || ~type.indexOf(Boolean)))) { + val = JSON.parse(val) + debug("jsonable %j", val) + } else if (~type.indexOf(Number) && !isNaN(val)) { + debug("convert to number", val) + val = +val + } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) { + debug("convert to date", val) + val = new Date(val) + } + } + + if (!types.hasOwnProperty(k)) { + return val + } + + // allow `--no-blah` to set 'blah' to null if null is allowed + if (val === false && ~type.indexOf(null) && + !(~type.indexOf(false) || ~type.indexOf(Boolean))) { + val = null + } + + var d = {} + d[k] = val + debug("prevalidated val", d, val, types[k]) + if (!validate(d, k, val, types[k], typeDefs)) { + if (exports.invalidHandler) { + exports.invalidHandler(k, val, types[k], data) + } else if (exports.invalidHandler !== false) { + debug("invalid: "+k+"="+val, types[k]) + } + return remove + } + debug("validated val", d, val, types[k]) + return d[k] + }).filter(function (val) { return val !== remove }) + + if (!val.length) delete data[k] + else if (isArray) { + debug(isArray, data[k], val) + data[k] = val + } else data[k] = val[0] + + debug("k=%s val=%j", k, val, data[k]) + }) +} + +function validateString (data, k, val) { + data[k] = String(val) +} + +function validatePath (data, k, val) { + if (val === true) return false + if (val === null) return true + + val = String(val) + var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\// + if (val.match(homePattern) && process.env.HOME) { + val = path.resolve(process.env.HOME, val.substr(2)) + } + data[k] = path.resolve(String(val)) + return true +} + +function validateNumber (data, k, val) { + debug("validate Number %j %j %j", k, val, isNaN(val)) + if (isNaN(val)) return false + data[k] = +val +} + +function validateDate (data, k, val) { + debug("validate Date %j %j %j", k, val, Date.parse(val)) + var s = Date.parse(val) + if (isNaN(s)) return false + data[k] = new Date(val) +} + +function validateBoolean (data, k, val) { + if (val instanceof Boolean) val = val.valueOf() + else if (typeof val === "string") { + if (!isNaN(val)) val = !!(+val) + else if (val === "null" || val === "false") val = false + else val = true + } else val = !!val + data[k] = val +} + +function validateUrl (data, k, val) { + val = url.parse(String(val)) + if (!val.host) return false + data[k] = val.href +} + +function validateStream (data, k, val) { + if (!(val instanceof Stream)) return false + data[k] = val +} + +function validate (data, k, val, type, typeDefs) { + // arrays are lists of types. + if (Array.isArray(type)) { + for (var i = 0, l = type.length; i < l; i ++) { + if (type[i] === Array) continue + if (validate(data, k, val, type[i], typeDefs)) return true + } + delete data[k] + return false + } + + // an array of anything? + if (type === Array) return true + + // NaN is poisonous. Means that something is not allowed. + if (type !== type) { + debug("Poison NaN", k, val, type) + delete data[k] + return false + } + + // explicit list of values + if (val === type) { + debug("Explicitly allowed %j", val) + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + return true + } + + // now go through the list of typeDefs, validate against each one. + var ok = false + , types = Object.keys(typeDefs) + for (var i = 0, l = types.length; i < l; i ++) { + debug("test type %j %j %j", k, val, types[i]) + var t = typeDefs[types[i]] + if (t && type === t.type) { + var d = {} + ok = false !== t.validate(d, k, val) + val = d[k] + if (ok) { + // if (isArray) (data[k] = data[k] || []).push(val) + // else data[k] = val + data[k] = val + break + } + } + } + debug("OK? %j (%j %j %j)", ok, k, val, types[i]) + + if (!ok) delete data[k] + return ok +} + +function parse (args, data, remain, types, shorthands) { + debug("parse", args, data, remain) + + var key = null + , abbrevs = abbrev(Object.keys(types)) + , shortAbbr = abbrev(Object.keys(shorthands)) + + for (var i = 0; i < args.length; i ++) { + var arg = args[i] + debug("arg", arg) + + if (arg.match(/^-{2,}$/)) { + // done with keys. + // the rest are args. + remain.push.apply(remain, args.slice(i + 1)) + args[i] = "--" + break + } + var hadEq = false + if (arg.charAt(0) === "-" && arg.length > 1) { + if (arg.indexOf("=") !== -1) { + hadEq = true + var v = arg.split("=") + arg = v.shift() + v = v.join("=") + args.splice.apply(args, [i, 1].concat([arg, v])) + } + + // see if it's a shorthand + // if so, splice and back up to re-parse it. + var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs) + debug("arg=%j shRes=%j", arg, shRes) + if (shRes) { + debug(arg, shRes) + args.splice.apply(args, [i, 1].concat(shRes)) + if (arg !== shRes[0]) { + i -- + continue + } + } + arg = arg.replace(/^-+/, "") + var no = null + while (arg.toLowerCase().indexOf("no-") === 0) { + no = !no + arg = arg.substr(3) + } + + if (abbrevs[arg]) arg = abbrevs[arg] + + var isArray = types[arg] === Array || + Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 + + // allow unknown things to be arrays if specified multiple times. + if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) { + if (!Array.isArray(data[arg])) + data[arg] = [data[arg]] + isArray = true + } + + var val + , la = args[i + 1] + + var isBool = typeof no === 'boolean' || + types[arg] === Boolean || + Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || + (typeof types[arg] === 'undefined' && !hadEq) || + (la === "false" && + (types[arg] === null || + Array.isArray(types[arg]) && ~types[arg].indexOf(null))) + + if (isBool) { + // just set and move along + val = !no + // however, also support --bool true or --bool false + if (la === "true" || la === "false") { + val = JSON.parse(la) + la = null + if (no) val = !val + i ++ + } + + // also support "foo":[Boolean, "bar"] and "--foo bar" + if (Array.isArray(types[arg]) && la) { + if (~types[arg].indexOf(la)) { + // an explicit type + val = la + i ++ + } else if ( la === "null" && ~types[arg].indexOf(null) ) { + // null allowed + val = null + i ++ + } else if ( !la.match(/^-{2,}[^-]/) && + !isNaN(la) && + ~types[arg].indexOf(Number) ) { + // number + val = +la + i ++ + } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { + // string + val = la + i ++ + } + } + + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + continue + } + + if (types[arg] === String && la === undefined) + la = "" + + if (la && la.match(/^-{2,}$/)) { + la = undefined + i -- + } + + val = la === undefined ? true : la + if (isArray) (data[arg] = data[arg] || []).push(val) + else data[arg] = val + + i ++ + continue + } + remain.push(arg) + } +} + +function resolveShort (arg, shorthands, shortAbbr, abbrevs) { + // handle single-char shorthands glommed together, like + // npm ls -glp, but only if there is one dash, and only if + // all of the chars are single-char shorthands, and it's + // not a match to some other abbrev. + arg = arg.replace(/^-+/, '') + + // if it's an exact known option, then don't go any further + if (abbrevs[arg] === arg) + return null + + // if it's an exact known shortopt, same deal + if (shorthands[arg]) { + // make it an array, if it's a list of words + if (shorthands[arg] && !Array.isArray(shorthands[arg])) + shorthands[arg] = shorthands[arg].split(/\s+/) + + return shorthands[arg] + } + + // first check to see if this arg is a set of single-char shorthands + var singles = shorthands.___singles + if (!singles) { + singles = Object.keys(shorthands).filter(function (s) { + return s.length === 1 + }).reduce(function (l,r) { + l[r] = true + return l + }, {}) + shorthands.___singles = singles + debug('shorthand singles', singles) + } + + var chrs = arg.split("").filter(function (c) { + return singles[c] + }) + + if (chrs.join("") === arg) return chrs.map(function (c) { + return shorthands[c] + }).reduce(function (l, r) { + return l.concat(r) + }, []) + + + // if it's an arg abbrev, and not a literal shorthand, then prefer the arg + if (abbrevs[arg] && !shorthands[arg]) + return null + + // if it's an abbr for a shorthand, then use that + if (shortAbbr[arg]) + arg = shortAbbr[arg] + + // make it an array, if it's a list of words + if (shorthands[arg] && !Array.isArray(shorthands[arg])) + shorthands[arg] = shorthands[arg].split(/\s+/) + + return shorthands[arg] +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md new file mode 100644 index 0000000..2f30261 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md @@ -0,0 +1,3 @@ + To get started, sign the + Contributor License Agreement. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md new file mode 100644 index 0000000..99746fe --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md @@ -0,0 +1,23 @@ +# abbrev-js + +Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev). + +Usage: + + var abbrev = require("abbrev"); + abbrev("foo", "fool", "folding", "flop"); + + // returns: + { fl: 'flop' + , flo: 'flop' + , flop: 'flop' + , fol: 'folding' + , fold: 'folding' + , foldi: 'folding' + , foldin: 'folding' + , folding: 'folding' + , foo: 'foo' + , fool: 'fool' + } + +This is handy for command-line scripts, or other cases where you want to be able to accept shorthands. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js new file mode 100644 index 0000000..69cfeac --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js @@ -0,0 +1,62 @@ + +module.exports = exports = abbrev.abbrev = abbrev + +abbrev.monkeyPatch = monkeyPatch + +function monkeyPatch () { + Object.defineProperty(Array.prototype, 'abbrev', { + value: function () { return abbrev(this) }, + enumerable: false, configurable: true, writable: true + }) + + Object.defineProperty(Object.prototype, 'abbrev', { + value: function () { return abbrev(Object.keys(this)) }, + enumerable: false, configurable: true, writable: true + }) +} + +function abbrev (list) { + if (arguments.length !== 1 || !Array.isArray(list)) { + list = Array.prototype.slice.call(arguments, 0) + } + for (var i = 0, l = list.length, args = [] ; i < l ; i ++) { + args[i] = typeof list[i] === "string" ? list[i] : String(list[i]) + } + + // sort them lexicographically, so that they're next to their nearest kin + args = args.sort(lexSort) + + // walk through each, seeing how much it has in common with the next and previous + var abbrevs = {} + , prev = "" + for (var i = 0, l = args.length ; i < l ; i ++) { + var current = args[i] + , next = args[i + 1] || "" + , nextMatches = true + , prevMatches = true + if (current === next) continue + for (var j = 0, cl = current.length ; j < cl ; j ++) { + var curChar = current.charAt(j) + nextMatches = nextMatches && curChar === next.charAt(j) + prevMatches = prevMatches && curChar === prev.charAt(j) + if (!nextMatches && !prevMatches) { + j ++ + break + } + } + prev = current + if (j === cl) { + abbrevs[current] = current + continue + } + for (var a = current.substr(0, j) ; j <= cl ; j ++) { + abbrevs[a] = current + a += current.charAt(j) + } + } + return abbrevs +} + +function lexSort (a, b) { + return a === b ? 0 : a > b ? 1 : -1 +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json new file mode 100644 index 0000000..1dad5f2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json @@ -0,0 +1,46 @@ +{ + "name": "abbrev", + "version": "1.0.5", + "description": "Like ruby's abbrev module, but in js", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "main": "abbrev.js", + "scripts": { + "test": "node test.js" + }, + "repository": { + "type": "git", + "url": "http://github.com/isaacs/abbrev-js" + }, + "license": { + "type": "MIT", + "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE" + }, + "bugs": { + "url": "https://github.com/isaacs/abbrev-js/issues" + }, + "homepage": "https://github.com/isaacs/abbrev-js", + "_id": "abbrev@1.0.5", + "_shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", + "_from": "abbrev@1", + "_npmVersion": "1.4.7", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", + "tarball": "http://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/test.js new file mode 100644 index 0000000..d5a7303 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/test.js @@ -0,0 +1,47 @@ +var abbrev = require('./abbrev.js') +var assert = require("assert") +var util = require("util") + +console.log("TAP Version 13") +var count = 0 + +function test (list, expect) { + count++ + var actual = abbrev(list) + assert.deepEqual(actual, expect, + "abbrev("+util.inspect(list)+") === " + util.inspect(expect) + "\n"+ + "actual: "+util.inspect(actual)) + actual = abbrev.apply(exports, list) + assert.deepEqual(abbrev.apply(exports, list), expect, + "abbrev("+list.map(JSON.stringify).join(",")+") === " + util.inspect(expect) + "\n"+ + "actual: "+util.inspect(actual)) + console.log('ok - ' + list.join(' ')) +} + +test([ "ruby", "ruby", "rules", "rules", "rules" ], +{ rub: 'ruby' +, ruby: 'ruby' +, rul: 'rules' +, rule: 'rules' +, rules: 'rules' +}) +test(["fool", "foom", "pool", "pope"], +{ fool: 'fool' +, foom: 'foom' +, poo: 'pool' +, pool: 'pool' +, pop: 'pope' +, pope: 'pope' +}) +test(["a", "ab", "abc", "abcd", "abcde", "acde"], +{ a: 'a' +, ab: 'ab' +, abc: 'abc' +, abcd: 'abcd' +, abcde: 'abcde' +, ac: 'acde' +, acd: 'acde' +, acde: 'acde' +}) + +console.log("0..%d", count) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/package.json new file mode 100644 index 0000000..4cbe930 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/package.json @@ -0,0 +1,57 @@ +{ + "name": "nopt", + "version": "3.0.1", + "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "main": "lib/nopt.js", + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "http://github.com/isaacs/nopt" + }, + "bin": { + "nopt": "./bin/nopt.js" + }, + "license": { + "type": "MIT", + "url": "https://github.com/isaacs/nopt/raw/master/LICENSE" + }, + "dependencies": { + "abbrev": "1" + }, + "devDependencies": { + "tap": "~0.4.8" + }, + "gitHead": "4296f7aba7847c198fea2da594f9e1bec02817ec", + "bugs": { + "url": "https://github.com/isaacs/nopt/issues" + }, + "homepage": "https://github.com/isaacs/nopt", + "_id": "nopt@3.0.1", + "_shasum": "bce5c42446a3291f47622a370abbf158fbbacbfd", + "_from": "nopt@~3.0.1", + "_npmVersion": "1.4.18", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "bce5c42446a3291f47622a370abbf158fbbacbfd", + "tarball": "http://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js new file mode 100644 index 0000000..2f9088c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js @@ -0,0 +1,251 @@ +var nopt = require("../") + , test = require('tap').test + + +test("passing a string results in a string", function (t) { + var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0) + t.same(parsed.key, "myvalue") + t.end() +}) + +// https://github.com/npm/nopt/issues/31 +test("Empty String results in empty string, not true", function (t) { + var parsed = nopt({ empty: String }, {}, ["--empty"], 0) + t.same(parsed.empty, "") + t.end() +}) + +test("~ path is resolved to $HOME", function (t) { + var path = require("path") + if (!process.env.HOME) process.env.HOME = "/tmp" + var parsed = nopt({key: path}, {}, ["--key=~/val"], 0) + t.same(parsed.key, path.resolve(process.env.HOME, "val")) + t.end() +}) + +// https://github.com/npm/nopt/issues/24 +test("Unknown options are not parsed as numbers", function (t) { + var parsed = nopt({"parse-me": Number}, null, ['--leave-as-is=1.20', '--parse-me=1.20'], 0) + t.equal(parsed['leave-as-is'], '1.20') + t.equal(parsed['parse-me'], 1.2) + t.end() +}); + +test("other tests", function (t) { + + var util = require("util") + , Stream = require("stream") + , path = require("path") + , url = require("url") + + , shorthands = + { s : ["--loglevel", "silent"] + , d : ["--loglevel", "info"] + , dd : ["--loglevel", "verbose"] + , ddd : ["--loglevel", "silly"] + , noreg : ["--no-registry"] + , reg : ["--registry"] + , "no-reg" : ["--no-registry"] + , silent : ["--loglevel", "silent"] + , verbose : ["--loglevel", "verbose"] + , h : ["--usage"] + , H : ["--usage"] + , "?" : ["--usage"] + , help : ["--usage"] + , v : ["--version"] + , f : ["--force"] + , desc : ["--description"] + , "no-desc" : ["--no-description"] + , "local" : ["--no-global"] + , l : ["--long"] + , p : ["--parseable"] + , porcelain : ["--parseable"] + , g : ["--global"] + } + + , types = + { aoa: Array + , nullstream: [null, Stream] + , date: Date + , str: String + , browser : String + , cache : path + , color : ["always", Boolean] + , depth : Number + , description : Boolean + , dev : Boolean + , editor : path + , force : Boolean + , global : Boolean + , globalconfig : path + , group : [String, Number] + , gzipbin : String + , logfd : [Number, Stream] + , loglevel : ["silent","win","error","warn","info","verbose","silly"] + , long : Boolean + , "node-version" : [false, String] + , npaturl : url + , npat : Boolean + , "onload-script" : [false, String] + , outfd : [Number, Stream] + , parseable : Boolean + , pre: Boolean + , prefix: path + , proxy : url + , "rebuild-bundle" : Boolean + , registry : url + , searchopts : String + , searchexclude: [null, String] + , shell : path + , t: [Array, String] + , tag : String + , tar : String + , tmp : path + , "unsafe-perm" : Boolean + , usage : Boolean + , user : String + , username : String + , userconfig : path + , version : Boolean + , viewer: path + , _exit : Boolean + , path: path + } + + ; [["-v", {version:true}, []] + ,["---v", {version:true}, []] + ,["ls -s --no-reg connect -d", + {loglevel:"info",registry:null},["ls","connect"]] + ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]] + ,["ls --registry blargle", {}, ["ls"]] + ,["--no-registry", {registry:null}, []] + ,["--no-color true", {color:false}, []] + ,["--no-color false", {color:true}, []] + ,["--no-color", {color:false}, []] + ,["--color false", {color:false}, []] + ,["--color --logfd 7", {logfd:7,color:true}, []] + ,["--color=true", {color:true}, []] + ,["--logfd=10", {logfd:10}, []] + ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] + ,["--tmp=tmp -tar=gtar", + {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] + ,["--logfd x", {}, []] + ,["a -true -- -no-false", {true:true},["a","-no-false"]] + ,["a -no-false", {false:false},["a"]] + ,["a -no-no-true", {true:true}, ["a"]] + ,["a -no-no-no-false", {false:false}, ["a"]] + ,["---NO-no-No-no-no-no-nO-no-no"+ + "-No-no-no-no-no-no-no-no-no"+ + "-no-no-no-no-NO-NO-no-no-no-no-no-no"+ + "-no-body-can-do-the-boogaloo-like-I-do" + ,{"body-can-do-the-boogaloo-like-I-do":false}, []] + ,["we are -no-strangers-to-love "+ + "--you-know=the-rules --and=so-do-i "+ + "---im-thinking-of=a-full-commitment "+ + "--no-you-would-get-this-from-any-other-guy "+ + "--no-gonna-give-you-up "+ + "-no-gonna-let-you-down=true "+ + "--no-no-gonna-run-around false "+ + "--desert-you=false "+ + "--make-you-cry false "+ + "--no-tell-a-lie "+ + "--no-no-and-hurt-you false" + ,{"strangers-to-love":false + ,"you-know":"the-rules" + ,"and":"so-do-i" + ,"you-would-get-this-from-any-other-guy":false + ,"gonna-give-you-up":false + ,"gonna-let-you-down":false + ,"gonna-run-around":false + ,"desert-you":false + ,"make-you-cry":false + ,"tell-a-lie":false + ,"and-hurt-you":false + },["we", "are"]] + ,["-t one -t two -t three" + ,{t: ["one", "two", "three"]} + ,[]] + ,["-t one -t null -t three four five null" + ,{t: ["one", "null", "three"]} + ,["four", "five", "null"]] + ,["-t foo" + ,{t:["foo"]} + ,[]] + ,["--no-t" + ,{t:["false"]} + ,[]] + ,["-no-no-t" + ,{t:["true"]} + ,[]] + ,["-aoa one -aoa null -aoa 100" + ,{aoa:["one", null, '100']} + ,[]] + ,["-str 100" + ,{str:"100"} + ,[]] + ,["--color always" + ,{color:"always"} + ,[]] + ,["--no-nullstream" + ,{nullstream:null} + ,[]] + ,["--nullstream false" + ,{nullstream:null} + ,[]] + ,["--notadate=2011-01-25" + ,{notadate: "2011-01-25"} + ,[]] + ,["--date 2011-01-25" + ,{date: new Date("2011-01-25")} + ,[]] + ,["-cl 1" + ,{config: true, length: 1} + ,[] + ,{config: Boolean, length: Number, clear: Boolean} + ,{c: "--config", l: "--length"}] + ,["--acount bla" + ,{"acount":true} + ,["bla"] + ,{account: Boolean, credentials: Boolean, options: String} + ,{a:"--account", c:"--credentials",o:"--options"}] + ,["--clear" + ,{clear:true} + ,[] + ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean} + ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}] + ,["--file -" + ,{"file":"-"} + ,[] + ,{file:String} + ,{}] + ,["--file -" + ,{"file":true} + ,["-"] + ,{file:Boolean} + ,{}] + ,["--path" + ,{"path":null} + ,[]] + ,["--path ." + ,{"path":process.cwd()} + ,[]] + ].forEach(function (test) { + var argv = test[0].split(/\s+/) + , opts = test[1] + , rem = test[2] + , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0) + , parsed = actual.argv + delete actual.argv + for (var i in opts) { + var e = JSON.stringify(opts[i]) + , a = JSON.stringify(actual[i] === undefined ? null : actual[i]) + if (e && typeof e === "object") { + t.deepEqual(e, a) + } else { + t.equal(e, a) + } + } + t.deepEqual(rem, parsed.remain) + }) + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/.npmrc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/.npmrc new file mode 100644 index 0000000..ca0bc48 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/.npmrc @@ -0,0 +1,2 @@ +save-prefix = ~ +proprietary-attribs = false diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/README.md new file mode 100644 index 0000000..ad67688 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/README.md @@ -0,0 +1,153 @@ +# npmlog + +The logger util that npm uses. + +This logger is very basic. It does the logging for npm. It supports +custom levels and colored output. + +By default, logs are written to stderr. If you want to send log messages +to outputs other than streams, then you can change the `log.stream` +member, or you can just listen to the events that it emits, and do +whatever you want with them. + +# Basic Usage + +``` +var log = require('npmlog') + +// additional stuff ---------------------------+ +// message ----------+ | +// prefix ----+ | | +// level -+ | | | +// v v v v + log.info('fyi', 'I have a kitty cat: %j', myKittyCat) +``` + +## log.level + +* {String} + +The level to display logs at. Any logs at or above this level will be +displayed. The special level `silent` will prevent anything from being +displayed ever. + +## log.record + +* {Array} + +An array of all the log messages that have been entered. + +## log.maxRecordSize + +* {Number} + +The maximum number of records to keep. If log.record gets bigger than +10% over this value, then it is sliced down to 90% of this value. + +The reason for the 10% window is so that it doesn't have to resize a +large array on every log entry. + +## log.prefixStyle + +* {Object} + +A style object that specifies how prefixes are styled. (See below) + +## log.headingStyle + +* {Object} + +A style object that specifies how the heading is styled. (See below) + +## log.heading + +* {String} Default: "" + +If set, a heading that is printed at the start of every line. + +## log.stream + +* {Stream} Default: `process.stderr` + +The stream where output is written. + +## log.enableColor() + +Force colors to be used on all messages, regardless of the output +stream. + +## log.disableColor() + +Disable colors on all messages. + +## log.pause() + +Stop emitting messages to the stream, but do not drop them. + +## log.resume() + +Emit all buffered messages that were written while paused. + +## log.log(level, prefix, message, ...) + +* `level` {String} The level to emit the message at +* `prefix` {String} A string prefix. Set to "" to skip. +* `message...` Arguments to `util.format` + +Emit a log message at the specified level. + +## log\[level](prefix, message, ...) + +For example, + +* log.silly(prefix, message, ...) +* log.verbose(prefix, message, ...) +* log.info(prefix, message, ...) +* log.http(prefix, message, ...) +* log.warn(prefix, message, ...) +* log.error(prefix, message, ...) + +Like `log.log(level, prefix, message, ...)`. In this way, each level is +given a shorthand, so you can do `log.info(prefix, message)`. + +## log.addLevel(level, n, style, disp) + +* `level` {String} Level indicator +* `n` {Number} The numeric level +* `style` {Object} Object with fg, bg, inverse, etc. +* `disp` {String} Optional replacement for `level` in the output. + +Sets up a new level with a shorthand function and so forth. + +Note that if the number is `Infinity`, then setting the level to that +will cause all log messages to be suppressed. If the number is +`-Infinity`, then the only way to show it is to enable all log messages. + +# Events + +Events are all emitted with the message object. + +* `log` Emitted for all messages +* `log.` Emitted for all messages with the `` level. +* `` Messages with prefixes also emit their prefix as an event. + +# Style Objects + +Style objects can have the following fields: + +* `fg` {String} Color for the foreground text +* `bg` {String} Color for the background +* `bold`, `inverse`, `underline` {Boolean} Set the associated property +* `bell` {Boolean} Make a noise (This is pretty annoying, probably.) + +# Message Objects + +Every log event is emitted with a message object, and the `log.record` +list contains all of them that have been created. They have the +following fields: + +* `id` {Number} +* `level` {String} +* `prefix` {String} +* `message` {String} Result of `util.format()` +* `messageRaw` {Array} Arguments to `util.format()` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/example.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/example.js new file mode 100644 index 0000000..c009fb1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/example.js @@ -0,0 +1,39 @@ +var log = require('./log.js') + +log.heading = 'npm' + +console.error('log.level=silly') +log.level = 'silly' +log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) +log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) +log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) +log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) +log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) +log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) +log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) + +console.error('log.level=silent') +log.level = 'silent' +log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) +log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) +log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) +log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) +log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) +log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) +log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) + +console.error('log.level=info') +log.level = 'info' +log.silly('silly prefix', 'x = %j', {foo:{bar:'baz'}}) +log.verbose('verbose prefix', 'x = %j', {foo:{bar:'baz'}}) +log.info('info prefix', 'x = %j', {foo:{bar:'baz'}}) +log.http('http prefix', 'x = %j', {foo:{bar:'baz'}}) +log.warn('warn prefix', 'x = %j', {foo:{bar:'baz'}}) +log.error('error prefix', 'x = %j', {foo:{bar:'baz'}}) +log.silent('silent prefix', 'x = %j', {foo:{bar:'baz'}}) +log.error('404', 'This is a longer\n'+ + 'message, with some details\n'+ + 'and maybe a stack.\n'+ + new Error('a 404 error').stack) +log.addLevel('noise', 10000, {beep: true}) +log.noise(false, 'LOUD NOISES') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/log.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/log.js new file mode 100644 index 0000000..38b7c74 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/log.js @@ -0,0 +1,154 @@ +var EE = require('events').EventEmitter +var log = exports = module.exports = new EE +var util = require('util') + +var ansi = require('ansi') +log.cursor = ansi(process.stderr) +log.stream = process.stderr + +// by default, let ansi decide based on tty-ness. +var colorEnabled = undefined +log.enableColor = function () { + colorEnabled = true + this.cursor.enabled = true +} +log.disableColor = function () { + colorEnabled = false + this.cursor.enabled = false +} + +// default level +log.level = 'info' + +// temporarily stop emitting, but don't drop +log.pause = function () { + this._paused = true +} + +log.resume = function () { + if (!this._paused) return + this._paused = false + + var b = this._buffer + this._buffer = [] + b.forEach(function (m) { + this.emitLog(m) + }, this) +} + +log._buffer = [] + +var id = 0 +log.record = [] +log.maxRecordSize = 10000 +log.log = function (lvl, prefix, message) { + var l = this.levels[lvl] + if (l === undefined) { + return this.emit('error', new Error(util.format( + 'Undefined log level: %j', lvl))) + } + + var a = new Array(arguments.length - 2) + var stack = null + for (var i = 2; i < arguments.length; i ++) { + var arg = a[i-2] = arguments[i] + + // resolve stack traces to a plain string. + if (typeof arg === 'object' && arg && + (arg instanceof Error) && arg.stack) { + arg.stack = stack = arg.stack + '' + } + } + if (stack) a.unshift(stack + '\n') + message = util.format.apply(util, a) + + var m = { id: id++, + level: lvl, + prefix: String(prefix || ''), + message: message, + messageRaw: a } + + this.emit('log', m) + this.emit('log.' + lvl, m) + if (m.prefix) this.emit(m.prefix, m) + + this.record.push(m) + var mrs = this.maxRecordSize + var n = this.record.length - mrs + if (n > mrs / 10) { + var newSize = Math.floor(mrs * 0.9) + this.record = this.record.slice(-1 * newSize) + } + + this.emitLog(m) +}.bind(log) + +log.emitLog = function (m) { + if (this._paused) { + this._buffer.push(m) + return + } + var l = this.levels[m.level] + if (l === undefined) return + if (l < this.levels[this.level]) return + if (l > 0 && !isFinite(l)) return + + var style = log.style[m.level] + var disp = log.disp[m.level] || m.level + m.message.split(/\r?\n/).forEach(function (line) { + if (this.heading) { + this.write(this.heading, this.headingStyle) + this.write(' ') + } + this.write(disp, log.style[m.level]) + var p = m.prefix || '' + if (p) this.write(' ') + this.write(p, this.prefixStyle) + this.write(' ' + line + '\n') + }, this) +} + +log.write = function (msg, style) { + if (!this.cursor) return + if (this.stream !== this.cursor.stream) { + this.cursor = ansi(this.stream, { enabled: colorEnabled }) + } + + style = style || {} + if (style.fg) this.cursor.fg[style.fg]() + if (style.bg) this.cursor.bg[style.bg]() + if (style.bold) this.cursor.bold() + if (style.underline) this.cursor.underline() + if (style.inverse) this.cursor.inverse() + if (style.beep) this.cursor.beep() + this.cursor.write(msg).reset() +} + +log.addLevel = function (lvl, n, style, disp) { + if (!disp) disp = lvl + this.levels[lvl] = n + this.style[lvl] = style + if (!this[lvl]) this[lvl] = function () { + var a = new Array(arguments.length + 1) + a[0] = lvl + for (var i = 0; i < arguments.length; i ++) { + a[i + 1] = arguments[i] + } + return this.log.apply(this, a) + }.bind(this) + this.disp[lvl] = disp +} + +log.prefixStyle = { fg: 'magenta' } +log.headingStyle = { fg: 'white', bg: 'black' } + +log.style = {} +log.levels = {} +log.disp = {} +log.addLevel('silly', -Infinity, { inverse: true }, 'sill') +log.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb') +log.addLevel('info', 2000, { fg: 'green' }) +log.addLevel('http', 3000, { fg: 'green', bg: 'black' }) +log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN') +log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!') +log.addLevel('silent', Infinity) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.jshintrc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.jshintrc new file mode 100644 index 0000000..248c542 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.jshintrc @@ -0,0 +1,4 @@ +{ + "laxcomma": true, + "asi": true +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/History.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/History.md new file mode 100644 index 0000000..f4a9fe3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/History.md @@ -0,0 +1,16 @@ + +0.3.0 / 2014-05-09 +================== + + * package: remove "test" script and "devDependencies" + * package: remove "engines" section + * pacakge: remove "bin" section + * package: beautify + * examples: remove `starwars` example (#15) + * Documented goto, horizontalAbsolute, and eraseLine methods in README.md (#12, @Jammerwoch) + * add `.jshintrc` file + +< 0.3.0 +======= + + * Prehistoric diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/README.md new file mode 100644 index 0000000..6ce1940 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/README.md @@ -0,0 +1,98 @@ +ansi.js +========= +### Advanced ANSI formatting tool for Node.js + +`ansi.js` is a module for Node.js that provides an easy-to-use API for +writing ANSI escape codes to `Stream` instances. ANSI escape codes are used to do +fancy things in a terminal window, like render text in colors, delete characters, +lines, the entire window, or hide and show the cursor, and lots more! + +#### Features: + + * 256 color support for the terminal! + * Make a beep sound from your terminal! + * Works with *any* writable `Stream` instance. + * Allows you to move the cursor anywhere on the terminal window. + * Allows you to delete existing contents from the terminal window. + * Allows you to hide and show the cursor. + * Converts CSS color codes and RGB values into ANSI escape codes. + * Low-level; you are in control of when escape codes are used, it's not abstracted. + + +Installation +------------ + +Install with `npm`: + +``` bash +$ npm install ansi +``` + + +Example +------- + +``` js +var ansi = require('ansi') + , cursor = ansi(process.stdout) + +// You can chain your calls forever: +cursor + .red() // Set font color to red + .bg.grey() // Set background color to grey + .write('Hello World!') // Write 'Hello World!' to stdout + .bg.reset() // Reset the bgcolor before writing the trailing \n, + // to avoid Terminal glitches + .write('\n') // And a final \n to wrap things up + +// Rendering modes are persistent: +cursor.hex('#660000').bold().underline() + +// You can use the regular logging functions, text will be green: +console.log('This is blood red, bold text') + +// To reset just the foreground color: +cursor.fg.reset() + +console.log('This will still be bold') + +// to go to a location (x,y) on the console +// note: 1-indexed, not 0-indexed: +cursor.goto(10, 5).write('Five down, ten over') + +// to clear the current line: +cursor.horizontalAbsolute(0).eraseLine().write('Starting again') + +// to go to a different column on the current line: +cursor.horizontalAbsolute(5).write('column five') + +// Clean up after yourself! +cursor.reset() +``` + + +License +------- + +(The MIT License) + +Copyright (c) 2012 Nathan Rajlich <nathan@tootallnate.net> + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/beep/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/beep/index.js new file mode 100755 index 0000000..c1ec929 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/beep/index.js @@ -0,0 +1,16 @@ +#!/usr/bin/env node + +/** + * Invokes the terminal "beep" sound once per second on every exact second. + */ + +process.title = 'beep' + +var cursor = require('../../')(process.stdout) + +function beep () { + cursor.beep() + setTimeout(beep, 1000 - (new Date()).getMilliseconds()) +} + +setTimeout(beep, 1000 - (new Date()).getMilliseconds()) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/clear/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/clear/index.js new file mode 100755 index 0000000..6ac21ff --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/clear/index.js @@ -0,0 +1,15 @@ +#!/usr/bin/env node + +/** + * Like GNU ncurses "clear" command. + * https://github.com/mscdex/node-ncurses/blob/master/deps/ncurses/progs/clear.c + */ + +process.title = 'clear' + +function lf () { return '\n' } + +require('../../')(process.stdout) + .write(Array.apply(null, Array(process.stdout.getWindowSize()[1])).map(lf).join('')) + .eraseData(2) + .goto(1, 1) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/cursorPosition.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/cursorPosition.js new file mode 100755 index 0000000..50f9644 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/cursorPosition.js @@ -0,0 +1,32 @@ +#!/usr/bin/env node + +var tty = require('tty') +var cursor = require('../')(process.stdout) + +// listen for the queryPosition report on stdin +process.stdin.resume() +raw(true) + +process.stdin.once('data', function (b) { + var match = /\[(\d+)\;(\d+)R$/.exec(b.toString()) + if (match) { + var xy = match.slice(1, 3).reverse().map(Number) + console.error(xy) + } + + // cleanup and close stdin + raw(false) + process.stdin.pause() +}) + + +// send the query position request code to stdout +cursor.queryPosition() + +function raw (mode) { + if (process.stdin.setRawMode) { + process.stdin.setRawMode(mode) + } else { + tty.setRawMode(mode) + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/progress/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/progress/index.js new file mode 100644 index 0000000..d28dbda --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/examples/progress/index.js @@ -0,0 +1,87 @@ +#!/usr/bin/env node + +var assert = require('assert') + , ansi = require('../../') + +function Progress (stream, width) { + this.cursor = ansi(stream) + this.delta = this.cursor.newlines + this.width = width | 0 || 10 + this.open = '[' + this.close = ']' + this.complete = '█' + this.incomplete = '_' + + // initial render + this.progress = 0 +} + +Object.defineProperty(Progress.prototype, 'progress', { + get: get + , set: set + , configurable: true + , enumerable: true +}) + +function get () { + return this._progress +} + +function set (v) { + this._progress = Math.max(0, Math.min(v, 100)) + + var w = this.width - this.complete.length - this.incomplete.length + , n = w * (this._progress / 100) | 0 + , i = w - n + , com = c(this.complete, n) + , inc = c(this.incomplete, i) + , delta = this.cursor.newlines - this.delta + + assert.equal(com.length + inc.length, w) + + if (delta > 0) { + this.cursor.up(delta) + this.delta = this.cursor.newlines + } + + this.cursor + .horizontalAbsolute(0) + .eraseLine(2) + .fg.white() + .write(this.open) + .fg.grey() + .bold() + .write(com) + .resetBold() + .write(inc) + .fg.white() + .write(this.close) + .fg.reset() + .write('\n') +} + +function c (char, length) { + return Array.apply(null, Array(length)).map(function () { + return char + }).join('') +} + + + + +// Usage +var width = parseInt(process.argv[2], 10) || process.stdout.getWindowSize()[0] / 2 + , p = new Progress(process.stdout, width) + +;(function tick () { + p.progress += Math.random() * 5 + p.cursor + .eraseLine(2) + .write('Progress: ') + .bold().write(p.progress.toFixed(2)) + .write('%') + .resetBold() + .write('\n') + if (p.progress < 100) + setTimeout(tick, 100) +})() diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/lib/ansi.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/lib/ansi.js new file mode 100644 index 0000000..52fc8ec --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/ansi/lib/ansi.js @@ -0,0 +1,405 @@ + +/** + * References: + * + * - http://en.wikipedia.org/wiki/ANSI_escape_code + * - http://www.termsys.demon.co.uk/vtansi.htm + * + */ + +/** + * Module dependencies. + */ + +var emitNewlineEvents = require('./newlines') + , prefix = '\x1b[' // For all escape codes + , suffix = 'm' // Only for color codes + +/** + * The ANSI escape sequences. + */ + +var codes = { + up: 'A' + , down: 'B' + , forward: 'C' + , back: 'D' + , nextLine: 'E' + , previousLine: 'F' + , horizontalAbsolute: 'G' + , eraseData: 'J' + , eraseLine: 'K' + , scrollUp: 'S' + , scrollDown: 'T' + , savePosition: 's' + , restorePosition: 'u' + , queryPosition: '6n' + , hide: '?25l' + , show: '?25h' +} + +/** + * Rendering ANSI codes. + */ + +var styles = { + bold: 1 + , italic: 3 + , underline: 4 + , inverse: 7 +} + +/** + * The negating ANSI code for the rendering modes. + */ + +var reset = { + bold: 22 + , italic: 23 + , underline: 24 + , inverse: 27 +} + +/** + * The standard, styleable ANSI colors. + */ + +var colors = { + white: 37 + , black: 30 + , blue: 34 + , cyan: 36 + , green: 32 + , magenta: 35 + , red: 31 + , yellow: 33 + , grey: 90 + , brightBlack: 90 + , brightRed: 91 + , brightGreen: 92 + , brightYellow: 93 + , brightBlue: 94 + , brightMagenta: 95 + , brightCyan: 96 + , brightWhite: 97 +} + + +/** + * Creates a Cursor instance based off the given `writable stream` instance. + */ + +function ansi (stream, options) { + if (stream._ansicursor) { + return stream._ansicursor + } else { + return stream._ansicursor = new Cursor(stream, options) + } +} +module.exports = exports = ansi + +/** + * The `Cursor` class. + */ + +function Cursor (stream, options) { + if (!(this instanceof Cursor)) { + return new Cursor(stream, options) + } + if (typeof stream != 'object' || typeof stream.write != 'function') { + throw new Error('a valid Stream instance must be passed in') + } + + // the stream to use + this.stream = stream + + // when 'enabled' is false then all the functions are no-ops except for write() + this.enabled = options && options.enabled + if (typeof this.enabled === 'undefined') { + this.enabled = stream.isTTY + } + this.enabled = !!this.enabled + + // then `buffering` is true, then `write()` calls are buffered in + // memory until `flush()` is invoked + this.buffering = !!(options && options.buffering) + this._buffer = [] + + // controls the foreground and background colors + this.fg = this.foreground = new Colorer(this, 0) + this.bg = this.background = new Colorer(this, 10) + + // defaults + this.Bold = false + this.Italic = false + this.Underline = false + this.Inverse = false + + // keep track of the number of "newlines" that get encountered + this.newlines = 0 + emitNewlineEvents(stream) + stream.on('newline', function () { + this.newlines++ + }.bind(this)) +} +exports.Cursor = Cursor + +/** + * Helper function that calls `write()` on the underlying Stream. + * Returns `this` instead of the write() return value to keep + * the chaining going. + */ + +Cursor.prototype.write = function (data) { + if (this.buffering) { + this._buffer.push(arguments) + } else { + this.stream.write.apply(this.stream, arguments) + } + return this +} + +/** + * Buffer `write()` calls into memory. + * + * @api public + */ + +Cursor.prototype.buffer = function () { + this.buffering = true + return this +} + +/** + * Write out the in-memory buffer. + * + * @api public + */ + +Cursor.prototype.flush = function () { + this.buffering = false + var str = this._buffer.map(function (args) { + if (args.length != 1) throw new Error('unexpected args length! ' + args.length); + return args[0]; + }).join(''); + this._buffer.splice(0); // empty + this.write(str); + return this +} + + +/** + * The `Colorer` class manages both the background and foreground colors. + */ + +function Colorer (cursor, base) { + this.current = null + this.cursor = cursor + this.base = base +} +exports.Colorer = Colorer + +/** + * Write an ANSI color code, ensuring that the same code doesn't get rewritten. + */ + +Colorer.prototype._setColorCode = function setColorCode (code) { + var c = String(code) + if (this.current === c) return + this.cursor.enabled && this.cursor.write(prefix + c + suffix) + this.current = c + return this +} + + +/** + * Set up the positional ANSI codes. + */ + +Object.keys(codes).forEach(function (name) { + var code = String(codes[name]) + Cursor.prototype[name] = function () { + var c = code + if (arguments.length > 0) { + c = toArray(arguments).map(Math.round).join(';') + code + } + this.enabled && this.write(prefix + c) + return this + } +}) + +/** + * Set up the functions for the rendering ANSI codes. + */ + +Object.keys(styles).forEach(function (style) { + var name = style[0].toUpperCase() + style.substring(1) + , c = styles[style] + , r = reset[style] + + Cursor.prototype[style] = function () { + if (this[name]) return + this.enabled && this.write(prefix + c + suffix) + this[name] = true + return this + } + + Cursor.prototype['reset' + name] = function () { + if (!this[name]) return + this.enabled && this.write(prefix + r + suffix) + this[name] = false + return this + } +}) + +/** + * Setup the functions for the standard colors. + */ + +Object.keys(colors).forEach(function (color) { + var code = colors[color] + + Colorer.prototype[color] = function () { + this._setColorCode(this.base + code) + return this.cursor + } + + Cursor.prototype[color] = function () { + return this.foreground[color]() + } +}) + +/** + * Makes a beep sound! + */ + +Cursor.prototype.beep = function () { + this.enabled && this.write('\x07') + return this +} + +/** + * Moves cursor to specific position + */ + +Cursor.prototype.goto = function (x, y) { + x = x | 0 + y = y | 0 + this.enabled && this.write(prefix + y + ';' + x + 'H') + return this +} + +/** + * Resets the color. + */ + +Colorer.prototype.reset = function () { + this._setColorCode(this.base + 39) + return this.cursor +} + +/** + * Resets all ANSI formatting on the stream. + */ + +Cursor.prototype.reset = function () { + this.enabled && this.write(prefix + '0' + suffix) + this.Bold = false + this.Italic = false + this.Underline = false + this.Inverse = false + this.foreground.current = null + this.background.current = null + return this +} + +/** + * Sets the foreground color with the given RGB values. + * The closest match out of the 216 colors is picked. + */ + +Colorer.prototype.rgb = function (r, g, b) { + var base = this.base + 38 + , code = rgb(r, g, b) + this._setColorCode(base + ';5;' + code) + return this.cursor +} + +/** + * Same as `cursor.fg.rgb(r, g, b)`. + */ + +Cursor.prototype.rgb = function (r, g, b) { + return this.foreground.rgb(r, g, b) +} + +/** + * Accepts CSS color codes for use with ANSI escape codes. + * For example: `#FF000` would be bright red. + */ + +Colorer.prototype.hex = function (color) { + return this.rgb.apply(this, hex(color)) +} + +/** + * Same as `cursor.fg.hex(color)`. + */ + +Cursor.prototype.hex = function (color) { + return this.foreground.hex(color) +} + + +// UTIL FUNCTIONS // + +/** + * Translates a 255 RGB value to a 0-5 ANSI RGV value, + * then returns the single ANSI color code to use. + */ + +function rgb (r, g, b) { + var red = r / 255 * 5 + , green = g / 255 * 5 + , blue = b / 255 * 5 + return rgb5(red, green, blue) +} + +/** + * Turns rgb 0-5 values into a single ANSI color code to use. + */ + +function rgb5 (r, g, b) { + var red = Math.round(r) + , green = Math.round(g) + , blue = Math.round(b) + return 16 + (red*36) + (green*6) + blue +} + +/** + * Accepts a hex CSS color code string (# is optional) and + * translates it into an Array of 3 RGB 0-255 values, which + * can then be used with rgb(). + */ + +function hex (color) { + var c = color[0] === '#' ? color.substring(1) : color + , r = c.substring(0, 2) + , g = c.substring(2, 4) + , b = c.substring(4, 6) + return [parseInt(r, 16), parseInt(g, 16), parseInt(b, 16)] +} + +/** + * Turns an array-like object into a real array. + */ + +function toArray (a) { + var i = 0 + , l = a.length + , rtn = [] + for (; i 0) { + var len = data.length + , i = 0 + // now try to calculate any deltas + if (typeof data == 'string') { + for (; i _(e.g. `appname_foo__bar__baz` => `foo.bar.baz`)_ + * if you passed an option `--config file` then from that file + * a local `.${appname}rc` or the first found looking in `./ ../ ../../ ../../../` etc. + * `$HOME/.${appname}rc` + * `$HOME/.${appname}/config` + * `$HOME/.config/${appname}` + * `$HOME/.config/${appname}/config` + * `/etc/${appname}rc` + * `/etc/${appname}/config` + * the defaults object you passed in. + +All configuration sources that were found will be flattened into one object, +so that sources **earlier** in this list override later ones. + + +## Configuration File Formats + +Configuration files (e.g. `.appnamerc`) may be in either [json](http://json.org/example) or [ini](http://en.wikipedia.org/wiki/INI_file) format. The example configurations below are equivalent: + + +#### Formatted as `ini` + +``` +; You can include comments in `ini` format if you want. + +dependsOn=0.10.0 + + +; `rc` has built-in support for ini sections, see? + +[commands] + www = ./commands/www + console = ./commands/repl + + +; You can even do nested sections + +[generators.options] + engine = ejs + +[generators.modules] + new = generate-new + engine = generate-backend + +``` + +#### Formatted as `json` + +```json +{ + // You can even comment your JSON, if you want + "dependsOn": "0.10.0", + "commands": { + "www": "./commands/www", + "console": "./commands/repl" + }, + "generators": { + "options": { + "engine": "ejs" + }, + "modules": { + "new": "generate-new", + "backend": "generate-backend" + } + } +} +``` + +Comments are stripped from JSON config via [strip-json-comments](https://github.com/sindresorhus/strip-json-comments). + +> Since ini, and env variables do not have a standard for types, your application needs be prepared for strings. + + + +## Advanced Usage + +#### Pass in your own `argv` + +You may pass in your own `argv` as the third argument to `rc`. This is in case you want to [use your own command-line opts parser](https://github.com/dominictarr/rc/pull/12). + +```javascript +require('rc')(appname, defaults, customArgvParser); +``` + + +## Note on Performance + +`rc` is running `fs.statSync`-- so make sure you don't use it in a hot code path (e.g. a request handler) + + +## License + +BSD / MIT / Apache2 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/browser.js new file mode 100644 index 0000000..8c230c5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/browser.js @@ -0,0 +1,7 @@ + +// when this is loaded into the browser, +// just use the defaults... + +module.exports = function (name, defaults) { + return defaults +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/index.js new file mode 100755 index 0000000..8743e40 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/index.js @@ -0,0 +1,43 @@ +#! /usr/bin/env node +var cc = require('./lib/utils') +var join = require('path').join +var deepExtend = require('deep-extend') +var etc = '/etc' +var win = process.platform === "win32" +var home = win + ? process.env.USERPROFILE + : process.env.HOME + +module.exports = function (name, defaults, argv) { + if(!name) + throw new Error('nameless configuration fail') + if(!argv) + argv = require('minimist')(process.argv.slice(2)) + defaults = ( + 'string' === typeof defaults + ? cc.json(defaults) : defaults + ) || {} + + var local = cc.find('.'+name+'rc') + + return deepExtend.apply(null, [ + defaults, + win ? {} : cc.json(join(etc, name, 'config')), + win ? {} : cc.json(join(etc, name + 'rc')), + home ? cc.json(join(home, '.config', name, 'config')) : {}, + home ? cc.json(join(home, '.config', name)) : {}, + home ? cc.json(join(home, '.' + name, 'config')) : {}, + home ? cc.json(join(home, '.' + name + 'rc')) : {}, + cc.json(local), + local ? {config: local} : null, + argv.config ? cc.json(argv.config) : null, + cc.env(name + '_'), + argv + ]) +} + +if(!module.parent) { + console.log( + JSON.stringify(module.exports(process.argv[2]), false, 2) + ) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js new file mode 100644 index 0000000..7ff402e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js @@ -0,0 +1,91 @@ +var fs = require('fs') +var ini = require('ini') +var path = require('path') +var stripJsonComments = require('strip-json-comments') + +var parse = exports.parse = function (content, file) { + + //if it ends in .json or starts with { then it must be json. + //must be done this way, because ini accepts everything. + //can't just try and parse it and let it throw if it's not ini. + //everything is ini. even json with a systax error. + + if((file && /\.json$/.test(file)) || /^\s*{/.test(content)) + return JSON.parse(stripJsonComments(content)) + return ini.parse(content) + +} + +var json = exports.json = function () { + var args = [].slice.call(arguments).filter(function (arg) { return arg != null }) + var file = path.join.apply(null, args) + var content + try { + content = fs.readFileSync(file,'utf-8') + } catch (err) { + return + } + return parse(content) +} + +var env = exports.env = function (prefix, env) { + env = env || process.env + var obj = {} + var l = prefix.length + for(var k in env) { + if((k.indexOf(prefix)) === 0) { + + var keypath = k.substring(l).split('__') + + // Trim empty strings from keypath array + var _emptyStringIndex + while ((_emptyStringIndex=keypath.indexOf('')) > -1) { + keypath.splice(_emptyStringIndex, 1) + } + + var cursor = obj + keypath.forEach(function _buildSubObj(_subkey,i){ + + // (check for _subkey first so we ignore empty strings) + if (!_subkey) + return + + // If this is the last key, just stuff the value in there + // Assigns actual value from env variable to final key + // (unless it's just an empty string- in that case use the last valid key) + if (i === keypath.length-1) + cursor[_subkey] = env[k] + + + // Build sub-object if nothing already exists at the keypath + if (cursor[_subkey] === undefined) + cursor[_subkey] = {} + + // Increment cursor used to track the object at the current depth + cursor = cursor[_subkey] + + }) + + } + + } + + return obj +} + +var find = exports.find = function () { + var rel = path.join.apply(null, [].slice.call(arguments)) + + function find(start, rel) { + var file = path.join(start, rel) + try { + fs.statSync(file) + return file + } catch (err) { + if(path.dirname(start) !== start) // root + return find(path.dirname(start), rel) + } + } + return find(process.cwd(), rel) +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE new file mode 100644 index 0000000..e950236 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Viacheslav Lotsmanov + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md new file mode 100644 index 0000000..0457c52 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md @@ -0,0 +1,52 @@ +Node.JS module “Deep Extend” +============================ + +Recursive object extending. + +Install +----- + + npm install deep-extend + +Usage +----- + + var deepExtend = require('deep-extend'); + var obj1 = { + a: 1, + b: 2, + d: { + a: 1, + b: [], + c: { test1: 123, test2: 321 } + }, + f: 5, + g: 123 + }; + var obj2 = { + b: 3, + c: 5, + d: { + b: { first: 'one', second: 'two' }, + c: { test2: 222 } + }, + e: { one: 1, two: 2 }, + f: [], + g: (void 0) + }; + + deepExtend(obj1, obj2); + + console.log(obj1); + /* + { a: 1, + b: 3, + d: + { a: 1, + b: { first: 'one', second: 'two' }, + c: { test1: 123, test2: 222 } }, + f: [], + c: 5, + e: { one: 1, two: 2 }, + g: undefined } + */ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js new file mode 100644 index 0000000..c1f8dae --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js @@ -0,0 +1,90 @@ +/*! + * Node.JS module "Deep Extend" + * @description Recursive object extending. + * @author Viacheslav Lotsmanov (unclechu) + * @license MIT + * + * The MIT License (MIT) + * + * Copyright (c) 2013 Viacheslav Lotsmanov + * + * 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. + */ + +/** + * Extening object that entered in first argument. + * Returns extended object or false if have no target object or incorrect type. + * If you wish to clone object, simply use that: + * deepExtend({}, yourObj_1, [yourObj_N]) - first arg is new empty object + */ +var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) { + if (arguments.length < 1 || typeof arguments[0] !== 'object') { + return false; + } + + if (arguments.length < 2) return arguments[0]; + + var target = arguments[0]; + + // convert arguments to array and cut off target object + var args = Array.prototype.slice.call(arguments, 1); + + var key, val, src, clone, tmpBuf; + + args.forEach(function (obj) { + if (typeof obj !== 'object') return; + + for (key in obj) { + if ( ! (key in obj)) continue; + + src = target[key]; + val = obj[key]; + + if (val === target) continue; + + if (typeof val !== 'object' || val === null) { + target[key] = val; + continue; + } else if (val instanceof Buffer) { + tmpBuf = new Buffer(val.length); + val.copy(tmpBuf); + target[key] = tmpBuf; + continue; + } else if (val instanceof Date) { + target[key] = new Date(val.getTime()); + continue; + } + + if (typeof src !== 'object' || src === null) { + clone = (Array.isArray(val)) ? [] : {}; + target[key] = deepExtend(clone, val); + continue; + } + + if (Array.isArray(val)) { + clone = (Array.isArray(src)) ? src : []; + } else { + clone = (!Array.isArray(src)) ? src : {}; + } + + target[key] = deepExtend(clone, val); + } + }); + + return target; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json new file mode 100644 index 0000000..b7862f6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json @@ -0,0 +1,59 @@ +{ + "name": "deep-extend", + "description": "Recursive object extending.", + "license": "MIT", + "version": "0.2.11", + "homepage": "https://github.com/unclechu/node-deep-extend", + "repository": { + "type": "git", + "url": "git://github.com/unclechu/node-deep-extend.git" + }, + "author": { + "name": "Viacheslav Lotsmanov", + "email": "lotsmanov89@gmail.com", + "url": "unclechu" + }, + "contributors": [ + { + "name": "Romain Prieto", + "url": "https://github.com/rprieto" + } + ], + "main": "index", + "engines": { + "node": ">=0.4" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "~1.19.0", + "should": "~3.3.2" + }, + "directories": { + "test": "./test" + }, + "bugs": { + "url": "https://github.com/unclechu/node-deep-extend/issues" + }, + "_id": "deep-extend@0.2.11", + "dist": { + "shasum": "7a16ba69729132340506170494bc83f7076fe08f", + "tarball": "http://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + }, + "_from": "deep-extend@~0.2.5", + "_npmVersion": "1.4.6", + "_npmUser": { + "name": "unclechu", + "email": "lotsmanov89@gmail.com" + }, + "maintainers": [ + { + "name": "unclechu", + "email": "lotsmanov89@gmail.com" + } + ], + "_shasum": "7a16ba69729132340506170494bc83f7076fe08f", + "_resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/index.spec.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/index.spec.js new file mode 100644 index 0000000..38974a2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/index.spec.js @@ -0,0 +1,57 @@ +var should = require('should'); +var extend = require('../index'); + +describe('deep-extend', function() { + + it('can extend on 1 level', function() { + var a = { hello: 1 }; + var b = { world: 2 }; + extend(a, b); + a.should.eql({ + hello: 1, + world: 2 + }); + }); + + it('can extend on 2 levels', function() { + var a = { person: { name: 'John' } }; + var b = { person: { age: 30 } }; + extend(a, b); + a.should.eql({ + person: { name: 'John', age: 30 } + }); + }); + + it('can extend with Buffer values', function() { + var a = { hello: 1 }; + var b = { value: new Buffer('world') }; + extend(a, b); + a.should.eql({ + hello: 1, + value: new Buffer('world') + }); + }); + + it('Buffer is cloned', function () { + var a = { }; + var b = { value: new Buffer('foo') }; + extend(a, b); + a.value.write('bar'); + a.value.toString().should.eql('bar'); + b.value.toString().should.eql('foo'); + }); + + it('Date objects', function () { + var a = { d: new Date() }; + var b = extend({}, a); + b.d.should.instanceOf(Date); + }); + + it('Date object is cloned', function () { + var a = { d: new Date() }; + var b = extend({}, a); + b.d.setTime( (new Date()).getTime() + 100000 ); + b.d.getTime().should.not.eql( a.d.getTime() ); + }); + +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/mocha.opts b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/mocha.opts new file mode 100644 index 0000000..5ada47b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/test/mocha.opts @@ -0,0 +1 @@ +--reporter spec diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md new file mode 100644 index 0000000..acbe8ec --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md @@ -0,0 +1,79 @@ +An ini format parser and serializer for node. + +Sections are treated as nested objects. Items before the first heading +are saved on the object directly. + +## Usage + +Consider an ini-file `config.ini` that looks like this: + + ; this comment is being ignored + scope = global + + [database] + user = dbuser + password = dbpassword + database = use_this_database + + [paths.default] + datadir = /var/lib/data + array[] = first value + array[] = second value + array[] = third value + +You can read, manipulate and write the ini-file like so: + + var fs = require('fs') + , ini = require('ini') + + var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8')) + + config.scope = 'local' + config.database.database = 'use_another_database' + config.paths.default.tmpdir = '/tmp' + delete config.paths.default.datadir + config.paths.default.array.push('fourth value') + + fs.writeFileSync('./config_modified.ini', ini.stringify(config, 'section')) + +This will result in a file called `config_modified.ini` being written to the filesystem with the following content: + + [section] + scope = local + [section.database] + user = dbuser + password = dbpassword + database = use_another_database + [section.paths.default] + tmpdir = /tmp + array[] = first value + array[] = second value + array[] = third value + array[] = fourth value + + +## API + +### decode(inistring) +Decode the ini-style formatted `inistring` into a nested object. + +### parse(inistring) +Alias for `decode(inistring)` + +### encode(object, [section]) +Encode the object `object` into an ini-style formatted string. If the optional parameter `section` is given, then all top-level properties of the object are put into this section and the `section`-string is prepended to all sub-sections, see the usage example above. + +### stringify(object, [section]) +Alias for `encode(object, [section])` + +### safe(val) +Escapes the string `val` such that it is safe to be used as a key or value in an ini-file. Basically escapes quotes. For example + + ini.safe('"unsafe string"') + +would result in + + "\"unsafe string\"" + +### unsafe(val) +Unescapes the string `val` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js new file mode 100644 index 0000000..eaf3209 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js @@ -0,0 +1,166 @@ + +exports.parse = exports.decode = decode +exports.stringify = exports.encode = encode + +exports.safe = safe +exports.unsafe = unsafe + +var eol = process.platform === "win32" ? "\r\n" : "\n" + +function encode (obj, section) { + var children = [] + , out = "" + + Object.keys(obj).forEach(function (k, _, __) { + var val = obj[k] + if (val && Array.isArray(val)) { + val.forEach(function(item) { + out += safe(k + "[]") + " = " + safe(item) + "\n" + }) + } + else if (val && typeof val === "object") { + children.push(k) + } else { + out += safe(k) + " = " + safe(val) + eol + } + }) + + if (section && out.length) { + out = "[" + safe(section) + "]" + eol + out + } + + children.forEach(function (k, _, __) { + var nk = dotSplit(k).join('\\.') + var child = encode(obj[k], (section ? section + "." : "") + nk) + if (out.length && child.length) { + out += eol + } + out += child + }) + + return out +} + +function dotSplit (str) { + return str.replace(/\1/g, '\2LITERAL\\1LITERAL\2') + .replace(/\\\./g, '\1') + .split(/\./).map(function (part) { + return part.replace(/\1/g, '\\.') + .replace(/\2LITERAL\\1LITERAL\2/g, '\1') + }) +} + +function decode (str) { + var out = {} + , p = out + , section = null + , state = "START" + // section |key = value + , re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i + , lines = str.split(/[\r\n]+/g) + , section = null + + lines.forEach(function (line, _, __) { + if (!line || line.match(/^\s*;/)) return + var match = line.match(re) + if (!match) return + if (match[1] !== undefined) { + section = unsafe(match[1]) + p = out[section] = out[section] || {} + return + } + var key = unsafe(match[2]) + , value = match[3] ? unsafe((match[4] || "")) : true + switch (value) { + case 'true': + case 'false': + case 'null': value = JSON.parse(value) + } + + // Convert keys with '[]' suffix to an array + if (key.length > 2 && key.slice(-2) === "[]") { + key = key.substring(0, key.length - 2) + if (!p[key]) { + p[key] = [] + } + else if (!Array.isArray(p[key])) { + p[key] = [p[key]] + } + } + + // safeguard against resetting a previously defined + // array by accidentally forgetting the brackets + if (Array.isArray(p[key])) { + p[key].push(value) + } + else { + p[key] = value + } + }) + + // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}} + // use a filter to return the keys that have to be deleted. + Object.keys(out).filter(function (k, _, __) { + if (!out[k] || typeof out[k] !== "object" || Array.isArray(out[k])) return false + // see if the parent section is also an object. + // if so, add it to that, and mark this one for deletion + var parts = dotSplit(k) + , p = out + , l = parts.pop() + , nl = l.replace(/\\\./g, '.') + parts.forEach(function (part, _, __) { + if (!p[part] || typeof p[part] !== "object") p[part] = {} + p = p[part] + }) + if (p === out && nl === l) return false + p[nl] = out[k] + return true + }).forEach(function (del, _, __) { + delete out[del] + }) + + return out +} + +function safe (val) { + return ( typeof val !== "string" + || val.match(/[\r\n]/) + || val.match(/^\[/) + || (val.length > 1 + && val.charAt(0) === "\"" + && val.slice(-1) === "\"") + || val !== val.trim() ) + ? JSON.stringify(val) + : val.replace(/;/g, '\\;') +} + +function unsafe (val, doUnesc) { + val = (val || "").trim() + if (val.charAt(0) === "\"" && val.slice(-1) === "\"") { + try { val = JSON.parse(val) } catch (_) {} + } else { + // walk the val to find the first not-escaped ; character + var esc = false + var unesc = ""; + for (var i = 0, l = val.length; i < l; i++) { + var c = val.charAt(i) + if (esc) { + if (c === "\\" || c === ";") + unesc += c + else + unesc += "\\" + c + esc = false + } else if (c === ";") { + break + } else if (c === "\\") { + esc = true + } else { + unesc += c + } + } + if (esc) + unesc += "\\" + return unesc + } + return val +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json new file mode 100644 index 0000000..e9c898c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json @@ -0,0 +1,50 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "ini", + "description": "An ini encoder/decoder for node", + "version": "1.1.0", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/ini.git" + }, + "main": "ini.js", + "scripts": { + "test": "tap test/*.js" + }, + "engines": { + "node": "*" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.0.9" + }, + "_id": "ini@1.1.0", + "dist": { + "shasum": "4e808c2ce144c6c1788918e034d6797bc6cf6281", + "tarball": "http://registry.npmjs.org/ini/-/ini-1.1.0.tgz" + }, + "_from": "ini@~1.1.0", + "_npmVersion": "1.2.2", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "4e808c2ce144c6c1788918e034d6797bc6cf6281", + "_resolved": "https://registry.npmjs.org/ini/-/ini-1.1.0.tgz", + "bugs": { + "url": "https://github.com/isaacs/ini/issues" + }, + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/isaacs/ini" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/bar.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/bar.js new file mode 100644 index 0000000..cb16176 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/bar.js @@ -0,0 +1,23 @@ +//test that parse(stringify(obj) deepEqu + +var ini = require('../') +var test = require('tap').test + +var data = { + 'number': {count: 10}, + 'string': {drink: 'white russian'}, + 'boolean': {isTrue: true}, + 'nested boolean': {theDude: {abides: true, rugCount: 1}} +} + + +test('parse(stringify(x)) deepEqual x', function (t) { + + for (var k in data) { + var s = ini.stringify(data[k]) + console.log(s, data[k]) + t.deepEqual(ini.parse(s), data[k]) + } + + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/fixtures/foo.ini b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/fixtures/foo.ini new file mode 100644 index 0000000..1d81378 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/fixtures/foo.ini @@ -0,0 +1,47 @@ +o = p + + a with spaces = b c + +; wrap in quotes to JSON-decode and preserve spaces +" xa n p " = "\"\r\nyoyoyo\r\r\n" + +; wrap in quotes to get a key with a bracket, not a section. +"[disturbing]" = hey you never know + +; Test arrays +zr[] = deedee +ar[] = one +ar[] = three +; This should be included in the array +ar = this is included + +; Test resetting of a value (and not turn it into an array) +br = cold +br = warm + +; a section +[a] +av = a val +e = { o: p, a: { av: a val, b: { c: { e: "this [value]" } } } } +j = "{ o: "p", a: { av: "a val", b: { c: { e: "this [value]" } } } }" +"[]" = a square? + +; Nested array +cr[] = four +cr[] = eight + +; nested child without middle parent +; should create otherwise-empty a.b +[a.b.c] +e = 1 +j = 2 + +; dots in the section name should be literally interpreted +[x\.y\.z] +x.y.z = xyz + +[x\.y\.z.a\.b\.c] +a.b.c = abc + +; this next one is not a comment! it's escaped! +nocomment = this\; this is not a comment diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/foo.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/foo.js new file mode 100644 index 0000000..3a05eaf --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/test/foo.js @@ -0,0 +1,71 @@ +var i = require("../") + , tap = require("tap") + , test = tap.test + , fs = require("fs") + , path = require("path") + , fixture = path.resolve(__dirname, "./fixtures/foo.ini") + , data = fs.readFileSync(fixture, "utf8") + , d + , expectE = 'o = p\n' + + 'a with spaces = b c\n' + + '" xa n p " = "\\"\\r\\nyoyoyo\\r\\r\\n"\n' + + '"[disturbing]" = hey you never know\n' + + 'zr[] = deedee\n' + + 'ar[] = one\n' + + 'ar[] = three\n' + + 'ar[] = this is included\n' + + 'br = warm\n' + + '\n' + + '[a]\n' + + 'av = a val\n' + + 'e = { o: p, a: ' + + '{ av: a val, b: { c: { e: "this [value]" ' + + '} } } }\nj = "\\"{ o: \\"p\\", a: { av:' + + ' \\"a val\\", b: { c: { e: \\"this [value]' + + '\\" } } } }\\""\n"[]" = a square?\n' + + 'cr[] = four\ncr[] = eight\n\n' + +'[a.b.c]\ne = 1\n' + + 'j = 2\n\n[x\\.y\\.z]\nx.y.z = xyz\n\n' + + '[x\\.y\\.z.a\\.b\\.c]\na.b.c = abc\n' + + 'nocomment = this\\; this is not a comment\n' + , expectD = + { o: 'p', + 'a with spaces': 'b c', + " xa n p ":'"\r\nyoyoyo\r\r\n', + '[disturbing]': 'hey you never know', + 'zr': ['deedee'], + 'ar': ['one', 'three', 'this is included'], + 'br': 'warm', + a: + { av: 'a val', + e: '{ o: p, a: { av: a val, b: { c: { e: "this [value]" } } } }', + j: '"{ o: "p", a: { av: "a val", b: { c: { e: "this [value]" } } } }"', + "[]": "a square?", + cr: ['four', 'eight'], + b: { c: { e: '1', j: '2' } } }, + 'x.y.z': { + 'x.y.z': 'xyz', + 'a.b.c': { + 'a.b.c': 'abc', + 'nocomment': 'this\; this is not a comment' + } + } + } + +test("decode from file", function (t) { + var d = i.decode(data) + t.deepEqual(d, expectD) + t.end() +}) + +test("encode from data", function (t) { + var e = i.encode(expectD) + t.deepEqual(e, expectE) + + var obj = {log: { type:'file', level: {label:'debug', value:10} } } + e = i.encode(obj) + t.notEqual(e.slice(0, 1), '\n', 'Never a blank first line') + t.notEqual(e.slice(-2), '\n\n', 'Never a blank final line') + + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml new file mode 100644 index 0000000..cc4dba2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE new file mode 100644 index 0000000..ee27ba4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE @@ -0,0 +1,18 @@ +This software is released under the MIT 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. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js new file mode 100644 index 0000000..abff3e8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js @@ -0,0 +1,2 @@ +var argv = require('../')(process.argv.slice(2)); +console.dir(argv); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js new file mode 100644 index 0000000..71fb830 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js @@ -0,0 +1,187 @@ +module.exports = function (args, opts) { + if (!opts) opts = {}; + + var flags = { bools : {}, strings : {} }; + + [].concat(opts['boolean']).filter(Boolean).forEach(function (key) { + flags.bools[key] = true; + }); + + var aliases = {}; + Object.keys(opts.alias || {}).forEach(function (key) { + aliases[key] = [].concat(opts.alias[key]); + aliases[key].forEach(function (x) { + aliases[x] = [key].concat(aliases[key].filter(function (y) { + return x !== y; + })); + }); + }); + + [].concat(opts.string).filter(Boolean).forEach(function (key) { + flags.strings[key] = true; + if (aliases[key]) { + flags.strings[aliases[key]] = true; + } + }); + + var defaults = opts['default'] || {}; + + var argv = { _ : [] }; + Object.keys(flags.bools).forEach(function (key) { + setArg(key, defaults[key] === undefined ? false : defaults[key]); + }); + + var notFlags = []; + + if (args.indexOf('--') !== -1) { + notFlags = args.slice(args.indexOf('--')+1); + args = args.slice(0, args.indexOf('--')); + } + + function setArg (key, val) { + var value = !flags.strings[key] && isNumber(val) + ? Number(val) : val + ; + setKey(argv, key.split('.'), value); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), value); + }); + } + + for (var i = 0; i < args.length; i++) { + var arg = args[i]; + + if (/^--.+=/.test(arg)) { + // Using [\s\S] instead of . because js doesn't support the + // 'dotall' regex modifier. See: + // http://stackoverflow.com/a/1068308/13216 + var m = arg.match(/^--([^=]+)=([\s\S]*)$/); + setArg(m[1], m[2]); + } + else if (/^--no-.+/.test(arg)) { + var key = arg.match(/^--no-(.+)/)[1]; + setArg(key, false); + } + else if (/^--.+/.test(arg)) { + var key = arg.match(/^--(.+)/)[1]; + var next = args[i + 1]; + if (next !== undefined && !/^-/.test(next) + && !flags.bools[key] + && (aliases[key] ? !flags.bools[aliases[key]] : true)) { + setArg(key, next); + i++; + } + else if (/^(true|false)$/.test(next)) { + setArg(key, next === 'true'); + i++; + } + else { + setArg(key, flags.strings[key] ? '' : true); + } + } + else if (/^-[^-]+/.test(arg)) { + var letters = arg.slice(1,-1).split(''); + + var broken = false; + for (var j = 0; j < letters.length; j++) { + var next = arg.slice(j+2); + + if (next === '-') { + setArg(letters[j], next) + continue; + } + + if (/[A-Za-z]/.test(letters[j]) + && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) { + setArg(letters[j], next); + broken = true; + break; + } + + if (letters[j+1] && letters[j+1].match(/\W/)) { + setArg(letters[j], arg.slice(j+2)); + broken = true; + break; + } + else { + setArg(letters[j], flags.strings[letters[j]] ? '' : true); + } + } + + var key = arg.slice(-1)[0]; + if (!broken && key !== '-') { + if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1]) + && !flags.bools[key] + && (aliases[key] ? !flags.bools[aliases[key]] : true)) { + setArg(key, args[i+1]); + i++; + } + else if (args[i+1] && /true|false/.test(args[i+1])) { + setArg(key, args[i+1] === 'true'); + i++; + } + else { + setArg(key, flags.strings[key] ? '' : true); + } + } + } + else { + argv._.push( + flags.strings['_'] || !isNumber(arg) ? arg : Number(arg) + ); + } + } + + Object.keys(defaults).forEach(function (key) { + if (!hasKey(argv, key.split('.'))) { + setKey(argv, key.split('.'), defaults[key]); + + (aliases[key] || []).forEach(function (x) { + setKey(argv, x.split('.'), defaults[key]); + }); + } + }); + + notFlags.forEach(function(key) { + argv._.push(key); + }); + + return argv; +}; + +function hasKey (obj, keys) { + var o = obj; + keys.slice(0,-1).forEach(function (key) { + o = (o[key] || {}); + }); + + var key = keys[keys.length - 1]; + return key in o; +} + +function setKey (obj, keys, value) { + var o = obj; + keys.slice(0,-1).forEach(function (key) { + if (o[key] === undefined) o[key] = {}; + o = o[key]; + }); + + var key = keys[keys.length - 1]; + if (o[key] === undefined || typeof o[key] === 'boolean') { + o[key] = value; + } + else if (Array.isArray(o[key])) { + o[key].push(value); + } + else { + o[key] = [ o[key], value ]; + } +} + +function isNumber (x) { + if (typeof x === 'number') return true; + if (/^0x[0-9a-f]+$/i.test(x)) return true; + return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x); +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json new file mode 100644 index 0000000..2a1bc56 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json @@ -0,0 +1,67 @@ +{ + "name": "minimist", + "version": "0.0.10", + "description": "parse argument options", + "main": "index.js", + "devDependencies": { + "tape": "~1.0.4", + "tap": "~0.4.0" + }, + "scripts": { + "test": "tap test/*.js" + }, + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/6..latest", + "ff/5", + "firefox/latest", + "chrome/10", + "chrome/latest", + "safari/5.1", + "safari/latest", + "opera/12" + ] + }, + "repository": { + "type": "git", + "url": "git://github.com/substack/minimist.git" + }, + "homepage": "https://github.com/substack/minimist", + "keywords": [ + "argv", + "getopt", + "parser", + "optimist" + ], + "author": { + "name": "James Halliday", + "email": "mail@substack.net", + "url": "http://substack.net" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/substack/minimist/issues" + }, + "_id": "minimist@0.0.10", + "dist": { + "shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf", + "tarball": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + }, + "_from": "minimist@~0.0.7", + "_npmVersion": "1.4.3", + "_npmUser": { + "name": "substack", + "email": "mail@substack.net" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + } + ], + "directories": {}, + "_shasum": "de3f98543dbf96082be48ad1a0c7cda836301dcf", + "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown new file mode 100644 index 0000000..c256353 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown @@ -0,0 +1,73 @@ +# minimist + +parse argument options + +This module is the guts of optimist's argument parser without all the +fanciful decoration. + +[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist) + +[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist) + +# example + +``` js +var argv = require('minimist')(process.argv.slice(2)); +console.dir(argv); +``` + +``` +$ node example/parse.js -a beep -b boop +{ _: [], a: 'beep', b: 'boop' } +``` + +``` +$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz +{ _: [ 'foo', 'bar', 'baz' ], + x: 3, + y: 4, + n: 5, + a: true, + b: true, + c: true, + beep: 'boop' } +``` + +# methods + +``` js +var parseArgs = require('minimist') +``` + +## var argv = parseArgs(args, opts={}) + +Return an argument object `argv` populated with the array arguments from `args`. + +`argv._` contains all the arguments that didn't have an option associated with +them. + +Numeric-looking arguments will be returned as numbers unless `opts.string` or +`opts.boolean` is set for that argument name. + +Any arguments after `'--'` will not be parsed and will end up in `argv._`. + +options can be: + +* `opts.string` - a string or array of strings argument names to always treat as +strings +* `opts.boolean` - a string or array of strings to always treat as booleans +* `opts.alias` - an object mapping string names to strings or arrays of string +argument names to use as aliases +* `opts.default` - an object mapping string argument names to default values + +# install + +With [npm](https://npmjs.org) do: + +``` +npm install minimist +``` + +# license + +MIT diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js new file mode 100644 index 0000000..749e083 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js @@ -0,0 +1,119 @@ +var parse = require('../'); +var test = require('tape'); + +test('flag boolean default false', function (t) { + var argv = parse(['moo'], { + boolean: ['t', 'verbose'], + default: { verbose: false, t: false } + }); + + t.deepEqual(argv, { + verbose: false, + t: false, + _: ['moo'] + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); + +}); + +test('boolean groups', function (t) { + var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], { + boolean: ['x','y','z'] + }); + + t.deepEqual(argv, { + x : true, + y : false, + z : true, + _ : [ 'one', 'two', 'three' ] + }); + + t.deepEqual(typeof argv.x, 'boolean'); + t.deepEqual(typeof argv.y, 'boolean'); + t.deepEqual(typeof argv.z, 'boolean'); + t.end(); +}); +test('boolean and alias with chainable api', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + herp: { alias: 'h', boolean: true } + }; + var aliasedArgv = parse(aliased, { + boolean: 'herp', + alias: { h: 'herp' } + }); + var propertyArgv = parse(regular, { + boolean: 'herp', + alias: { h: 'herp' } + }); + var expected = { + herp: true, + h: true, + '_': [ 'derp' ] + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias with options hash', function (t) { + var aliased = [ '-h', 'derp' ]; + var regular = [ '--herp', 'derp' ]; + var opts = { + alias: { 'h': 'herp' }, + boolean: 'herp' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + '_': [ 'derp' ] + }; + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +test('boolean and alias using explicit true', function (t) { + var aliased = [ '-h', 'true' ]; + var regular = [ '--herp', 'true' ]; + var opts = { + alias: { h: 'herp' }, + boolean: 'h' + }; + var aliasedArgv = parse(aliased, opts); + var propertyArgv = parse(regular, opts); + var expected = { + herp: true, + h: true, + '_': [ ] + }; + + t.same(aliasedArgv, expected); + t.same(propertyArgv, expected); + t.end(); +}); + +// regression, see https://github.com/substack/node-optimist/issues/71 +test('boolean and --x=true', function(t) { + var parsed = parse(['--boool', '--other=true'], { + boolean: 'boool' + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'true'); + + parsed = parse(['--boool', '--other=false'], { + boolean: 'boool' + }); + + t.same(parsed.boool, true); + t.same(parsed.other, 'false'); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js new file mode 100644 index 0000000..8b034b9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js @@ -0,0 +1,24 @@ +var parse = require('../'); +var test = require('tape'); + +test('-', function (t) { + t.plan(5); + t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] }); + t.deepEqual(parse([ '-' ]), { _: [ '-' ] }); + t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] }); + t.deepEqual( + parse([ '-b', '-' ], { boolean: 'b' }), + { b: true, _: [ '-' ] } + ); + t.deepEqual( + parse([ '-s', '-' ], { string: 's' }), + { s: '-', _: [] } + ); +}); + +test('-a -- b', function (t) { + t.plan(3); + t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] }); + t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); + t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js new file mode 100644 index 0000000..f0041ee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js @@ -0,0 +1,20 @@ +var test = require('tape'); +var parse = require('../'); + +test('boolean default true', function (t) { + var argv = parse([], { + boolean: 'sometrue', + default: { sometrue: true } + }); + t.equal(argv.sometrue, true); + t.end(); +}); + +test('boolean default false', function (t) { + var argv = parse([], { + boolean: 'somefalse', + default: { somefalse: false } + }); + t.equal(argv.somefalse, false); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js new file mode 100644 index 0000000..d8b3e85 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js @@ -0,0 +1,22 @@ +var parse = require('../'); +var test = require('tape'); + +test('dotted alias', function (t) { + var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); + t.equal(argv.a.b, 22); + t.equal(argv.aa.bb, 22); + t.end(); +}); + +test('dotted default', function (t) { + var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}}); + t.equal(argv.a.b, 11); + t.equal(argv.aa.bb, 11); + t.end(); +}); + +test('dotted default with no alias', function (t) { + var argv = parse('', {default: {'a.b': 11}}); + t.equal(argv.a.b, 11); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js new file mode 100644 index 0000000..5d3a1e0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js @@ -0,0 +1,31 @@ +var test = require('tape'); +var parse = require('../'); + +test('long opts', function (t) { + t.deepEqual( + parse([ '--bool' ]), + { bool : true, _ : [] }, + 'long boolean' + ); + t.deepEqual( + parse([ '--pow', 'xixxle' ]), + { pow : 'xixxle', _ : [] }, + 'long capture sp' + ); + t.deepEqual( + parse([ '--pow=xixxle' ]), + { pow : 'xixxle', _ : [] }, + 'long capture eq' + ); + t.deepEqual( + parse([ '--host', 'localhost', '--port', '555' ]), + { host : 'localhost', port : 555, _ : [] }, + 'long captures sp' + ); + t.deepEqual( + parse([ '--host=localhost', '--port=555' ]), + { host : 'localhost', port : 555, _ : [] }, + 'long captures eq' + ); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js new file mode 100644 index 0000000..2cc77f4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js @@ -0,0 +1,36 @@ +var parse = require('../'); +var test = require('tape'); + +test('nums', function (t) { + var argv = parse([ + '-x', '1234', + '-y', '5.67', + '-z', '1e7', + '-w', '10f', + '--hex', '0xdeadbeef', + '789' + ]); + t.deepEqual(argv, { + x : 1234, + y : 5.67, + z : 1e7, + w : '10f', + hex : 0xdeadbeef, + _ : [ 789 ] + }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv.y, 'number'); + t.deepEqual(typeof argv.z, 'number'); + t.deepEqual(typeof argv.w, 'string'); + t.deepEqual(typeof argv.hex, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); + +test('already a number', function (t) { + var argv = parse([ '-x', 1234, 789 ]); + t.deepEqual(argv, { x : 1234, _ : [ 789 ] }); + t.deepEqual(typeof argv.x, 'number'); + t.deepEqual(typeof argv._[0], 'number'); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js new file mode 100644 index 0000000..7b4a2a1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js @@ -0,0 +1,197 @@ +var parse = require('../'); +var test = require('tape'); + +test('parse args', function (t) { + t.deepEqual( + parse([ '--no-moo' ]), + { moo : false, _ : [] }, + 'no' + ); + t.deepEqual( + parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]), + { v : ['a','b','c'], _ : [] }, + 'multi' + ); + t.end(); +}); + +test('comprehensive', function (t) { + t.deepEqual( + parse([ + '--name=meowmers', 'bare', '-cats', 'woo', + '-h', 'awesome', '--multi=quux', + '--key', 'value', + '-b', '--bool', '--no-meep', '--multi=baz', + '--', '--not-a-flag', 'eek' + ]), + { + c : true, + a : true, + t : true, + s : 'woo', + h : 'awesome', + b : true, + bool : true, + key : 'value', + multi : [ 'quux', 'baz' ], + meep : false, + name : 'meowmers', + _ : [ 'bare', '--not-a-flag', 'eek' ] + } + ); + t.end(); +}); + +test('flag boolean', function (t) { + var argv = parse([ '-t', 'moo' ], { boolean: 't' }); + t.deepEqual(argv, { t : true, _ : [ 'moo' ] }); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('flag boolean value', function (t) { + var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], { + boolean: [ 't', 'verbose' ], + default: { verbose: true } + }); + + t.deepEqual(argv, { + verbose: false, + t: true, + _: ['moo'] + }); + + t.deepEqual(typeof argv.verbose, 'boolean'); + t.deepEqual(typeof argv.t, 'boolean'); + t.end(); +}); + +test('newlines in params' , function (t) { + var args = parse([ '-s', "X\nX" ]) + t.deepEqual(args, { _ : [], s : "X\nX" }); + + // reproduce in bash: + // VALUE="new + // line" + // node program.js --s="$VALUE" + args = parse([ "--s=X\nX" ]) + t.deepEqual(args, { _ : [], s : "X\nX" }); + t.end(); +}); + +test('strings' , function (t) { + var s = parse([ '-s', '0001234' ], { string: 's' }).s; + t.equal(s, '0001234'); + t.equal(typeof s, 'string'); + + var x = parse([ '-x', '56' ], { string: 'x' }).x; + t.equal(x, '56'); + t.equal(typeof x, 'string'); + t.end(); +}); + +test('stringArgs', function (t) { + var s = parse([ ' ', ' ' ], { string: '_' })._; + t.same(s.length, 2); + t.same(typeof s[0], 'string'); + t.same(s[0], ' '); + t.same(typeof s[1], 'string'); + t.same(s[1], ' '); + t.end(); +}); + +test('empty strings', function(t) { + var s = parse([ '-s' ], { string: 's' }).s; + t.equal(s, ''); + t.equal(typeof s, 'string'); + + var str = parse([ '--str' ], { string: 'str' }).str; + t.equal(str, ''); + t.equal(typeof str, 'string'); + + var letters = parse([ '-art' ], { + string: [ 'a', 't' ] + }); + + t.equal(letters.a, ''); + t.equal(letters.r, true); + t.equal(letters.t, ''); + + t.end(); +}); + + +test('string and alias', function(t) { + var x = parse([ '--str', '000123' ], { + string: 's', + alias: { s: 'str' } + }); + + t.equal(x.str, '000123'); + t.equal(typeof x.str, 'string'); + t.equal(x.s, '000123'); + t.equal(typeof x.s, 'string'); + + var y = parse([ '-s', '000123' ], { + string: 'str', + alias: { str: 's' } + }); + + t.equal(y.str, '000123'); + t.equal(typeof y.str, 'string'); + t.equal(y.s, '000123'); + t.equal(typeof y.s, 'string'); + t.end(); +}); + +test('slashBreak', function (t) { + t.same( + parse([ '-I/foo/bar/baz' ]), + { I : '/foo/bar/baz', _ : [] } + ); + t.same( + parse([ '-xyz/foo/bar/baz' ]), + { x : true, y : true, z : '/foo/bar/baz', _ : [] } + ); + t.end(); +}); + +test('alias', function (t) { + var argv = parse([ '-f', '11', '--zoom', '55' ], { + alias: { z: 'zoom' } + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.f, 11); + t.end(); +}); + +test('multiAlias', function (t) { + var argv = parse([ '-f', '11', '--zoom', '55' ], { + alias: { z: [ 'zm', 'zoom' ] } + }); + t.equal(argv.zoom, 55); + t.equal(argv.z, argv.zoom); + t.equal(argv.z, argv.zm); + t.equal(argv.f, 11); + t.end(); +}); + +test('nested dotted objects', function (t) { + var argv = parse([ + '--foo.bar', '3', '--foo.baz', '4', + '--foo.quux.quibble', '5', '--foo.quux.o_O', + '--beep.boop' + ]); + + t.same(argv.foo, { + bar : 3, + baz : 4, + quux : { + quibble : 5, + o_O : true + } + }); + t.same(argv.beep, { boop : true }); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js new file mode 100644 index 0000000..21851b0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js @@ -0,0 +1,9 @@ +var parse = require('../'); +var test = require('tape'); + +test('parse with modifier functions' , function (t) { + t.plan(1); + + var argv = parse([ '-b', '123' ], { boolean: 'b' }); + t.deepEqual(argv, { b: true, _: ['123'] }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js new file mode 100644 index 0000000..d513a1c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js @@ -0,0 +1,67 @@ +var parse = require('../'); +var test = require('tape'); + +test('numeric short args', function (t) { + t.plan(2); + t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] }); + t.deepEqual( + parse([ '-123', '456' ]), + { 1: true, 2: true, 3: 456, _: [] } + ); +}); + +test('short', function (t) { + t.deepEqual( + parse([ '-b' ]), + { b : true, _ : [] }, + 'short boolean' + ); + t.deepEqual( + parse([ 'foo', 'bar', 'baz' ]), + { _ : [ 'foo', 'bar', 'baz' ] }, + 'bare' + ); + t.deepEqual( + parse([ '-cats' ]), + { c : true, a : true, t : true, s : true, _ : [] }, + 'group' + ); + t.deepEqual( + parse([ '-cats', 'meow' ]), + { c : true, a : true, t : true, s : 'meow', _ : [] }, + 'short group next' + ); + t.deepEqual( + parse([ '-h', 'localhost' ]), + { h : 'localhost', _ : [] }, + 'short capture' + ); + t.deepEqual( + parse([ '-h', 'localhost', '-p', '555' ]), + { h : 'localhost', p : 555, _ : [] }, + 'short captures' + ); + t.end(); +}); + +test('mixed short bool and capture', function (t) { + t.same( + parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ] + } + ); + t.end(); +}); + +test('short and long', function (t) { + t.deepEqual( + parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]), + { + f : true, p : 555, h : 'localhost', + _ : [ 'script.js' ] + } + ); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js new file mode 100644 index 0000000..8a52a58 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js @@ -0,0 +1,8 @@ +var parse = require('../'); +var test = require('tape'); + +test('whitespace should be whitespace' , function (t) { + t.plan(1); + var x = parse([ '-x', '\t' ]).x; + t.equal(x, '\t'); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js new file mode 100755 index 0000000..ac4da48 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js @@ -0,0 +1,41 @@ +#!/usr/bin/env node +'use strict'; +var fs = require('fs'); +var strip = require('./strip-json-comments'); +var input = process.argv[2]; + + +function getStdin(cb) { + var ret = ''; + + process.stdin.setEncoding('utf8'); + + process.stdin.on('data', function (data) { + ret += data; + }); + + process.stdin.on('end', function () { + cb(ret); + }); +} + +if (process.argv.indexOf('-h') !== -1 || process.argv.indexOf('--help') !== -1) { + console.log('strip-json-comments > '); + console.log('or'); + console.log('cat | strip-json-comments > '); + return; +} + +if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) { + console.log(require('./package').version); + return; +} + +if (input) { + process.stdout.write(strip(fs.readFileSync(input, 'utf8'))); + return; +} + +getStdin(function (data) { + process.stdout.write(strip(data)); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json new file mode 100644 index 0000000..e08b6ff --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json @@ -0,0 +1,76 @@ +{ + "name": "strip-json-comments", + "version": "0.1.3", + "description": "Strip comments from JSON. Lets you use comments in your JSON files!", + "keywords": [ + "json", + "strip", + "remove", + "delete", + "trim", + "comments", + "multiline", + "parse", + "config", + "configuration", + "conf", + "settings", + "util", + "env", + "environment", + "cli", + "bin" + ], + "license": "MIT", + "author": { + "name": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "http://sindresorhus.com" + }, + "files": [ + "cli.js", + "strip-json-comments.js" + ], + "main": "strip-json-comments", + "bin": { + "strip-json-comments": "cli.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/sindresorhus/strip-json-comments" + }, + "scripts": { + "test": "mocha" + }, + "devDependencies": { + "mocha": "*" + }, + "engines": { + "node": ">=0.8.0" + }, + "gitHead": "cbd5aede7ccbe5d5a9065b1d47070fd99ad579af", + "bugs": { + "url": "https://github.com/sindresorhus/strip-json-comments/issues" + }, + "homepage": "https://github.com/sindresorhus/strip-json-comments", + "_id": "strip-json-comments@0.1.3", + "_shasum": "164c64e370a8a3cc00c9e01b539e569823f0ee54", + "_from": "strip-json-comments@0.1.x", + "_npmVersion": "1.4.13", + "_npmUser": { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + }, + "maintainers": [ + { + "name": "sindresorhus", + "email": "sindresorhus@gmail.com" + } + ], + "dist": { + "shasum": "164c64e370a8a3cc00c9e01b539e569823f0ee54", + "tarball": "http://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-0.1.3.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md new file mode 100644 index 0000000..ad6a178 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md @@ -0,0 +1,74 @@ +# strip-json-comments [![Build Status](https://travis-ci.org/sindresorhus/strip-json-comments.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-json-comments) + +> Strip comments from JSON. Lets you use comments in your JSON files! + +This is now possible: + +```js +{ + // rainbows + "unicorn": /* ❤ */ "cake" +} +``` + +It will remove single-line comments `//` and mult-line comments `/**/`. + +Also available as a [gulp](https://github.com/sindresorhus/gulp-strip-json-comments)/[grunt](https://github.com/sindresorhus/grunt-strip-json-comments)/[broccoli](https://github.com/sindresorhus/broccoli-strip-json-comments) plugin and a [require hook](https://github.com/uTest/autostrip-json-comments). + + +*There's already [json-comments](https://npmjs.org/package/json-comments), but it's only for Node.js and uses a naive regex to strip comments which fails on simple cases like `{"a":"//"}`. This module however parses out the comments.* + + +## Install + +```sh +$ npm install --save strip-json-comments +``` + +```sh +$ bower install --save strip-json-comments +``` + +```sh +$ component install sindresorhus/strip-json-comments +``` + + +## Usage + +```js +var json = '{/*rainbows*/"unicorn":"cake"}'; +JSON.parse(stripJsonComments(json)); +//=> {unicorn: 'cake'} +``` + + +## API + +### stripJsonComments(input) + +#### input + +Type: `string` + +Accepts a string with JSON and returns a string without comments. + + +## CLI + +```sh +$ npm install --global strip-json-comments +``` + +```sh +$ strip-json-comments --help + +strip-json-comments > +# or +cat | strip-json-comments > +``` + + +## License + +MIT © [Sindre Sorhus](http://sindresorhus.com) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js new file mode 100644 index 0000000..2e7fdef --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js @@ -0,0 +1,64 @@ +/*! + strip-json-comments + Strip comments from JSON. Lets you use comments in your JSON files! + https://github.com/sindresorhus/strip-json-comments + by Sindre Sorhus + MIT License +*/ +(function () { + 'use strict'; + + function stripJsonComments(str) { + var currentChar; + var nextChar; + var insideString = false; + var insideComment = false; + var ret = ''; + + for (var i = 0; i < str.length; i++) { + currentChar = str[i]; + nextChar = str[i + 1]; + + if (!insideComment && str[i - 1] !== '\\' && currentChar === '"') { + insideString = !insideString; + } + + if (insideString) { + ret += currentChar; + continue; + } + + if (!insideComment && currentChar + nextChar === '//') { + insideComment = 'single'; + i++; + } else if (insideComment === 'single' && currentChar + nextChar === '\r\n') { + insideComment = false; + i++; + } else if (insideComment === 'single' && currentChar === '\n') { + insideComment = false; + } else if (!insideComment && currentChar + nextChar === '/*') { + insideComment = 'multi'; + i++; + continue; + } else if (insideComment === 'multi' && currentChar + nextChar === '*/') { + insideComment = false; + i++; + continue; + } + + if (insideComment) { + continue; + } + + ret += currentChar; + } + + return ret; + } + + if (typeof module !== 'undefined' && module.exports) { + module.exports = stripJsonComments; + } else { + window.stripJsonComments = stripJsonComments; + } +})(); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/package.json new file mode 100644 index 0000000..4d3bac0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/package.json @@ -0,0 +1,64 @@ +{ + "name": "rc", + "version": "0.5.1", + "description": "hardwired configuration loader", + "main": "index.js", + "browserify": "browser.js", + "scripts": { + "test": "set -e; node test/test.js; node test/ini.js; node test/nested-env-vars.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/dominictarr/rc.git" + }, + "keywords": [ + "config", + "rc", + "unix", + "defaults" + ], + "bin": { + "rc": "./index.js" + }, + "author": { + "name": "Dominic Tarr", + "email": "dominic.tarr@gmail.com", + "url": "dominictarr.com" + }, + "licenses": [ + "BSD", + "MIT", + "Apache2" + ], + "dependencies": { + "minimist": "~0.0.7", + "deep-extend": "~0.2.5", + "strip-json-comments": "0.1.x", + "ini": "~1.1.0" + }, + "gitHead": "24cc92c2f9c6d7193c283bc6be7164d6fa4fcf23", + "bugs": { + "url": "https://github.com/dominictarr/rc/issues" + }, + "homepage": "https://github.com/dominictarr/rc", + "_id": "rc@0.5.1", + "_shasum": "b88ef9421a08151352a659e0c3a58c4b82eb7576", + "_from": "rc@~0.5.0", + "_npmVersion": "1.4.26", + "_npmUser": { + "name": "dominictarr", + "email": "dominic.tarr@gmail.com" + }, + "maintainers": [ + { + "name": "dominictarr", + "email": "dominic.tarr@gmail.com" + } + ], + "dist": { + "shasum": "b88ef9421a08151352a659e0c3a58c4b82eb7576", + "tarball": "http://registry.npmjs.org/rc/-/rc-0.5.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/rc/-/rc-0.5.1.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/ini.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/ini.js new file mode 100644 index 0000000..e6857f8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/ini.js @@ -0,0 +1,16 @@ +var cc =require('../lib/utils') +var INI = require('ini') +var assert = require('assert') + +function test(obj) { + + var _json, _ini + var json = cc.parse (_json = JSON.stringify(obj)) + var ini = cc.parse (_ini = INI.stringify(obj)) + console.log(_ini, _json) + assert.deepEqual(json, ini) +} + + +test({hello: true}) + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js new file mode 100644 index 0000000..314979f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js @@ -0,0 +1,39 @@ + +var n = 'rc'+Math.random() +var assert = require('assert') + + +// Basic usage +process.env[n+'_someOpt__a'] = 42 +process.env[n+'_someOpt__x__'] = 99 +process.env[n+'_someOpt__a__b'] = 186 +process.env[n+'_someOpt__x__y'] = 1862 +process.env[n+'_someOpt__z'] = 186577 + +// Should ignore empty strings from orphaned '__' +process.env[n+'_someOpt__z__x__'] = 18629 +process.env[n+'_someOpt__w__w__'] = 18629 + +// Leading '__' should ignore everything up to 'z' +process.env[n+'___z__i__'] = 9999 + +var config = require('../')(n, { + option: true +}) + +console.log('\n\n------ nested-env-vars ------\n',config) + +assert.equal(config.option, true) +assert.equal(config.someOpt.a, 42) +assert.equal(config.someOpt.x, 99) +// Should not override `a` once it's been set +assert.equal(config.someOpt.a/*.b*/, 42) +// Should not override `x` once it's been set +assert.equal(config.someOpt.x/*.y*/, 99) +assert.equal(config.someOpt.z, 186577) +// Should not override `z` once it's been set +assert.equal(config.someOpt.z/*.x*/, 186577) +assert.equal(config.someOpt.w.w, 18629) +assert.equal(config.z.i, 9999) + + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/test.js new file mode 100644 index 0000000..badc930 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rc/test/test.js @@ -0,0 +1,56 @@ + +var n = 'rc'+Math.random() +var assert = require('assert') + +process.env[n+'_envOption'] = 42 + +var config = require('../')(n, { + option: true +}) + +console.log(config) + +assert.equal(config.option, true) +assert.equal(config.envOption, 42) + +var customArgv = require('../')(n, { + option: true +}, { // nopt-like argv + option: false, + envOption: 24, + argv: { + remain: [], + cooked: ['--no-option', '--envOption', '24'], + original: ['--no-option', '--envOption=24'] + } +}) + +console.log(customArgv) + +assert.equal(customArgv.option, false) +assert.equal(customArgv.envOption, 24) + +var fs = require('fs') +var path = require('path') +var jsonrc = path.resolve('.' + n + 'rc'); + +fs.writeFileSync(jsonrc, [ + '{', + '// json overrides default', + '"option": false,', + '/* env overrides json */', + '"envOption": 24', + '}' +].join('\n')); + +var commentedJSON = require('../')(n, { + option: true +}) + +fs.unlinkSync(jsonrc); + +console.log(commentedJSON) + +assert.equal(commentedJSON.option, false) +assert.equal(commentedJSON.envOption, 42) +assert.equal(commentedJSON.config, jsonrc) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.npmignore new file mode 100644 index 0000000..80e59ef --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.npmignore @@ -0,0 +1,2 @@ +tests +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.travis.yml new file mode 100644 index 0000000..6e4887a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/.travis.yml @@ -0,0 +1,12 @@ +language: node_js +node_js: + - "0.8" + - "0.10" + +env: + - OPTIONALS=Y + - OPTIONALS=N + +install: + - if [[ "$OPTIONALS" == "Y" ]]; then npm install; fi + - if [[ "$OPTIONALS" == "N" ]]; then npm install --no-optional; fi diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md new file mode 100644 index 0000000..11f571f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md @@ -0,0 +1,954 @@ +## Change Log + +### upcoming (2014/07/09 12:10 +00:00) +- [#946](https://github.com/mikeal/request/pull/946) defaults: merge headers (@aj0strow) +- [#844](https://github.com/mikeal/request/pull/844) Add support for HTTP[S]_PROXY environment variables. Fixes #595. (@jvmccarthy) + +### v2.37.1 (2014/07/07 17:25 +00:00) +- [8711b2f](https://github.com/mikeal/request/commit/8711b2f3489553a7ddae69fa8c9f538182c9d5c8) 2.37.1 (@mikeal) + +### v2.37.0 (2014/07/07 17:25 +00:00) +- [79472b2](https://github.com/mikeal/request/commit/79472b263cde77504a354913a16bdc9fbdc9ed5d) append secureOptions to poolKey (@medovob) +- [#907](https://github.com/mikeal/request/pull/907) append secureOptions to poolKey (@medovob) +- [b223a8a](https://github.com/mikeal/request/commit/b223a8add0cbdd4e699a52da66aeb0f0cb17a0c3) expose tough-cookie's getCookiesSync (@charlespwd) +- [f4dcad0](https://github.com/mikeal/request/commit/f4dcad0fa6e2f2388abae508ad7256a1e1214ab2) test getCookies method (@charlespwd) +- [adcf62b](https://github.com/mikeal/request/commit/adcf62bf45ec19a28198ca8d3f37e7d7babc883a) update readme (@charlespwd) +- [4fdf13b](https://github.com/mikeal/request/commit/4fdf13b57dcd20b9fe03c0956f5df70c82d6e4a3) Merge branch 'charlespwd-master' (@lalitkapoor) +- [83e370d](https://github.com/mikeal/request/commit/83e370d54ca2a5fb162e40e7e705e1e9d702ba0a) Bump version of hawk dep. (@samccone) +- [#927](https://github.com/mikeal/request/pull/927) Bump version of hawk dep. (@samccone) +- [c42dcec](https://github.com/mikeal/request/commit/c42dcec10a307cb2299861f87720d491a89142b4) package.json: use OSI-style license name (@isaacs) +- [8892cb7](https://github.com/mikeal/request/commit/8892cb7bb8945807ff25038e888222d4e902acc8) Swap mime module. (@eiriksm) +- [d92395e](https://github.com/mikeal/request/commit/d92395e638cbfe5c31eb4ff54941b98b09057486) Make package.json so node .8 understands it. (@eiriksm) +- [6ebd748](https://github.com/mikeal/request/commit/6ebd748a02a49976d41ebbc4f8396acf8fda1c14) Add some additional hacks to work in the browser. (@eiriksm) +- [#943](https://github.com/mikeal/request/pull/943) New mime module (@eiriksm) +- [561454d](https://github.com/mikeal/request/commit/561454d18a68b7a03163308f6d29e127afe97426) Add some code comments about why we do the extra checks. (@eiriksm) +- [#944](https://github.com/mikeal/request/pull/944) Make request work with browserify (@eiriksm) +- [6a0add7](https://github.com/mikeal/request/commit/6a0add70b2687cf751b3446a15a513a1fd141738) defaults: merge headers (@aj0strow) +- [407c1ad](https://github.com/mikeal/request/commit/407c1ada61afca4d4ba50155c6d9430754541df1) prefer late return statement (@aj0strow) +- [4ab40ba](https://github.com/mikeal/request/commit/4ab40ba2f9aca8958cab149eb9cfbd9edb5534aa) Added support for manual querystring in form option (@charlespwd) +- [a55627c](https://github.com/mikeal/request/commit/a55627cd9f468cefb2971bb501ebc0c2fc27aa8b) Updated README (@charlespwd) +- [#949](https://github.com/mikeal/request/pull/949) Manually enter querystring in form option (@charlespwd) +- [10246c8](https://github.com/mikeal/request/commit/10246c84819db14b32fccca040029b06449242a3) [PATCH v2] Add support for gzip content decoding (@kevinoid) +- [6180c5f](https://github.com/mikeal/request/commit/6180c5f45c01fb2158b9a44f894a34263479fa84) check for content-length header before setting it in nextTick (@camilleanne) +- [#951](https://github.com/mikeal/request/pull/951) Add support for gzip content decoding (@kevinoid) +- [849c681](https://github.com/mikeal/request/commit/849c681846ce3b5492bd47261de391377a3ac19b) Silence EventEmitter memory leak warning #311 (@watson) +- [#955](https://github.com/mikeal/request/pull/955) check for content-length header before setting it in nextTick (@camilleanne) +- [#957](https://github.com/mikeal/request/pull/957) Silence EventEmitter memory leak warning #311 (@watson) +- [c1d951e](https://github.com/mikeal/request/commit/c1d951e536bd41c957f0cade41d051c9d41d1462) Fixing for 0.8 (@mikeal) +- [4851118](https://github.com/mikeal/request/commit/48511186495888a5f0cb15a107325001ac91990e) 2.37.0 (@mikeal) + +### v2.36.1 (2014/05/19 20:59 +00:00) +- [c3914fc](https://github.com/mikeal/request/commit/c3914fcd4a74faf6dbf0fb6a4a188e871e0c51b8) 2.36.1 (@mikeal) + +### v2.36.0 (2014/05/19 20:59 +00:00) +- [76a96de](https://github.com/mikeal/request/commit/76a96de75580042aa780e9587ff7a22522119c3f) Reventing lodash merge change. (@mikeal) +- [b8bb57e](https://github.com/mikeal/request/commit/b8bb57efb17e72e2ac6d957c05c3f2570c7ba6a0) 2.36.0 (@mikeal) + +### v2.35.1 (2014/05/17 20:57 +00:00) +- [4bbd153](https://github.com/mikeal/request/commit/4bbd1532a68cadf1a88dd69c277645e9b781f364) 2.35.1 (@mikeal) + +### v2.35.0 (2014/05/17 20:57 +00:00) +- [2833da3](https://github.com/mikeal/request/commit/2833da3c3c1c34f4130ad1ba470354fc32410691) initial changelog (@lalitkapoor) +- [49319e6](https://github.com/mikeal/request/commit/49319e6c09a8a169c95a8d282c900f9fecd50371) Merge branch 'master' of https://github.com/mikeal/request into create-changelog-based-on-pull-requests (@lalitkapoor) +- [#815](https://github.com/mikeal/request/pull/815) Create changelog based on pull requests (@lalitkapoor) +- [4b6ce1a](https://github.com/mikeal/request/commit/4b6ce1ac0f79cb8fa633e281d3eb4c0cb61794e1) It appears that secureOptions is an undocumented feature to fix issues with broken server. See joynet/node #5119 (@nw) +- [#821](https://github.com/mikeal/request/pull/821) added secureOptions back (@nw) +- [eddd488](https://github.com/mikeal/request/commit/eddd4889fb1bc95c741749e79d9749aab3e103fc) Fixing #825 (@mikeal) +- [4627a7a](https://github.com/mikeal/request/commit/4627a7a14078494ded8c66c19c43efd07324cbd8) improve error reporting for invalid protocols (@FND) +- [#840](https://github.com/mikeal/request/pull/840) improve error reporting for invalid protocols (@FND) +- [#810](https://github.com/mikeal/request/pull/810) add some exposition to mpu example in README.md (@mikermcneil) +- [8a0e2d6](https://github.com/mikeal/request/commit/8a0e2d65351560858275c73505df12b537f4d001) Added support for HTTP_PROXY and HTTPS_PROXY environment variables, if the proxy option isn't already set. (@jvmccarthy) +- [f60d348](https://github.com/mikeal/request/commit/f60d348dc1840ee6d7b709efcc2b3cd1a03aef63) Fix word consistency +- [#850](https://github.com/mikeal/request/pull/850) Fix word consistency in readme (@0xNobody) +- [#809](https://github.com/mikeal/request/pull/809) upgrade tunnel-proxy to 0.4.0 (@ksato9700) +- [e86377c](https://github.com/mikeal/request/commit/e86377c0c1e7695c3997f7802175ca37f5a5113b) Won't use HTTP(S)_PROXY env var if proxy explicitly set to null. (@jvmccarthy) +- [f1bb537](https://github.com/mikeal/request/commit/f1bb537ee2440bd664ea8c445ac3a2c6e31e9932) Add support for RFC 6750 Bearer Tokens +- [ba51a26](https://github.com/mikeal/request/commit/ba51a26079ec52c0a9145fbe8b6796d46e79bb8e) Add documentation about auth.bearer (@phedny) +- [#861](https://github.com/mikeal/request/pull/861) Add support for RFC 6750 Bearer Tokens (@phedny) +- [b8ee579](https://github.com/mikeal/request/commit/b8ee5790ace95440a56074f6afe866f4662e9e88) Fix typo (@dandv) +- [#866](https://github.com/mikeal/request/pull/866) Fix typo (@dandv) +- [b292b59](https://github.com/mikeal/request/commit/b292b59fadecb35dac3bee0959c4b4b782e772e3) Clean code syntax in test-pipes.js (@tgohn) +- [f7996d5](https://github.com/mikeal/request/commit/f7996d5fcfed85e03f293a7c9739e385b64ecaad) Add test for request.pipefilter (@tgohn) +- [#869](https://github.com/mikeal/request/pull/869) Pipefilter test (@tgohn) +- [86b99b6](https://github.com/mikeal/request/commit/86b99b671a3c86f4f963a6c67047343fd8edae8f) Fix typo in form example (@mscdex) +- [2ba4808](https://github.com/mikeal/request/commit/2ba48083ddf2607f85e2c479e0d254483c2610fe) failing test (@lalitkapoor) +- [39396b0](https://github.com/mikeal/request/commit/39396b0bb2e90eb7ec4dfcf5d2e731a2cb156f5c) extend passed in options (@lalitkapoor) +- [#891](https://github.com/mikeal/request/pull/891) fixes 857 - options object is mutated by calling request (@lalitkapoor) +- [54a51c6](https://github.com/mikeal/request/commit/54a51c665887e162ccb9f6b17b9c1f3b017ccc29) merge options (@vohof) +- [25b95db](https://github.com/mikeal/request/commit/25b95dbdddf874f014386a0a9fe35a7c903b7415) tilde? (@vohof) +- [#897](https://github.com/mikeal/request/pull/897) merge with default options (@vohof) +- [a1e4b1a](https://github.com/mikeal/request/commit/a1e4b1a9c2f39ce565fd023bb604da139f689d43) Fixes #555 (@pigulla) +- [#901](https://github.com/mikeal/request/pull/901) Fixes #555 (@pigulla) +- [6498a5f](https://github.com/mikeal/request/commit/6498a5f1ae68050cfeabf8f34f75bc72b08f1805) 2.35.0 (@mikeal) + +### v2.34.1 (2014/02/18 19:35 +00:00) +- [aefea20](https://github.com/mikeal/request/commit/aefea20b215ff1a48f0d8d27dcac0186604e3b2d) 2.34.1 (@mikeal) + +### v2.34.0 (2014/02/18 19:35 +00:00) +- [46edc90](https://github.com/mikeal/request/commit/46edc902e6ffdee39038a6702021728cb9d9b8fa) simpler (@joaojeronimo) +- [#781](https://github.com/mikeal/request/pull/781) simpler isReadStream function (@joaojeronimo) +- [fe2f59f](https://github.com/mikeal/request/commit/fe2f59fdc72de5c86404e51ab6bc4e0e8ece95f2) Provide ability to override content-type when `json` option used (@vvo) +- [#785](https://github.com/mikeal/request/pull/785) Provide ability to override content-type when `json` option used (@vvo) +- [d134f01](https://github.com/mikeal/request/commit/d134f012e64702e8f4070d61504b39524e1a07ba) Adds content-length calculation when submitting forms using form-data library. This is related to issue 345. (@Juul) +- [#793](https://github.com/mikeal/request/pull/793) Adds content-length calculation when submitting forms using form-data li... (@Juul) +- [3ebf25c](https://github.com/mikeal/request/commit/3ebf25c5af1194d8f7b3a3330fe89e729532809b) adding failing test (@lalitkapoor) +- [0f57a90](https://github.com/mikeal/request/commit/0f57a90384588727a5446bb1f5bf4e0be2d85780) accept options in arguments (@lalitkapoor) +- [7fb1647](https://github.com/mikeal/request/commit/7fb164731a5aad80c6539e33eda4ad4a51bb7871) silently ignore errors when adding cookie to jar (@lalitkapoor) +- [d6b2b1c](https://github.com/mikeal/request/commit/d6b2b1c279d12cdddc6593060672d49b12e63fea) add additional header test (@lalitkapoor) +- [f29e6df](https://github.com/mikeal/request/commit/f29e6dfadc6c3a45b6190998b6608059f87f3c32) Added the Apache license to the package.json. (@keskival) +- [#802](https://github.com/mikeal/request/pull/802) Added the Apache license to the package.json. (@keskival) +- [#801](https://github.com/mikeal/request/pull/801) 794 ignore cookie parsing and domain errors (@lalitkapoor) +- [54e6dfb](https://github.com/mikeal/request/commit/54e6dfb77d57757d4006982f813ebaab9e005cd5) Rewrite UNIX Domain Socket support into 2.33.1. Add test. (@lyuzashi) +- [3eaed2f](https://github.com/mikeal/request/commit/3eaed2f2e82d9d17a583bcc54270c16a7b674206) Use setImmediate when available, otherwise fallback to nextTick (@lyuzashi) +- [746ca75](https://github.com/mikeal/request/commit/746ca757da24d5011e92e04cb00c90098a7680fd) Indent wrapped buildRequest function (@lyuzashi) +- [#516](https://github.com/mikeal/request/pull/516) UNIX Socket URL Support (@native-digital) +- [9a5b0a8](https://github.com/mikeal/request/commit/9a5b0a81eca9836f05b0192c05c0d41e79034461) initial format (@lalitkapoor) +- [9380a49](https://github.com/mikeal/request/commit/9380a49779ddb081eba5d0ee51e4396d72d52066) upgrade tunnel-proxy to 0.4.0 (@ksato9700) +- [1efea37](https://github.com/mikeal/request/commit/1efea374286c728c3c988ee2264fb44cd8c41d88) add some exposition to mpu example in README.md (@mikermcneil) +- [ba0d63a](https://github.com/mikeal/request/commit/ba0d63ae23a3fc95dfe012df0bd6c8d7e87b1df7) made the language clearer (@mikermcneil) +- [b43aa81](https://github.com/mikeal/request/commit/b43aa81789c0b8c7ae90d2b983f79dde4a125470) 2.34.0 (@mikeal) + +### v2.33.1 (2014/01/16 19:48 +00:00) +- [afcf827](https://github.com/mikeal/request/commit/afcf827559b3223c96ac1bbd19bd1e4a6d7771e3) 2.33.1 (@mikeal) + +### v2.33.0 (2014/01/16 19:48 +00:00) +- [7f1cc8f](https://github.com/mikeal/request/commit/7f1cc8ff5a8d9443e7a793f4655487e722b75b0d) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [3e43d3d](https://github.com/mikeal/request/commit/3e43d3d5175f5f18d1e97b2f5d4ca6ac6c216e4a) 2.33.0 (@mikeal) + +### v2.32.1 (2014/01/16 19:33 +00:00) +- [dd44f39](https://github.com/mikeal/request/commit/dd44f39d37daacbbeb21f9e960f13adbb44eea0a) 2.32.1 (@mikeal) + +### v2.32.0 (2014/01/16 19:33 +00:00) +- [#757](https://github.com/mikeal/request/pull/757) require aws-sign2 (@mafintosh) +- [#744](https://github.com/mikeal/request/pull/744) Use Cookie.parse (@lalitkapoor) +- [5eaee1c](https://github.com/mikeal/request/commit/5eaee1ce4008ede1df15201622ac478c892d6a8a) Upgrade tough-cookie to 0.10.0 (@stash) +- [#763](https://github.com/mikeal/request/pull/763) Upgrade tough-cookie to 0.10.0 (@stash) +- [d2489d0](https://github.com/mikeal/request/commit/d2489d0e24d9a538224f5c8c090dcdeb1f8d4969) Fixed auth error for some servers like twisted. According to rfc 2617 auth scheme token should be case-insensitive. (@bobyrizov) +- [#764](https://github.com/mikeal/request/pull/764) Case-insensitive authentication scheme (@bobyrizov) +- [cbee3d0](https://github.com/mikeal/request/commit/cbee3d04ee9f704501a64edb7b9b6d201e98494b) Use tough-cookie CookieJar sync API (@stash) +- [3eeaf6a](https://github.com/mikeal/request/commit/3eeaf6a90df7b806d91ae1e8e2f56862ece2ea33) Emit error, not cookieError (@stash) +- [#767](https://github.com/mikeal/request/pull/767) Use tough-cookie CookieJar sync API (@stash) +- [9eac534](https://github.com/mikeal/request/commit/9eac534dd11e40bba65456491cb62ad68d8f41fa) 2.32.0 (@mikeal) + +### v2.31.1 (2014/01/08 02:57 +00:00) +- [b1b5e91](https://github.com/mikeal/request/commit/b1b5e9161e149574ba5528c401a70bfadef1a98a) 2.31.1 (@mikeal) + +### v2.31.0 (2014/01/08 02:57 +00:00) +- [dd2577f](https://github.com/mikeal/request/commit/dd2577f8264d4d4b07484dec7094b72c00c8416f) Removing s3 test. (@mikeal) +- [fef5bf3](https://github.com/mikeal/request/commit/fef5bf34258e3695b61c048c683f1d4a7f99b368) Fix callback arguments documentation (@mmalecki) +- [#736](https://github.com/mikeal/request/pull/736) Fix callback arguments documentation (@mmalecki) +- [5531c20](https://github.com/mikeal/request/commit/5531c208678145ef35b06e948190be2fd6a8a1c8) updating README example: cookie jar api changed cookie module changed to tough-cookie (@emkay) +- [#741](https://github.com/mikeal/request/pull/741) README example is using old cookie jar api (@emkay) +- [9d73e5a](https://github.com/mikeal/request/commit/9d73e5a277af141a6e4fa9dbcae5d0c3b755d277) add note about JSON output body type (@iansltx) +- [#742](https://github.com/mikeal/request/pull/742) Add note about JSON output body type (@iansltx) +- [41e20a4](https://github.com/mikeal/request/commit/41e20a4d288e30101e493b383a0e4852a3271a98) Use Cookie.parse (@lalitkapoor) +- [4d09556](https://github.com/mikeal/request/commit/4d095562a5c42ffb41b0ff194e9e6f32c0f44372) updating setCookie example to make it clear that the callback is required (@emkay) +- [#745](https://github.com/mikeal/request/pull/745) updating setCookie example to make it clear that the callback is required (@emkay) +- [b7ede1d](https://github.com/mikeal/request/commit/b7ede1d56f9a2764e4bf764687b81419df817e5a) README: Markdown code highlight (@weakish) +- [#746](https://github.com/mikeal/request/pull/746) README: Markdown code highlight (@weakish) +- [#645](https://github.com/mikeal/request/pull/645) update twitter api url to v1.1 (@mick) +- [20dcd18](https://github.com/mikeal/request/commit/20dcd18ce8e3397ba7e0213da9c760b048ca5b49) require aws-sign2 (@mafintosh) +- [df2c426](https://github.com/mikeal/request/commit/df2c4264321c3db1387ddf9a945d63b9ae7d57b8) 2.31.0 (@mikeal) + +### v2.30.1 (2013/12/13 19:17 +00:00) +- [eba2d40](https://github.com/mikeal/request/commit/eba2d402fcdcf1ac878de8672b1c9f5da856dcc1) 2.30.1 (@mikeal) + +### v2.30.0 (2013/12/13 19:17 +00:00) +- [aee3819](https://github.com/mikeal/request/commit/aee38191557574ef570fd9c764af0af7072cc92a) Fix TypeError when calling request.cookie +- [#728](https://github.com/mikeal/request/pull/728) Fix TypeError when calling request.cookie (@scarletmeow) +- [628ef76](https://github.com/mikeal/request/commit/628ef768b1f52710b8eb4e14be4db69d174d1dcb) better DIGEST support (@dai-shi) +- [d919bc1](https://github.com/mikeal/request/commit/d919bc1ce97fa461c365437a0c739bbaa6b86de7) ignore null authValues (DIGEST) (@dai-shi) +- [75fc209](https://github.com/mikeal/request/commit/75fc209c5a9e6c647a04e42048c30f46c66fc103) DIGEST support: pass algoritm and opaque, add TODO items, test case for compatible mode (@dai-shi) +- [#730](https://github.com/mikeal/request/pull/730) better HTTP DIGEST support (@dai-shi) +- [937a24a](https://github.com/mikeal/request/commit/937a24a168a126f406ee8eb55eb78169ddc53497) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. +- [#732](https://github.com/mikeal/request/pull/732) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. (@Fritz-Lium) +- [f03be23](https://github.com/mikeal/request/commit/f03be2309bd85a89d2e3c208b2fb4be1a2b95c79) Make digest qop regex more robust (see #730) (@nylen) +- [c7d97ae](https://github.com/mikeal/request/commit/c7d97aefaebf773ce62c72e9ec656f0250b7a1e7) 2.30.0 (@mikeal) + +### v2.29.1 (2013/12/06 20:05 +00:00) +- [e0f2c41](https://github.com/mikeal/request/commit/e0f2c41bd4e15518e97dd2f4c134be51ed4cb68b) 2.29.1 (@mikeal) + +### v2.29.0 (2013/12/06 20:05 +00:00) +- [3c2cad1](https://github.com/mikeal/request/commit/3c2cad11301380f4056eb3ca4c0c124f7f7f72f5) make request.defaults(options, requester) run the requester for all methods (@jchris) +- [#727](https://github.com/mikeal/request/pull/727) fix requester bug (@jchris) +- [0c9f875](https://github.com/mikeal/request/commit/0c9f87542cd1f919751d3ed1f00208ce7705f8e7) 2.29.0 (@mikeal) + +### v2.28.1 (2013/12/04 19:42 +00:00) +- [3e6a300](https://github.com/mikeal/request/commit/3e6a300121586da81b871f759a9feec52810474a) 2.28.1 (@mikeal) + +### v2.28.0 (2013/12/04 19:42 +00:00) +- [ac26f43](https://github.com/mikeal/request/commit/ac26f43d9a8212289f92056d3029c207f755cef4) Update request.js (@wprl) +- [adc2cb6](https://github.com/mikeal/request/commit/adc2cb6721e5980e8ed667a3f558cce8c89ee6c2) Use random cnonce (@wprl) +- [ff16a9d](https://github.com/mikeal/request/commit/ff16a9daf93e01cecee7fabec64c3e1b423f7db5) Add test for random cnonce (@wprl) +- [df64c2b](https://github.com/mikeal/request/commit/df64c2bc8f691ecc6f6c214e2254bab439830b88) Restore whitespace (@wprl) +- [#630](https://github.com/mikeal/request/pull/630) Send random cnonce for HTTP Digest requests (@wprl) +- [aca5a16](https://github.com/mikeal/request/commit/aca5a169c44cc658e8310691a2ae1cfc4c2b0958) update twitter api url to v1.1 (@mick) +- [abcbadd](https://github.com/mikeal/request/commit/abcbadd1b2a113c34a37b62d36ddcfd74452850e) Test case for #304. (@diversario) +- [b8cf874](https://github.com/mikeal/request/commit/b8cf8743b66d8eee4048561a7d81659f053393c8) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) +- [e6c7d1f](https://github.com/mikeal/request/commit/e6c7d1f6d23922480c09427d5f54f84eec60b7af) quiet, but check that stderr output has something reasonable for debug (@jrgm) +- [#659](https://github.com/mikeal/request/pull/659) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm) +- [23164e4](https://github.com/mikeal/request/commit/23164e4f33bd0837d796037c3d0121db23653c34) option.tunnel to explicitly disable tunneling (@seanmonstar) +- [#662](https://github.com/mikeal/request/pull/662) option.tunnel to explicitly disable tunneling (@seanmonstar) +- [#656](https://github.com/mikeal/request/pull/656) Test case for #304. (@diversario) +- [da16120](https://github.com/mikeal/request/commit/da16120a8f0751b305a341c012dbdcfd62e83585) Change `secureOptions' to `secureProtocol' for HTTPS request (@richarddong) +- [43d9d0a](https://github.com/mikeal/request/commit/43d9d0a76974d2c61681ddee04479d514ebfa320) add `ciphers' and `secureProtocol' to `options' in `getAgent' (@richarddong) +- [#666](https://github.com/mikeal/request/pull/666) make `ciphers` and `secureProtocol` to work in https request (@richarddong) +- [524e035](https://github.com/mikeal/request/commit/524e0356b73240409a11989d369511419526b5ed) change cookie module (@sxyizhiren) +- [#674](https://github.com/mikeal/request/pull/674) change cookie module,to tough-cookie.please check it . (@sxyizhiren) +- [e8dbcc8](https://github.com/mikeal/request/commit/e8dbcc83d4eff3c14e03bd754174e2c5d45f2872) tests: Fixed test-timeout.js events unit test (@Turbo87) +- [aed1c71](https://github.com/mikeal/request/commit/aed1c71fac0047b66a236a990a5569445cfe995d) Added Travis CI configuration file (@Turbo87) +- [#683](https://github.com/mikeal/request/pull/683) Travis CI support (@Turbo87) +- [8bfa640](https://github.com/mikeal/request/commit/8bfa6403ce03cbd3f3de6b82388bfcc314e56c61) dependencies: Set `tough-cookie` as optional dependency (@Turbo87) +- [bcc138d](https://github.com/mikeal/request/commit/bcc138da67b7e1cf29dc7d264a73d8b1d1f4b0e4) dependencies: Set `form-data` as optional dependency (@Turbo87) +- [751ac28](https://github.com/mikeal/request/commit/751ac28b7f13bfeff2a0e920ca2926a005dcb6f0) dependencies: Set `tunnel-agent` as optional dependency (@Turbo87) +- [6d7c1c9](https://github.com/mikeal/request/commit/6d7c1c9d8e3a300ff6f2a93e7f3361799acf716b) dependencies: Set `http-signature` as optional dependency (@Turbo87) +- [733f1e3](https://github.com/mikeal/request/commit/733f1e3ae042a513a18cde1c6e444b18ee07ad66) Added .npmignore file (@Turbo87) +- [e2fc346](https://github.com/mikeal/request/commit/e2fc346b7e5e470fcd36189bcadf63c53feebb22) dependencies: Set `hawk` as optional dependency (@Turbo87) +- [e87d45f](https://github.com/mikeal/request/commit/e87d45fe89ea220035bf07696a70292763f7135f) dependencies: Set `aws-sign` as optional dependency (@Turbo87) +- [1cd81ba](https://github.com/mikeal/request/commit/1cd81ba30908b77cff2fa618aeb232fefaa53ada) lib: Added optional() function (@Turbo87) +- [28c2c38](https://github.com/mikeal/request/commit/28c2c3820feab0cc719df213a60838db019f3e1a) dependencies: Set `oauth-sign` as optional dependency (@Turbo87) +- [2ceddf7](https://github.com/mikeal/request/commit/2ceddf7e793feb99c5b6a76998efe238965b22cd) TravisCI: Test with and without optional dependencies (@Turbo87) +- [#682](https://github.com/mikeal/request/pull/682) Optional dependencies (@Turbo87) +- [2afab5b](https://github.com/mikeal/request/commit/2afab5b665a2e03becbc4a42ad481bb737405655) Handle blank password in basic auth. (@diversario) +- [cabe5a6](https://github.com/mikeal/request/commit/cabe5a62dc71282ce8725672184efe9d97ba79a5) Handle `auth.password` and `auth.username`. (@diversario) +- [#690](https://github.com/mikeal/request/pull/690) Handle blank password in basic auth. (@diversario) +- [33100c3](https://github.com/mikeal/request/commit/33100c3c7fa678f592374f7b2526fe9a0499b6f6) Typo (@VRMink) +- [#694](https://github.com/mikeal/request/pull/694) Typo in README (@ExxKA) +- [9072ff1](https://github.com/mikeal/request/commit/9072ff1556bcb002772838a94e1541585ef68f02) Edited README.md for formatting and clarity of phrasing (@Zearin) +- [#696](https://github.com/mikeal/request/pull/696) Edited README.md for formatting and clarity of phrasing (@Zearin) +- [07ee58d](https://github.com/mikeal/request/commit/07ee58d3a8145740ba34cc724f123518e4b3d1c3) Fixing listing in callback part of docs. (@lukasz-zak) +- [#710](https://github.com/mikeal/request/pull/710) Fixing listing in callback part of docs. (@lukasz-zak) +- [8ee21d0](https://github.com/mikeal/request/commit/8ee21d0dcc637090f98251eba22b9f4fd1602f0e) Request.multipart no longer crashes when header 'Content-type' is present (@pastaclub) +- [#715](https://github.com/mikeal/request/pull/715) Request.multipart no longer crashes when header 'Content-type' present (@pastaclub) +- [8b04ca6](https://github.com/mikeal/request/commit/8b04ca6ad8d025c275e40b806a69112ac53bd416) doc: Removed use of gendered pronouns (@oztu) +- [#719](https://github.com/mikeal/request/pull/719) Made a comment gender neutral. (@oztu) +- [8795fc6](https://github.com/mikeal/request/commit/8795fc68cce26b9a45d10db9eaffd4bc943aca3a) README.md: add custom HTTP Headers example. (@tcort) +- [#724](https://github.com/mikeal/request/pull/724) README.md: add custom HTTP Headers example. (@tcort) +- [c5d5b1f](https://github.com/mikeal/request/commit/c5d5b1fcf348e768943fe632a9a313d704d35c65) Changing dep. (@mikeal) +- [bf04163](https://github.com/mikeal/request/commit/bf04163883fa9c62d4e1a9fdd64d6efd7723d5f8) 2.28.0 (@mikeal) + +### v2.27.1 (2013/08/15 21:30 +00:00) +- [a80a026](https://github.com/mikeal/request/commit/a80a026e362a9462d6948adc1b0d2831432147d2) 2.27.1 (@mikeal) + +### v2.27.0 (2013/08/15 21:30 +00:00) +- [3627b9c](https://github.com/mikeal/request/commit/3627b9cc7752cfe57ac609ed613509ff61017045) rename Request and remove .DS_Store (@joaojeronimo) +- [920f9b8](https://github.com/mikeal/request/commit/920f9b88f7dd8f8d153e72371b1bf2d16d5e4160) rename Request (@joaojeronimo) +- [c243cc6](https://github.com/mikeal/request/commit/c243cc66131216bb57bcc0fd79c250a7927ee424) for some reason it removed request.js (@joaojeronimo) +- [#619](https://github.com/mikeal/request/pull/619) decouple things a bit (@CrowdProcess) +- [ed4ecc5](https://github.com/mikeal/request/commit/ed4ecc5ae5cd1d9559a937e84638c9234244878b) Try normal stringify first, then fall back to safe stringify (@mikeal) +- [5642ff5](https://github.com/mikeal/request/commit/5642ff56e64c19e8183dcd5b6f9d07cca295a79e) 2.27.0 (@mikeal) + +### v2.26.1 (2013/08/07 16:31 +00:00) +- [b422510](https://github.com/mikeal/request/commit/b422510ba16315c3e0e1293a17f3a8fa7a653a77) 2.26.1 (@mikeal) + +### v2.26.0 (2013/08/07 16:31 +00:00) +- [3b5b62c](https://github.com/mikeal/request/commit/3b5b62cdd4f3b92e63a65d3a7265f5a85b11c4c9) Only include :password in Basic Auth if it's defined (fixes #602) (@bendrucker) +- [#605](https://github.com/mikeal/request/pull/605) Only include ":" + pass in Basic Auth if it's defined (fixes #602) (@bendrucker) +- [cce2c2c](https://github.com/mikeal/request/commit/cce2c2c8ea5b0136932b2432e4e25c0124d58d5a) Moved init of self.uri.pathname (@lexander) +- [08793ec](https://github.com/mikeal/request/commit/08793ec2f266ef88fbe6c947e6b334e04d4b9dc9) Fix all header casing issues forever. (@mikeal) +- [#613](https://github.com/mikeal/request/pull/613) Fixes #583, moved initialization of self.uri.pathname (@lexander) +- [f98ff99](https://github.com/mikeal/request/commit/f98ff990d294165498c9fbf79b2de12722e5c842) Update this old ass readme with some new HOTNESS! (@mikeal) +- [3312010](https://github.com/mikeal/request/commit/3312010f72d035f22b87a6d8d463f0d91b88fea1) markdown badge instead. (@mikeal) +- [9cf657c](https://github.com/mikeal/request/commit/9cf657c1f08bf460911b8bb0a8c5c0d3ae6135c7) Shorter title. (@mikeal) +- [2c61d66](https://github.com/mikeal/request/commit/2c61d66f1dc323bb612729c7320797b79b22034c) put Request out (@joaojeronimo) +- [28513a1](https://github.com/mikeal/request/commit/28513a1b371452699438c0eb73471f8969146264) 2.26.0 (@mikeal) + +### v2.25.1 (2013/07/23 21:51 +00:00) +- [6387b21](https://github.com/mikeal/request/commit/6387b21a9fb2e16ee4dd2ab73b757eca298587b5) 2.25.1 (@mikeal) + +### v2.25.0 (2013/07/23 21:51 +00:00) +- [828f12a](https://github.com/mikeal/request/commit/828f12a1ae0f187deee4d531b2eaf7531169aaf2) 2.25.0 (@mikeal) + +### v2.24.1 (2013/07/23 20:51 +00:00) +- [29ae1bc](https://github.com/mikeal/request/commit/29ae1bc454c03216beeea69d65b538ce4f61e8c1) 2.24.1 (@mikeal) + +### v2.24.0 (2013/07/23 20:51 +00:00) +- [f667318](https://github.com/mikeal/request/commit/f66731870d5f3e0e5655cd89612049b540c34714) Fixed a small typo (@michalstanko) +- [#601](https://github.com/mikeal/request/pull/601) Fixed a small typo (@michalstanko) +- [#594](https://github.com/mikeal/request/pull/594) Emit complete event when there is no callback (@RomainLK) +- [#596](https://github.com/mikeal/request/pull/596) Global agent is being used when pool is specified (@Cauldrath) +- [41ce492](https://github.com/mikeal/request/commit/41ce4926fb08242f19135fd3ae10b18991bc3ee0) New deps. (@mikeal) +- [8176c94](https://github.com/mikeal/request/commit/8176c94d5d17bd14ef4bfe459fbfe9cee5cbcc6f) 2.24.0 (@mikeal) + +### v2.23.1 (2013/07/23 02:45 +00:00) +- [63f31cb](https://github.com/mikeal/request/commit/63f31cb1d170a4af498fbdd7566f867423caf8e3) 2.23.1 (@mikeal) + +### v2.23.0 (2013/07/23 02:44 +00:00) +- [758f598](https://github.com/mikeal/request/commit/758f598de8d6024db3fa8ee7d0a1fc3e45c50f53) Initial commit. Request package. (@mikeal) +- [104cc94](https://github.com/mikeal/request/commit/104cc94839d4b71aaf3681142daefba7ace78c94) Removing unnecessary markup. (@mikeal) +- [12a4cb8](https://github.com/mikeal/request/commit/12a4cb88b949cb4a81d51189d432c25c08522a87) Matching node documentation style. (@mikeal) +- [ab96993](https://github.com/mikeal/request/commit/ab969931106b10b5f8658dc9e0f512c5dfc2a7da) Release tarball. (@mikeal) +- [e7e37ad](https://github.com/mikeal/request/commit/e7e37ad537081a040ea3e527aac23ae859b40b2c) Removing old tarball. (@mikeal) +- [e66e90d](https://github.com/mikeal/request/commit/e66e90dd814ae7bfbcd52003609d7bde9eafea57) Adding automatic redirect following. (@mikeal) +- [2fc5b84](https://github.com/mikeal/request/commit/2fc5b84832ae42f6ddb081b1909d0a6ca00c8d51) Adding SSL support. (@mikeal) +- [a3ac375](https://github.com/mikeal/request/commit/a3ac375d4b5800a038ae26233425fadc26866fbc) Fixing bug where callback fired for every redirect. (@mikeal) +- [1139efe](https://github.com/mikeal/request/commit/1139efedb5aad4a328c1d8ff45fe77839a69169f) Cleaning up tests. (@mikeal) +- [bb49fe6](https://github.com/mikeal/request/commit/bb49fe6709fa06257f4b7aadc2e450fd45a41328) Rolling version. (@mikeal) +- [4ff3493](https://github.com/mikeal/request/commit/4ff349371931ec837339aa9082c4ac7ddd4c7c35) Updates to README.md (@mikeal) +- [1c9cf71](https://github.com/mikeal/request/commit/1c9cf719c92b02ba85c4e47bd2b92a3303cbe1cf) Adding optional body buffer. (@mikeal) +- [49dfef4](https://github.com/mikeal/request/commit/49dfef42630c4fda6fb208534c00638dc0f06a6b) Rolling version. (@mikeal) +- [ab40cc8](https://github.com/mikeal/request/commit/ab40cc850652e325fcc3b0a44ee7303ae0a7b77f) Preserve the original full path. (@mikeal) +- [6d70f62](https://github.com/mikeal/request/commit/6d70f62c356f18098ca738b3dbedcf212ac3d8d8) Rolling version. (@mikeal) +- [e2ca15a](https://github.com/mikeal/request/commit/e2ca15a0f7e986e3063977ee9bd2eb69e86bdb1f) Fixing bugs and rolling version. (@mikeal) +- [8165254](https://github.com/mikeal/request/commit/81652543d3a09553cbf33095a7932dec53ccecc2) Cleanup. Fixing '' === '/' path bug. (@mikeal) +- [a0536a4](https://github.com/mikeal/request/commit/a0536a46d0b91e204fbde1e4341461bc827c9542) Rolling version. (@mikeal) +- [9ccaad7](https://github.com/mikeal/request/commit/9ccaad7dce05e5dcc3eacaf1500404622a0d8067) Adding stream support for request and response bodies. (@mikeal) +- [585166d](https://github.com/mikeal/request/commit/585166d979d4476e460e9835cc0516d04a9a3e11) Rolling version. (@mikeal) +- [41111c8](https://github.com/mikeal/request/commit/41111c88d711da80ea123df238d62038b89769bf) Bugfix release for response stream. (@mikeal) +- [86e375d](https://github.com/mikeal/request/commit/86e375d093700affe4d6d2b76a7acedbe8da140c) Remove host header when we add it. (@mikeal) +- [3a6277c](https://github.com/mikeal/request/commit/3a6277c81cfd3457c760f2aaea44852ef832a1e8) Rolling version. (@mikeal) +- [7a11f69](https://github.com/mikeal/request/commit/7a11f69d5353ecc1319e2e91ca4aefbaf0338136) writing requestBodyStream into request (@beanieboi) +- [186e9cf](https://github.com/mikeal/request/commit/186e9cf692511d768f8016d311609a0a0a315af6) Using sys.pump (@mikeal) +- [09e7ade](https://github.com/mikeal/request/commit/09e7ade541e1d40316a3f153128871a353e707b1) Fixing host port addition. Rolling version. (@mikeal) +- [cec3f3f](https://github.com/mikeal/request/commit/cec3f3f619322f27e2a82c7fd8971722f98d04d6) Using builtin base64. (@mikeal) +- [2a2e2a2](https://github.com/mikeal/request/commit/2a2e2a2f5c4760d4da3caa1a0f2d14c31a4222dc) new structure. new convenience methods (@mikeal) +- [f835b5f](https://github.com/mikeal/request/commit/f835b5fb605506b8ecd3c17bebe9ed54f0066cfc) removing old files. (@mikeal) +- [91616c4](https://github.com/mikeal/request/commit/91616c4e4f488f75a8b04b5b6f0ceef7e814cffd) Adding better redirect handling. (@mikeal) +- [3a95433](https://github.com/mikeal/request/commit/3a95433cbec9693a16ff365148489a058720ae7c) Fixing tests. (@mikeal) +- [38eb1d2](https://github.com/mikeal/request/commit/38eb1d2fa8dea582bb7c3fb37a7b05ff91857a46) By popular demand, proxy support! Not really tested yet but it seems to kinda work. (@mikeal) +- [45d41df](https://github.com/mikeal/request/commit/45d41dff63f36b25b3403e59c8b172b7aa9ed373) Added proxy auth. (@mikeal) +- [85e3d97](https://github.com/mikeal/request/commit/85e3d97e0dced39a3769c4e3f2707ba3aaab1eaa) Fixing for non-proxy case. (@mikeal) +- [f796da7](https://github.com/mikeal/request/commit/f796da74849d2b0732bd1bae1d2dcaf1243142c1) Fixing relative uri's for forwards. (@mikeal) +- [dead30e](https://github.com/mikeal/request/commit/dead30ebef9c3ff806b895e2bd32f52ba3988c69) Adding support for specifying an encoding for the response body. (@mikeal) +- [9433344](https://github.com/mikeal/request/commit/943334488dcc8e7f90727b86f9eb1bc502c33b4f) Removing debugging statement (@mikeal) +- [41efb7a](https://github.com/mikeal/request/commit/41efb7a7dcca3b47e97c23c6cdbd3e860d3bd82b) Error on maxRedirects exceeded. (@mikeal) +- [9549570](https://github.com/mikeal/request/commit/95495701fa4e99a3ab85acdab71ecdaabe0dbd45) Allow options.url, people do it all the time, might as well just support it. (@mikeal) +- [21a53c0](https://github.com/mikeal/request/commit/21a53c016edcc113e809219639807b46d29dba36) Pumping version. (@mikeal) +- [aca9782](https://github.com/mikeal/request/commit/aca9782285fe1d727570fe8d799561f45d49048e) Fixing byteLength !== string lenght issues. (@mikeal) +- [a77c296](https://github.com/mikeal/request/commit/a77c296431eda2a211f59bdb88654c4a64ed4ef3) Don't rely on automatic semicolon insertion (pretty please :) (@papandreou) +- [8b02f29](https://github.com/mikeal/request/commit/8b02f29c9019dd1d1dd291dd85889b26f592a137) Also set content-length when options.body is the empty string. (@papandreou) +- [023281c](https://github.com/mikeal/request/commit/023281ca9b4414a9bc0170c2b08aaf886a7a08f7) Simplified boolean logic. (@papandreou) +- [4f897fd](https://github.com/mikeal/request/commit/4f897fdd6c7c93bea73dbf34623f09af63bb1ed4) Simplified check for whether response.headers.location starts with "http:" or "https:". (@papandreou) +- [6d7db85](https://github.com/mikeal/request/commit/6d7db85cadf401dffdec07a4d66822207898c69e) Fixed double var declaration. (@papandreou) +- [97255cf](https://github.com/mikeal/request/commit/97255cfd2a4aa8f34d307e7cd96fe1c1f13cb26a) Process redirects as soon as the response arrives. Prevents the uninteresting redirect response from being pumped into responseBodyStream. (@papandreou) +- [b2af15f](https://github.com/mikeal/request/commit/b2af15f4fcbe1115cf8b53c5ae89fbf2365bfffc) New feature: If options.noBuffer is true, don't buffer up the response, just return it. Most of the time getting a readable stream is much more flexible than having the option to pipe the response into a writable stream. For one thing, the stream can be paused. (@papandreou) +- [fee5f89](https://github.com/mikeal/request/commit/fee5f89159a8f36b25df509c55093bf7ebd1c993) A few fixes/changes from papandreou's code, also added new semantics for onResponse. (@mikeal) +- [fa72fcb](https://github.com/mikeal/request/commit/fa72fcb950029b222f0621e2d49304e35d08c380) Updated documentation. (@mikeal) +- [4fc7209](https://github.com/mikeal/request/commit/4fc72098e7eeb9518951b9306115340ffdcce7ce) Fix for both onResponse and callback (@mikeal) +- [3153436](https://github.com/mikeal/request/commit/3153436404fca865a65649d46eb22d9797128c9d) Adding license information. (@mikeal) +- [59570de](https://github.com/mikeal/request/commit/59570dec37913c7e530303a83f03781d9aca958c) Fix for unescaping passwords for basic auth. (@notmatt) +- [0d771ab](https://github.com/mikeal/request/commit/0d771ab7882b97d776179972c51c59386f91b953) require querystring (@notmatt) +- [875f79b](https://github.com/mikeal/request/commit/875f79b6a40340457fafafdadac813cfa5343689) Allow request's body to be an object. (@Stanley) +- [86895b9](https://github.com/mikeal/request/commit/86895b9c37f7b412b7df963c2a75361ff402d8c5) Merge branch 'master' of github.com:Stanley/request (@Stanley) +- [4c9c984](https://github.com/mikeal/request/commit/4c9c984cb37bfd4e901ce24b0e9b283604c27bf4) Better tests. (@mikeal) +- [02f6b38](https://github.com/mikeal/request/commit/02f6b38c1697a55ed43940d1fd0bef6225d4faa2) Added specs for body option (@Stanley) +- [af66607](https://github.com/mikeal/request/commit/af666072a22b8df4d75fe71885139059f56ea5ee) Made specs pass (@Stanley) +- [641ec05](https://github.com/mikeal/request/commit/641ec052dd95797816e781b2c3ac2524841db7cb) Merge branch 'master' of https://github.com/Stanley/request into jsonbody (@mikeal) +- [ab4c96b](https://github.com/mikeal/request/commit/ab4c96be1c002c10806d967a4b266543f8b0267c) Moved spec tests to normal node script tests. Style changes to code and docs. (@mikeal) +- [fc2a7ef](https://github.com/mikeal/request/commit/fc2a7ef301c1266938a5aeb539e4f3fc3b5191dd) Clearer wording for json option. (@mikeal) +- [01371d7](https://github.com/mikeal/request/commit/01371d728082e22aabeb840da82a30aec62d7d8a) Removing specs loader. (@mikeal) +- [560dadd](https://github.com/mikeal/request/commit/560dadd6cbd293622c66cd82b5506704c9850b13) Adding newline to end of test files, makes for cleaner diffs in the future. (@mikeal) +- [a0348dd](https://github.com/mikeal/request/commit/a0348dd0fef462c3c678a639619c27101c757035) Add pass message when tests finish. (@mikeal) +- [da77a0e](https://github.com/mikeal/request/commit/da77a0e152c1dd43f5c1e698110d23e4d32280db) Adding better debug message on failures for GET tests. (@mikeal) +- [6aade82](https://github.com/mikeal/request/commit/6aade822a90724a47176771d137e30b0a702e7ef) throw on error. (@mikeal) +- [4f41b8d](https://github.com/mikeal/request/commit/4f41b8dbbf9a93c53d5ccdf483c9d7803e279916) Rolling version. (@mikeal) +- [7cf01f0](https://github.com/mikeal/request/commit/7cf01f0481afb367b5d0d4878645ac535cfe9a2e) master is moving to node v0.3.6+ (@mikeal) +- [cb403a4](https://github.com/mikeal/request/commit/cb403a4cfdbe3d98feb9151fdbdae1e1436e59ab) Initial support for 0.3.6+.\n\nExperimental support for Request objects as streams. It's untested and requires a pending patch to node.js (@mikeal) +- [a3c80f9](https://github.com/mikeal/request/commit/a3c80f98f42f25d4cb02d5d9e34ba0e67cc89293) Adding defaults call. (@mikeal) +- [55f22f9](https://github.com/mikeal/request/commit/55f22f96365c57aa8687de951e3f9ed982eba408) Request will keep it's own agent pool so that it can expose a maxSockets setting for easy pool sizing. (@mikeal) +- [004741c](https://github.com/mikeal/request/commit/004741c23dc0eaf61f111161bb913ba418e033e4) Fixing reference error. (@mikeal) +- [8548541](https://github.com/mikeal/request/commit/85485414150fbac58b08126b3684f81dcb930bf1) Simplified pool implementation. (@mikeal) +- [9121c47](https://github.com/mikeal/request/commit/9121c47e4cbe47bccc20a75e0e6c6c098dce04fb) Default to globalPool. (@mikeal) +- [9ec3490](https://github.com/mikeal/request/commit/9ec3490aefd52f05b57e6db13730ace54b4439d1) Support for https. Requires pending patch in node core for consistent Agent API. (@mikeal) +- [146b154](https://github.com/mikeal/request/commit/146b154a1a31ae7a30aa9f28e891e4824af548fa) Fixes for reference errors. (@mikeal) +- [8756120](https://github.com/mikeal/request/commit/8756120f83ceb94f8ba600acba274ba512696eef) Only create an agent when a relevant option is passed. (@mikeal) +- [cc3cf03](https://github.com/mikeal/request/commit/cc3cf0322847982875ff32a7cef25c39c29630ba) New HTTP client doesn't require such explicit error listener management. (@mikeal) +- [f7c0379](https://github.com/mikeal/request/commit/f7c0379b99ac7989df7f934be67cc3ae979591bb) Fixing bug in .pipe() handling. Thanks tanepiper. (@mikeal) +- [897a7ef](https://github.com/mikeal/request/commit/897a7ef020cefcb7a36c04a11e286238df8ecdaa) Fixes for streams, docs, and convenience methods. (@mikeal) +- [7c2899a](https://github.com/mikeal/request/commit/7c2899a046b750eda495b23b2d58604260deddbc) Doc fixes. (@mikeal) +- [f535fe1](https://github.com/mikeal/request/commit/f535fe1008c8f11bb37e16f95fe287ed93343704) Doc fixes. (@mikeal) +- [d1deb5b](https://github.com/mikeal/request/commit/d1deb5b4dda4474fe9d480ad42ace664d89e73ee) Pipe tests, all passing! (@mikeal) +- [d67a041](https://github.com/mikeal/request/commit/d67a041783df8d724662d82f9fb792db1be3f4f0) Moving basic example to the top. (@mikeal) +- [6a98b9e](https://github.com/mikeal/request/commit/6a98b9e4a561b516b14d325c48785a9d6f40c514) Do not mix encoding option with pipeing. (@mikeal) +- [06b67ef](https://github.com/mikeal/request/commit/06b67ef01f73572a6a9b586854d4c21be427bdb2) Disable pooling with {pool:false} (@mikeal) +- [1c24881](https://github.com/mikeal/request/commit/1c248815b5dfffda43541e367bd4d66955ca0325) Send all arguments passed to stream methods. (@mikeal) +- [7946393](https://github.com/mikeal/request/commit/7946393893e75df24b390b7ab19eb5b9d6c23891) Better errors and warnings for different pipe conditions. (@mikeal) +- [ee2108d](https://github.com/mikeal/request/commit/ee2108db592113a0fe3840c361277fdd89f0c89c) Removing commented out legacy code. (@mikeal) +- [5f838b3](https://github.com/mikeal/request/commit/5f838b3582eda465f366d7df89c6dd69920405f2) Fixing redirect issue, thanks @linus (@mikeal) +- [c08758e](https://github.com/mikeal/request/commit/c08758e25290ee12278b3eb95d502645e0d66e4e) Adding del alias, thanks tanepiper. (@mikeal) +- [0b7d675](https://github.com/mikeal/request/commit/0b7d6756c120ebf17ce6c70fc1ff4ecd6850e704) Keep require('https') from throwing if node is compiled with --without-ssl. This will still throw for Invalid Protocol if https is used. Which makes more sense and makes request work without SSl support. (@davglass) +- [02fc9f7](https://github.com/mikeal/request/commit/02fc9f7cc8912402a5a98ddefaffa5f6da870562) Rolling version. Pushed new version to npm. (@mikeal) +- [0b30532](https://github.com/mikeal/request/commit/0b30532ee1a3cabb177017acfa7885b157031df2) Sent a patch today to fix this in core but this hack will fix node that predates that fix to core. (@mikeal) +- [5d5d8f4](https://github.com/mikeal/request/commit/5d5d8f43156b04fd3ceb312cfdf47cc2b0c4104d) Rolling version. Pushed new version to npm. (@mikeal) +- [1c00080](https://github.com/mikeal/request/commit/1c000809f1795d2e21635a626cf730aba2049d3e) Fixing reference to tls. (@mikeal) +- [4c355d1](https://github.com/mikeal/request/commit/4c355d1f87fced167e4b21770bfe6f8208f32b53) Be a better stream. (@mikeal) +- [9bed22f](https://github.com/mikeal/request/commit/9bed22f22e007201d4faeebdb486603c3bb088c3) Rolled version and pushed to npm (@mikeal) +- [34df8e2](https://github.com/mikeal/request/commit/34df8e2301dcfd10705b9ff3b257741b0816c8a1) typo in `request.defaults` (@clement) +- [4d7a6d4](https://github.com/mikeal/request/commit/4d7a6d46fa481e43fe873b8c8fad2f7dd816dbb5) default value only if undefined in `request.defaults` + misplaced `return` statement (@clement) +- [243a565](https://github.com/mikeal/request/commit/243a56563f1014318a467e46113b2c61b485f377) Adding support for request(url) (@mikeal) +- [83a9cec](https://github.com/mikeal/request/commit/83a9cec3cb2f7a43a1e10c13da8d0dd72b937965) Fixing case where + is in user or password. (@mikeal) +- [8bb7f98](https://github.com/mikeal/request/commit/8bb7f98ba8b78c217552c979811c07f1299318fe) making Request a duplex stream rather than adding special handling for pipes out. (@mikeal) +- [55a1fde](https://github.com/mikeal/request/commit/55a1fdedcad1e291502ce10010dda7e478a1b503) pause and resume should act on response instead of request (@tobowers) +- [63125a3](https://github.com/mikeal/request/commit/63125a33523e72e449ceef76da57b63522998282) Making request really smart about pipeing to itself so that we can do simple proxy cats (@mikeal) +- [2f9e257](https://github.com/mikeal/request/commit/2f9e257bc39eb329eec660c6d675fb40172fc5a5) Rolling version since master right now has some pretty hot new code in it. (@mikeal) +- [#31](https://github.com/mikeal/request/pull/31) Error on piping a request to a destination (@tobowers) +- [b1f3d54](https://github.com/mikeal/request/commit/b1f3d5439d24b848b2bf3a6459eea74cb0e43df3) The "end" event that was supposed to be emitted to fix a core bug in NodeJS wasn't fired because it wasn't emitted on the response object. (@voxpelli) +- [#35](https://github.com/mikeal/request/pull/35) The "end" event isn't emitted for some responses (@voxpelli) +- [40b1c67](https://github.com/mikeal/request/commit/40b1c676e1d3a292719ad2dd9cf9354c101bad47) Rolling version. (@mikeal) +- [9a28022](https://github.com/mikeal/request/commit/9a28022d0e438d0028e61a53e897689470025e50) Fixing bug in forwarding with new pipes logic. (@mikeal) +- [44e4e56](https://github.com/mikeal/request/commit/44e4e5605b0a9e02036393bcbd3a8d91280f5611) Fixing big bug in forwarding logic. (@mikeal) +- [b0cff72](https://github.com/mikeal/request/commit/b0cff72d63689d96e0b1d49a8a5aef9ccc71cb8b) Added timeout option to abort the request before the response starts responding (@mbrevoort) +- [cc76b10](https://github.com/mikeal/request/commit/cc76b109590437bfae54116e3424b2c6e44a3b3e) corrected spelling error in README (@mbrevoort) +- [#45](https://github.com/mikeal/request/pull/45) Added timeout option (@mbrevoort) +- [1cca56b](https://github.com/mikeal/request/commit/1cca56b29bb670c53d5995e76c0b075a747b5ad7) Fixing for node http client refactor. (@mikeal) +- [2a78aa3](https://github.com/mikeal/request/commit/2a78aa3f827e76c548e001fa519448b24466b518) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [ce12273](https://github.com/mikeal/request/commit/ce12273d3990c1446d3166bbd9e35c0e2435f137) New fs.ReadStream handling hotness. (@mikeal) +- [535e30a](https://github.com/mikeal/request/commit/535e30a4bd4a8e41d97ffa6a4e99630ac09a4bcb) Adding pipe support to HTTP ServerResponse objects. (@mikeal) +- [2f0cf6b](https://github.com/mikeal/request/commit/2f0cf6bf44edbaec4c0a0cb15a679302de7f0aff) Setting proper statusCode. (@mikeal) +- [6e3ecb1](https://github.com/mikeal/request/commit/6e3ecb106c3a32101d80ac0f87968fddd3ac5e2c) Adding test for pipeing file to disc. (@mikeal) +- [bbbb52e](https://github.com/mikeal/request/commit/bbbb52e406b65100b557caa3687a1aa04fab6ff3) Pumping version. (@mikeal) +- [a10b6e4](https://github.com/mikeal/request/commit/a10b6e4c08478364b8079801fdb23f3530fcc85f) Adding reference to Request instance on response to make it easier on inline callbacks. fixes #43. (@mikeal) +- [b9aff1f](https://github.com/mikeal/request/commit/b9aff1fe007dab3f93e666f047fa03a4e8f5f8b7) Add body property to resp when we have it as a shorthand. fixes #28 (@mikeal) +- [411b30d](https://github.com/mikeal/request/commit/411b30dab1fe5b20880113aa801a2fdbb7c35c40) If the error is handled and not throw we would still process redirects. Fixes #34. (@mikeal) +- [8f3c2b4](https://github.com/mikeal/request/commit/8f3c2b4f6dee8838f30e2430a23d5071128148f0) w00t! request 2.0 (@mikeal) +- [9957542](https://github.com/mikeal/request/commit/9957542cc6928443f3a7769510673665b5a90040) valid semver. (@mikeal) +- [31f5ee2](https://github.com/mikeal/request/commit/31f5ee28726ac7e14355cad0c6d2785f9ca422c6) Drastically improved header handling. (@mikeal) +- [c99b8fc](https://github.com/mikeal/request/commit/c99b8fcd706ae035f6248669b017ac2995e45f31) Return destination stream from pipe(). (@mikeal) +- [cba588c](https://github.com/mikeal/request/commit/cba588cec1e204d70f40f8bd11df0e27dc78ef0c) Style fixes. Bye Bye semi-colons. Mostly lined up with npm style. (@mikeal) +- [8515a51](https://github.com/mikeal/request/commit/8515a510ccc0a661d7c28fce6e513a7d71be7f8f) Clearer spacing. Slightly more consistent. (@mikeal) +- [3acd82a](https://github.com/mikeal/request/commit/3acd82a10e7d973fc5dbaa574c2e8906e48e1ee9) add failing test for issue #51 (@benatkin) +- [68c17f6](https://github.com/mikeal/request/commit/68c17f6c9a3d7217368b3b8bc61203e6a14eb4f0) implement parsing json response when json is truthy (@benatkin) +- [1cb1ec1](https://github.com/mikeal/request/commit/1cb1ec114b03394a0a530f245a857d8424cad02d) allow empty string (@benatkin) +- [4f8d2df](https://github.com/mikeal/request/commit/4f8d2df9f845690667a56e7698dbaf23b5028177) support JSON APIs that don't set the write content type (@benatkin) +- [#53](https://github.com/mikeal/request/pull/53) Parse json: Issue #51 (@benatkin) +- [c63e6e9](https://github.com/mikeal/request/commit/c63e6e96378a2b050bddbe1b39337662f304dc95) Adding proxy to docs, don't know why this wasn't already in. (@mikeal) +- [ef767d1](https://github.com/mikeal/request/commit/ef767d12f13a9c78d3df89add7556f5421204843) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [1b12d3a](https://github.com/mikeal/request/commit/1b12d3a9f48a6142d75fa1790c80eb313388ca44) Emit a proper error. (@mikeal) +- [47314d7](https://github.com/mikeal/request/commit/47314d7cb41fe9c3a7717a502bed9cf1b6074ffc) Greatly expanded documentation. (@mikeal) +- [e477369](https://github.com/mikeal/request/commit/e477369b4bbc271248ee8b686c556567570a6cca) Doc refinements. (@mikeal) +- [fe4d221](https://github.com/mikeal/request/commit/fe4d22109bc1411c29b253756d609856327ff146) Fix for newer npm (@mikeal) +- [7b2f788](https://github.com/mikeal/request/commit/7b2f788293e205edc7b46a7fd5304296b5e800e3) More doc cleanup. (@mikeal) +- [f8eb2e2](https://github.com/mikeal/request/commit/f8eb2e229aca38547236d48066a0b3f9f8f67638) Copy headers so that they survive mutation. (@mikeal) +- [59eab0e](https://github.com/mikeal/request/commit/59eab0e5e49c6d32697822f712ed725843e70010) Rolling version. (@mikeal) +- [76bf5f6](https://github.com/mikeal/request/commit/76bf5f6c6e37f6cb972b3d4f1ac495a4ceaaa00d) Improvements to json handling and defaults. (@mikeal) +- [81e2c40](https://github.com/mikeal/request/commit/81e2c4040a9911a242148e1d4a482ac6c745d8eb) Rolling version. (@mikeal) +- [76d8924](https://github.com/mikeal/request/commit/76d8924cab295f80518a71d5903f1e815618414f) Proper checking and handling of json bodies (@mikeal) +- [a8422a8](https://github.com/mikeal/request/commit/a8422a80895ed70e3871c7826a51933a75c51b69) Rolling version. (@mikeal) +- [f236376](https://github.com/mikeal/request/commit/f2363760782c3d532900a86d383c34f3c94f6d5f) Adding pipefilter. (@mikeal) +- [dd85f8d](https://github.com/mikeal/request/commit/dd85f8da969c2cc1825a7dfec6eac430de36440c) Rolling version. (@mikeal) +- [#66](https://github.com/mikeal/request/pull/66) Do not overwrite established content-type headers for read stream deliver (@voodootikigod) +- [b09212f](https://github.com/mikeal/request/commit/b09212f38fe736c2c92a1ee076cae9d0f4c612c3) Do not overwrite established content-type headers for read stream deliveries. (@voodootikigod) +- [01bc25d](https://github.com/mikeal/request/commit/01bc25d25343d73e9f5731b3d0df1cf5923398d4) Only apply workaround on pre-0.5 node.js and move test to assert.equal (@mikeal) +- [d487131](https://github.com/mikeal/request/commit/d487131ebc2f7a4bf265061845f7f3ea2fd3ed34) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [1200df5](https://github.com/mikeal/request/commit/1200df52bd334f9a44a43846159146b8f938fd9e) Rolling version. (@mikeal) +- [8279362](https://github.com/mikeal/request/commit/82793626f6965884a3720d66f5a276d7d4d30873) fix global var leaks (@aheckmann) +- [#67](https://github.com/mikeal/request/pull/67) fixed global variable leaks (@aheckmann) +- [ab91204](https://github.com/mikeal/request/commit/ab9120495a89536c7152e3cdf17d684323b40474) Test that chunked responses are properly toString'ed (@isaacs) +- [9bff39f](https://github.com/mikeal/request/commit/9bff39fa485f28d7f1754e72f026418ca1186783) Properly flatten chunked responses (@isaacs) +- [8e4e956](https://github.com/mikeal/request/commit/8e4e95654391c71c22933ffd422fdc82d20ac059) Fix #52 Make the tests runnable with npm (@isaacs) +- [a9aa9d6](https://github.com/mikeal/request/commit/a9aa9d6d50ef0481553da3e50e40e723a58de10a) Fix #71 Respect the strictSSL flag (@isaacs) +- [#69](https://github.com/mikeal/request/pull/69) Flatten chunked requests properly (@isaacs) +- [#73](https://github.com/mikeal/request/pull/73) Fix #71 Respect the strictSSL flag (@isaacs) +- [#70](https://github.com/mikeal/request/pull/70) add test script to package.json (@isaacs) +- [08ca561](https://github.com/mikeal/request/commit/08ca5617e0d8bcadee98f10f94a49cbf2dd02862) Fixing case where encoding is set. Also cleaning up trailing whitespace because my editor likes to do that now. (@mikeal) +- [0be269f](https://github.com/mikeal/request/commit/0be269f7d9da6c3a14a59d5579546fee9d038960) Fixing case where no body exists. (@mikeal) +- [2f37bbc](https://github.com/mikeal/request/commit/2f37bbc51ff84c3c28ae419138a19bd33a9f0103) Fixing timeout tests. (@mikeal) +- [f551a2f](https://github.com/mikeal/request/commit/f551a2f02a87994249c2fd37dc8f20a29e8bf529) Fixing legacy naming of self as options. (@mikeal) +- [717789e](https://github.com/mikeal/request/commit/717789ec9f690e9d5216ce1c27688eef822940cc) Avoid duplicate emit when using a timeout (@Marsup) +- [#76](https://github.com/mikeal/request/pull/76) Bug when a request fails and a timeout is set (@Marsup) +- [c1d255e](https://github.com/mikeal/request/commit/c1d255e5bcc5791ab69809913fe6d917ab93c8b7) global leakage in request.defaults (@isaacs) +- [14070f2](https://github.com/mikeal/request/commit/14070f269c79cae6ef9e7f7a415867150599bb8e) Don't require SSL for non-SSL requests (@isaacs) +- [4b8f696](https://github.com/mikeal/request/commit/4b8f6965e14c6fb704cf16f5bc011e4787cf32b2) Set proxy auth instead of just setting auth a second time (@isaacs) +- [cd22fbd](https://github.com/mikeal/request/commit/cd22fbdb00b90c5c75187ecf41373cfbb4af5bcd) Merge branch 'proxy-auth-bug' (@isaacs) +- [#78](https://github.com/mikeal/request/pull/78) Don't try to do strictSSL for non-ssl connections (@isaacs) +- [d8c53fc](https://github.com/mikeal/request/commit/d8c53fceca3af385753880395c680f6ec3d4d560) Removing legacy call to sys.puts (@mikeal) +- [731b32b](https://github.com/mikeal/request/commit/731b32b654bb217de3466b8d149ce480988bb24b) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [9c897df](https://github.com/mikeal/request/commit/9c897dffc7e238f10eb7e14c61978d6821c70f56) Enhance redirect handling: (1) response._redirectsFollowed reports the total number of redirects followed instead of being reset to 0; (2) add response.redirects, an array of the response.statusCode and response.headers.location for each redirect. (@danmactough) +- [#81](https://github.com/mikeal/request/pull/81) Enhance redirect handling (@danmactough) +- [4c84001](https://github.com/mikeal/request/commit/4c8400103ec18a0729e29e9ffb17dda65ce02f6d) Document strictSSL option (@isaacs) +- [d517ac0](https://github.com/mikeal/request/commit/d517ac03278b3ebd9a46ca9f263bea68d655822b) allow passing in buffers as multipart bodies (@kkaefer) +- [6563865](https://github.com/mikeal/request/commit/6563865b80573ad3c68834a6633aff6d322b59d5) bugs[web] should be bugs[url] (@isaacs) +- [2625854](https://github.com/mikeal/request/commit/262585480c148c56772dfc8386cfc59d5d262ca0) add option followAllRedirects to follow post/put redirects +- [bc057af](https://github.com/mikeal/request/commit/bc057affb58272d9152766956e5cde4ea51ca043) fix typo, force redirects to always use GET +- [d68b434](https://github.com/mikeal/request/commit/d68b434693dbf848dff4c570c4249a35329cc24f) Support node 0.5.11-style url parsing (@isaacs) +- [#96](https://github.com/mikeal/request/pull/96) Authless parsed url host support (@isaacs) +- [9f66c6d](https://github.com/mikeal/request/commit/9f66c6d79bc6515d870b906df39bd9d6d9164994) Typo, causing 'TypeError: Cannot read property 'length' of undefined' (@isaacs) +- [#97](https://github.com/mikeal/request/pull/97) Typo in previous pull causes TypeError in non-0.5.11 versions (@isaacs) +- [b320e05](https://github.com/mikeal/request/commit/b320e05f2d84510f47a6b6857d091c8cd4d3ae2e) When no request body is being sent set 'content-length':0. fixes #89 (@mikeal) +- [059916c](https://github.com/mikeal/request/commit/059916c545a0faa953cb8ac66b8c3ae243b1c8ce) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [248e9d6](https://github.com/mikeal/request/commit/248e9d65e73ac868948a82d07feaf33387723a1d) Fix for pipe() after response. Added response event, fixed and updated tests, removed deprecated stream objects. (@mikeal) +- [a2e5d6e](https://github.com/mikeal/request/commit/a2e5d6e30d3e101f8c5a034ef0401fdde8608ccf) Fixing double callback firing. node 0.5 is much better about calling errors on the client object which, when aborting on timeout, predictable emits an error which then triggers a double callback. (@mikeal) +- [5f80577](https://github.com/mikeal/request/commit/5f805775e6aeaaf229cc781439b29108fb69f373) Release for 0.6 (@mikeal) +- [bf906de](https://github.com/mikeal/request/commit/bf906de601121b52c433b0af208550f1db892cde) Adding some oauth support, tested with Twitter. (@mikeal) +- [8869b2e](https://github.com/mikeal/request/commit/8869b2e88cc305e224556c5ca75b7b59311911d9) Removing irrelevant comments. (@mikeal) +- [8323eed](https://github.com/mikeal/request/commit/8323eed4915bb73b33544bc276f3840c13969134) Closed issue 82 : handling cookies - added tests too +- [739f841](https://github.com/mikeal/request/commit/739f84166d619778ab96fd0b0f4f1f43e8b0fdda) Closed issue 82 : handling cookies - added tests too +- [7daf841](https://github.com/mikeal/request/commit/7daf8415fb1a4e707ec54eb413169e49d8bbe521) Closed issue 82 : handling cookies - added tests too +- [6c22041](https://github.com/mikeal/request/commit/6c22041a4719bf081c827dda8f35e7b79b4c39d9) changed README +- [3db7f7d](https://github.com/mikeal/request/commit/3db7f7d38e95406b84f06fed52b69038b0250904) Updated README +- [6181b7a](https://github.com/mikeal/request/commit/6181b7a8a4be75bcf75cd3ff6dacb8e910737e92) Documented request.cookie() and request.jar() +- [fc44260](https://github.com/mikeal/request/commit/fc44260d13f0094bfe96d18878a11c6fe88b69e5) Tiny cookie example error on README +- [366831b](https://github.com/mikeal/request/commit/366831b705b5d5ebfbec5f63b4b140cbafcb4515) Remove instanceof check for CookieJar (mikeal suggestion) +- [88488cf](https://github.com/mikeal/request/commit/88488cf076efbd916b0326e0981e280c993963a7) Also add cookie to the user defined cookie jar (mikeal's suggestion) +- [f6fef5b](https://github.com/mikeal/request/commit/f6fef5bfa4ba8e1dfa3022df8991716e5cba7264) Updated cookie documentation in README file +- [b519044](https://github.com/mikeal/request/commit/b5190441a889164dfeb4148fac643fd7a87cfb51) request.defaults({jar: false}) disables cookies && also updated README +- [856a65c](https://github.com/mikeal/request/commit/856a65cd28402efbe3831a68d73937564a27ea9b) Update jar documentation in the options also +- [#102](https://github.com/mikeal/request/pull/102) Implemented cookies - closes issue 82: https://github.com/mikeal/request/issues/82 (@alessioalex) +- [62592e7](https://github.com/mikeal/request/commit/62592e7fe9ee5ecaee80b8f5bc2400e4a277e694) Cookie bugs (@janjongboom) +- [a06ad2f](https://github.com/mikeal/request/commit/a06ad2f955270974409e75c088e1f5d1f5298ff5) Follow redirects should work on PUT and POST requests as well. This is more consistent to other frameworks, e.g. .NET (@janjongboom) +- [bf3f5d3](https://github.com/mikeal/request/commit/bf3f5d30fdabf6946096623fc3398bb66ed19a1f) Cookies shouldn't be discarded when followRedirect = true (@janjongboom) +- [16db85c](https://github.com/mikeal/request/commit/16db85c07e6c2516269299640fdddca6db7bc051) Revert "Follow redirects should work on PUT and POST requests as well. This is more consistent to other frameworks, e.g. .NET" (@janjongboom) +- [841664e](https://github.com/mikeal/request/commit/841664e309f329be98c1a011c634f5291af1eebc) Add test for proxy option (@dominictarr) +- [#105](https://github.com/mikeal/request/pull/105) added test for proxy option. (@dominictarr) +- [50d2d39](https://github.com/mikeal/request/commit/50d2d3934cd86d7142a4aab66017bb1ef82329cf) Fixing test, emitter matches on req.url so it needs the full url. (@mikeal) +- [668a291](https://github.com/mikeal/request/commit/668a291013380af305eba12b1d5c7a5376a74c76) Adding some documentation for OAuth signing support. (@mikeal) +- [04faa3b](https://github.com/mikeal/request/commit/04faa3bf2b1f4ec710414c6ec7231b24767b2f89) Minor improvements in example (@mikeal) +- [0fddc17](https://github.com/mikeal/request/commit/0fddc1798dcd9b213e3f8aec504c61cecf4d7997) Another small fix to the url in the docs. (@mikeal) +- [337649a](https://github.com/mikeal/request/commit/337649a08b4263c0d108cd4621475c8ff9cf8dd0) Add oauth to options. (@mikeal) +- [#86](https://github.com/mikeal/request/pull/86) Can't post binary to multipart requests (@developmentseed) +- [4e4d428](https://github.com/mikeal/request/commit/4e4d4285490be20abf89ff1fb54fb5088c01c00e) Update to Iris Couch URL (@jhs) +- [#110](https://github.com/mikeal/request/pull/110) Update to Iris Couch URL (@iriscouch) +- [d7af099](https://github.com/mikeal/request/commit/d7af0994b382466367f2cafc5376150e661eeb9d) Remove the global `i` as it's causing my test suites to fail with leak detection turned on. (@3rd-Eden) +- [#117](https://github.com/mikeal/request/pull/117) Remove the global `i` (@3rd-Eden) +- [b2a4ad1](https://github.com/mikeal/request/commit/b2a4ad1e7d7553230e932ea093d7f77f38147ef9) Force all cookie keys into lower case as suggested by LinusU (@jhurliman) +- [055a726](https://github.com/mikeal/request/commit/055a7268b40425643d23bd6a4f09c7268dbab680) Applying a modified version of pull request #106 as suggested by janjongboom (@jhurliman) +- [#121](https://github.com/mikeal/request/pull/121) Another patch for cookie handling regression (@jhurliman) +- [a353f4e](https://github.com/mikeal/request/commit/a353f4eeb312ea378d34b624f5c4df33eefa152c) Merge remote-tracking branch 'upstream/master' (@janjongboom) +- [#104](https://github.com/mikeal/request/pull/104) Cookie handling contains bugs (@janjongboom) +- [a3be5ad](https://github.com/mikeal/request/commit/a3be5ad5ea112422ed00da632530b93bcf54727c) Fix encoding of characters like ( (@mikeal) +- [dd2067b](https://github.com/mikeal/request/commit/dd2067bbbf77d1132c9ed480848645136b8a5521) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [ddc4e45](https://github.com/mikeal/request/commit/ddc4e453c3b9a0e11da4df156c5e15206abfc1ef) Pushed new version to npm (@mikeal) +- [feee5eb](https://github.com/mikeal/request/commit/feee5ebd2ca8c09db25b5cb13cd951f7c4322a49) Real fix for encoding issues in javascript and oauth. (@mikeal) +- [23896cd](https://github.com/mikeal/request/commit/23896cdc66d75ec176876167ff21da72b7ff181b) Pushed new version to npm. (@mikeal) +- [a471ed2](https://github.com/mikeal/request/commit/a471ed2ca8acdca1010a0fc20434c5c9956b0d0c) HTTP redirect tests (@jhs) +- [a4a9aa1](https://github.com/mikeal/request/commit/a4a9aa199ff958630791e131092ec332ada00a49) A self-signed certificate for upcoming HTTPS testing (@jhs) +- [10ac6b9](https://github.com/mikeal/request/commit/10ac6b9db40263bec1bf63ee7e057000ffd2d7e9) HTTPS tests, for now a copy of the test-body tests (@jhs) +- [105aed1](https://github.com/mikeal/request/commit/105aed1ff99add1957f91df7efabf406e262f463) Support an "httpModules" object for custom http/https module behavior (@jhs) +- [#112](https://github.com/mikeal/request/pull/112) Support using a custom http-like module (@iriscouch) +- [d05a875](https://github.com/mikeal/request/commit/d05a8753af576fc1adccc7ffe9633690371c05ee) Test for #129 (@mikeal) +- [06cdfaa](https://github.com/mikeal/request/commit/06cdfaa3c29233dac3f47e156f2b5b3a0f0ae4b8) return body as buffer when encoding is null +- [#132](https://github.com/mikeal/request/pull/132) return the body as a Buffer when encoding is set to null (@jahewson) +- [4882e51](https://github.com/mikeal/request/commit/4882e519ed6b8d08795da5de37166148ce0ee440) fixed cookies parsing, updated tests (@afanasy) +- [2be228e](https://github.com/mikeal/request/commit/2be228ec8b48a60028bd1d80c8cbebf23964f913) Change `host` to `hostname` in request hash +- [#135](https://github.com/mikeal/request/pull/135) host vs hostname (@iangreenleaf) +- [e24abc5](https://github.com/mikeal/request/commit/e24abc5cc2c6fa154ae04fe58a16d135eeba4951) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [c99c809](https://github.com/mikeal/request/commit/c99c809bb48b9c0193aae3789c5c844f7f6cbe92) Reverting host -> hostname because it breaks in pre-0.6. (@mikeal) +- [a1134d8](https://github.com/mikeal/request/commit/a1134d855f928fde5c4fe9ee255c111da0195bfc) adding logging (@mikeal) +- [#133](https://github.com/mikeal/request/pull/133) Fixed cookies parsing (@afanasy) +- [9179471](https://github.com/mikeal/request/commit/9179471f9f63b6ba9c9078a35cb888337ce295e8) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [cbb180b](https://github.com/mikeal/request/commit/cbb180b0399074995c235a555e3e3e162d738f7c) Fixes to oauth test. (@mikeal) +- [e1c351f](https://github.com/mikeal/request/commit/e1c351f92958634ccf3fbe78aa2f5b06d9c9a5fa) Published new version. (@mikeal) +- [3ceee86](https://github.com/mikeal/request/commit/3ceee86f1f3aad3a6877d6d3813e087549f3b485) Formatting fixes. (@mikeal) +- [18e1af5](https://github.com/mikeal/request/commit/18e1af5e38168dcb95c8ae29bb234f1ad9bbbdf9) Fixing log error. (@mikeal) +- [edc19b5](https://github.com/mikeal/request/commit/edc19b5249f655714efa0f8fa110cf663b742921) Pushed new version. (@mikeal) +- [f51c32b](https://github.com/mikeal/request/commit/f51c32bd6f4da0419ed8404b610c43ee3f21cf92) added "form" option to readme. (@petejkim) +- [#144](https://github.com/mikeal/request/pull/144) added "form" option to readme (@petejkim) +- [b58022e](https://github.com/mikeal/request/commit/b58022ecda782af93e35e5f9601013b90b09ca73) add "forever" method (@thejh) +- [79d4651](https://github.com/mikeal/request/commit/79d46510ddff2e2c12c69f7ae4072ec489e27b0e) remove logging (@thejh) +- [f87cbf6](https://github.com/mikeal/request/commit/f87cbf6ec6fc0fc2869c340114514c887b304a80) retry on ECONNRESET on reused socket (@thejh) +- [1a91675](https://github.com/mikeal/request/commit/1a916757f4ec48b1282fddfa0aaa0fa6a1bf1267) Multipart requests should respect content-type if set; Issue #145 (@apeace) +- [#146](https://github.com/mikeal/request/pull/146) Multipart should respect content-type if previously set (@apeace) +- [#148](https://github.com/mikeal/request/pull/148) Retry Agent (@thejh) +- [70c5b63](https://github.com/mikeal/request/commit/70c5b63aca29a7d1629fa2909ff5b7199bbf0fd1) Publishing new version to npm. (@mikeal) +- [fc0f04b](https://github.com/mikeal/request/commit/fc0f04bab5d6be56a2c19d47d3e8386bd9a0b29e) Fix: timeout on socket, timeout after redirect +- [ef79e59](https://github.com/mikeal/request/commit/ef79e59bbb88ed3e7d4368fe3ca5eee411bda345) Fix: timeout after redirect 2 +- [c32a218](https://github.com/mikeal/request/commit/c32a218da2296e89a269f1832d95b12c4aa10852) merge master (@jroes) +- [d2d9b54](https://github.com/mikeal/request/commit/d2d9b545e5679b829d33deeba0b22f9050fd78b1) add line to docs describing followAllRedirects option (@jroes) +- [#90](https://github.com/mikeal/request/pull/90) add option followAllRedirects to follow post/put redirects (@jroes) +- [c08ab7e](https://github.com/mikeal/request/commit/c08ab7efaefd39c04deb6986716efe5a6069528e) Emit an event after we create the request object so that people can manipulate it before nextTick(). (@mikeal) +- [#162](https://github.com/mikeal/request/pull/162) Fix issue #159 (@dpetukhov) +- [e77a169](https://github.com/mikeal/request/commit/e77a1695c5c632c067857e99274f28a1d74301fe) fixing streaming example. fixes #164 (@mikeal) +- [ee53386](https://github.com/mikeal/request/commit/ee53386d85975c79b801edbb4f5bb7ff4c5dc90b) fixes #127 (@mikeal) +- [e2cd9de](https://github.com/mikeal/request/commit/e2cd9de9a9d10e1aa4cf4e26006bb30fa5086f0b) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [a0ab977](https://github.com/mikeal/request/commit/a0ab9770a8fb89f970bb3783ed4e6dde9e33511b) Added failing test for #125. (@papandreou) +- [c80800a](https://github.com/mikeal/request/commit/c80800a834b0f8bc0fb40d1fad4d4165a83369fd) Fix cookie jar/headers.cookie collision. Closes #125. (@papandreou) +- [1ac9e2d](https://github.com/mikeal/request/commit/1ac9e2d1bf776728a1fe676dd3693ef66f50f7f7) Redirect test: Also assert that the request cookie doesn't get doubled in the request for the landing page. (@papandreou) +- [07bbf33](https://github.com/mikeal/request/commit/07bbf331e2a0d40d261487f6222e8cafee0e50e3) Fixes #150 (@mikeal) +- [c640eed](https://github.com/mikeal/request/commit/c640eed292c06eac3ec89f60031ddf0fc0add732) Cookie jar handling: Don't double the cookies on each redirect (see discussion on #139). (@papandreou) +- [808de8b](https://github.com/mikeal/request/commit/808de8b0ba49d4bb81590ec37a873e6be4d9a416) Adding some missing mime types #138 (@serby) +- [#161](https://github.com/mikeal/request/pull/161) Fix cookie jar/headers.cookie collision (#125) (@papandreou) +- [#168](https://github.com/mikeal/request/pull/168) Picking off an EasyFix by adding some missing mimetypes. (@serby) +- [2a30487](https://github.com/mikeal/request/commit/2a304879f4218c1e46195d882bc81c0f874be329) bugfix - allow add cookie to wrapped request (defaults) (@fabianonunes) +- [a18b4f1](https://github.com/mikeal/request/commit/a18b4f14559f56cf52ca1b421daa6a934d28d51b) Making pipeDest a public prototype method rather than keeping it private. (@mikeal) +- [#170](https://github.com/mikeal/request/pull/170) can't create a cookie in a wrapped request (defaults) (@fabianonunes) +- [49a0f60](https://github.com/mikeal/request/commit/49a0f604779c91dd1759a02cbb195ccbd8d73f5d) Structural refactor, getting read for composable API. (@mikeal) +- [5daa0b2](https://github.com/mikeal/request/commit/5daa0b28b06cf109614f19e76b0e0b9b25ee3baf) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [e4df85c](https://github.com/mikeal/request/commit/e4df85c72221bf09ee7e1eb54f6c881851bd4164) Composable API for OAuth. (@mikeal) +- [945ec40](https://github.com/mikeal/request/commit/945ec40baef968ddd468c3b4dfce01621e4a0e31) Composable form API (@mikeal) +- [c30b47f](https://github.com/mikeal/request/commit/c30b47f229522a75af85da269157377b4a7dc37d) Use this, return this. (@mikeal) +- [e908644](https://github.com/mikeal/request/commit/e908644a69f9107b954f13635736f1e640216aec) Composable multipart API. (@mikeal) +- [e115677](https://github.com/mikeal/request/commit/e115677b1a03576eb96386986c350f211a4f38cd) Composable jar. Guard against overwrites on retry. (@mikeal) +- [a482e48](https://github.com/mikeal/request/commit/a482e4802e11fd122b12e18d1b18b49850fef823) Updating copyright for the new year. (@mikeal) +- [3c6581a](https://github.com/mikeal/request/commit/3c6581a9d4508fe5d75e111ae0fb94c5e0078404) Adding clobber argument for appending to headers. thanks @isaacs (@mikeal) +- [54e6aca](https://github.com/mikeal/request/commit/54e6aca0ab5982621fc9b35500f2154e50c0c95d) Fixes #144. (@mikeal) +- [12f4997](https://github.com/mikeal/request/commit/12f4997ed83bfbfefa3fc5b5635bc9a6829aa0d7) Fixing clobber. (@mikeal) +- [2f34fd1](https://github.com/mikeal/request/commit/2f34fd13b7ec86cb1c67e0a58664b9e060a34a50) Added support for a "query" option value that is a hash of querystring values that is merged (taking precedence over) with the querystring passed in the uri string. (@csainty) +- [a32d9e7](https://github.com/mikeal/request/commit/a32d9e7069533fb727a71730dbaa0f62ebefb731) Added a js based test runner so I can run tests on windows. (@csainty) +- [e0b6ce0](https://github.com/mikeal/request/commit/e0b6ce063de0c4223c97982128bb8203caf4a331) Tidied up an issue where ?> was being appended to URLs. (@csainty) +- [d47150d](https://github.com/mikeal/request/commit/d47150d6748a452df336d8de9743218028a876db) Refactored to match the composable style (@csainty) +- [b7e0929](https://github.com/mikeal/request/commit/b7e0929837873a8132476bb2b4d2e2a0fdc7cd0f) implemented issue #173 allow uri to be first argument (@twilson63) +- [b7264a6](https://github.com/mikeal/request/commit/b7264a6626481d5da50a28c91ea0be7b688c9daf) removed debug line and reset ports (@twilson63) +- [76598c9](https://github.com/mikeal/request/commit/76598c92bee64376e5d431285ac1bf6783140dbb) removed npm-debug (@twilson63) +- [#177](https://github.com/mikeal/request/pull/177) Issue #173 Support uri as first and optional config as second argument (@twilson63) +- [0f24051](https://github.com/mikeal/request/commit/0f240517dea65337636a49cb1cc2b5327504430e) Renamed query to qs. It was actually my first choice, but there appeared to be conflicts with the qs = require('querystring'). These are no longer present though and must have been unrelated. (@csainty) +- [becedaa](https://github.com/mikeal/request/commit/becedaaa7681b0c4ad5c0a9b9922fc950f091af2) Changed test structure to no longer require a server, modeled on the oauth tests. This also lets me revert some of the changes I had to make to the test server and proxy tests (@csainty) +- [9b2bbf0](https://github.com/mikeal/request/commit/9b2bbf0c12e87a59320efac67759041cd4af913f) Modified how the qs function works, it now no longer tweaks the existing request uri, instead it recreates a new one. This allows me to revert all the other changes I had to make previously and gives a nice clean commit that is self contained. (@csainty) +- [5ac7e26](https://github.com/mikeal/request/commit/5ac7e26ce4f7bf5a334df91df83699891171c0ae) failing test for .pipe(dst, opts) (@substack) +- [3b2422e](https://github.com/mikeal/request/commit/3b2422e62fbd6359b841e59a2c1888db71a22c2c) fix for failing pipe opts test (@substack) +- [8788c8b](https://github.com/mikeal/request/commit/8788c8b8cba96662e9d94a96eb04d96b904adea3) added uri param for post, put, head, del shortcuts (@twilson63) +- [#179](https://github.com/mikeal/request/pull/179) fix to add opts in .pipe(stream, opts) (@substack) +- [#180](https://github.com/mikeal/request/pull/180) Modified the post, put, head and del shortcuts to support uri optional param (@twilson63) +- [37d0699](https://github.com/mikeal/request/commit/37d0699eb681e85b7df4896b0a68b6865e596cb3) Fixing end bug i introduced being stupid. (@mikeal) +- [3a97292](https://github.com/mikeal/request/commit/3a97292f45273fa2cc937c0698ba19964780b4bb) fixed defaults functionality to support (uri, options, callback) (@twilson63) +- [#182](https://github.com/mikeal/request/pull/182) Fix request.defaults to support (uri, options, callback) api (@twilson63) +- [c94b200](https://github.com/mikeal/request/commit/c94b200258fa48697e386121a3e114ab7bed2ecf) Switched npm test from the bash script to a node script so that it is cross-platform. (@csainty) +- [#176](https://github.com/mikeal/request/pull/176) Querystring option (@csainty) +- [3b1e609](https://github.com/mikeal/request/commit/3b1e6094451e8d34c93353177de9d76e9a805e43) Adding defaults test back in. (@mikeal) +- [b4ae0c2](https://github.com/mikeal/request/commit/b4ae0c2d50f018a90a3ec8daa1d14c92a99873b9) Fixing idiotic bug I introduced. (@mikeal) +- [32f76c8](https://github.com/mikeal/request/commit/32f76c8baaf784dc2f4f1871153b1796bcebdcfe) Pushed new version to npm. (@mikeal) +- [00d0d9f](https://github.com/mikeal/request/commit/00d0d9f432182f13a5b8aa2e3a2a144b5c179015) Adding accept header to json support. (@mikeal) +- [0f580e6](https://github.com/mikeal/request/commit/0f580e6f6317c5301a52c0b6963d58e27112abca) Add abort support to the returned request (@itay) +- [4505e6d](https://github.com/mikeal/request/commit/4505e6d39a44229bfe5dc4d9a920233e05a7dfdb) Fixing some edge streaming cases with redirects by reusing the Request object. (@mikeal) +- [eed57af](https://github.com/mikeal/request/commit/eed57af8fe3e16632e9e0043d4d7f4d147dbfb8f) Published new version. (@mikeal) +- [97386b5](https://github.com/mikeal/request/commit/97386b5d7315b5c83702ffc7d0b09e34ecb67e04) Fixing pretty bad bug from the composable refactor. (@mikeal) +- [b693ce6](https://github.com/mikeal/request/commit/b693ce64e16aaa859d4edc86f82fbb11e00d33c0) Move abort to a prototype method, don't raise error (@itay) +- [1330eef](https://github.com/mikeal/request/commit/1330eef3ec84a651a435c95cf1ff1a4003086440) Merge branch 'master' of git://github.com/mikeal/request (@itay) +- [#188](https://github.com/mikeal/request/pull/188) Add abort support to the returned request (@itay) +- [5ff4645](https://github.com/mikeal/request/commit/5ff46453e713da1ae66a0d510eda4919e4080abe) Style changes. (@mikeal) +- [2dbd1e4](https://github.com/mikeal/request/commit/2dbd1e4350c2941b795b0e5ee7c0a00cd04cce09) Fixing new params style on master for head request. (@mikeal) +- [14989b2](https://github.com/mikeal/request/commit/14989b2dfc6830dbdad5364930fba1d2995aba06) Pushed new version to npm. (@mikeal) +- [0ea2351](https://github.com/mikeal/request/commit/0ea2351ef017ada9b8472f8d73086715ebe30c6a) Fixes #190. outdated check on options.json from before we had boolean support. (@mikeal) +- [21bf78c](https://github.com/mikeal/request/commit/21bf78c264316f75f4e6c571461521cda6ccf088) Adds a block on DELETE requests in status 300-400 (@goatslacker) +- [0c0c201](https://github.com/mikeal/request/commit/0c0c20139b28b21a860f72b8ce0124046fae421d) Adds tests for GH-119 Fix (@goatslacker) +- [#193](https://github.com/mikeal/request/pull/193) Fixes GH-119 (@goatslacker) +- [5815a69](https://github.com/mikeal/request/commit/5815a697347f20658dc2bdfd0d06e41d0aa0dac4) Fixes #194. setTimeout only works on node 0.6+ (@mikeal) +- [1ddcd60](https://github.com/mikeal/request/commit/1ddcd605bc8936c5b3534e1cf9aa1b29fa2b060b) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [7b35b4f](https://github.com/mikeal/request/commit/7b35b4ff63bbdf133f0f600a88a87b5723d29bdf) Removing old checks for self.req, it's ensured if start() is called. Implementing early pause/resume for when streams try to pause/resume before any data is emitted. Fixes #195. (@mikeal) +- [f01b79b](https://github.com/mikeal/request/commit/f01b79bb651f64065bac8877739223527f5b5592) Make ForeverAgent work with HTTPS (@isaacs) +- [#197](https://github.com/mikeal/request/pull/197) Make ForeverAgent work with HTTPS (@isaacs) +- [8d85b57](https://github.com/mikeal/request/commit/8d85b57ebb81c9d2d0a6b94aed41bf2ab0e3ad09) Forever inherits bugfix (@isaacs) +- [#198](https://github.com/mikeal/request/pull/198) Bugfix on forever usage of util.inherits (@isaacs) +- [37446f5](https://github.com/mikeal/request/commit/37446f54bb21cf9c83ffa81d354d799ae7ecf9ed) Add a test of HTTPS strict with CA checking (@isaacs) +- [8378d2e](https://github.com/mikeal/request/commit/8378d2ef9b8121a9851d21b3f6ec8304bde61c9d) Support tunneling HTTPS requests over proxies (@isaacs) +- [#199](https://github.com/mikeal/request/pull/199) Tunnel (@isaacs) +- [f0052ac](https://github.com/mikeal/request/commit/f0052ac5e6ca9f3f4aa49f6cda6ba15eb5d8b8e6) Published new version to npm. (@mikeal) +- [cea668f](https://github.com/mikeal/request/commit/cea668f6f7d444831313ccc0e0d301d25f2bd421) Adding more explicit error when undefined is passed as uri or options. (@mikeal) +- [047b7b5](https://github.com/mikeal/request/commit/047b7b52f3b11f4c44a02aeb1c3583940ddb59c7) Fix special method functions that get passed an options object. (@mikeal) +- [746de0e](https://github.com/mikeal/request/commit/746de0ef2f564534b29eeb8f296a59bd2c3086a7) pass through Basic authorization option for HTTPS tunneling +- [6fda9d7](https://github.com/mikeal/request/commit/6fda9d7d75e24cc1302995e41e26a91e03fdfc9a) Always clobber internal objects for qs but preserve old querystring args when clobber is present. (@mikeal) +- [75ca7a2](https://github.com/mikeal/request/commit/75ca7a25bc9c6102e87f3660a25835c7fcd70edb) Merge branch 'master' of https://github.com/mikeal/request +- [3b9f0fd](https://github.com/mikeal/request/commit/3b9f0fd3da4ae74de9ec76e7c66c57a7f8641df2) Fix cookies so that attributes are case insensitive +- [fddbd6e](https://github.com/mikeal/request/commit/fddbd6ee7d531bc4a82f629633b9d1637cb039e8) Properly set cookies during redirects +- [0d0bdb7](https://github.com/mikeal/request/commit/0d0bdb793f908492d4086fae8744f1e33e68d8c6) Remove request body when following non-GET redirects +- [#203](https://github.com/mikeal/request/pull/203) Fix cookie and redirect bugs and add auth support for HTTPS tunnel (@milewise) +- [b5fa773](https://github.com/mikeal/request/commit/b5fa773994de1799cf53491db7f5f3ba32825b20) Replace all occurrences of special chars in RFC3986 (@chriso) +- [bc6cd6c](https://github.com/mikeal/request/commit/bc6cd6ca6c6157bad76f0b2b23d4993f389ba977) documenting additional behavior of json option (@jphaas) +- [80e4e43](https://github.com/mikeal/request/commit/80e4e43186de1e9dcfaa1c9a921451560b91267c) Fixes #215. (@mikeal) +- [51f343b](https://github.com/mikeal/request/commit/51f343b9adfc11ec1b2ddcfb52a57e1e13feacb2) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [89c0f1d](https://github.com/mikeal/request/commit/89c0f1dd324bc65ad9c07436fb2c8220de388c42) titlecase authorization for oauth (@visnup) +- [#217](https://github.com/mikeal/request/pull/217) need to use Authorization (titlecase) header with Tumblr OAuth (@visnup) +- [8c163eb](https://github.com/mikeal/request/commit/8c163eb9349459839fc720658979d5c97a955825) Double quotes are optional, and the space after the ; could be required (@janjongboom) +- [#224](https://github.com/mikeal/request/pull/224) Multipart content-type change (@janjongboom) +- [96f4b9b](https://github.com/mikeal/request/commit/96f4b9b1f7b937a92f3f94f10d6d02f8878b6107) Style changes. (@mikeal) +- [b131c64](https://github.com/mikeal/request/commit/b131c64816f621cf15f8c51e76eb105778b4aad8) Adding safe .toJSON method. fixes #167 (@mikeal) +- [05d6e02](https://github.com/mikeal/request/commit/05d6e02c31ec4e6fcfadbfbe5414e701710f6e55) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [74ca9a4](https://github.com/mikeal/request/commit/74ca9a4852b666d30dd71421e8cc8b8a83177148) Unified error and complete handling. Fixes #171 (@mikeal) +- [a86c7dc](https://github.com/mikeal/request/commit/a86c7dc7d0a7c640c7def4c0215e46e76a11ff56) Fixing followAllRedirects and all the redirect tests. (@mikeal) +- [#211](https://github.com/mikeal/request/pull/211) Replace all occurrences of special chars in RFC3986 (@chriso) +- [7e24e8a](https://github.com/mikeal/request/commit/7e24e8a48d0dcfe10d0cc08b3c4e9627b9a95a97) New version on npm, first 3.0 release candidate. (@mikeal) +- [22e0f0d](https://github.com/mikeal/request/commit/22e0f0d73459c11b81b0f66a2cde85492dd8e38f) Added test for .toJSON() (@mikeal) +- [df32746](https://github.com/mikeal/request/commit/df32746f157948b6ae05e87a35cf1768e065ef0b) Adding toJSON to npm test. (@mikeal) +- [e65bfba](https://github.com/mikeal/request/commit/e65bfba98f0886a059a268dcdceabf41aec1e5cc) New version in npm. (@mikeal) +- [2b95921](https://github.com/mikeal/request/commit/2b959217151aaff7a6e7cc15e2acfccd1bbb9b85) Fixing defaults when url is passed instead of uri. (@mikeal) +- [e0534d8](https://github.com/mikeal/request/commit/e0534d860b4931a7a6e645b328fd4418a5433057) Pushed new version to npm. (@mikeal) +- [d2dc835](https://github.com/mikeal/request/commit/d2dc83538379e9e1fafb94f5698c56b4a5318d8d) don't error when null is passed for options (@polotek) +- [db80bf0](https://github.com/mikeal/request/commit/db80bf0444bd98c45f635f305154b9da20eed328) expose initParams (@polotek) +- [8cf019c](https://github.com/mikeal/request/commit/8cf019c9f9f719694408840823e92da08ab9dac3) allow request.defaults to override the main request method (@polotek) +- [#240](https://github.com/mikeal/request/pull/240) don't error when null is passed for options (@polotek) +- [69d017d](https://github.com/mikeal/request/commit/69d017de57622429f123235cc5855f36b3e18d1c) added dynamic boundary for multipart requests (@zephrax) +- [fc13e18](https://github.com/mikeal/request/commit/fc13e185f5e28a280d347e61622ba708e1cd7bbc) added dynamic boundary for multipart requests (@zephrax) +- [#243](https://github.com/mikeal/request/pull/243) Dynamic boundary (@zephrax) +- [1764176](https://github.com/mikeal/request/commit/176417698a84c53c0a69bdfd2a05a2942919816c) Fixing the set-cookie header (@jeromegn) +- [#246](https://github.com/mikeal/request/pull/246) Fixing the set-cookie header (@jeromegn) +- [6f9da89](https://github.com/mikeal/request/commit/6f9da89348b848479c23192c04b3c0ddd5a4c8bc) do not set content-length header to 0 when self.method is GET or self.method is undefined (@sethbridges) +- [efc0ea4](https://github.com/mikeal/request/commit/efc0ea44d63372a30011822ad9d37bd3d7b85952) Experimental AWS signing. Signing code from knox. (@mikeal) +- [4c08a1c](https://github.com/mikeal/request/commit/4c08a1c10bc0ebb679e212ad87419f6c4cc341eb) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [fdb10eb](https://github.com/mikeal/request/commit/fdb10eb493110b8e6e4f679524f38cef946e3f08) Adding support for aws in options. (@mikeal) +- [dac6a30](https://github.com/mikeal/request/commit/dac6a301ae03207af88fae6f5017e82157b79b41) Fixing upgraded stat size and supporting content-type and content-md5 properly. (@mikeal) +- [98cb503](https://github.com/mikeal/request/commit/98cb50325e1d7789fd9f44523d2315df5f890d10) Allow body === '' /* the empty string */. (@Filirom1) +- [0e9ac12](https://github.com/mikeal/request/commit/0e9ac12c69aaca370fbca94b41358e1c3a2f6170) fixed just another global leak of i (@sreuter) +- [#260](https://github.com/mikeal/request/pull/260) fixed just another leak of 'i' (@sreuter) +- [#255](https://github.com/mikeal/request/pull/255) multipart allow body === '' ( the empty string ) (@Filirom1) +- [#249](https://github.com/mikeal/request/pull/249) Fix for the fix of your (closed) issue #89 where self.headers[content-length] is set to 0 for all methods (@sethbridges) +- [adc9ab1](https://github.com/mikeal/request/commit/adc9ab1f563f3cb4681ac8241fcc75e6099efde2) style changes. making @rwaldron cry (@mikeal) +- [155e6ee](https://github.com/mikeal/request/commit/155e6ee270924d5698d3fea37cefc1926cbaf998) Fixed `pool: false` to not use the global agent (@timshadel) +- [1232a8e](https://github.com/mikeal/request/commit/1232a8e46752619d4d4b51d558e6725faf7bf3aa) JSON test should check for equality (@timshadel) +- [#261](https://github.com/mikeal/request/pull/261) Setting 'pool' to 'false' does NOT disable Agent pooling (@timshadel) +- [#262](https://github.com/mikeal/request/pull/262) JSON test should check for equality (@timshadel) +- [914a723](https://github.com/mikeal/request/commit/914a72300702a78a08263fe98a43d25e25713a70) consumer_key and token_secret need to be encoded for OAuth v1 (@nanodocumet) +- [500e790](https://github.com/mikeal/request/commit/500e790f8773f245ff43dd9c14ec3d5c92fe0b9e) Fix uncontrolled crash when "this.uri" is an invalid URI (@naholyr) +- [#265](https://github.com/mikeal/request/pull/265) uncaughtException when redirected to invalid URI (@naholyr) +- [#263](https://github.com/mikeal/request/pull/263) Bug in OAuth key generation for sha1 (@nanodocumet) +- [f4b87cf](https://github.com/mikeal/request/commit/f4b87cf439453b3ca1d63e85b3aeb3373ee1f17e) I'm not OCD seriously (@TehShrike) +- [#268](https://github.com/mikeal/request/pull/268) I'm not OCD seriously (@TehShrike) +- [fcab7f1](https://github.com/mikeal/request/commit/fcab7f1953cd6fb141a7d98f60580c50b59fb73f) Adding a line break to the preamble as the first part of a multipart was not recognized by a server I was communicating with. (@proksoup) +- [661b62e](https://github.com/mikeal/request/commit/661b62e5319bf0143312404f1fc81c895c46f6e6) Commenting out failing post test. Need to figure out a way to test this now that the default is to use a UUID for the frontier. (@mikeal) +- [7165c86](https://github.com/mikeal/request/commit/7165c867fa5dea4dcb0aab74d2bf8ab5541e3f1b) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [5a7ca9b](https://github.com/mikeal/request/commit/5a7ca9b398c1300c08a28fb7f266054c3ce8c57a) Added drain event and returning the boolean from write to proper handle back pressure when piping. (@mafintosh) +- [#273](https://github.com/mikeal/request/pull/273) Pipe back pressure issue (@mafintosh) +- [f8ae8d1](https://github.com/mikeal/request/commit/f8ae8d18627e4743996d8600f77f4e4c05a2a590) New version in npm. (@mikeal) +- [7ff5dae](https://github.com/mikeal/request/commit/7ff5daef152bcfac5b02e661e5476a57b9693489) Merge remote-tracking branch 'upstream/master' (@proksoup) +- [1f34700](https://github.com/mikeal/request/commit/1f34700e5614ea2a2d78b80dd467c002c3e91cb3) fix tests with boundary by injecting boundry from header (@benatkin) +- [ee2b2c2](https://github.com/mikeal/request/commit/ee2b2c2f7a8625fde4d71d79e19cdc5d98f09955) Like in [node.js](https://github.com/joyent/node/blob/master/lib/net.js#L52) print logs if NODE_DEBUG contains the word request (@Filirom1) +- [#279](https://github.com/mikeal/request/pull/279) fix tests with boundary by injecting boundry from header (@benatkin) +- [3daebaf](https://github.com/mikeal/request/commit/3daebaf2551c8d0df7dac1ebff0af4fe08608768) Merge branch 'master' of https://github.com/mikeal/request (@proksoup) +- [dba2ebf](https://github.com/mikeal/request/commit/dba2ebf09552258f37b60122c19b236064b0d216) Updating with corresponding tests. (@proksoup) +- [396531d](https://github.com/mikeal/request/commit/396531d083c94bc807a25f7c3a50a0c92a00c5f7) Removing console.log of multipart (@proksoup) +- [54226a3](https://github.com/mikeal/request/commit/54226a38816b4169e0a7a5d8b1a7feba78235fec) Okay, trying it as an optional parameter, with a new test in test-body.js to verify (@proksoup) +- [23ae7d5](https://github.com/mikeal/request/commit/23ae7d576cc63d645eecf057112b71d6cb73e7b1) Remove non-"oauth_" parameters from being added into the OAuth Authorization header (@jplock) +- [8b82ef4](https://github.com/mikeal/request/commit/8b82ef4ff0b50b0c8dcfb830f62466fa30662666) Removing guard, there are some cases where this is valid. (@mikeal) +- [82440f7](https://github.com/mikeal/request/commit/82440f76f22a5fca856735af66e2dc3fcf240c0d) Adding back in guard for _started, need to keep some measure of safety but we should defer this restriction for as long as possible. (@mikeal) +- [#282](https://github.com/mikeal/request/pull/282) OAuth Authorization header contains non-"oauth_" parameters (@jplock) +- [087be3e](https://github.com/mikeal/request/commit/087be3ebbada53699d14839374f1679f63f3138f) Remove stray `console.log()` call in multipart generator. (@bcherry) +- [0a8a5ab](https://github.com/mikeal/request/commit/0a8a5ab6a08eaeffd45ef4e028be2259d61bb0ee) Merge remote-tracking branch 'upstream/master' (@proksoup) +- [#241](https://github.com/mikeal/request/pull/241) Composability updates suggested by issue #239 (@polotek) +- [#284](https://github.com/mikeal/request/pull/284) Remove stray `console.log()` call in multipart generator. (@bcherry) +- [8344666](https://github.com/mikeal/request/commit/8344666f682a302c914cce7ae9cea8de054f9240) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) +- [#272](https://github.com/mikeal/request/pull/272) Boundary begins with CRLF? (@proksoup) +- [#214](https://github.com/mikeal/request/pull/214) documenting additional behavior of json option (@jphaas) +- [#207](https://github.com/mikeal/request/pull/207) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs) +- [9cadd61](https://github.com/mikeal/request/commit/9cadd61d989e85715ea07da8770a3077db41cca3) Allow parser errors to bubble up to request (@mscdex) +- [6a00fea](https://github.com/mikeal/request/commit/6a00fea09eed99257c0aec2bb66fbf109b0f573a) Only add socket error handler callback once (@mscdex) +- [975ea90](https://github.com/mikeal/request/commit/975ea90bed9503c67055b20e36baf4bcba54a052) Fix style (@mscdex) +- [205dfd2](https://github.com/mikeal/request/commit/205dfd2e21c13407d89d3ed92dc2b44b987d962b) Use .once() when listening for parser error (@mscdex) +- [ff9b564](https://github.com/mikeal/request/commit/ff9b5643d6b5679a9e7d7997ec6275dac10b000e) Add a space after if (@Filirom1) +- [#280](https://github.com/mikeal/request/pull/280) Like in node.js print options if NODE_DEBUG contains the word request (@Filirom1) +- [d38e57b](https://github.com/mikeal/request/commit/d38e57bbb3d827aa87427f2130aa5a5a3a973161) Test for #289 (@isaacs) +- [820af58](https://github.com/mikeal/request/commit/820af5839f2a193d091d98f23fd588bd919e3e58) A test of POST redirect following with 303 status (@isaacs) +- [7adc5a2](https://github.com/mikeal/request/commit/7adc5a21869bc92cc3b5e84d32c585952c8e5e87) Use self.encoding when calling Buffer.toString() (@isaacs) +- [#290](https://github.com/mikeal/request/pull/290) A test for #289 (@isaacs) +- [#293](https://github.com/mikeal/request/pull/293) Allow parser errors to bubble up to request (@mscdex) +- [ed68b8d](https://github.com/mikeal/request/commit/ed68b8dd024561e9d47d80df255fb79d783c13a7) Updated the twitter oauth dance. The comments weren't clear. Also removed token_key. No longer needed with twitter oauth. (@joemccann) +- [6bc19cd](https://github.com/mikeal/request/commit/6bc19cda351b59f8e45405499a100abd0b456e42) Forgot to remove token_secret; no longer needed for twitter. (@joemccann) +- [1f21b17](https://github.com/mikeal/request/commit/1f21b17fc4ff3a7011b23e3c9261d66effa3aa40) Adding form-data support. (@mikeal) +- [827e950](https://github.com/mikeal/request/commit/827e950500746eb9d3a3fa6f174416b194c9dedf) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [b211200](https://github.com/mikeal/request/commit/b2112009a31fc7f9122970d392750f62b6e77111) Test fixes for relative import. Adding to run all (@mikeal) +- [1268195](https://github.com/mikeal/request/commit/1268195b75bd5bb3954b4c4f2d9feb80a97994d1) Bundling mime module rather than keep around our own mime-map. (@mikeal) +- [4f51cec](https://github.com/mikeal/request/commit/4f51cecdc363946b957585c3deccfd8c37e19aa0) Docs for the form API, pumping version. (@mikeal) +- [90245d7](https://github.com/mikeal/request/commit/90245d7199215d7b195cf7e36b203ca0bd0a6bd3) Doc fixes. (@mikeal) +- [d98ef41](https://github.com/mikeal/request/commit/d98ef411c560bd1168f242c524a378914ff8eac4) Pushed new version to npm. (@mikeal) +- [3e11937](https://github.com/mikeal/request/commit/3e119375acda2da225afdb1596f6346dbd551fba) Pass servername to tunneling secure socket creation (@isaacs) +- [7725b23](https://github.com/mikeal/request/commit/7725b235fdec8889c0c91d55c99992dc683e2e22) Declare dependencies more sanely (@isaacs) +- [#317](https://github.com/mikeal/request/pull/317) Workaround for #313 (@isaacs) +- [#318](https://github.com/mikeal/request/pull/318) Pass servername to tunneling secure socket creation (@isaacs) +- [0c470bc](https://github.com/mikeal/request/commit/0c470bccf1ec097ae600b6116e6244cb624dc00e) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [0d98e5b](https://github.com/mikeal/request/commit/0d98e5b7ea6bd9c4f21535d3682bbed2f2e05df4) Pushed new version to npm. (@mikeal) +- [64a4448](https://github.com/mikeal/request/commit/64a44488ac8c792a1f548f305fc5c61efe0d77fb) when setting defaults, the wrapper adds the jar method assuming it has the same signature as get, meaning undefined is passed into initParams, which subsequently fails. now passing jar function directly as it has no need of defaults anyway seeing as it only creates a new cookie jar (@StuartHarris) +- [48c9881](https://github.com/mikeal/request/commit/48c988118bda4691fffbfcf30d5a39b6c1438736) Added test to illustrate #321 (@alexindigo) +- [8ce0f2a](https://github.com/mikeal/request/commit/8ce0f2a3b6929cd0f7998e00d850eaf5401afdb7) Added *src* stream removal on redirect. #321 (@alexindigo) +- [c32f0bb](https://github.com/mikeal/request/commit/c32f0bb9feaa71917843856c23b4aae99f78ad4d) Do not try to remove listener from an undefined connection (@strk) +- [#326](https://github.com/mikeal/request/pull/326) Do not try to remove listener from an undefined connection (@CartoDB) +- [#322](https://github.com/mikeal/request/pull/322) Fix + test for piped into request bumped into redirect. #321 (@alexindigo) +- [85b6a63](https://github.com/mikeal/request/commit/85b6a632ac7d3456485fbf931043f10f5f6344a5) New version in npm. (@mikeal) +- [f462bd3](https://github.com/mikeal/request/commit/f462bd3fa421fa5e5ca6c91852333db90297b80e) Rolling trunk version. (@mikeal) +- [8a82c5b](https://github.com/mikeal/request/commit/8a82c5b0990cc58fa4cb7f81814d13ba7ae35453) Adding url to redirect error for better debugging. (@mikeal) +- [013c986](https://github.com/mikeal/request/commit/013c986d0a8b5b2811cd06dd3733f4a3d37df1cc) Better debugging of max redirect errors. (@mikeal) +- [#320](https://github.com/mikeal/request/pull/320) request.defaults() doesn't need to wrap jar() (@redbadger) +- [4797f88](https://github.com/mikeal/request/commit/4797f88b42c3cf8680cbde09bf473678a5707aed) Fix #296 - Only set Content-Type if body exists (@Marsup) +- [f6bcf3e](https://github.com/mikeal/request/commit/f6bcf3eb51982180e813c69cccb942734f815ffe) fixup aws function to work in more situations (@nlf) +- [ba6c88a](https://github.com/mikeal/request/commit/ba6c88af5e771c2a0e007e6166e037a149561e09) added short blurb on using aws (@nlf) +- [#343](https://github.com/mikeal/request/pull/343) Allow AWS to work in more situations, added a note in the README on its usage (@nathan-lafreniere) +- [288c52a](https://github.com/mikeal/request/commit/288c52a2a1579164500c26136552827112801ff1) switch to a case insensitive getter when fetching headers for aws auth signing (@nlf) +- [#332](https://github.com/mikeal/request/pull/332) Fix #296 - Only set Content-Type if body exists (@Marsup) +- [7a16286](https://github.com/mikeal/request/commit/7a162868de65b6de15e00c1f707b5e0f292c5f86) Emit errors for anything in init so that it is catchable in a redirect. (@mikeal) +- [d288d21](https://github.com/mikeal/request/commit/d288d21d709fa81067f5af53737dfde06f842262) fix bug (@azylman) +- [#355](https://github.com/mikeal/request/pull/355) stop sending erroneous headers on redirected requests (@azylman) +- [b0b97f5](https://github.com/mikeal/request/commit/b0b97f53a9e94f3aeaa05e2cda5b820668f6e3b2) delete _form along with everything else on a redirect (@jgautier) +- [#360](https://github.com/mikeal/request/pull/360) Delete self._form along with everything else on redirect (@jgautier) +- [61e3850](https://github.com/mikeal/request/commit/61e3850f0f91ca6732fbd06b46796fbcd2fea1ad) Made it so that if we pass in Content-Length or content-length in the headers, don't make a new version (@danjenkins) +- [#361](https://github.com/mikeal/request/pull/361) Don't create a Content-Length header if we already have it set (@danjenkins) +- [590452d](https://github.com/mikeal/request/commit/590452d6569e68e480d4f40b88022f1b81914ad6) inside oauth.hmacsign: running rfc3986 on base_uri instead of just encodeURIComponent. +- [#362](https://github.com/mikeal/request/pull/362) Running `rfc3986` on `base_uri` in `oauth.hmacsign` instead of just `encodeURIComponent` (@jeffmarshall) +- [f7dc90c](https://github.com/mikeal/request/commit/f7dc90c8dae743d5736dc6c807eecde613eb4fd4) Revert "Merge pull request #362 from jeffmarshall/master" (@mikeal) +- [d631a26](https://github.com/mikeal/request/commit/d631a26e263077eca3d4925de9b0a8d57365ba90) reintroducing the WTF escape + encoding, also fixing a typo. +- [#363](https://github.com/mikeal/request/pull/363) rfc3986 on base_uri, now passes tests (@jeffmarshall) +- [bfe2791](https://github.com/mikeal/request/commit/bfe2791f596b749eed6961159d41a404c3aba0d0) oauth fix. (@mikeal) +- [#344](https://github.com/mikeal/request/pull/344) Make AWS auth signing find headers correctly (@nathan-lafreniere) +- [e863f25](https://github.com/mikeal/request/commit/e863f25336abc7b9f9936c20e0c06da8db0c6593) style change. (@mikeal) +- [3e5a87c](https://github.com/mikeal/request/commit/3e5a87ce28b3bb45861b32f283cd20d0084d78a7) Don't remove x_auth_type for Twitter reverse auth (@drudge) +- [#369](https://github.com/mikeal/request/pull/369) Don't remove x_auth_mode for Twitter reverse auth (@drudge) +- [25d4667](https://github.com/mikeal/request/commit/25d466773c43949e2eea4236ffc62841757fd1f0) x_auth_mode not x_auth_type (@drudge) +- [#370](https://github.com/mikeal/request/pull/370) Twitter reverse auth uses x_auth_mode not x_auth_type (@drudge) +- [cadf4dc](https://github.com/mikeal/request/commit/cadf4dc54f4ee3fae821f6beb1ea6443e528bf6f) massive style commit. (@mikeal) +- [33453a5](https://github.com/mikeal/request/commit/33453a53bc37e4499853b9d929b3603cdf7a31cd) New version in npm. (@mikeal) +- [b638185](https://github.com/mikeal/request/commit/b6381854006470af1d0607f636992c7247b6720f) Setting master version. (@mikeal) +- [8014d2a](https://github.com/mikeal/request/commit/8014d2a5b797f07cf56d2f39a346031436e1b064) correct Host header for proxy tunnel CONNECT (@ypocat) +- [#374](https://github.com/mikeal/request/pull/374) Correct Host header for proxy tunnel CONNECT (@ypocat) +- [8c3e9cb](https://github.com/mikeal/request/commit/8c3e9cb529767cff5e7206e2e76531183085b42a) If one of the request parameters is called "timestamp", the "oauth_timestamp" OAuth parameter will get removed during the parameter cleanup loop. (@jplock) +- [#375](https://github.com/mikeal/request/pull/375) Fix for missing oauth_timestamp parameter (@jplock) +- [69e6dc5](https://github.com/mikeal/request/commit/69e6dc5c80e67bbd7d135c3ceb657a1b2df58763) Fixed headers piping on redirects (@kapetan) +- [#376](https://github.com/mikeal/request/pull/376) Headers lost on redirect (@kapetan) +- [62dbbf3](https://github.com/mikeal/request/commit/62dbbf3d77b0851ba424d4f09d1d0c0be91c1f2d) Resolving the Invalid signature when using "qs" (@landeiro) +- [d4cf4f9](https://github.com/mikeal/request/commit/d4cf4f98e11f9a85b6bdfd0481c85c8ac34061ce) fixes missing host header on retried request when using forever agent +- [#380](https://github.com/mikeal/request/pull/380) Fixes missing host header on retried request when using forever agent (@mac-) +- [#381](https://github.com/mikeal/request/pull/381) Resolving "Invalid signature. Expected signature base string: " (@landeiro) +- [ea2f975](https://github.com/mikeal/request/commit/ea2f975ae83efe956b77cbcd0fd9ad42c0d5192f) Ensure that uuid is treated as a property name, not an index. (@othiym23) +- [#388](https://github.com/mikeal/request/pull/388) Ensure "safe" toJSON doesn't break EventEmitters (@othiym23) +- [11a3bc0](https://github.com/mikeal/request/commit/11a3bc0ea3063f6f0071248e03c8595bfa9fd046) Add more reporting to tests (@mmalecki) +- [#398](https://github.com/mikeal/request/pull/398) Add more reporting to tests (@mmalecki) +- [b85bf63](https://github.com/mikeal/request/commit/b85bf633fe8197dc38855f10016a0a76a8ab600a) Optimize environment lookup to happen once only (@mmalecki) +- [#403](https://github.com/mikeal/request/pull/403) Optimize environment lookup to happen once only (@mmalecki) +- [dbb9a20](https://github.com/mikeal/request/commit/dbb9a205fafd7bf5a05d2dbe7eb2c6833b4387dc) renaming tests/googledoodle.png to match it's actual image type of jpeg (@nfriedly) +- [e2d7d4f](https://github.com/mikeal/request/commit/e2d7d4fd35869354ba14a333a4b4989b648e1971) Add more auth options, including digest support (@nylen) +- [d0d536c](https://github.com/mikeal/request/commit/d0d536c1e5a9a342694ffa5f14ef8fbe8dcfa8bd) Add tests for basic and digest auth (@nylen) +- [85fd359](https://github.com/mikeal/request/commit/85fd359890646ef9f55cc6e5c6a32e74f4fbb786) Document new auth options (@nylen) +- [#338](https://github.com/mikeal/request/pull/338) Add more auth options, including digest support (@nylen) +- [fd2e2fa](https://github.com/mikeal/request/commit/fd2e2fa1e6d580cbc34afd3ae1200682cecb3cf9) Fixed a typo. (@jerem) +- [#415](https://github.com/mikeal/request/pull/415) Fixed a typo. (@jerem) +- [53c1508](https://github.com/mikeal/request/commit/53c1508c9c6a58f7d846de82cad36402497a4a4f) Fix for #417 (@mikeal) +- [b23f985](https://github.com/mikeal/request/commit/b23f985e02da4a96f1369541a128c4204a355666) Fixing merge conflict. (@mikeal) +- [28e8be5](https://github.com/mikeal/request/commit/28e8be5175793ac99236df88e26c0139a143e32d) Lost a forever fix in the previous merge. Fixing. (@mikeal) +- [e4d1e25](https://github.com/mikeal/request/commit/e4d1e25c1648ef91f6baf1ef407c712509af4b66) Copy options before adding callback. (@nrn) +- [22bc67d](https://github.com/mikeal/request/commit/22bc67d7ac739e9c9f74c026f875a0a7c686e29d) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) +- [#430](https://github.com/mikeal/request/pull/430) Respect specified {Host,host} headers, not just {host} (@andrewschaaf) +- [6b11acf](https://github.com/mikeal/request/commit/6b11acf3e29fb84daef4e940314cae5ac2e580c6) Updating form-data. (@mikeal) +- [d195845](https://github.com/mikeal/request/commit/d195845c3e1de42c9aee752eec8efa4dda87ec74) Updating mime (@mikeal) +- [20ba1d6](https://github.com/mikeal/request/commit/20ba1d6d38191aa7545b927a7262a18c5c63575b) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [0150d9f](https://github.com/mikeal/request/commit/0150d9fa13e51d99880013b9ec29343850b40c2f) Consider `options.rejectUnauthorized` when pooling https agents (@mmalecki) +- [3e07b6d](https://github.com/mikeal/request/commit/3e07b6d4b81037d0e6e595670db483708ffa8698) Use `rejectUnauthorized: false` in tests (@mmalecki) +- [3995878](https://github.com/mikeal/request/commit/3995878d9fff18a8707f27ffeb4ed6401086adce) Support `key` and `cert` options (@mmalecki) +- [#433](https://github.com/mikeal/request/pull/433) Added support for HTTPS cert & key (@indexzero) +- [8b0f4e8](https://github.com/mikeal/request/commit/8b0f4e8fba33d578a891218201d87e3316ea9844) Released 2.14.0 (@mikeal) +- [54172c6](https://github.com/mikeal/request/commit/54172c68cab8360372e1e64e3fa14902662950bd) Rolling master version. (@mikeal) +- [aa4a285](https://github.com/mikeal/request/commit/aa4a28586354901b0c9b298a0aa79abb5ed175af) Add patch convenience method. (@mloar) +- [66501b9](https://github.com/mikeal/request/commit/66501b9872abc9a2065430cd5ed4a34dd45c8bee) protect against double callback (@spollack) +- [#444](https://github.com/mikeal/request/pull/444) protect against double callbacks on error path (@spollack) +- [#448](https://github.com/mikeal/request/pull/448) Convenience method for PATCH (@mloar) +- [6f0f8c5](https://github.com/mikeal/request/commit/6f0f8c5ee2b2fdc7118804664c2215fe9cb5a2f2) No longer doing bundle dependencies (@mikeal) +- [3997f98](https://github.com/mikeal/request/commit/3997f980722241c18454a00aeeda07d701c27a8f) No longer using bundle dependencies (@mikeal) +- [cba36ce](https://github.com/mikeal/request/commit/cba36ce64e68bd26e230b65f81256776ac66e686) Adding hawk signing to request. (@mikeal) +- [c7a8be6](https://github.com/mikeal/request/commit/c7a8be6d174eff05a9cb2fda987979e475d8543f) Fixing bug in empty options. (@mikeal) +- [67d753f](https://github.com/mikeal/request/commit/67d753fec99fa1f5a3b35ec0bbbc98896418d86c) node-uuid is much better. (@mikeal) +- [337718b](https://github.com/mikeal/request/commit/337718baa08cafb3e706d275fd7344a3c92363bb) Smarter test runner. (@mikeal) +- [bcc33ac](https://github.com/mikeal/request/commit/bcc33aca57baf6fe2a81fbf5983048c9220c71b1) Moved the cookie jar in to it's own module. (@mikeal) +- [3261be4](https://github.com/mikeal/request/commit/3261be4b5d6f45f62b9f50bec18af770cbb70957) Put aws signing in its own package. (@mikeal) +- [fbed723](https://github.com/mikeal/request/commit/fbed7234d7b532813105efdc4c54777396a6773b) OAuth signing is now in its own library. (@mikeal) +- [ef5ab90](https://github.com/mikeal/request/commit/ef5ab90277fb00d0e8eb1c565b0f6ef8c52601d3) Forever agent is now it's own package. (@mikeal) +- [ca1ed81](https://github.com/mikeal/request/commit/ca1ed813c62c7493dc77108b3efc907cc36930cb) tunneling agent is now it's own library. (@mikeal) +- [5c75621](https://github.com/mikeal/request/commit/5c75621ba5cea18bcf114117112121d361e5f3c9) Moving from main.js to index. cause it's not 2010 anymore. (@mikeal) +- [#413](https://github.com/mikeal/request/pull/413) rename googledoodle.png to .jpg (@nfriedly) +- [b4c4c28](https://github.com/mikeal/request/commit/b4c4c28424d906cd96a2131010b21d7facf8b666) Merge branch 'master' of github.com:mikeal/request (@nrn) +- [#310](https://github.com/mikeal/request/pull/310) Twitter Oauth Stuff Out of Date; Now Updated (@joemccann) +- [8b0e7e8](https://github.com/mikeal/request/commit/8b0e7e8c9d196d7286d1563aa54affcc4c8b0e1d) Comment to explain init() and start(). (@mikeal) +- [43d578d](https://github.com/mikeal/request/commit/43d578dc0206388eeae9584f540d550a06308fc8) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [b7c5ed4](https://github.com/mikeal/request/commit/b7c5ed48b618f71f138f9f08f8d705336f907e01) destroy the response if present when destroying the request (@mafintosh) +- [b279277](https://github.com/mikeal/request/commit/b279277dc2fb4b649640322980315d74db0d13f3) response.abort should be response.destroy (@mafintosh) +- [#454](https://github.com/mikeal/request/pull/454) Destroy the response if present when destroying the request (clean merge) (@mafintosh) +- [#429](https://github.com/mikeal/request/pull/429) Copy options before adding callback. (@nrn) +- [e0e0fb4](https://github.com/mikeal/request/commit/e0e0fb451f17945a02203639e4836aa327b4e30b) hawk 0.9.0 (@hueniverse) +- [#456](https://github.com/mikeal/request/pull/456) hawk 0.9.0 (@hueniverse) +- [2f60bc2](https://github.com/mikeal/request/commit/2f60bc253ff6e28df58a33da24b710b6d506849f) Fixes #453 (@mikeal) +- [805b6e4](https://github.com/mikeal/request/commit/805b6e4fe3afeeb407b4fca2e34e9caabe30f747) Fixing hawk README to match new usage. (@mikeal) +- [8feb957](https://github.com/mikeal/request/commit/8feb957911083bce552d1898b7ffcaa87104cd21) Removing old logref code. (@mikeal) +- [fcf6d67](https://github.com/mikeal/request/commit/fcf6d6765247a2645a233d95468ade2960294074) Safe stringify. (@mikeal) +- [62455bc](https://github.com/mikeal/request/commit/62455bca81e8760f25a2bf1dec2b06c8e915de79) hawk 0.10 (@hueniverse) +- [c361b41](https://github.com/mikeal/request/commit/c361b4140e7e6e4fe2a8f039951b65d54af65f42) hawk 0.10 (@hueniverse) +- [fa1ef30](https://github.com/mikeal/request/commit/fa1ef30dcdac83b271ce38c71975df0ed96b08f7) Strip the UTF8 BOM from a UTF encoded response (@kppullin) +- [9d636c0](https://github.com/mikeal/request/commit/9d636c0b3e882742e15ba989d0c2413f95364680) if query params are empty, then request path shouldn't end with a '?' (@jaipandya) +- [#462](https://github.com/mikeal/request/pull/462) if query params are empty, then request path shouldn't end with a '?' (merges cleanly now) (@jaipandya) +- [#460](https://github.com/mikeal/request/pull/460) hawk 0.10.0 (@hueniverse) +- [#461](https://github.com/mikeal/request/pull/461) Strip the UTF8 BOM from a UTF encoded response (@kppullin) +- [6d29ed7](https://github.com/mikeal/request/commit/6d29ed72e34f3b2b6d8a5cfadd96dd26b3dd246d) Moving response handlers to onResponse. (@mikeal) +- [885d6eb](https://github.com/mikeal/request/commit/885d6ebeb6130c2ab7624304f4a01a898573390b) Using querystring library from visionmedia (@kbackowski) +- [#471](https://github.com/mikeal/request/pull/471) Using querystring library from visionmedia (@kbackowski) +- [346bb42](https://github.com/mikeal/request/commit/346bb42898c5804576d9e9b3adf40123260bf73b) On strictSSL set rejectUnauthorized. (@mikeal) +- [8a45365](https://github.com/mikeal/request/commit/8a453656a705d2fa98fbf9092b1600d2ddadbb5a) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [32cfd3c](https://github.com/mikeal/request/commit/32cfd3cf7b3f23c2b1d36c5ccb475cbb3a4693ff) Style changes. (@mikeal) +- [ec07ee2](https://github.com/mikeal/request/commit/ec07ee2d3eeb90b6d0ad9f6d7f3a36da72276841) Print debug logs NODE_DEBUG=request in environment (@isaacs) +- [681af64](https://github.com/mikeal/request/commit/681af644a2ebccad8bcccb75984f7f10f909b382) Flow data in v0.10-style streams (@isaacs) +- [#473](https://github.com/mikeal/request/pull/473) V0.10 compat (@isaacs) +- [f07a8ba](https://github.com/mikeal/request/commit/f07a8baebf7001addbc0f7d7c869adddc21768ce) Release. (@mikeal) +- [1f947a1](https://github.com/mikeal/request/commit/1f947a1d2728147fbf4f57aa361d0bedcebfc206) Rolling master version. (@mikeal) +- [7a217bb](https://github.com/mikeal/request/commit/7a217bbdced9a05a786fe6534ab52734df342d3e) Reinstate querystring for `unescape` (@shimaore) +- [b0b4ca9](https://github.com/mikeal/request/commit/b0b4ca913e119337e9313a157eee2f08f77ddc38) Test for `unescape` (@shimaore) +- [#475](https://github.com/mikeal/request/pull/475) Use `unescape` from `querystring` (@shimaore) +- [28fc741](https://github.com/mikeal/request/commit/28fc741fa958a9783031189964ef6f6d7e3f3264) Release. (@mikeal) +- [d3e28ef](https://github.com/mikeal/request/commit/d3e28ef7144da4d9f22f8fb475bd5aa6a80fb947) Rolling master version. (@mikeal) +- [8f8bb9e](https://github.com/mikeal/request/commit/8f8bb9ee8c4dcd9eb815249fbe2a7cf54f61b56f) Changing so if Accept header is explicitly set, sending json does not overwrite. (@RoryH) +- [#479](https://github.com/mikeal/request/pull/479) Changing so if Accept header is explicitly set, sending json does not ov... (@RoryH) +- [7694372](https://github.com/mikeal/request/commit/7694372f3dc9d57ac29ca7ee5c00146aa5e1e747) Proper version for latest. (@mikeal) +- [aa208cf](https://github.com/mikeal/request/commit/aa208cf5c682262529d749f592db147182cacfaf) 0.8+ only now (@mikeal) +- [16b5ab9](https://github.com/mikeal/request/commit/16b5ab9151823067b05b382241483ef10811c3e1) Upgrading qs. (@mikeal) +- [7d10c1e](https://github.com/mikeal/request/commit/7d10c1e83b4663f592c773e7fece83435585a06f) Merge branch 'master' of github.com:mikeal/request (@mikeal) +- [b8ca4b4](https://github.com/mikeal/request/commit/b8ca4b474b8215cab44ef8ef789303571b3d016f) pumping hawk version. (@mikeal) +- [9c0e484](https://github.com/mikeal/request/commit/9c0e48430e3a9de8715e77c07c98301399eaf6e3) release (@mikeal) +- [a9f1896](https://github.com/mikeal/request/commit/a9f189697e2a813bee9bff31de32a25e99e55cf2) rolling master version. (@mikeal) +- [560a1f8](https://github.com/mikeal/request/commit/560a1f8b927099e44b75274375a690df2a05de67) Set content-type on input. (@mikeal) +- [5fec436](https://github.com/mikeal/request/commit/5fec436b6602bc8c76133664bca23e98f511b096) Release. (@mikeal) +- [88d8d5b](https://github.com/mikeal/request/commit/88d8d5bc80679b78a39cab8e6d8295728a0a150d) Rolling version. (@mikeal) +- [d05b6ba](https://github.com/mikeal/request/commit/d05b6ba72702c2411b4627d4d89190a5f2aba562) Empty body must be passed as empty string, exclude JSON case (@Olegas) +- [#490](https://github.com/mikeal/request/pull/490) Empty response body (3-rd argument) must be passed to callback as an empty string (@Olegas) +- [8aa13cd](https://github.com/mikeal/request/commit/8aa13cd5b5e22b24466ef0e59fa8b5f1d0f0795a) Added redirect event (@Cauldrath) +- [4d63a04](https://github.com/mikeal/request/commit/4d63a042553c90718bf0b90652921b26c52dcb31) Moving response emit above setHeaders on destination streams (@kenperkins) +- [#498](https://github.com/mikeal/request/pull/498) Moving response emit above setHeaders on destination streams (@kenperkins) +- [c40993f](https://github.com/mikeal/request/commit/c40993fc987b1a8a3cb08cd5699b2f1b2bd4b28b) Fix a regression introduced by cba36ce6 (@nylen) +- [edc2e17](https://github.com/mikeal/request/commit/edc2e17e8154239efa6bd2914435798c18882635) Don't delete headers when retrying a request with proper authentication (@nylen) +- [a375ac1](https://github.com/mikeal/request/commit/a375ac15460f4f3b679f4418d7fc467a5cc94499) Refactor and expand basic auth tests (@nylen) +- [9bc28bf](https://github.com/mikeal/request/commit/9bc28bf912fb0afdd14b36b0ccbafb185a32546a) Cleanup whitespace. (@mikeal) +- [9a35cd2](https://github.com/mikeal/request/commit/9a35cd2248d9492b099c7ee46d68ca017b6a701c) Fix basic auth for passwords that contain colons (@tonistiigi) +- [f724810](https://github.com/mikeal/request/commit/f724810c7b9f82fa1423d0a4d19fcb5aaca98137) Honor the .strictSSL option when using proxies (tunnel-agent) (@jhs) +- [95a2558](https://github.com/mikeal/request/commit/95a25580375be1b9c39cc2e88a36a8387395bc13) Add HTTP Signature support. (@davidlehn) +- [921c973](https://github.com/mikeal/request/commit/921c973015721ee0f92ed670f5e88bca057104cc) * Make password optional to support the format: http://username@hostname/ +- [2759ebb](https://github.com/mikeal/request/commit/2759ebbe07e8563fd3ded698d2236309fb28176b) add 'localAddress' support (@yyfrankyy) +- [#513](https://github.com/mikeal/request/pull/513) add 'localAddress' support (@yyfrankyy) +- [#512](https://github.com/mikeal/request/pull/512) Make password optional to support the format: http://username@hostname/ (@pajato1) +- [#508](https://github.com/mikeal/request/pull/508) Honor the .strictSSL option when using proxies (tunnel-agent) (@iriscouch) +- [5f036e6](https://github.com/mikeal/request/commit/5f036e6f5d3102a89e5401a53090a0627a7850a8) Conflicts: index.js (@nylen) +- [89d2602](https://github.com/mikeal/request/commit/89d2602ef4e3a4e6e51284f6a29b5767c79ffaba) Conflicts: README.md (@davidlehn) +- [#502](https://github.com/mikeal/request/pull/502) Fix POST (and probably other) requests that are retried after 401 Unauthorized (@nylen) +- [eb3e033](https://github.com/mikeal/request/commit/eb3e033170403832fe7070955db32112ec46005f) Merge branch 'master' of git://github.com/mikeal/request (@davidlehn) +- [#510](https://github.com/mikeal/request/pull/510) Add HTTP Signature support. (@digitalbazaar) +- [227d998](https://github.com/mikeal/request/commit/227d9985426214b6ac68702933346000298d7790) Update the internal path variable when querystring is changed (@jblebrun) +- [#519](https://github.com/mikeal/request/pull/519) Update internal path state on post-creation QS changes (@incredible-labs) +- [428b9c1](https://github.com/mikeal/request/commit/428b9c1ad9831b7dfd6cec4ce68df358590c6d65) Fixing test-tunnel.js (@noway421) +- [2417599](https://github.com/mikeal/request/commit/24175993f6c362f7fca5965feb0a11756f00baf3) Improving test-localAddress.js (@noway421) +- [#520](https://github.com/mikeal/request/pull/520) Fixing test-tunnel.js (@noway421) +- [1e37f1b](https://github.com/mikeal/request/commit/1e37f1bea45174e09e6450bc71dfc081c8cd94de) Some explaining comments (@noway421) +- [909b024](https://github.com/mikeal/request/commit/909b024619c9e47f615749661d610cccd8421d80) Updating dependencies (@noway421) +- [#523](https://github.com/mikeal/request/pull/523) Updating dependencies (@noway421) +- [47191e1](https://github.com/mikeal/request/commit/47191e1a5e29714fb0c5f8b2162b2971570df644) 2.17.0 (@mikeal) +- [14def5a](https://github.com/mikeal/request/commit/14def5af5903d03f66bd6c9be534e6b76f47c063) 2.18.0 (@mikeal) +- [56fd6b7](https://github.com/mikeal/request/commit/56fd6b7ec6da162894df0809126d688f30900d25) 2.18.1 (@mikeal) +- [37dd689](https://github.com/mikeal/request/commit/37dd68989670f8937b537579a4299d9649b8aa16) Fixing dep. (@mikeal) +- [dd7209a](https://github.com/mikeal/request/commit/dd7209a84dd40afe87db31c6ab66885e2015cb8f) 2.19.0 (@mikeal) +- [62f3b92](https://github.com/mikeal/request/commit/62f3b9203690d4ad34486fc506fc78a1c9971e03) 2.19.1 (@mikeal) +- [74c6b2e](https://github.com/mikeal/request/commit/74c6b2e315872980ee9a9a000d25e724138f28b1) Adding test for onelineproxy. (@mikeal) +- [2a01cc0](https://github.com/mikeal/request/commit/2a01cc082f544647f7176a992e02668519a694be) Fixing onelineproxy. (@mikeal) +- [8b4c920](https://github.com/mikeal/request/commit/8b4c9203adb372f2ee99b1b012406b482b27c68d) 2.20.0 (@mikeal) +- [d8d4a33](https://github.com/mikeal/request/commit/d8d4a3311d8d31df88fa8a2ab3265872e5cb97ae) 2.20.1 (@mikeal) +- [5937012](https://github.com/mikeal/request/commit/59370123b22e8c971e4ee48c3d0caf920d890bda) dependencies versions bump (@jodaka) +- [#529](https://github.com/mikeal/request/pull/529) dependencies versions bump (@jodaka) +- [#521](https://github.com/mikeal/request/pull/521) Improving test-localAddress.js (@noway421) +- [#503](https://github.com/mikeal/request/pull/503) Fix basic auth for passwords that contain colons (@tonistiigi) +- [#497](https://github.com/mikeal/request/pull/497) Added redirect event (@Cauldrath) +- [297a9ea](https://github.com/mikeal/request/commit/297a9ea827655e5fb406a86907bb0d89b01deae8) fix typo (@fredericosilva) +- [#532](https://github.com/mikeal/request/pull/532) fix typo (@fredericosilva) +- [3691db5](https://github.com/mikeal/request/commit/3691db5a2d0981d4aeabfda5b988a5c69074e187) Allow explicitly empty user field for basic authentication. (@mikeando) +- [#536](https://github.com/mikeal/request/pull/536) Allow explicitly empty user field for basic authentication. (@mikeando) +- [5d36e32](https://github.com/mikeal/request/commit/5d36e324047f79cbbf3bb9b71fef633f02b36367) 2.21.0 (@mikeal) +- [9bd98d6](https://github.com/mikeal/request/commit/9bd98d6052f222aa348635c1acb2e2c99eed0f8c) 2.21.1 (@mikeal) +- [a918e04](https://github.com/mikeal/request/commit/a918e04a8d767a2948567ea29ed3fdd1650c16b1) The exported request function doesn't have an auth method (@tschaub) +- [1ebe1ac](https://github.com/mikeal/request/commit/1ebe1ac2f78e8a6149c03ce68fcb23d56df2316e) exposing Request class (@regality) +- [#542](https://github.com/mikeal/request/pull/542) Expose Request class (@ifit) +- [467573d](https://github.com/mikeal/request/commit/467573d17b4db5f93ed425ace0594370a7820c7c) Update http-signatures version. (@davidlehn) +- [#541](https://github.com/mikeal/request/pull/541) The exported request function doesn't have an auth method (@tschaub) +- [3040bbe](https://github.com/mikeal/request/commit/3040bbe5de846811151dab8dc09944acc93a338e) Fix redirections, (@criloz) +- [#564](https://github.com/mikeal/request/pull/564) Fix redirections (@NebTex) +- [397b435](https://github.com/mikeal/request/commit/397b4350fcf885460d7dced94cf1db1f5c167f80) handle ciphers and secureOptions in agentOptions (@SamPlacette) +- [65a2778](https://github.com/mikeal/request/commit/65a27782db7d2798b6490ea08efacb8f3b0a401c) tests and fix for null agentOptions case (@SamPlacette) +- [#568](https://github.com/mikeal/request/pull/568) use agentOptions to create agent when specified in request (@SamPlacette) +- [c116920](https://github.com/mikeal/request/commit/c116920a2cbef25afe2e1bbcf4df074e1e2f9dbb) Let's see how we do with only the main guard. (@mikeal) +- [f54a335](https://github.com/mikeal/request/commit/f54a3358119298634a7b0c29a21bf1471fc23d98) Fix spelling of "ignoring." (@bigeasy) +- [5cd215f](https://github.com/mikeal/request/commit/5cd215f327e113dc6c062634e405c577986cfd3c) Change isUrl regex to accept mixed case (@lexander) +- [02c8e74](https://github.com/mikeal/request/commit/02c8e749360a47d45e3e7b51b7f751fe498d2f25) #583 added tests for isUrl regex change. (@lexander) +- [#581](https://github.com/mikeal/request/pull/581) Fix spelling of "ignoring." (@bigeasy) +- [#544](https://github.com/mikeal/request/pull/544) Update http-signature version. (@digitalbazaar) +- [e77746b](https://github.com/mikeal/request/commit/e77746bf42e974dc91a84d03f44f750dd7ee0989) global cookie jar disabled by default, send jar: true to enable. (@threepointone) +- [46015ac](https://github.com/mikeal/request/commit/46015ac8d5b74f8107a6ec9fd07c133f46c5d833) 2.22.0 (@mikeal) +- [e5da4a5](https://github.com/mikeal/request/commit/e5da4a5e1a20bf4f23681f7b996f22c5fadae91d) 2.22.1 (@mikeal) +- [#587](https://github.com/mikeal/request/pull/587) Global cookie jar disabled by default (@threepointone) +- [fac9da1](https://github.com/mikeal/request/commit/fac9da1cc426bf0a4bcc5f0b7d0d0aea8b1cce38) Prevent setting headers after they are sent (@wpreul) +- [#589](https://github.com/mikeal/request/pull/589) Prevent setting headers after they are sent (@wpreul) +- [bc1537a](https://github.com/mikeal/request/commit/bc1537ab79064cea532b0d14110ce4e49a663bde) Emit complete event when there is no callback +- [de8508e](https://github.com/mikeal/request/commit/de8508e9feac10563596aeee26727567b3c2e33c) Added check to see if the global pool is being used before using the global agent (@Cauldrath) +- [03441ef](https://github.com/mikeal/request/commit/03441ef919e51a742aaf9e168d917e97e2d9eb6b) 2.23.0 (@mikeal) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md new file mode 100644 index 0000000..06367a1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md @@ -0,0 +1,29 @@ +# This is an OPEN Open Source Project + +----------------------------------------- + +## What? + +Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. + +## Rules + +There are a few basic ground-rules for contributors: + +1. **No `--force` pushes** or modifying the Git history in any way. +1. **Non-master branches** ought to be used for ongoing work. +1. **External API changes and significant modifications** ought to be subject to an **internal pull-request** to solicit feedback from other contributors. +1. Internal pull-requests to solicit feedback are *encouraged* for any other non-trivial contribution but left to the discretion of the contributor. +1. For significant changes wait a full 24 hours before merging so that active contributors who are distributed throughout the world have a chance to weigh in. +1. Contributors should attempt to adhere to the prevailing code-style. + + +## Releases + +Declaring formal releases remains the prerogative of the project maintainer. + +## Changes to this arrangement + +This is an experiment and feedback is welcome! This document may also be subject to pull-requests or changes by contributors where you believe you have something valuable to add or change. + +----------------------------------------- diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/README.md new file mode 100644 index 0000000..fef1fea --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/README.md @@ -0,0 +1,543 @@ +# Request — Simplified HTTP client + +[![NPM](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/) + +## Super simple to use + +Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. + +```javascript +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. + } +}) +``` + +## Streaming + +You can stream any response to a file stream. + +```javascript +request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) +``` + +You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one). + +```javascript +fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) +``` + +Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers. + +```javascript +request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) +``` + +Now let’s get fancy. + +```javascript +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + if (req.method === 'PUT') { + req.pipe(request.put('http://mysite.com/doodle.png')) + } else if (req.method === 'GET' || req.method === 'HEAD') { + request.get('http://mysite.com/doodle.png').pipe(resp) + } + } +}) +``` + +You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do: + +```javascript +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + var x = request('http://mysite.com/doodle.png') + req.pipe(x) + x.pipe(resp) + } +}) +``` + +And since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :) + +```javascript +req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) +``` + +Also, none of this new functionality conflicts with requests previous features, it just expands them. + +```javascript +var r = request.defaults({'proxy':'http://localproxy.com'}) + +http.createServer(function (req, resp) { + if (req.url === '/doodle.png') { + r.get('http://google.com/doodle.png').pipe(resp) + } +}) +``` + +You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. + +## Proxies + +If you specify a `proxy` option, then the request (and any subsequent +redirects) will be sent via a connection to the proxy server. + +If your endpoint is an `https` url, and you are using a proxy, then +request will send a `CONNECT` request to the proxy server *first*, and +then use the supplied connection to connect to the endpoint. + +That is, first it will make a request like: + +``` +HTTP/1.1 CONNECT endpoint-server.com:80 +Host: proxy-server.com +User-Agent: whatever user agent you specify +``` + +and then the proxy server make a TCP connection to `endpoint-server` +on port `80`, and return a response that looks like: + +``` +HTTP/1.1 200 OK +``` + +At this point, the connection is left open, and the client is +communicating directly with the `endpoint-server.com` machine. + +See [the wikipedia page on HTTP Tunneling](http://en.wikipedia.org/wiki/HTTP_tunnel) +for more information. + +By default, when proxying `http` traffic, request will simply make a +standard proxied `http` request. This is done by making the `url` +section of the initial line of the request a fully qualified url to +the endpoint. + +For example, it will make a single request that looks like: + +``` +HTTP/1.1 GET http://endpoint-server.com/some-url +Host: proxy-server.com +Other-Headers: all go here + +request body or whatever +``` + +Because a pure "http over http" tunnel offers no additional security +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`. + +If you are using a tunneling proxy, you may set the +`proxyHeaderWhiteList` to share certain headers with the proxy. + +By default, this set is: + +``` +accept +accept-charset +accept-encoding +accept-language +accept-ranges +cache-control +content-encoding +content-language +content-length +content-location +content-md5 +content-range +content-type +connection +date +expect +max-forwards +pragma +proxy-authorization +referer +te +transfer-encoding +user-agent +via +``` + +Note that, when using a tunneling proxy, the `proxy-authorization` +header is *never* sent to the endpoint server, but only to the proxy +server. All other headers are sent as-is over the established +connection. + +## UNIX Socket + +`request` supports the `unix://` protocol for all requests. The path is assumed to be absolute to the root of the host file system. + +HTTP paths are extracted from the supplied URL by testing each level of the full URL against net.connect for a socket response. + +Thus the following request will GET `/httppath` from the HTTP server listening on `/tmp/unix.socket` + +```javascript +request.get('unix://tmp/unix.socket/httppath') +``` + +## Forms + +`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. + +URL-encoded forms are simple. + +```javascript +request.post('http://service.com/upload', {form:{key:'value'}}) +// or +request.post('http://service.com/upload').form({key:'value'}) +``` + +For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don’t need to worry about piping the form object or setting the headers, `request` will handle that for you. + +```javascript +var r = request.post('http://service.com/upload', function optionalCallback (err, httpResponse, body) { + if (err) { + return console.error('upload failed:', err); + } + console.log('Upload successful! Server responded with:', body); +}) +var form = r.form() +form.append('my_field', 'my_value') +form.append('my_buffer', new Buffer([1, 2, 3])) +form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))) +form.append('remote_file', request('http://google.com/doodle.png')) + +// Just like always, `r` is a writable stream, and can be used as such (you have until nextTick to pipe it, etc.) +// Alternatively, you can provide a callback (that's what this example does — see `optionalCallback` above). +``` + +## HTTP Authentication + +```javascript +request.get('http://some.server.com/').auth('username', 'password', false); +// or +request.get('http://some.server.com/', { + 'auth': { + 'user': 'username', + 'pass': 'password', + 'sendImmediately': false + } +}); +// or +request.get('http://some.server.com/').auth(null, null, true, 'bearerToken'); +// or +request.get('http://some.server.com/', { + 'auth': { + 'bearer': 'bearerToken' + } +}); +``` + +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)`. + +`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). + +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. + +```javascript +var username = 'username', + password = 'password', + url = 'http://' + username + ':' + password + '@some.server.com'; + +request({url: url}, function (error, response, body) { + // Do more stuff with 'body' here +}); +``` + +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. + +## OAuth Signing + +```javascript +// Twitter OAuth +var qs = require('querystring') + , oauth = + { callback: 'http://mysite.com/callback/' + , consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + } + , url = 'https://api.twitter.com/oauth/request_token' + ; +request.post({url:url, oauth:oauth}, function (e, r, body) { + // Ideally, you would take the body in the response + // 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) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: access_token.oauth_token + , verifier: access_token.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) + , oauth = + { consumer_key: CONSUMER_KEY + , consumer_secret: CONSUMER_SECRET + , token: perm_token.oauth_token + , token_secret: perm_token.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 += qs.stringify(params) + request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { + console.log(user) + }) + }) +}) +``` + +## Custom HTTP Headers + +HTTP Headers, such as `User-Agent`, can be set in the `options` object. +In the example below, we call the github API to find out the number +of stars and forks for the request repository. This requires a +custom `User-Agent` header as well as https. + +```javascript +var request = require('request'); + +var options = { + url: 'https://api.github.com/repos/mikeal/request', + headers: { + 'User-Agent': 'request' + } +}; + +function callback(error, response, body) { + if (!error && response.statusCode == 200) { + var info = JSON.parse(body); + console.log(info.stargazers_count + " Stars"); + console.log(info.forks_count + " Forks"); + } +} + +request(options, callback); +``` + +## request(options, callback) + +The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional. + +* `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()` +* `qs` - object containing querystring values to be appended to the `uri` +* `method` - http method (default: `"GET"`) +* `headers` - http headers (default: `{}`) +* `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer` or `String`. +* `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no options, a `FormData` instance is returned (and is piped to request). +* `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. +* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. +* `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise. +* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`) +* `maxRedirects` - the maximum number of redirects to follow (default: `10`) +* `encoding` - Encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. +* `pool` - A hash object containing the agents for these requests. If omitted, the request will use the global pool (which is set to node's default `maxSockets`) +* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. +* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request +* `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). +* `strictSSL` - If `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option. +* `jar` - If `true` and `tough-cookie` is installed, remember cookies for future use (or define your custom cookie jar; see examples section) +* `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`. Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services) +* `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. +* `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. +* `proxyHeaderWhiteList` - A whitelist of headers to send to a + tunneling proxy. + + +The callback argument gets 3 arguments: + +1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object) +2. An [`http.IncomingMessage`](http://nodejs.org/api/http.html#http_http_incomingmessage) object +3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied) + +## Convenience methods + +There are also shorthand methods for different HTTP METHODs and some other conveniences. + +### request.defaults(options) + +This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. + +**Note:** You can call `.defaults()` on the wrapper that is returned from `request.defaults` to add/override defaults that were previously defaulted. + +For example: +```javascript +//requests using baseRequest() will set the 'x-token' header +var baseRequest = request.defaults({ + headers: {x-token: 'my-token'} +}) + +//requests using specialRequest() will include the 'x-token' header set in +//baseRequest and will also include the 'special' header +var specialRequest = baseRequest.defaults({ + headers: {special: 'special value'} +}) +``` + +### request.put + +Same as `request()`, but defaults to `method: "PUT"`. + +```javascript +request.put(url) +``` + +### request.patch + +Same as `request()`, but defaults to `method: "PATCH"`. + +```javascript +request.patch(url) +``` + +### request.post + +Same as `request()`, but defaults to `method: "POST"`. + +```javascript +request.post(url) +``` + +### request.head + +Same as request() but defaults to `method: "HEAD"`. + +```javascript +request.head(url) +``` + +### request.del + +Same as `request()`, but defaults to `method: "DELETE"`. + +```javascript +request.del(url) +``` + +### request.get + +Same as `request()` (for uniformity). + +```javascript +request.get(url) +``` +### request.cookie + +Function that creates a new cookie. + +```javascript +request.cookie('cookie_string_here') +``` +### request.jar + +Function that creates a new cookie jar. + +```javascript +request.jar() +``` + + +## Examples: + +```javascript + var request = require('request') + , rand = Math.floor(Math.random()*100000000).toString() + ; + request( + { method: 'PUT' + , uri: 'http://mikeal.iriscouch.com/testjs/' + rand + , multipart: + [ { 'content-type': 'application/json' + , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) + } + , { body: 'I am an attachment' } + ] + } + , function (error, response, body) { + if(response.statusCode == 201){ + console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) + } else { + console.log('error: '+ response.statusCode) + console.log(body) + } + } + ) +``` + +Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`) and install `tough-cookie`. + +```javascript +var request = request.defaults({jar: true}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +To use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`) + +```javascript +var j = request.jar() +var request = request.defaults({jar:j}) +request('http://www.google.com', function () { + request('http://images.google.com') +}) +``` + +OR + +```javascript +// `npm install --save tough-cookie` before this works +var j = request.jar() +var cookie = request.cookie('your_cookie_here') +j.setCookie(cookie, uri); +request({url: 'http://www.google.com', jar: j}, function () { + request('http://images.google.com') +}) +``` + +To inspect your cookie jar after a request + +```javascript +var j = request.jar() +request({url: 'http://www.google.com', jar: j}, function () { + var cookie_string = j.getCookieStringSync(uri); // "key1=value1; key2=value2; ..." + var cookies = j.getCookiesSync(uri); + // [{key: 'key1', value: 'value1', domain: "www.google.com", ...}, ...] +}) +``` + +## Debugging + +There are at least three ways to debug the operation of `request`: + +1. Launch the node process like `NODE_DEBUG=request node script.js` + (`lib,request,otherlib` works too). + +2. Set `require('request').debug = true` at any time (this does the same thing + as #1). + +3. Use the [request-debug module](https://github.com/nylen/request-debug) to + view request and response headers and bodies. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/disabled.appveyor.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/disabled.appveyor.yml new file mode 100644 index 0000000..238f3d6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/disabled.appveyor.yml @@ -0,0 +1,36 @@ +# http://www.appveyor.com/docs/appveyor-yml + +# Fix line endings in Windows. (runs before repo cloning) +init: + - git config --global core.autocrlf input + +# Test against these versions of Node.js. +environment: + matrix: + - nodejs_version: "0.10" + - nodejs_version: "0.8" + - nodejs_version: "0.11" + +# Allow failing jobs for bleeding-edge Node.js versions. +matrix: + allow_failures: + - nodejs_version: "0.11" + +# Install scripts. (runs after repo cloning) +install: + # Get the latest stable version of Node 0.STABLE.latest + - ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version) + # Typical npm stuff. + - npm install + +# Post-install test scripts. +test_script: + # Output useful info for debugging. + - ps: "npm test # PowerShell" # Pass comment to PS for easier debugging + - cmd: npm test + +# Don't actually build. +build: off + +# Set build version format here instead of in the admin panel. +version: "{build}" diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/index.js new file mode 100755 index 0000000..ced8bd9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/index.js @@ -0,0 +1,166 @@ +// Copyright 2010-2012 Mikeal Rogers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +var extend = require('util')._extend + , cookies = require('./lib/cookies') + , copy = require('./lib/copy') + , helpers = require('./lib/helpers') + , isFunction = helpers.isFunction + , constructObject = helpers.constructObject + , filterForCallback = helpers.filterForCallback + , constructOptionsFrom = helpers.constructOptionsFrom + , paramsHaveRequestBody = helpers.paramsHaveRequestBody + ; + +// organize params for patch, post, put, head, del +function initParams(uri, options, callback) { + callback = filterForCallback([options, callback]) + options = constructOptionsFrom(uri, options) + + return constructObject() + .extend({callback: callback}) + .extend({options: options}) + .extend({uri: options.uri}) + .done() +} + +function request (uri, options, callback) { + if (typeof uri === 'undefined') + throw new Error('undefined is not a valid uri or options object.') + + var params = initParams(uri, options, callback) + options = params.options + options.callback = params.callback + options.uri = params.uri + + return new request.Request(options) +} + +function requester(params) { + if(typeof params.options._requester === 'function') + return params.options._requester + return request +} + +request.get = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'GET' + return requester(params)(params.uri || null, params.options, params.callback) +} + +request.head = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'HEAD' + + if (paramsHaveRequestBody(params)) + throw new Error("HTTP HEAD requests MUST NOT include a request body.") + + return requester(params)(params.uri || null, params.options, params.callback) +} + +request.post = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'POST' + return requester(params)(params.uri || null, params.options, params.callback) +} + +request.put = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'PUT' + return requester(params)(params.uri || null, params.options, params.callback) +} + +request.patch = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'PATCH' + return requester(params)(params.uri || null, params.options, params.callback) +} + +request.del = function (uri, options, callback) { + var params = initParams(uri, options, callback) + params.options.method = 'DELETE' + return requester(params)(params.uri || null, params.options, params.callback) +} + +request.jar = function () { + return cookies.jar() +} + +request.cookie = function (str) { + return cookies.parse(str) +} + +request.defaults = function (options, requester) { + + var wrap = function (method) { + var headerlessOptions = function (options) { + options = extend({}, options) + delete options.headers + return options + } + + var getHeaders = function (params, options) { + return constructObject() + .extend(options.headers) + .extend(params.options.headers) + .done() + } + + return function (uri, opts, callback) { + var params = initParams(uri, opts, callback) + params.options = extend(headerlessOptions(options), params.options) + + if (options.headers) + params.options.headers = getHeaders(params, options) + + if (isFunction(requester)) { + if (method === request) { + method = requester + } else { + params.options._requester = requester + } + } + + return method(params.options, params.callback) + } + } + + defaults = wrap(this) + defaults.get = wrap(this.get) + defaults.patch = wrap(this.patch) + defaults.post = wrap(this.post) + defaults.put = wrap(this.put) + defaults.head = wrap(this.head) + defaults.del = wrap(this.del) + defaults.cookie = wrap(this.cookie) + defaults.jar = this.jar + defaults.defaults = this.defaults + return defaults +} + +request.forever = function (agentOptions, optionsArg) { + var options = constructObject() + if (optionsArg) options.extend(optionsArg) + if (agentOptions) options.agentOptions = agentOptions + + options.extend({forever: true}) + return request.defaults(options.done()) +} + +// Exports + +module.exports = request +request.Request = require('./request') +request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG) +request.initParams = initParams diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js new file mode 100644 index 0000000..07a9f36 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js @@ -0,0 +1,28 @@ +var optional = require('./optional') + , tough = optional('tough-cookie') + , Cookie = tough && tough.Cookie + , CookieJar = tough && tough.CookieJar + ; + +exports.parse = function(str) { + if (str && str.uri) str = str.uri + if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") + if (!Cookie) { + return null; + } + return Cookie.parse(str) +}; + +exports.jar = function() { + if (!CookieJar) { + // tough-cookie not loaded, return a stub object: + return { + setCookieSync: function(){}, + getCookieStringSync: function(){}, + getCookiesSync: function(){} + }; + } + var jar = new CookieJar(); + jar._jar = jar; // For backwards compatibility + return jar; +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/copy.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/copy.js new file mode 100644 index 0000000..56831ff --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/copy.js @@ -0,0 +1,8 @@ +module.exports = +function copy (obj) { + var o = {} + Object.keys(obj).forEach(function (i) { + o[i] = obj[i] + }) + return o +} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/debug.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/debug.js new file mode 100644 index 0000000..d61ec88 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/debug.js @@ -0,0 +1,9 @@ +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js new file mode 100644 index 0000000..27a38f4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js @@ -0,0 +1,50 @@ +var extend = require('util')._extend + +function constructObject(initialObject) { + initialObject = initialObject || {} + + return { + extend: function (object) { + return constructObject(extend(initialObject, object)) + }, + done: function () { + return initialObject + } + } +} + +function constructOptionsFrom(uri, options) { + var params = constructObject() + if (typeof options === 'object') { + params.extend(options).extend({uri: uri}) + } else if (typeof uri === 'string') { + params.extend({uri: uri}) + } else { + params.extend(uri) + } + return params.done() +} + +function filterForCallback(values) { + var callbacks = values.filter(isFunction) + return callbacks[0] +} + +function isFunction(value) { + return typeof value === 'function' +} + +function paramsHaveRequestBody(params) { + return ( + params.options.body || + params.options.requestBodyStream || + (params.options.json && typeof params.options.json !== 'boolean') || + params.options.multipart + ) +} + +exports.isFunction = isFunction +exports.constructObject = constructObject +exports.constructOptionsFrom = constructOptionsFrom +exports.filterForCallback = filterForCallback +exports.paramsHaveRequestBody = paramsHaveRequestBody diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/optional.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/optional.js new file mode 100644 index 0000000..af0cc15 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/lib/optional.js @@ -0,0 +1,13 @@ +module.exports = function(moduleName) { + try { + return module.parent.require(moduleName); + } catch (e) { + // This could mean that we are in a browser context. + // Add another try catch like it used to be, for backwards compability + // and browserify reasons. + try { + return require(moduleName); + } + catch (e) {} + } +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md new file mode 100644 index 0000000..763564e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md @@ -0,0 +1,4 @@ +aws-sign +======== + +AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js new file mode 100644 index 0000000..576e49d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js @@ -0,0 +1,202 @@ + +/*! + * knox - auth + * Copyright(c) 2010 LearnBoost + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var crypto = require('crypto') + , parse = require('url').parse + ; + +/** + * Valid keys. + */ + +var keys = + [ 'acl' + , 'location' + , 'logging' + , 'notification' + , 'partNumber' + , 'policy' + , 'requestPayment' + , 'torrent' + , 'uploadId' + , 'uploads' + , 'versionId' + , 'versioning' + , 'versions' + , 'website' + ] + +/** + * Return an "Authorization" header value with the given `options` + * in the form of "AWS :" + * + * @param {Object} options + * @return {String} + * @api private + */ + +function authorization (options) { + return 'AWS ' + options.key + ':' + sign(options) +} + +module.exports = authorization +module.exports.authorization = authorization + +/** + * Simple HMAC-SHA1 Wrapper + * + * @param {Object} options + * @return {String} + * @api private + */ + +function hmacSha1 (options) { + return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') +} + +module.exports.hmacSha1 = hmacSha1 + +/** + * Create a base64 sha1 HMAC for `options`. + * + * @param {Object} options + * @return {String} + * @api private + */ + +function sign (options) { + options.message = stringToSign(options) + return hmacSha1(options) +} +module.exports.sign = sign + +/** + * Create a base64 sha1 HMAC for `options`. + * + * Specifically to be used with S3 presigned URLs + * + * @param {Object} options + * @return {String} + * @api private + */ + +function signQuery (options) { + options.message = queryStringToSign(options) + return hmacSha1(options) +} +module.exports.signQuery= signQuery + +/** + * Return a string for sign() with the given `options`. + * + * Spec: + * + * \n + * \n + * \n + * \n + * [headers\n] + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function stringToSign (options) { + var headers = options.amazonHeaders || '' + if (headers) headers += '\n' + var r = + [ options.verb + , options.md5 + , options.contentType + , options.date ? options.date.toUTCString() : '' + , headers + options.resource + ] + return r.join('\n') +} +module.exports.queryStringToSign = stringToSign + +/** + * Return a string for sign() with the given `options`, but is meant exclusively + * for S3 presigned URLs + * + * Spec: + * + * \n + * + * + * @param {Object} options + * @return {String} + * @api private + */ + +function queryStringToSign (options){ + return 'GET\n\n\n' + options.date + '\n' + options.resource +} +module.exports.queryStringToSign = queryStringToSign + +/** + * Perform the following: + * + * - ignore non-amazon headers + * - lowercase fields + * - sort lexicographically + * - trim whitespace between ":" + * - join with newline + * + * @param {Object} headers + * @return {String} + * @api private + */ + +function canonicalizeHeaders (headers) { + var buf = [] + , fields = Object.keys(headers) + ; + for (var i = 0, len = fields.length; i < len; ++i) { + var field = fields[i] + , val = headers[field] + , field = field.toLowerCase() + ; + if (0 !== field.indexOf('x-amz')) continue + buf.push(field + ':' + val) + } + return buf.sort().join('\n') +} +module.exports.canonicalizeHeaders = canonicalizeHeaders + +/** + * Perform the following: + * + * - ignore non sub-resources + * - sort lexicographically + * + * @param {String} resource + * @return {String} + * @api private + */ + +function canonicalizeResource (resource) { + var url = parse(resource, true) + , path = url.pathname + , buf = [] + ; + + Object.keys(url.query).forEach(function(key){ + if (!~keys.indexOf(key)) return + var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) + buf.push(key + val) + }) + + return path + (buf.length ? '?' + buf.sort().join('&') : '') +} +module.exports.canonicalizeResource = canonicalizeResource diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json new file mode 100644 index 0000000..c72ab54 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json @@ -0,0 +1,47 @@ +{ + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "name": "aws-sign2", + "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.", + "version": "0.5.0", + "repository": { + "url": "https://github.com/mikeal/aws-sign" + }, + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "readme": "aws-sign\n========\n\nAWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/mikeal/aws-sign/issues" + }, + "_id": "aws-sign2@0.5.0", + "dist": { + "shasum": "c57103f7a17fc037f02d7c2e64b602ea223f7d63", + "tarball": "http://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" + }, + "_from": "aws-sign2@~0.5.0", + "_npmVersion": "1.3.2", + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "maintainers": [ + { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + } + ], + "directories": {}, + "_shasum": "c57103f7a17fc037f02d7c2e64b602ea223f7d63", + "_resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "homepage": "https://github.com/mikeal/aws-sign", + "scripts": {} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc new file mode 100644 index 0000000..c8ef3ca --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc @@ -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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml new file mode 100644 index 0000000..7ddb9c9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml @@ -0,0 +1,11 @@ +language: node_js +node_js: + - 0.8 + - "0.10" +branches: + only: + - master +notifications: + email: + - rod@vagg.org +script: npm test \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md new file mode 100644 index 0000000..ccb2479 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md @@ -0,0 +1,13 @@ +The MIT License (MIT) +===================== + +Copyright (c) 2014 bl contributors +---------------------------------- + +*bl contributors listed at * + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md new file mode 100644 index 0000000..1753cc4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md @@ -0,0 +1,195 @@ +# bl *(BufferList)* + +**A Node.js Buffer list collector, reader and streamer thingy.** + +[![NPM](https://nodei.co/npm/bl.png?downloads=true&downloadRank=true)](https://nodei.co/npm/bl/) +[![NPM](https://nodei.co/npm-dl/bl.png?months=6&height=3)](https://nodei.co/npm/bl/) + +**bl** is a storage object for collections of Node Buffers, exposing them with the main Buffer readable API. Also works as a duplex stream so you can collect buffers from a stream that emits them and emit buffers to a stream that consumes them! + +The original buffers are kept intact and copies are only done as necessary. Any reads that require the use of a single original buffer will return a slice of that buffer only (which references the same memory as the original buffer). Reads that span buffers perform concatenation as required and return the results transparently. + +```js +const BufferList = require('bl') + +var bl = new BufferList() +bl.append(new Buffer('abcd')) +bl.append(new Buffer('efg')) +bl.append('hi') // bl will also accept & convert Strings +bl.append(new Buffer('j')) +bl.append(new Buffer([ 0x3, 0x4 ])) + +console.log(bl.length) // 12 + +console.log(bl.slice(0, 10).toString('ascii')) // 'abcdefghij' +console.log(bl.slice(3, 10).toString('ascii')) // 'defghij' +console.log(bl.slice(3, 6).toString('ascii')) // 'def' +console.log(bl.slice(3, 8).toString('ascii')) // 'defgh' +console.log(bl.slice(5, 10).toString('ascii')) // 'fghij' + +// or just use toString! +console.log(bl.toString()) // 'abcdefghij\u0003\u0004' +console.log(bl.toString('ascii', 3, 8)) // 'defgh' +console.log(bl.toString('ascii', 5, 10)) // 'fghij' + +// other standard Buffer readables +console.log(bl.readUInt16BE(10)) // 0x0304 +console.log(bl.readUInt16LE(10)) // 0x0403 +``` + +Give it a callback in the constructor and use it just like **[concat-stream](https://github.com/maxogden/node-concat-stream)**: + +```js +const bl = require('bl') + , fs = require('fs') + +fs.createReadStream('README.md') + .pipe(bl(function (err, data) { // note 'new' isn't strictly required + // `data` is a complete Buffer object containing the full data + console.log(data.toString()) + })) +``` + +Note that when you use the *callback* method like this, the resulting `data` parameter is a concatenation of all `Buffer` objects in the list. If you want to avoid the overhead of this concatenation (in cases of extreme performance consciousness), then avoid the *callback* method and just listen to `'end'` instead, like a standard Stream. + +Or to fetch a URL using [hyperquest](https://github.com/substack/hyperquest) (should work with [request](http://github.com/mikeal/request) and even plain Node http too!): +```js +const hyperquest = require('hyperquest') + , bl = require('bl') + , url = 'https://raw.github.com/rvagg/bl/master/README.md' + +hyperquest(url).pipe(bl(function (err, data) { + console.log(data.toString()) +})) +``` + +Or, use it as a readable stream to recompose a list of Buffers to an output source: + +```js +const BufferList = require('bl') + , fs = require('fs') + +var bl = new BufferList() +bl.append(new Buffer('abcd')) +bl.append(new Buffer('efg')) +bl.append(new Buffer('hi')) +bl.append(new Buffer('j')) + +bl.pipe(fs.createWriteStream('gibberish.txt')) +``` + +## API + + * new BufferList([ callback ]) + * bl.length + * bl.append(buffer) + * bl.get(index) + * bl.slice([ start[, end ] ]) + * bl.copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ]) + * bl.duplicate() + * bl.consume(bytes) + * bl.toString([encoding, [ start, [ end ]]]) + * bl.readDoubleBE(), bl.readDoubleLE(), bl.readFloatBE(), bl.readFloatLE(), bl.readInt32BE(), bl.readInt32LE(), bl.readUInt32BE(), bl.readUInt32LE(), bl.readInt16BE(), bl.readInt16LE(), bl.readUInt16BE(), bl.readUInt16LE(), bl.readInt8(), bl.readUInt8() + * Streams + +-------------------------------------------------------- + +### new BufferList([ callback | buffer | buffer array ]) +The constructor takes an optional callback, if supplied, the callback will be called with an error argument followed by a reference to the **bl** instance, when `bl.end()` is called (i.e. from a piped stream). This is a convenient method of collecting the entire contents of a stream, particularly when the stream is *chunky*, such as a network stream. + +Normally, no arguments are required for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` object. + +`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with: + +```js +var bl = require('bl') +var myinstance = bl() + +// equivilant to: + +var BufferList = require('bl') +var myinstance = new BufferList() +``` + +-------------------------------------------------------- + +### bl.length +Get the length of the list in bytes. This is the sum of the lengths of all of the buffers contained in the list, minus any initial offset for a semi-consumed buffer at the beginning. Should accurately represent the total number of bytes that can be read from the list. + +-------------------------------------------------------- + +### bl.append(buffer) +`append(buffer)` adds an additional buffer or BufferList to the internal list. + +-------------------------------------------------------- + +### bl.get(index) +`get()` will return the byte at the specified index. + +-------------------------------------------------------- + +### bl.slice([ start, [ end ] ]) +`slice()` returns a new `Buffer` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively. + +If the requested range spans a single internal buffer then a slice of that buffer will be returned which shares the original memory range of that Buffer. If the range spans multiple buffers then copy operations will likely occur to give you a uniform Buffer. + +-------------------------------------------------------- + +### bl.copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ]) +`copy()` copies the content of the list in the `dest` buffer, starting from `destStart` and containing the bytes within the range specified with `srcStart` to `srcEnd`. `destStart`, `start` and `end` are optional and will default to the beginning of the `dest` buffer, and the beginning and end of the list respectively. + +-------------------------------------------------------- + +### bl.duplicate() +`duplicate()` performs a **shallow-copy** of the list. The internal Buffers remains the same, so if you change the underlying Buffers, the change will be reflected in both the original and the duplicate. This method is needed if you want to call `consume()` or `pipe()` and still keep the original list.Example: + +```js +var bl = new BufferList() + +bl.append('hello') +bl.append(' world') +bl.append('\n') + +bl.duplicate().pipe(process.stdout, { end: false }) + +console.log(bl.toString()) +``` + +-------------------------------------------------------- + +### bl.consume(bytes) +`consume()` will shift bytes *off the start of the list*. The number of bytes consumed don't need to line up with the sizes of the internal Buffers—initial offsets will be calculated accordingly in order to give you a consistent view of the data. + +-------------------------------------------------------- + +### bl.toString([encoding, [ start, [ end ]]]) +`toString()` will return a string representation of the buffer. The optional `start` and `end` arguments are passed on to `slice()`, while the `encoding` is passed on to `toString()` of the resulting Buffer. See the [Buffer#toString()](http://nodejs.org/docs/latest/api/buffer.html#buffer_buf_tostring_encoding_start_end) documentation for more information. + +-------------------------------------------------------- + +### bl.readDoubleBE(), bl.readDoubleLE(), bl.readFloatBE(), bl.readFloatLE(), bl.readInt32BE(), bl.readInt32LE(), bl.readUInt32BE(), bl.readUInt32LE(), bl.readInt16BE(), bl.readInt16LE(), bl.readUInt16BE(), bl.readUInt16LE(), bl.readInt8(), bl.readUInt8() + +All of the standard byte-reading methods of the `Buffer` interface are implemented and will operate across internal Buffer boundaries transparently. + +See the [Buffer](http://nodejs.org/docs/latest/api/buffer.html) documentation for how these work. + +-------------------------------------------------------- + +### Streams +**bl** is a Node **[Duplex Stream](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_duplex)**, so it can be read from and written to like a standard Node stream. You can also `pipe()` to and from a **bl** instance. + +-------------------------------------------------------- + +## Contributors + +**bl** is brought to you by the following hackers: + + * [Rod Vagg](https://github.com/rvagg) + * [Matteo Collina](https://github.com/mcollina) + * [Jarett Cruger](https://github.com/jcrugzz) + +======= + +## License + +**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. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js new file mode 100644 index 0000000..d1ea3b5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js @@ -0,0 +1,216 @@ +var DuplexStream = require('readable-stream').Duplex + , util = require('util') + +function BufferList (callback) { + if (!(this instanceof BufferList)) + return new BufferList(callback) + + this._bufs = [] + this.length = 0 + + if (typeof callback == 'function') { + this._callback = callback + + var piper = function (err) { + if (this._callback) { + this._callback(err) + this._callback = null + } + }.bind(this) + + this.on('pipe', function (src) { + src.on('error', piper) + }) + this.on('unpipe', function (src) { + src.removeListener('error', piper) + }) + } + else if (Buffer.isBuffer(callback)) + this.append(callback) + else if (Array.isArray(callback)) { + callback.forEach(function (b) { + Buffer.isBuffer(b) && this.append(b) + }.bind(this)) + } + + DuplexStream.call(this) +} + +util.inherits(BufferList, DuplexStream) + +BufferList.prototype._offset = function (offset) { + var tot = 0, i = 0, _t + for (; i < this._bufs.length; i++) { + _t = tot + this._bufs[i].length + if (offset < _t) + return [ i, offset - tot ] + tot = _t + } +} + +BufferList.prototype.append = function (buf) { + var isBuffer = Buffer.isBuffer(buf) || + buf instanceof BufferList + + this._bufs.push(isBuffer ? buf : new Buffer(buf)) + this.length += buf.length + return this +} + +BufferList.prototype._write = function (buf, encoding, callback) { + this.append(buf) + if (callback) + callback() +} + +BufferList.prototype._read = function (size) { + if (!this.length) + return this.push(null) + size = Math.min(size, this.length) + this.push(this.slice(0, size)) + this.consume(size) +} + +BufferList.prototype.end = function (chunk) { + DuplexStream.prototype.end.call(this, chunk) + + if (this._callback) { + this._callback(null, this.slice()) + this._callback = null + } +} + +BufferList.prototype.get = function (index) { + return this.slice(index, index + 1)[0] +} + +BufferList.prototype.slice = function (start, end) { + return this.copy(null, 0, start, end) +} + +BufferList.prototype.copy = function (dst, dstStart, srcStart, srcEnd) { + if (typeof srcStart != 'number' || srcStart < 0) + srcStart = 0 + if (typeof srcEnd != 'number' || srcEnd > this.length) + srcEnd = this.length + if (srcStart >= this.length) + return dst || new Buffer(0) + if (srcEnd <= 0) + return dst || new Buffer(0) + + var copy = !!dst + , off = this._offset(srcStart) + , len = srcEnd - srcStart + , bytes = len + , bufoff = (copy && dstStart) || 0 + , start = off[1] + , l + , i + + // copy/slice everything + if (srcStart === 0 && srcEnd == this.length) { + if (!copy) // slice, just return a full concat + return Buffer.concat(this._bufs) + + // copy, need to copy individual buffers + for (i = 0; i < this._bufs.length; i++) { + this._bufs[i].copy(dst, bufoff) + bufoff += this._bufs[i].length + } + + return dst + } + + // easy, cheap case where it's a subset of one of the buffers + if (bytes <= this._bufs[off[0]].length - start) { + return copy + ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes) + : this._bufs[off[0]].slice(start, start + bytes) + } + + if (!copy) // a slice, we need something to copy in to + dst = new Buffer(len) + + for (i = off[0]; i < this._bufs.length; i++) { + l = this._bufs[i].length - start + + if (bytes > l) { + this._bufs[i].copy(dst, bufoff, start) + } else { + this._bufs[i].copy(dst, bufoff, start, start + bytes) + break + } + + bufoff += l + bytes -= l + + if (start) + start = 0 + } + + return dst +} + +BufferList.prototype.toString = function (encoding, start, end) { + return this.slice(start, end).toString(encoding) +} + +BufferList.prototype.consume = function (bytes) { + while (this._bufs.length) { + if (bytes > this._bufs[0].length) { + bytes -= this._bufs[0].length + this.length -= this._bufs[0].length + this._bufs.shift() + } else { + this._bufs[0] = this._bufs[0].slice(bytes) + this.length -= bytes + break + } + } + return this +} + +BufferList.prototype.duplicate = function () { + var i = 0 + , copy = new BufferList() + + for (; i < this._bufs.length; i++) + copy.append(this._bufs[i]) + + return copy +} + +BufferList.prototype.destroy = function () { + this._bufs.length = 0; + this.length = 0; + this.push(null); +} + +;(function () { + var methods = { + 'readDoubleBE' : 8 + , 'readDoubleLE' : 8 + , 'readFloatBE' : 4 + , 'readFloatLE' : 4 + , 'readInt32BE' : 4 + , 'readInt32LE' : 4 + , 'readUInt32BE' : 4 + , 'readUInt32LE' : 4 + , 'readInt16BE' : 2 + , 'readInt16LE' : 2 + , 'readUInt16BE' : 2 + , 'readUInt16LE' : 2 + , 'readInt8' : 1 + , 'readUInt8' : 1 + } + + for (var m in methods) { + (function (m) { + BufferList.prototype[m] = function (offset) { + return this.slice(offset, offset + methods[m])[m](0) + } + }(m)) + } +}()) + +module.exports = BufferList diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore new file mode 100644 index 0000000..38344f8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore @@ -0,0 +1,5 @@ +build/ +test/ +examples/ +fs.js +zlib.js \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md new file mode 100644 index 0000000..34c1189 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md @@ -0,0 +1,15 @@ +# readable-stream + +***Node-core streams for userland*** + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png)](https://nodei.co/npm/readable-stream/) + +This package is a mirror of the Streams2 and Streams3 implementations in Node-core. + +If you want to guarantee a stable streams base, regardless of what version of Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core. + +**readable-stream** comes in two major versions, v1.0.x and v1.1.x. The former tracks the Streams2 implementation in Node 0.10, including bug-fixes and minor improvements as they are added. The latter tracks Streams3 as it develops in Node 0.11; we will likely see a v1.2.x branch for Node 0.12. + +**readable-stream** uses proper patch-level versioning so if you pin to `"~1.0.0"` you’ll get the latest Node 0.10 Streams2 implementation, including any fixes and minor non-breaking improvements. The patch-level versions of 1.0.x and 1.1.x should mirror the patch-level versions of Node-core releases. You should prefer the **1.0.x** releases for now and when you’re ready to start using Streams3, pin to `"~1.1.0"` + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000..ca807af --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_duplex.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000..b513d61 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,89 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +module.exports = Duplex; + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} +/**/ + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +forEach(objectKeys(Writable.prototype), function(method) { + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; +}); + +function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) + return; + + // no more data can be written. + // But allow more writes to happen in this tick. + process.nextTick(this.end.bind(this)); +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000..895ca50 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,46 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) + return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000..6307220 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,982 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Readable.ReadableState = ReadableState; + +var EE = require('events').EventEmitter; + +/**/ +if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +var Stream = require('stream'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var StringDecoder; + +util.inherits(Readable, Stream); + +function ReadableState(options, stream) { + options = options || {}; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = false; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // In streams that never have any data, and do push(null) right away, + // the consumer can miss the 'end' event if they do some I/O before + // consuming the stream. So, we don't emit('end') until some reading + // happens. + this.calledRead = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, becuase any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + if (!(this instanceof Readable)) + return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + + if (typeof chunk === 'string' && !state.objectMode) { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null || chunk === undefined) { + state.reading = false; + if (!state.ended) + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) { + state.buffer.unshift(chunk); + } else { + state.reading = false; + state.buffer.push(chunk); + } + + if (state.needReadable) + emitReadable(stream); + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + + + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; +}; + +// Don't raise the hwm > 128MB +var MAX_HWM = 0x800000; +function roundUpToNextPowerOf2(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + for (var p = 1; p < 32; p <<= 1) n |= n >> p; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + + if (state.objectMode) + return n === 0 ? 0 : 1; + + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + + if (n <= 0) + return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) + state.highWaterMark = roundUpToNextPowerOf2(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else + return state.length; + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function(n) { + var state = this._readableState; + state.calledRead = true; + var nOrig = n; + var ret; + + if (typeof n !== 'number' || n > 0) + state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended)) { + emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + ret = null; + + // In cases where the decoder did not receive enough data + // to produce a full chunk, then immediately received an + // EOF, state.buffer will contain [, ]. + // howMuchToRead will see this and coerce the amount to + // read to zero (because it's looking at the length of the + // first in state.buffer), and we'll end up here. + // + // This can only happen via state.decoder -- no other venue + // exists for pushing a zero-length chunk into state.buffer + // and triggering this behavior. In this case, we return our + // remaining data and end the stream, if appropriate. + if (state.length > 0 && state.decoder) { + ret = fromList(n, state); + state.length -= ret.length; + } + + if (state.length === 0) + endReadable(this); + + return ret; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + + // if we currently have less than the highWaterMark, then also read some + if (state.length - n <= state.highWaterMark) + doRead = true; + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) + doRead = false; + + if (doRead) { + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read called its callback synchronously, then `reading` + // will be false, and we need to re-evaluate how much data we + // can return to the user. + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + + if (n > 0) + ret = fromList(n, state); + else + ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + + // If we happened to read() exactly the remaining amount in the + // buffer, and the EOF has been seen at this point, then make sure + // that we emit 'end' on the very next tick. + if (state.ended && !state.endEmitted && state.length === 0) + endReadable(this); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && + 'string' !== typeof chunk && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + + +function onEofChunk(stream, state) { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // if we've ended and we have some data left, then emit + // 'readable' now to make sure it gets picked up. + if (state.length > 0) + emitReadable(stream); + else + endReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (state.emittedReadable) + return; + + state.emittedReadable = true; + if (state.sync) + process.nextTick(function() { + emitReadable_(stream); + }); + else + emitReadable_(stream); +} + +function emitReadable_(stream) { + stream.emit('readable'); +} + + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(function() { + maybeReadMore_(stream, state); + }); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && + state.length < state.highWaterMark) { + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else + len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function(n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + process.nextTick(endFn); + else + src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + if (readable !== src) return; + cleanup(); + } + + function onend() { + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + function cleanup() { + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (!dest._writableState || dest._writableState.needDrain) + ondrain(); + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + unpipe(); + dest.removeListener('error', onerror); + if (EE.listenerCount(dest, 'error') === 0) + dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) + dest.on('error', onerror); + else if (isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + + + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + // the handler that waits for readable events after all + // the data gets sucked out in flow. + // This would be easier to follow with a .once() handler + // in flow(), but that is too slow. + this.on('readable', pipeOnReadable); + + state.flowing = true; + process.nextTick(function() { + flow(src); + }); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function() { + var dest = this; + var state = src._readableState; + state.awaitDrain--; + if (state.awaitDrain === 0) + flow(src); + }; +} + +function flow(src) { + var state = src._readableState; + var chunk; + state.awaitDrain = 0; + + function write(dest, i, list) { + var written = dest.write(chunk); + if (false === written) { + state.awaitDrain++; + } + } + + while (state.pipesCount && null !== (chunk = src.read())) { + + if (state.pipesCount === 1) + write(state.pipes, 0, null); + else + forEach(state.pipes, write); + + src.emit('data', chunk); + + // if anyone needs a drain, then we have to wait for that. + if (state.awaitDrain > 0) + return; + } + + // if every destination was unpiped, either before entering this + // function, or in the while loop, then stop flowing. + // + // NB: This is a pretty rare edge case. + if (state.pipesCount === 0) { + state.flowing = false; + + // if there were data event listeners added, then switch to old mode. + if (EE.listenerCount(src, 'data') > 0) + emitDataEvents(src); + return; + } + + // at this point, no one needed a drain, so we just ran out of data + // on the next readable event, start it over again. + state.ranOut = true; +} + +function pipeOnReadable() { + if (this._readableState.ranOut) { + this._readableState.ranOut = false; + flow(this); + } +} + + +Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) + return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) + return this; + + if (!dest) + dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + this.removeListener('readable', pipeOnReadable); + state.flowing = false; + if (dest) + dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + this.removeListener('readable', pipeOnReadable); + state.flowing = false; + + for (var i = 0; i < len; i++) + dests[i].emit('unpipe', this); + return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) + return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data' && !this._readableState.flowing) + emitDataEvents(this); + + if (ev === 'readable' && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + this.read(0); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function() { + emitDataEvents(this); + this.read(0); + this.emit('resume'); +}; + +Readable.prototype.pause = function() { + emitDataEvents(this, true); + this.emit('pause'); +}; + +function emitDataEvents(stream, startPaused) { + var state = stream._readableState; + + if (state.flowing) { + // https://github.com/isaacs/readable-stream/issues/16 + throw new Error('Cannot switch to old mode now.'); + } + + var paused = startPaused || false; + var readable = false; + + // convert to an old-style stream. + stream.readable = true; + stream.pipe = Stream.prototype.pipe; + stream.on = stream.addListener = Stream.prototype.on; + + stream.on('readable', function() { + readable = true; + + var c; + while (!paused && (null !== (c = stream.read()))) + stream.emit('data', c); + + if (c === null) { + readable = false; + stream._readableState.needReadable = true; + } + }); + + stream.pause = function() { + paused = true; + this.emit('pause'); + }; + + stream.resume = function() { + paused = false; + if (readable) + process.nextTick(function() { + stream.emit('readable'); + }); + else + this.read(0); + this.emit('resume'); + }; + + // now make it start, just in case it hadn't already. + stream.emit('readable'); +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function() { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function(chunk) { + if (state.decoder) + chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + //if (state.objectMode && util.isNullOrUndefined(chunk)) + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) + return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (typeof stream[i] === 'function' && + typeof this[i] === 'undefined') { + this[i] = function(method) { return function() { + return stream[method].apply(stream, arguments); + }}(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function(ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function(n) { + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + + + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) + return null; + + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) + ret = list.join(''); + else + ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) + ret = ''; + else + ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted && state.calledRead) { + state.ended = true; + process.nextTick(function() { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + }); + } +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf (xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000..eb188df --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,210 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + + +function TransformState(options, stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) + return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) + stream.push(data); + + if (cb) + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + + +function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + + Duplex.call(this, options); + + var ts = this._transformState = new TransformState(options, this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + this.once('finish', function() { + if ('function' === typeof this._flush) + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); +} + +Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + + +function done(stream, er) { + if (er) + return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var rs = stream._readableState; + var ts = stream._transformState; + + if (ws.length) + throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) + throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000..4bdaa4f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,386 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, cb), and it'll handle all +// the drain event emission and buffering. + +module.exports = Writable; + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Writable.WritableState = WritableState; + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Stream = require('stream'); + +util.inherits(Writable, Stream); + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; +} + +function WritableState(options, stream) { + options = options || {}; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, becuase any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.buffer = []; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; +} + +function Writable(options) { + var Duplex = require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) + return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function() { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + + +function writeAfterEnd(stream, state, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + if (!Buffer.isBuffer(chunk) && + 'string' !== typeof chunk && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); + valid = false; + } + return valid; +} + +Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + else if (!encoding) + encoding = state.defaultEncoding; + + if (typeof cb !== 'function') + cb = function() {}; + + if (state.ended) + writeAfterEnd(this, state, cb); + else if (validChunk(this, state, chunk, cb)) + ret = writeOrBuffer(this, state, chunk, encoding, cb); + + return ret; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && + state.decodeStrings !== false && + typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) + state.needDrain = true; + + if (state.writing) + state.buffer.push(new WriteReq(chunk, encoding, cb)); + else + doWrite(stream, state, len, chunk, encoding, cb); + + return ret; +} + +function doWrite(stream, state, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + if (sync) + process.nextTick(function() { + cb(er); + }); + else + cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) + onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(stream, state); + + if (!finished && !state.bufferProcessing && state.buffer.length) + clearBuffer(stream, state); + + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + cb(); + if (finished) + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + + for (var c = 0; c < state.buffer.length; c++) { + var entry = state.buffer[c]; + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, len, chunk, encoding, cb); + + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + c++; + break; + } + } + + state.bufferProcessing = false; + if (c < state.buffer.length) + state.buffer = state.buffer.slice(c); + else + state.buffer.length = 0; +} + +Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (typeof chunk !== 'undefined' && chunk !== null) + this.write(chunk, encoding); + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) + endWritable(this, state, cb); +}; + + +function needFinish(stream, state) { + return (state.ending && + state.length === 0 && + !state.finished && + !state.writing); +} + +function finishMaybe(stream, state) { + var need = needFinish(stream, state); + if (need) { + state.finished = true; + stream.emit('finish'); + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + process.nextTick(cb); + else + stream.once('finish', cb); + } + state.ended = true; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md new file mode 100644 index 0000000..5a76b41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md @@ -0,0 +1,3 @@ +# core-util-is + +The `util.is*` functions introduced in Node v0.12. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch new file mode 100644 index 0000000..a06d5c0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch @@ -0,0 +1,604 @@ +diff --git a/lib/util.js b/lib/util.js +index a03e874..9074e8e 100644 +--- a/lib/util.js ++++ b/lib/util.js +@@ -19,430 +19,6 @@ + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + +-var formatRegExp = /%[sdj%]/g; +-exports.format = function(f) { +- if (!isString(f)) { +- var objects = []; +- for (var i = 0; i < arguments.length; i++) { +- objects.push(inspect(arguments[i])); +- } +- return objects.join(' '); +- } +- +- var i = 1; +- var args = arguments; +- var len = args.length; +- var str = String(f).replace(formatRegExp, function(x) { +- if (x === '%%') return '%'; +- if (i >= len) return x; +- switch (x) { +- case '%s': return String(args[i++]); +- case '%d': return Number(args[i++]); +- case '%j': +- try { +- return JSON.stringify(args[i++]); +- } catch (_) { +- return '[Circular]'; +- } +- default: +- return x; +- } +- }); +- for (var x = args[i]; i < len; x = args[++i]) { +- if (isNull(x) || !isObject(x)) { +- str += ' ' + x; +- } else { +- str += ' ' + inspect(x); +- } +- } +- return str; +-}; +- +- +-// Mark that a method should not be used. +-// Returns a modified function which warns once by default. +-// If --no-deprecation is set, then it is a no-op. +-exports.deprecate = function(fn, msg) { +- // Allow for deprecating things in the process of starting up. +- if (isUndefined(global.process)) { +- return function() { +- return exports.deprecate(fn, msg).apply(this, arguments); +- }; +- } +- +- if (process.noDeprecation === true) { +- return fn; +- } +- +- var warned = false; +- function deprecated() { +- if (!warned) { +- if (process.throwDeprecation) { +- throw new Error(msg); +- } else if (process.traceDeprecation) { +- console.trace(msg); +- } else { +- console.error(msg); +- } +- warned = true; +- } +- return fn.apply(this, arguments); +- } +- +- return deprecated; +-}; +- +- +-var debugs = {}; +-var debugEnviron; +-exports.debuglog = function(set) { +- if (isUndefined(debugEnviron)) +- debugEnviron = process.env.NODE_DEBUG || ''; +- set = set.toUpperCase(); +- if (!debugs[set]) { +- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { +- var pid = process.pid; +- debugs[set] = function() { +- var msg = exports.format.apply(exports, arguments); +- console.error('%s %d: %s', set, pid, msg); +- }; +- } else { +- debugs[set] = function() {}; +- } +- } +- return debugs[set]; +-}; +- +- +-/** +- * Echos the value of a value. Trys to print the value out +- * in the best way possible given the different types. +- * +- * @param {Object} obj The object to print out. +- * @param {Object} opts Optional options object that alters the output. +- */ +-/* legacy: obj, showHidden, depth, colors*/ +-function inspect(obj, opts) { +- // default options +- var ctx = { +- seen: [], +- stylize: stylizeNoColor +- }; +- // legacy... +- if (arguments.length >= 3) ctx.depth = arguments[2]; +- if (arguments.length >= 4) ctx.colors = arguments[3]; +- if (isBoolean(opts)) { +- // legacy... +- ctx.showHidden = opts; +- } else if (opts) { +- // got an "options" object +- exports._extend(ctx, opts); +- } +- // set default options +- if (isUndefined(ctx.showHidden)) ctx.showHidden = false; +- if (isUndefined(ctx.depth)) ctx.depth = 2; +- if (isUndefined(ctx.colors)) ctx.colors = false; +- if (isUndefined(ctx.customInspect)) ctx.customInspect = true; +- if (ctx.colors) ctx.stylize = stylizeWithColor; +- return formatValue(ctx, obj, ctx.depth); +-} +-exports.inspect = inspect; +- +- +-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +-inspect.colors = { +- 'bold' : [1, 22], +- 'italic' : [3, 23], +- 'underline' : [4, 24], +- 'inverse' : [7, 27], +- 'white' : [37, 39], +- 'grey' : [90, 39], +- 'black' : [30, 39], +- 'blue' : [34, 39], +- 'cyan' : [36, 39], +- 'green' : [32, 39], +- 'magenta' : [35, 39], +- 'red' : [31, 39], +- 'yellow' : [33, 39] +-}; +- +-// Don't use 'blue' not visible on cmd.exe +-inspect.styles = { +- 'special': 'cyan', +- 'number': 'yellow', +- 'boolean': 'yellow', +- 'undefined': 'grey', +- 'null': 'bold', +- 'string': 'green', +- 'date': 'magenta', +- // "name": intentionally not styling +- 'regexp': 'red' +-}; +- +- +-function stylizeWithColor(str, styleType) { +- var style = inspect.styles[styleType]; +- +- if (style) { +- return '\u001b[' + inspect.colors[style][0] + 'm' + str + +- '\u001b[' + inspect.colors[style][1] + 'm'; +- } else { +- return str; +- } +-} +- +- +-function stylizeNoColor(str, styleType) { +- return str; +-} +- +- +-function arrayToHash(array) { +- var hash = {}; +- +- array.forEach(function(val, idx) { +- hash[val] = true; +- }); +- +- return hash; +-} +- +- +-function formatValue(ctx, value, recurseTimes) { +- // Provide a hook for user-specified inspect functions. +- // Check that value is an object with an inspect function on it +- if (ctx.customInspect && +- value && +- isFunction(value.inspect) && +- // Filter out the util module, it's inspect function is special +- value.inspect !== exports.inspect && +- // Also filter out any prototype objects using the circular check. +- !(value.constructor && value.constructor.prototype === value)) { +- var ret = value.inspect(recurseTimes, ctx); +- if (!isString(ret)) { +- ret = formatValue(ctx, ret, recurseTimes); +- } +- return ret; +- } +- +- // Primitive types cannot have properties +- var primitive = formatPrimitive(ctx, value); +- if (primitive) { +- return primitive; +- } +- +- // Look up the keys of the object. +- var keys = Object.keys(value); +- var visibleKeys = arrayToHash(keys); +- +- if (ctx.showHidden) { +- keys = Object.getOwnPropertyNames(value); +- } +- +- // Some type of object without properties can be shortcutted. +- if (keys.length === 0) { +- if (isFunction(value)) { +- var name = value.name ? ': ' + value.name : ''; +- return ctx.stylize('[Function' + name + ']', 'special'); +- } +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } +- if (isDate(value)) { +- return ctx.stylize(Date.prototype.toString.call(value), 'date'); +- } +- if (isError(value)) { +- return formatError(value); +- } +- } +- +- var base = '', array = false, braces = ['{', '}']; +- +- // Make Array say that they are Array +- if (isArray(value)) { +- array = true; +- braces = ['[', ']']; +- } +- +- // Make functions say that they are functions +- if (isFunction(value)) { +- var n = value.name ? ': ' + value.name : ''; +- base = ' [Function' + n + ']'; +- } +- +- // Make RegExps say that they are RegExps +- if (isRegExp(value)) { +- base = ' ' + RegExp.prototype.toString.call(value); +- } +- +- // Make dates with properties first say the date +- if (isDate(value)) { +- base = ' ' + Date.prototype.toUTCString.call(value); +- } +- +- // Make error with message first say the error +- if (isError(value)) { +- base = ' ' + formatError(value); +- } +- +- if (keys.length === 0 && (!array || value.length == 0)) { +- return braces[0] + base + braces[1]; +- } +- +- if (recurseTimes < 0) { +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } else { +- return ctx.stylize('[Object]', 'special'); +- } +- } +- +- ctx.seen.push(value); +- +- var output; +- if (array) { +- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); +- } else { +- output = keys.map(function(key) { +- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); +- }); +- } +- +- ctx.seen.pop(); +- +- return reduceToSingleString(output, base, braces); +-} +- +- +-function formatPrimitive(ctx, value) { +- if (isUndefined(value)) +- return ctx.stylize('undefined', 'undefined'); +- if (isString(value)) { +- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') +- .replace(/'/g, "\\'") +- .replace(/\\"/g, '"') + '\''; +- return ctx.stylize(simple, 'string'); +- } +- if (isNumber(value)) { +- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, +- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . +- if (value === 0 && 1 / value < 0) +- return ctx.stylize('-0', 'number'); +- return ctx.stylize('' + value, 'number'); +- } +- if (isBoolean(value)) +- return ctx.stylize('' + value, 'boolean'); +- // For some reason typeof null is "object", so special case here. +- if (isNull(value)) +- return ctx.stylize('null', 'null'); +-} +- +- +-function formatError(value) { +- return '[' + Error.prototype.toString.call(value) + ']'; +-} +- +- +-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { +- var output = []; +- for (var i = 0, l = value.length; i < l; ++i) { +- if (hasOwnProperty(value, String(i))) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- String(i), true)); +- } else { +- output.push(''); +- } +- } +- keys.forEach(function(key) { +- if (!key.match(/^\d+$/)) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- key, true)); +- } +- }); +- return output; +-} +- +- +-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { +- var name, str, desc; +- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; +- if (desc.get) { +- if (desc.set) { +- str = ctx.stylize('[Getter/Setter]', 'special'); +- } else { +- str = ctx.stylize('[Getter]', 'special'); +- } +- } else { +- if (desc.set) { +- str = ctx.stylize('[Setter]', 'special'); +- } +- } +- if (!hasOwnProperty(visibleKeys, key)) { +- name = '[' + key + ']'; +- } +- if (!str) { +- if (ctx.seen.indexOf(desc.value) < 0) { +- if (isNull(recurseTimes)) { +- str = formatValue(ctx, desc.value, null); +- } else { +- str = formatValue(ctx, desc.value, recurseTimes - 1); +- } +- if (str.indexOf('\n') > -1) { +- if (array) { +- str = str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n').substr(2); +- } else { +- str = '\n' + str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n'); +- } +- } +- } else { +- str = ctx.stylize('[Circular]', 'special'); +- } +- } +- if (isUndefined(name)) { +- if (array && key.match(/^\d+$/)) { +- return str; +- } +- name = JSON.stringify('' + key); +- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { +- name = name.substr(1, name.length - 2); +- name = ctx.stylize(name, 'name'); +- } else { +- name = name.replace(/'/g, "\\'") +- .replace(/\\"/g, '"') +- .replace(/(^"|"$)/g, "'"); +- name = ctx.stylize(name, 'string'); +- } +- } +- +- return name + ': ' + str; +-} +- +- +-function reduceToSingleString(output, base, braces) { +- var numLinesEst = 0; +- var length = output.reduce(function(prev, cur) { +- numLinesEst++; +- if (cur.indexOf('\n') >= 0) numLinesEst++; +- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; +- }, 0); +- +- if (length > 60) { +- return braces[0] + +- (base === '' ? '' : base + '\n ') + +- ' ' + +- output.join(',\n ') + +- ' ' + +- braces[1]; +- } +- +- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +-} +- +- + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray(ar) { +@@ -522,166 +98,10 @@ function isPrimitive(arg) { + exports.isPrimitive = isPrimitive; + + function isBuffer(arg) { +- return arg instanceof Buffer; ++ return Buffer.isBuffer(arg); + } + exports.isBuffer = isBuffer; + + function objectToString(o) { + return Object.prototype.toString.call(o); +-} +- +- +-function pad(n) { +- return n < 10 ? '0' + n.toString(10) : n.toString(10); +-} +- +- +-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', +- 'Oct', 'Nov', 'Dec']; +- +-// 26 Feb 16:19:34 +-function timestamp() { +- var d = new Date(); +- var time = [pad(d.getHours()), +- pad(d.getMinutes()), +- pad(d.getSeconds())].join(':'); +- return [d.getDate(), months[d.getMonth()], time].join(' '); +-} +- +- +-// log is just a thin wrapper to console.log that prepends a timestamp +-exports.log = function() { +- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +-}; +- +- +-/** +- * Inherit the prototype methods from one constructor into another. +- * +- * The Function.prototype.inherits from lang.js rewritten as a standalone +- * function (not on Function.prototype). NOTE: If this file is to be loaded +- * during bootstrapping this function needs to be rewritten using some native +- * functions as prototype setup using normal JavaScript does not work as +- * expected during bootstrapping (see mirror.js in r114903). +- * +- * @param {function} ctor Constructor function which needs to inherit the +- * prototype. +- * @param {function} superCtor Constructor function to inherit prototype from. +- */ +-exports.inherits = function(ctor, superCtor) { +- ctor.super_ = superCtor; +- ctor.prototype = Object.create(superCtor.prototype, { +- constructor: { +- value: ctor, +- enumerable: false, +- writable: true, +- configurable: true +- } +- }); +-}; +- +-exports._extend = function(origin, add) { +- // Don't do anything if add isn't an object +- if (!add || !isObject(add)) return origin; +- +- var keys = Object.keys(add); +- var i = keys.length; +- while (i--) { +- origin[keys[i]] = add[keys[i]]; +- } +- return origin; +-}; +- +-function hasOwnProperty(obj, prop) { +- return Object.prototype.hasOwnProperty.call(obj, prop); +-} +- +- +-// Deprecated old stuff. +- +-exports.p = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- console.error(exports.inspect(arguments[i])); +- } +-}, 'util.p: Use console.error() instead'); +- +- +-exports.exec = exports.deprecate(function() { +- return require('child_process').exec.apply(this, arguments); +-}, 'util.exec is now called `child_process.exec`.'); +- +- +-exports.print = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(String(arguments[i])); +- } +-}, 'util.print: Use console.log instead'); +- +- +-exports.puts = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(arguments[i] + '\n'); +- } +-}, 'util.puts: Use console.log instead'); +- +- +-exports.debug = exports.deprecate(function(x) { +- process.stderr.write('DEBUG: ' + x + '\n'); +-}, 'util.debug: Use console.error instead'); +- +- +-exports.error = exports.deprecate(function(x) { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stderr.write(arguments[i] + '\n'); +- } +-}, 'util.error: Use console.error instead'); +- +- +-exports.pump = exports.deprecate(function(readStream, writeStream, callback) { +- var callbackCalled = false; +- +- function call(a, b, c) { +- if (callback && !callbackCalled) { +- callback(a, b, c); +- callbackCalled = true; +- } +- } +- +- readStream.addListener('data', function(chunk) { +- if (writeStream.write(chunk) === false) readStream.pause(); +- }); +- +- writeStream.addListener('drain', function() { +- readStream.resume(); +- }); +- +- readStream.addListener('end', function() { +- writeStream.end(); +- }); +- +- readStream.addListener('close', function() { +- call(); +- }); +- +- readStream.addListener('error', function(err) { +- writeStream.end(); +- call(err); +- }); +- +- writeStream.addListener('error', function(err) { +- readStream.destroy(); +- call(err); +- }); +-}, 'util.pump(): Use readableStream.pipe() instead'); +- +- +-var uv; +-exports._errnoException = function(err, syscall) { +- if (isUndefined(uv)) uv = process.binding('uv'); +- var errname = uv.errname(err); +- var e = new Error(syscall + ' ' + errname); +- e.code = errname; +- e.errno = errname; +- e.syscall = syscall; +- return e; +-}; ++} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js new file mode 100644 index 0000000..9074e8e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js @@ -0,0 +1,107 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return Buffer.isBuffer(arg); +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json new file mode 100644 index 0000000..2b7593c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -0,0 +1,54 @@ +{ + "name": "core-util-is", + "version": "1.0.1", + "description": "The `util.is*` functions introduced in Node v0.12.", + "main": "lib/util.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/core-util-is" + }, + "keywords": [ + "util", + "isBuffer", + "isArray", + "isNumber", + "isString", + "isRegExp", + "isThis", + "isThat", + "polyfill" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/core-util-is/issues" + }, + "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/isaacs/core-util-is", + "_id": "core-util-is@1.0.1", + "dist": { + "shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", + "tarball": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "_from": "core-util-is@~1.0.0", + "_npmVersion": "1.3.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", + "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "scripts": {} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/util.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/util.js new file mode 100644 index 0000000..007fa10 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/util.js @@ -0,0 +1,106 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && objectToString(e) === '[object Error]'; +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return arg instanceof Buffer; +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json new file mode 100644 index 0000000..3d69f4f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json @@ -0,0 +1,51 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "_id": "inherits@2.0.1", + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@~2.0.1", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md new file mode 100644 index 0000000..052a62b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md @@ -0,0 +1,54 @@ + +# isarray + +`Array#isArray` for older browsers. + +## Usage + +```js +var isArray = require('isarray'); + +console.log(isArray([])); // => true +console.log(isArray({})); // => false +``` + +## Installation + +With [npm](http://npmjs.org) do + +```bash +$ npm install isarray +``` + +Then bundle for the browser with +[browserify](https://github.com/substack/browserify). + +With [component](http://component.io) do + +```bash +$ component install juliangruber/isarray +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json new file mode 100644 index 0000000..9e31b68 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json @@ -0,0 +1,19 @@ +{ + "name" : "isarray", + "description" : "Array#isArray for older browsers", + "version" : "0.0.1", + "repository" : "juliangruber/isarray", + "homepage": "https://github.com/juliangruber/isarray", + "main" : "index.js", + "scripts" : [ + "index.js" + ], + "dependencies" : {}, + "keywords": ["browser","isarray","array"], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js new file mode 100644 index 0000000..5f5ad45 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js @@ -0,0 +1,3 @@ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json new file mode 100644 index 0000000..fc7904b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json @@ -0,0 +1,54 @@ +{ + "name": "isarray", + "description": "Array#isArray for older browsers", + "version": "0.0.1", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/isarray.git" + }, + "homepage": "https://github.com/juliangruber/isarray", + "main": "index.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": {}, + "devDependencies": { + "tap": "*" + }, + "keywords": [ + "browser", + "isarray", + "array" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "readme": "\n# isarray\n\n`Array#isArray` for older browsers.\n\n## Usage\n\n```js\nvar isArray = require('isarray');\n\nconsole.log(isArray([])); // => true\nconsole.log(isArray({})); // => false\n```\n\n## Installation\n\nWith [npm](http://npmjs.org) do\n\n```bash\n$ npm install isarray\n```\n\nThen bundle for the browser with\n[browserify](https://github.com/substack/browserify).\n\nWith [component](http://component.io) do\n\n```bash\n$ component install juliangruber/isarray\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\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\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject 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", + "readmeFilename": "README.md", + "_id": "isarray@0.0.1", + "dist": { + "shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "tarball": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "_from": "isarray@0.0.1", + "_npmVersion": "1.2.18", + "_npmUser": { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + "maintainers": [ + { + "name": "juliangruber", + "email": "julian@juliangruber.com" + } + ], + "directories": {}, + "_shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "_resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "bugs": { + "url": "https://github.com/juliangruber/isarray/issues" + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore new file mode 100644 index 0000000..206320c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore @@ -0,0 +1,2 @@ +build +test diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000..6de584a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE @@ -0,0 +1,20 @@ +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md new file mode 100644 index 0000000..4d2aa00 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md @@ -0,0 +1,7 @@ +**string_decoder.js** (`require('string_decoder')`) from Node.js core + +Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details. + +Version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.** + +The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version. \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js new file mode 100644 index 0000000..b00e54f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js @@ -0,0 +1,221 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Buffer = require('buffer').Buffer; + +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } + + +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; + + +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json new file mode 100644 index 0000000..a8c586b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json @@ -0,0 +1,54 @@ +{ + "name": "string_decoder", + "version": "0.10.31", + "description": "The string_decoder module from Node core", + "main": "index.js", + "dependencies": {}, + "devDependencies": { + "tap": "~0.4.8" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/rvagg/string_decoder.git" + }, + "homepage": "https://github.com/rvagg/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "gitHead": "d46d4fd87cf1d06e031c23f1ba170ca7d4ade9a0", + "bugs": { + "url": "https://github.com/rvagg/string_decoder/issues" + }, + "_id": "string_decoder@0.10.31", + "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "_from": "string_decoder@~0.10.x", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "tarball": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json new file mode 100644 index 0000000..1448587 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json @@ -0,0 +1,69 @@ +{ + "name": "readable-stream", + "version": "1.0.31", + "description": "Streams2, a user-land copy of the stream library from Node.js v0.10.x", + "main": "readable.js", + "dependencies": { + "core-util-is": "~1.0.0", + "isarray": "0.0.1", + "string_decoder": "~0.10.x", + "inherits": "~2.0.1" + }, + "devDependencies": { + "tap": "~0.2.6" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/readable-stream" + }, + "keywords": [ + "readable", + "stream", + "pipe" + ], + "browser": { + "util": false + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/readable-stream/issues" + }, + "homepage": "https://github.com/isaacs/readable-stream", + "_id": "readable-stream@1.0.31", + "_shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", + "_from": "readable-stream@~1.0.26", + "_npmVersion": "1.4.9", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", + "tarball": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000..27e8d8a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_passthrough.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js new file mode 100644 index 0000000..4d1ddfc --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js @@ -0,0 +1,6 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js new file mode 100644 index 0000000..5d482f0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_transform.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js new file mode 100644 index 0000000..e1e9efd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_writable.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json new file mode 100644 index 0000000..cb6c272 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json @@ -0,0 +1,61 @@ +{ + "name": "bl", + "version": "0.9.3", + "description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!", + "main": "bl.js", + "scripts": { + "test": "node test/test.js | faucet", + "test-local": "brtapsauce-local test/basic-test.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/rvagg/bl.git" + }, + "homepage": "https://github.com/rvagg/bl", + "authors": [ + "Rod Vagg (https://github.com/rvagg)", + "Matteo Collina (https://github.com/mcollina)", + "Jarett Cruger (https://github.com/jcrugzz)" + ], + "keywords": [ + "buffer", + "buffers", + "stream", + "awesomesauce" + ], + "license": "MIT", + "dependencies": { + "readable-stream": "~1.0.26" + }, + "devDependencies": { + "tape": "~2.12.3", + "hash_file": "~0.1.1", + "faucet": "~0.0.1", + "brtapsauce": "~0.3.0" + }, + "gitHead": "4987a76bf6bafd7616e62c7023c955e62f3a9461", + "bugs": { + "url": "https://github.com/rvagg/bl/issues" + }, + "_id": "bl@0.9.3", + "_shasum": "c41eff3e7cb31bde107c8f10076d274eff7f7d44", + "_from": "bl@~0.9.0", + "_npmVersion": "1.4.27", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "c41eff3e7cb31bde107c8f10076d274eff7f7d44", + "tarball": "http://registry.npmjs.org/bl/-/bl-0.9.3.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/bl/-/bl-0.9.3.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/basic-test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/basic-test.js new file mode 100644 index 0000000..75116a3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/basic-test.js @@ -0,0 +1,541 @@ +var tape = require('tape') + , crypto = require('crypto') + , fs = require('fs') + , hash = require('hash_file') + , BufferList = require('../') + + , encodings = + ('hex utf8 utf-8 ascii binary base64' + + (process.browser ? '' : ' ucs2 ucs-2 utf16le utf-16le')).split(' ') + +tape('single bytes from single buffer', function (t) { + var bl = new BufferList() + bl.append(new Buffer('abcd')) + + t.equal(bl.length, 4) + + t.equal(bl.get(0), 97) + t.equal(bl.get(1), 98) + t.equal(bl.get(2), 99) + t.equal(bl.get(3), 100) + + t.end() +}) + +tape('single bytes from multiple buffers', function (t) { + var bl = new BufferList() + bl.append(new Buffer('abcd')) + bl.append(new Buffer('efg')) + bl.append(new Buffer('hi')) + bl.append(new Buffer('j')) + + t.equal(bl.length, 10) + + t.equal(bl.get(0), 97) + t.equal(bl.get(1), 98) + t.equal(bl.get(2), 99) + t.equal(bl.get(3), 100) + t.equal(bl.get(4), 101) + t.equal(bl.get(5), 102) + t.equal(bl.get(6), 103) + t.equal(bl.get(7), 104) + t.equal(bl.get(8), 105) + t.equal(bl.get(9), 106) + t.end() +}) + +tape('multi bytes from single buffer', function (t) { + var bl = new BufferList() + bl.append(new Buffer('abcd')) + + t.equal(bl.length, 4) + + t.equal(bl.slice(0, 4).toString('ascii'), 'abcd') + t.equal(bl.slice(0, 3).toString('ascii'), 'abc') + t.equal(bl.slice(1, 4).toString('ascii'), 'bcd') + + t.end() +}) + +tape('multiple bytes from multiple buffers', function (t) { + var bl = new BufferList() + + bl.append(new Buffer('abcd')) + bl.append(new Buffer('efg')) + bl.append(new Buffer('hi')) + bl.append(new Buffer('j')) + + t.equal(bl.length, 10) + + t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij') + t.equal(bl.slice(3, 10).toString('ascii'), 'defghij') + t.equal(bl.slice(3, 6).toString('ascii'), 'def') + t.equal(bl.slice(3, 8).toString('ascii'), 'defgh') + t.equal(bl.slice(5, 10).toString('ascii'), 'fghij') + + t.end() +}) + +tape('multiple bytes from multiple buffer lists', function (t) { + var bl = new BufferList() + + bl.append(new BufferList([new Buffer('abcd'), new Buffer('efg')])) + bl.append(new BufferList([new Buffer('hi'), new Buffer('j')])) + + t.equal(bl.length, 10) + + t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij') + t.equal(bl.slice(3, 10).toString('ascii'), 'defghij') + t.equal(bl.slice(3, 6).toString('ascii'), 'def') + t.equal(bl.slice(3, 8).toString('ascii'), 'defgh') + t.equal(bl.slice(5, 10).toString('ascii'), 'fghij') + + t.end() +}) + +tape('consuming from multiple buffers', function (t) { + var bl = new BufferList() + + bl.append(new Buffer('abcd')) + bl.append(new Buffer('efg')) + bl.append(new Buffer('hi')) + bl.append(new Buffer('j')) + + t.equal(bl.length, 10) + + t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij') + + bl.consume(3) + t.equal(bl.length, 7) + t.equal(bl.slice(0, 7).toString('ascii'), 'defghij') + + bl.consume(2) + t.equal(bl.length, 5) + t.equal(bl.slice(0, 5).toString('ascii'), 'fghij') + + bl.consume(1) + t.equal(bl.length, 4) + t.equal(bl.slice(0, 4).toString('ascii'), 'ghij') + + bl.consume(1) + t.equal(bl.length, 3) + t.equal(bl.slice(0, 3).toString('ascii'), 'hij') + + bl.consume(2) + t.equal(bl.length, 1) + t.equal(bl.slice(0, 1).toString('ascii'), 'j') + + t.end() +}) + +tape('test readUInt8 / readInt8', function (t) { + var buf1 = new Buffer(1) + , buf2 = new Buffer(3) + , buf3 = new Buffer(3) + , bl = new BufferList() + + buf2[1] = 0x3 + buf2[2] = 0x4 + buf3[0] = 0x23 + buf3[1] = 0x42 + + bl.append(buf1) + bl.append(buf2) + bl.append(buf3) + + t.equal(bl.readUInt8(2), 0x3) + t.equal(bl.readInt8(2), 0x3) + t.equal(bl.readUInt8(3), 0x4) + t.equal(bl.readInt8(3), 0x4) + t.equal(bl.readUInt8(4), 0x23) + t.equal(bl.readInt8(4), 0x23) + t.equal(bl.readUInt8(5), 0x42) + t.equal(bl.readInt8(5), 0x42) + t.end() +}) + +tape('test readUInt16LE / readUInt16BE / readInt16LE / readInt16BE', function (t) { + var buf1 = new Buffer(1) + , buf2 = new Buffer(3) + , buf3 = new Buffer(3) + , bl = new BufferList() + + buf2[1] = 0x3 + buf2[2] = 0x4 + buf3[0] = 0x23 + buf3[1] = 0x42 + + bl.append(buf1) + bl.append(buf2) + bl.append(buf3) + + t.equal(bl.readUInt16BE(2), 0x0304) + t.equal(bl.readUInt16LE(2), 0x0403) + t.equal(bl.readInt16BE(2), 0x0304) + t.equal(bl.readInt16LE(2), 0x0403) + t.equal(bl.readUInt16BE(3), 0x0423) + t.equal(bl.readUInt16LE(3), 0x2304) + t.equal(bl.readInt16BE(3), 0x0423) + t.equal(bl.readInt16LE(3), 0x2304) + t.equal(bl.readUInt16BE(4), 0x2342) + t.equal(bl.readUInt16LE(4), 0x4223) + t.equal(bl.readInt16BE(4), 0x2342) + t.equal(bl.readInt16LE(4), 0x4223) + t.end() +}) + +tape('test readUInt32LE / readUInt32BE / readInt32LE / readInt32BE', function (t) { + var buf1 = new Buffer(1) + , buf2 = new Buffer(3) + , buf3 = new Buffer(3) + , bl = new BufferList() + + buf2[1] = 0x3 + buf2[2] = 0x4 + buf3[0] = 0x23 + buf3[1] = 0x42 + + bl.append(buf1) + bl.append(buf2) + bl.append(buf3) + + t.equal(bl.readUInt32BE(2), 0x03042342) + t.equal(bl.readUInt32LE(2), 0x42230403) + t.equal(bl.readInt32BE(2), 0x03042342) + t.equal(bl.readInt32LE(2), 0x42230403) + t.end() +}) + +tape('test readFloatLE / readFloatBE', function (t) { + var buf1 = new Buffer(1) + , buf2 = new Buffer(3) + , buf3 = new Buffer(3) + , bl = new BufferList() + + buf2[1] = 0x00 + buf2[2] = 0x00 + buf3[0] = 0x80 + buf3[1] = 0x3f + + bl.append(buf1) + bl.append(buf2) + bl.append(buf3) + + t.equal(bl.readFloatLE(2), 0x01) + t.end() +}) + +tape('test readDoubleLE / readDoubleBE', function (t) { + var buf1 = new Buffer(1) + , buf2 = new Buffer(3) + , buf3 = new Buffer(10) + , bl = new BufferList() + + buf2[1] = 0x55 + buf2[2] = 0x55 + buf3[0] = 0x55 + buf3[1] = 0x55 + buf3[2] = 0x55 + buf3[3] = 0x55 + buf3[4] = 0xd5 + buf3[5] = 0x3f + + bl.append(buf1) + bl.append(buf2) + bl.append(buf3) + + t.equal(bl.readDoubleLE(2), 0.3333333333333333) + t.end() +}) + +tape('test toString', function (t) { + var bl = new BufferList() + + bl.append(new Buffer('abcd')) + bl.append(new Buffer('efg')) + bl.append(new Buffer('hi')) + bl.append(new Buffer('j')) + + t.equal(bl.toString('ascii', 0, 10), 'abcdefghij') + t.equal(bl.toString('ascii', 3, 10), 'defghij') + t.equal(bl.toString('ascii', 3, 6), 'def') + t.equal(bl.toString('ascii', 3, 8), 'defgh') + t.equal(bl.toString('ascii', 5, 10), 'fghij') + + t.end() +}) + +tape('test toString encoding', function (t) { + var bl = new BufferList() + , b = new Buffer('abcdefghij\xff\x00') + + bl.append(new Buffer('abcd')) + bl.append(new Buffer('efg')) + bl.append(new Buffer('hi')) + bl.append(new Buffer('j')) + bl.append(new Buffer('\xff\x00')) + + encodings.forEach(function (enc) { + t.equal(bl.toString(enc), b.toString(enc), enc) + }) + + t.end() +}) + +!process.browser && tape('test stream', function (t) { + var random = crypto.randomBytes(65534) + , rndhash = hash(random, 'md5') + , md5sum = crypto.createHash('md5') + , bl = new BufferList(function (err, buf) { + t.ok(Buffer.isBuffer(buf)) + t.ok(err === null) + t.equal(rndhash, hash(bl.slice(), 'md5')) + t.equal(rndhash, hash(buf, 'md5')) + + bl.pipe(fs.createWriteStream('/tmp/bl_test_rnd_out.dat')) + .on('close', function () { + var s = fs.createReadStream('/tmp/bl_test_rnd_out.dat') + s.on('data', md5sum.update.bind(md5sum)) + s.on('end', function() { + t.equal(rndhash, md5sum.digest('hex'), 'woohoo! correct hash!') + t.end() + }) + }) + + }) + + fs.writeFileSync('/tmp/bl_test_rnd.dat', random) + fs.createReadStream('/tmp/bl_test_rnd.dat').pipe(bl) +}) + +tape('instantiation with Buffer', function (t) { + var buf = crypto.randomBytes(1024) + , buf2 = crypto.randomBytes(1024) + , b = BufferList(buf) + + t.equal(buf.toString('hex'), b.slice().toString('hex'), 'same buffer') + b = BufferList([ buf, buf2 ]) + t.equal(b.slice().toString('hex'), Buffer.concat([ buf, buf2 ]).toString('hex'), 'same buffer') + t.end() +}) + +tape('test String appendage', function (t) { + var bl = new BufferList() + , b = new Buffer('abcdefghij\xff\x00') + + bl.append('abcd') + bl.append('efg') + bl.append('hi') + bl.append('j') + bl.append('\xff\x00') + + encodings.forEach(function (enc) { + t.equal(bl.toString(enc), b.toString(enc)) + }) + + t.end() +}) + +tape('write nothing, should get empty buffer', function (t) { + t.plan(3) + BufferList(function (err, data) { + t.notOk(err, 'no error') + t.ok(Buffer.isBuffer(data), 'got a buffer') + t.equal(0, data.length, 'got a zero-length buffer') + t.end() + }).end() +}) + +tape('unicode string', function (t) { + t.plan(2) + var inp1 = '\u2600' + , inp2 = '\u2603' + , exp = inp1 + ' and ' + inp2 + , bl = BufferList() + bl.write(inp1) + bl.write(' and ') + bl.write(inp2) + t.equal(exp, bl.toString()) + t.equal(new Buffer(exp).toString('hex'), bl.toString('hex')) +}) + +tape('should emit finish', function (t) { + var source = BufferList() + , dest = BufferList() + + source.write('hello') + source.pipe(dest) + + dest.on('finish', function () { + t.equal(dest.toString('utf8'), 'hello') + t.end() + }) +}) + +tape('basic copy', function (t) { + var buf = crypto.randomBytes(1024) + , buf2 = new Buffer(1024) + , b = BufferList(buf) + + b.copy(buf2) + t.equal(b.slice().toString('hex'), buf2.toString('hex'), 'same buffer') + t.end() +}) + +tape('copy after many appends', function (t) { + var buf = crypto.randomBytes(512) + , buf2 = new Buffer(1024) + , b = BufferList(buf) + + b.append(buf) + b.copy(buf2) + t.equal(b.slice().toString('hex'), buf2.toString('hex'), 'same buffer') + t.end() +}) + +tape('copy at a precise position', function (t) { + var buf = crypto.randomBytes(1004) + , buf2 = new Buffer(1024) + , b = BufferList(buf) + + b.copy(buf2, 20) + t.equal(b.slice().toString('hex'), buf2.slice(20).toString('hex'), 'same buffer') + t.end() +}) + +tape('copy starting from a precise location', function (t) { + var buf = crypto.randomBytes(10) + , buf2 = new Buffer(5) + , b = BufferList(buf) + + b.copy(buf2, 0, 5) + t.equal(b.slice(5).toString('hex'), buf2.toString('hex'), 'same buffer') + t.end() +}) + +tape('copy in an interval', function (t) { + var rnd = crypto.randomBytes(10) + , b = BufferList(rnd) // put the random bytes there + , actual = new Buffer(3) + , expected = new Buffer(3) + + rnd.copy(expected, 0, 5, 8) + b.copy(actual, 0, 5, 8) + + t.equal(actual.toString('hex'), expected.toString('hex'), 'same buffer') + t.end() +}) + +tape('copy an interval between two buffers', function (t) { + var buf = crypto.randomBytes(10) + , buf2 = new Buffer(10) + , b = BufferList(buf) + + b.append(buf) + b.copy(buf2, 0, 5, 15) + + t.equal(b.slice(5, 15).toString('hex'), buf2.toString('hex'), 'same buffer') + t.end() +}) + +tape('duplicate', function (t) { + t.plan(2) + + var bl = new BufferList('abcdefghij\xff\x00') + , dup = bl.duplicate() + + t.equal(bl.prototype, dup.prototype) + t.equal(bl.toString('hex'), dup.toString('hex')) +}) + +tape('destroy no pipe', function (t) { + t.plan(2) + + var bl = new BufferList('alsdkfja;lsdkfja;lsdk') + bl.destroy() + + t.equal(bl._bufs.length, 0) + t.equal(bl.length, 0) +}) + +!process.browser && tape('destroy with pipe before read end', function (t) { + t.plan(2) + + var bl = new BufferList() + fs.createReadStream(__dirname + '/sauce.js') + .pipe(bl) + + bl.destroy() + + t.equal(bl._bufs.length, 0) + t.equal(bl.length, 0) + +}) + +!process.browser && tape('destroy with pipe before read end with race', function (t) { + t.plan(2) + + var bl = new BufferList() + fs.createReadStream(__dirname + '/sauce.js') + .pipe(bl) + + setTimeout(function () { + bl.destroy() + setTimeout(function () { + t.equal(bl._bufs.length, 0) + t.equal(bl.length, 0) + }, 500) + }, 500) +}) + +!process.browser && tape('destroy with pipe after read end', function (t) { + t.plan(2) + + var bl = new BufferList() + fs.createReadStream(__dirname + '/sauce.js') + .on('end', onEnd) + .pipe(bl) + + function onEnd () { + bl.destroy() + + t.equal(bl._bufs.length, 0) + t.equal(bl.length, 0) + } +}) + +!process.browser && tape('destroy with pipe while writing to a destination', function (t) { + t.plan(4) + + var bl = new BufferList() + , ds = new BufferList() + + fs.createReadStream(__dirname + '/sauce.js') + .on('end', onEnd) + .pipe(bl) + + function onEnd () { + bl.pipe(ds) + + setTimeout(function () { + bl.destroy() + + t.equals(bl._bufs.length, 0) + t.equals(bl.length, 0) + + ds.destroy() + + t.equals(bl._bufs.length, 0) + t.equals(bl.length, 0) + + }, 100) + } +}) + +!process.browser && tape('handle error', function (t) { + t.plan(2) + fs.createReadStream('/does/not/exist').pipe(BufferList(function (err, data) { + t.ok(err instanceof Error, 'has error') + t.notOk(data, 'no data') + })) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/sauce.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/sauce.js new file mode 100644 index 0000000..a6d2862 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/sauce.js @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +const user = process.env.SAUCE_USER + , key = process.env.SAUCE_KEY + , path = require('path') + , brtapsauce = require('brtapsauce') + , testFile = path.join(__dirname, 'basic-test.js') + + , capabilities = [ + { browserName: 'chrome' , platform: 'Windows XP', version: '' } + , { browserName: 'firefox' , platform: 'Windows 8' , version: '' } + , { browserName: 'firefox' , platform: 'Windows XP', version: '4' } + , { browserName: 'internet explorer' , platform: 'Windows 8' , version: '10' } + , { browserName: 'internet explorer' , platform: 'Windows 7' , version: '9' } + , { browserName: 'internet explorer' , platform: 'Windows 7' , version: '8' } + , { browserName: 'internet explorer' , platform: 'Windows XP', version: '7' } + , { browserName: 'internet explorer' , platform: 'Windows XP', version: '6' } + , { browserName: 'safari' , platform: 'Windows 7' , version: '5' } + , { browserName: 'safari' , platform: 'OS X 10.8' , version: '6' } + , { browserName: 'opera' , platform: 'Windows 7' , version: '' } + , { browserName: 'opera' , platform: 'Windows 7' , version: '11' } + , { browserName: 'ipad' , platform: 'OS X 10.8' , version: '6' } + , { browserName: 'android' , platform: 'Linux' , version: '4.0', 'device-type': 'tablet' } + ] + +if (!user) + throw new Error('Must set a SAUCE_USER env var') +if (!key) + throw new Error('Must set a SAUCE_KEY env var') + +brtapsauce({ + name : 'Traversty' + , user : user + , key : key + , brsrc : testFile + , capabilities : capabilities + , options : { timeout: 60 * 6 } +}) \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js new file mode 100644 index 0000000..aa9b487 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js @@ -0,0 +1,9 @@ +require('./basic-test') + +if (!process.env.SAUCE_KEY || !process.env.SAUCE_USER) + return console.log('SAUCE_KEY and/or SAUCE_USER not set, not running sauce tests') + +if (!/v0\.10/.test(process.version)) + return console.log('Not Node v0.10.x, not running sauce tests') + +require('./sauce.js') \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md new file mode 100644 index 0000000..719584c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md @@ -0,0 +1,45 @@ +## Caseless -- wrap an object to set and get property with caseless semantics but also preserve caseing. + +This library is incredibly useful when working with HTTP headers. It allows you to get/set/check for headers in a caseless manor while also preserving the caseing of headers the first time they are set. + +## Usage + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'asdf') +c.get('a-header') === 'asdf' +``` + +## has(key) + +Has takes a name and if it finds a matching header will return that header name with the preserved caseing it was set with. + +```javascript +c.has('a-header') === 'a-Header' +``` + +## set(key, value[, clobber=true]) + +Set is fairly straight forward except that if the header exists and clobber is disabled it will add `','+value` to the existing header. + +```javascript +c.set('a-Header', 'fdas') +c.set('a-HEADER', 'more', false) +c.get('a-header') === 'fdsa,more' +``` + +## swap(key) + +Swaps the casing of a header with the new one that is passed in. + +```javascript +var headers = {} + , c = caseless(headers) + ; +c.set('a-Header', 'fdas') +c.swap('a-HEADER') +c.has('a-header') === 'a-HEADER' +headers === {'a-HEADER': 'fdas'} +``` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js new file mode 100644 index 0000000..231a997 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js @@ -0,0 +1,65 @@ +function Caseless (dict) { + this.dict = dict +} +Caseless.prototype.set = function (name, value, clobber) { + if (typeof name === 'object') { + for (var i in name) { + this.set(i, name[i], value) + } + } else { + if (typeof clobber === 'undefined') clobber = true + var has = this.has(name) + + if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value + else this.dict[has || name] = value + return has + } +} +Caseless.prototype.has = function (name) { + var keys = Object.keys(this.dict) + , name = name.toLowerCase() + ; + for (var i=0;i 0 && !req.useChunkedEncodingByDefault) { + var idleSocket = this.freeSockets[name].pop() + idleSocket.removeListener('error', idleSocket._onIdleError) + delete idleSocket._onIdleError + req._reusedSocket = true + req.onSocket(idleSocket) + } else { + this.addRequestNoreuse(req, host, port) + } +} + +ForeverAgent.prototype.removeSocket = function(s, name, host, port) { + if (this.sockets[name]) { + var index = this.sockets[name].indexOf(s) + if (index !== -1) { + this.sockets[name].splice(index, 1) + } + } else if (this.sockets[name] && this.sockets[name].length === 0) { + // don't leak + delete this.sockets[name] + delete this.requests[name] + } + + if (this.freeSockets[name]) { + var index = this.freeSockets[name].indexOf(s) + if (index !== -1) { + this.freeSockets[name].splice(index, 1) + if (this.freeSockets[name].length === 0) { + delete this.freeSockets[name] + } + } + } + + if (this.requests[name] && this.requests[name].length) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(name, host, port).emit('free') + } +} + +function ForeverAgentSSL (options) { + ForeverAgent.call(this, options) +} +util.inherits(ForeverAgentSSL, ForeverAgent) + +ForeverAgentSSL.prototype.createConnection = createConnectionSSL +ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest + +function createConnectionSSL (port, host, options) { + if (typeof port === 'object') { + options = port; + } else if (typeof host === 'object') { + options = host; + } else if (typeof options === 'object') { + options = options; + } else { + options = {}; + } + + if (typeof port === 'number') { + options.port = port; + } + + if (typeof host === 'string') { + options.host = host; + } + + return tls.connect(options); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json new file mode 100644 index 0000000..110a36f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json @@ -0,0 +1,46 @@ +{ + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "name": "forever-agent", + "description": "HTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.", + "version": "0.5.2", + "repository": { + "url": "https://github.com/mikeal/forever-agent" + }, + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "bugs": { + "url": "https://github.com/mikeal/forever-agent/issues" + }, + "homepage": "https://github.com/mikeal/forever-agent", + "_id": "forever-agent@0.5.2", + "dist": { + "shasum": "6d0e09c4921f94a27f63d3b49c5feff1ea4c5130", + "tarball": "http://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + }, + "_from": "forever-agent@~0.5.0", + "_npmVersion": "1.3.21", + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "maintainers": [ + { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + } + ], + "directories": {}, + "_shasum": "6d0e09c4921f94a27f63d3b49c5feff1ea4c5130", + "_resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "readme": "ERROR: No README data found!", + "scripts": {} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License new file mode 100644 index 0000000..c7ff12a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License @@ -0,0 +1,19 @@ +Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/Readme.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/Readme.md new file mode 100644 index 0000000..c8a1a55 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/Readme.md @@ -0,0 +1,175 @@ +# Form-Data [![Build Status](https://travis-ci.org/felixge/node-form-data.png?branch=master)](https://travis-ci.org/felixge/node-form-data) [![Dependency Status](https://gemnasium.com/felixge/node-form-data.png)](https://gemnasium.com/felixge/node-form-data) + +A module to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications. + +The API of this module is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd]. + +[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface +[streams2-thing]: http://nodejs.org/api/stream.html#stream_compatibility_with_older_node_versions + +## Install + +``` +npm install form-data +``` + +## Usage + +In this example we are constructing a form with 3 fields that contain a string, +a buffer and a file stream. + +``` javascript +var FormData = require('form-data'); +var fs = require('fs'); + +var form = new FormData(); +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_file', fs.createReadStream('/foo/bar.jpg')); +``` + +Also you can use http-response stream: + +``` javascript +var FormData = require('form-data'); +var http = require('http'); + +var form = new FormData(); + +http.request('http://nodejs.org/images/logo.png', function(response) { + form.append('my_field', 'my value'); + form.append('my_buffer', new Buffer(10)); + form.append('my_logo', response); +}); +``` + +Or @mikeal's request stream: + +``` javascript +var FormData = require('form-data'); +var request = require('request'); + +var form = new FormData(); + +form.append('my_field', 'my value'); +form.append('my_buffer', new Buffer(10)); +form.append('my_logo', request('http://nodejs.org/images/logo.png')); +``` + +In order to submit this form to a web application, call ```submit(url, [callback])``` method: + +``` javascript +form.submit('http://example.org/', function(err, res) { + // res – response object (http.IncomingMessage) // + res.resume(); // for node-0.10.x +}); + +``` + +For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods. + +### Alternative submission methods + +You can use node's http client interface: + +``` javascript +var http = require('http'); + +var request = http.request({ + method: 'post', + host: 'example.org', + path: '/upload', + headers: form.getHeaders() +}); + +form.pipe(request); + +request.on('response', function(res) { + console.log(res.statusCode); +}); +``` + +Or if you would prefer the `'Content-Length'` header to be set for you: + +``` javascript +form.submit('example.org/upload', function(err, res) { + console.log(res.statusCode); +}); +``` + +To use custom headers and pre-known length in parts: + +``` javascript +var CRLF = '\r\n'; +var form = new FormData(); + +var options = { + header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF, + knownLength: 1 +}; + +form.append('my_buffer', buffer, options); + +form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); +}); +``` + +Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually: + +``` javascript +someModule.stream(function(err, stdout, stderr) { + if (err) throw err; + + var form = new FormData(); + + form.append('file', stdout, { + filename: 'unicycle.jpg', + contentType: 'image/jpg', + knownLength: 19806 + }); + + form.submit('http://example.com/', function(err, res) { + if (err) throw err; + console.log('Done'); + }); +}); +``` + +For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter: + +``` javascript +form.submit({ + host: 'example.com', + path: '/probably.php?extra=params', + auth: 'username:password' +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`: + +``` javascript +form.submit({ + host: 'example.com', + path: '/surelynot.php', + headers: {'x-test-header': 'test-header-value'} +}, function(err, res) { + console.log(res.statusCode); +}); +``` + +## Notes + +- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround. +- If it feels like FormData hangs after submit and you're on ```node-0.10```, please check [Compatibility with Older Node Versions][streams2-thing] + +## TODO + +- Add new streams (0.10) support and try really hard not to break it for 0.8.x. + +## License + +Form-Data is licensed under the MIT license. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js new file mode 100644 index 0000000..b8bd158 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js @@ -0,0 +1,351 @@ +var CombinedStream = require('combined-stream'); +var util = require('util'); +var path = require('path'); +var http = require('http'); +var https = require('https'); +var parseUrl = require('url').parse; +var fs = require('fs'); +var mime = require('mime'); +var async = require('async'); + +module.exports = FormData; +function FormData() { + this._overheadLength = 0; + this._valueLength = 0; + this._lengthRetrievers = []; + + CombinedStream.call(this); +} +util.inherits(FormData, CombinedStream); + +FormData.LINE_BREAK = '\r\n'; + +FormData.prototype.append = function(field, value, options) { + options = options || {}; + + var append = CombinedStream.prototype.append.bind(this); + + // all that streamy business can't handle numbers + if (typeof value == 'number') value = ''+value; + + // https://github.com/felixge/node-form-data/issues/38 + if (util.isArray(value)) { + // Please convert your array into string + // the way web server expects it + this._error(new Error('Arrays are not supported.')); + return; + } + + var header = this._multiPartHeader(field, value, options); + var footer = this._multiPartFooter(field, value, options); + + append(header); + append(value); + append(footer); + + // pass along options.knownLength + this._trackLength(header, value, options); +}; + +FormData.prototype._trackLength = function(header, value, options) { + var valueLength = 0; + + // used w/ getLengthSync(), when length is known. + // e.g. for streaming directly from a remote server, + // w/ a known file a size, and not wanting to wait for + // incoming file to finish to get its size. + if (options.knownLength != null) { + valueLength += +options.knownLength; + } else if (Buffer.isBuffer(value)) { + valueLength = value.length; + } else if (typeof value === 'string') { + valueLength = Buffer.byteLength(value); + } + + this._valueLength += valueLength; + + // @check why add CRLF? does this account for custom/multiple CRLFs? + this._overheadLength += + Buffer.byteLength(header) + + + FormData.LINE_BREAK.length; + + // empty or either doesn't have path or not an http response + if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) { + return; + } + + // no need to bother with the length + if (!options.knownLength) + this._lengthRetrievers.push(function(next) { + + if (value.hasOwnProperty('fd')) { + + // take read range into a account + // `end` = Infinity –> read file till the end + // + // TODO: Looks like there is bug in Node fs.createReadStream + // it doesn't respect `end` options without `start` options + // Fix it when node fixes it. + // https://github.com/joyent/node/issues/7819 + if (value.end != undefined && value.end != Infinity && value.start != undefined) { + + // when end specified + // no need to calculate range + // inclusive, starts with 0 + next(null, value.end+1 - (value.start ? value.start : 0)); + + // not that fast snoopy + } else { + // still need to fetch file size from fs + fs.stat(value.path, function(err, stat) { + + var fileSize; + + if (err) { + next(err); + return; + } + + // update final size based on the range options + fileSize = stat.size - (value.start ? value.start : 0); + next(null, fileSize); + }); + } + + // or http response + } else if (value.hasOwnProperty('httpVersion')) { + next(null, +value.headers['content-length']); + + // or request stream http://github.com/mikeal/request + } else if (value.hasOwnProperty('httpModule')) { + // wait till response come back + value.on('response', function(response) { + value.pause(); + next(null, +response.headers['content-length']); + }); + value.resume(); + + // something else + } else { + next('Unknown stream'); + } + }); +}; + +FormData.prototype._multiPartHeader = function(field, value, options) { + var boundary = this.getBoundary(); + var header = ''; + + // custom header specified (as string)? + // it becomes responsible for boundary + // (e.g. to handle extra CRLFs on .NET servers) + if (options.header != null) { + header = options.header; + } else { + header += '--' + boundary + FormData.LINE_BREAK + + 'Content-Disposition: form-data; name="' + field + '"'; + + // fs- and request- streams have path property + // or use custom filename and/or contentType + // TODO: Use request's response mime-type + if (options.filename || value.path) { + header += + '; filename="' + path.basename(options.filename || value.path) + '"' + FormData.LINE_BREAK + + 'Content-Type: ' + (options.contentType || mime.lookup(options.filename || value.path)); + + // http response has not + } else if (value.readable && value.hasOwnProperty('httpVersion')) { + header += + '; filename="' + path.basename(value.client._httpMessage.path) + '"' + FormData.LINE_BREAK + + 'Content-Type: ' + value.headers['content-type']; + } + + header += FormData.LINE_BREAK + FormData.LINE_BREAK; + } + + return header; +}; + +FormData.prototype._multiPartFooter = function(field, value, options) { + return function(next) { + var footer = FormData.LINE_BREAK; + + var lastPart = (this._streams.length === 0); + if (lastPart) { + footer += this._lastBoundary(); + } + + next(footer); + }.bind(this); +}; + +FormData.prototype._lastBoundary = function() { + return '--' + this.getBoundary() + '--'; +}; + +FormData.prototype.getHeaders = function(userHeaders) { + var formHeaders = { + 'content-type': 'multipart/form-data; boundary=' + this.getBoundary() + }; + + for (var header in userHeaders) { + formHeaders[header.toLowerCase()] = userHeaders[header]; + } + + return formHeaders; +} + +FormData.prototype.getCustomHeaders = function(contentType) { + contentType = contentType ? contentType : 'multipart/form-data'; + + var formHeaders = { + 'content-type': contentType + '; boundary=' + this.getBoundary(), + 'content-length': this.getLengthSync() + }; + + return formHeaders; +} + +FormData.prototype.getBoundary = function() { + if (!this._boundary) { + this._generateBoundary(); + } + + return this._boundary; +}; + +FormData.prototype._generateBoundary = function() { + // This generates a 50 character boundary similar to those used by Firefox. + // They are optimized for boyer-moore parsing. + var boundary = '--------------------------'; + for (var i = 0; i < 24; i++) { + boundary += Math.floor(Math.random() * 10).toString(16); + } + + this._boundary = boundary; +}; + +// Note: getLengthSync DOESN'T calculate streams length +// As workaround one can calculate file size manually +// and add it as knownLength option +FormData.prototype.getLengthSync = function(debug) { + var knownLength = this._overheadLength + this._valueLength; + + // Don't get confused, there are 3 "internal" streams for each keyval pair + // so it basically checks if there is any value added to the form + if (this._streams.length) { + knownLength += this._lastBoundary().length; + } + + // https://github.com/felixge/node-form-data/issues/40 + if (this._lengthRetrievers.length) { + // Some async length retrivers are present + // therefore synchronous length calculation is false. + // Please use getLength(callback) to get proper length + this._error(new Error('Cannot calculate proper length in synchronous way.')); + } + + return knownLength; +}; + +FormData.prototype.getLength = function(cb) { + var knownLength = this._overheadLength + this._valueLength; + + if (this._streams.length) { + knownLength += this._lastBoundary().length; + } + + if (!this._lengthRetrievers.length) { + process.nextTick(cb.bind(this, null, knownLength)); + return; + } + + async.parallel(this._lengthRetrievers, function(err, values) { + if (err) { + cb(err); + return; + } + + values.forEach(function(length) { + knownLength += length; + }); + + cb(null, knownLength); + }); +}; + +FormData.prototype.submit = function(params, cb) { + + var request + , options + , defaults = { + method : 'post' + }; + + // parse provided url if it's string + // or treat it as options object + if (typeof params == 'string') { + params = parseUrl(params); + + options = populate({ + port: params.port, + path: params.pathname, + host: params.hostname + }, defaults); + } + else // use custom params + { + options = populate(params, defaults); + // if no port provided use default one + if (!options.port) { + options.port = options.protocol == 'https:' ? 443 : 80; + } + } + + // put that good code in getHeaders to some use + options.headers = this.getHeaders(params.headers); + + // https if specified, fallback to http in any other case + if (params.protocol == 'https:') { + request = https.request(options); + } else { + request = http.request(options); + } + + // get content length and fire away + this.getLength(function(err, length) { + + // TODO: Add chunked encoding when no length (if err) + + // add content length + request.setHeader('Content-Length', length); + + this.pipe(request); + if (cb) { + request.on('error', cb); + request.on('response', cb.bind(this, null)); + } + }.bind(this)); + + return request; +}; + +FormData.prototype._error = function(err) { + if (this.error) return; + + this.error = err; + this.pause(); + this.emit('error', err); +}; + +/* + * Santa's little helpers + */ + +// populates missing values +function populate(dst, src) { + for (var prop in src) { + if (!dst[prop]) dst[prop] = src[prop]; + } + return dst; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml new file mode 100644 index 0000000..6e5919d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "0.10" diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE new file mode 100644 index 0000000..8f29698 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2010-2014 Caolan McMahon + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md new file mode 100644 index 0000000..0bea531 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md @@ -0,0 +1,1646 @@ +# Async.js + +[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async) + + +Async is a utility module which provides straight-forward, powerful functions +for working with asynchronous JavaScript. Although originally designed for +use with [Node.js](http://nodejs.org), it can also be used directly in the +browser. Also supports [component](https://github.com/component/component). + +Async provides around 20 functions that include the usual 'functional' +suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns +for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these +functions assume you follow the Node.js convention of providing a single +callback as the last argument of your `async` function. + + +## Quick Examples + +```javascript +async.map(['file1','file2','file3'], fs.stat, function(err, results){ + // results is now an array of stats for each file +}); + +async.filter(['file1','file2','file3'], fs.exists, function(results){ + // results now equals an array of the existing files +}); + +async.parallel([ + function(){ ... }, + function(){ ... } +], callback); + +async.series([ + function(){ ... }, + function(){ ... } +]); +``` + +There are many more functions available so take a look at the docs below for a +full list. This module aims to be comprehensive, so if you feel anything is +missing please create a GitHub issue for it. + +## Common Pitfalls + +### Binding a context to an iterator + +This section is really about `bind`, not about `async`. If you are wondering how to +make `async` execute your iterators in a given context, or are confused as to why +a method of another library isn't working as an iterator, study this example: + +```js +// Here is a simple object with an (unnecessarily roundabout) squaring method +var AsyncSquaringLibrary = { + squareExponent: 2, + square: function(number, callback){ + var result = Math.pow(number, this.squareExponent); + setTimeout(function(){ + callback(null, result); + }, 200); + } +}; + +async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){ + // result is [NaN, NaN, NaN] + // This fails because the `this.squareExponent` expression in the square + // function is not evaluated in the context of AsyncSquaringLibrary, and is + // therefore undefined. +}); + +async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){ + // result is [1, 4, 9] + // With the help of bind we can attach a context to the iterator before + // passing it to async. Now the square function will be executed in its + // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent` + // will be as expected. +}); +``` + +## Download + +The source is available for download from +[GitHub](http://github.com/caolan/async). +Alternatively, you can install using Node Package Manager (`npm`): + + npm install async + +__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed + +## In the Browser + +So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. + +Usage: + +```html + + +``` + +## Documentation + +### Collections + +* [`each`](#each) +* [`eachSeries`](#eachSeries) +* [`eachLimit`](#eachLimit) +* [`map`](#map) +* [`mapSeries`](#mapSeries) +* [`mapLimit`](#mapLimit) +* [`filter`](#filter) +* [`filterSeries`](#filterSeries) +* [`reject`](#reject) +* [`rejectSeries`](#rejectSeries) +* [`reduce`](#reduce) +* [`reduceRight`](#reduceRight) +* [`detect`](#detect) +* [`detectSeries`](#detectSeries) +* [`sortBy`](#sortBy) +* [`some`](#some) +* [`every`](#every) +* [`concat`](#concat) +* [`concatSeries`](#concatSeries) + +### Control Flow + +* [`series`](#seriestasks-callback) +* [`parallel`](#parallel) +* [`parallelLimit`](#parallellimittasks-limit-callback) +* [`whilst`](#whilst) +* [`doWhilst`](#doWhilst) +* [`until`](#until) +* [`doUntil`](#doUntil) +* [`forever`](#forever) +* [`waterfall`](#waterfall) +* [`compose`](#compose) +* [`seq`](#seq) +* [`applyEach`](#applyEach) +* [`applyEachSeries`](#applyEachSeries) +* [`queue`](#queue) +* [`priorityQueue`](#priorityQueue) +* [`cargo`](#cargo) +* [`auto`](#auto) +* [`retry`](#retry) +* [`iterator`](#iterator) +* [`apply`](#apply) +* [`nextTick`](#nextTick) +* [`times`](#times) +* [`timesSeries`](#timesSeries) + +### Utils + +* [`memoize`](#memoize) +* [`unmemoize`](#unmemoize) +* [`log`](#log) +* [`dir`](#dir) +* [`noConflict`](#noConflict) + + +## Collections + + + +### each(arr, iterator, callback) + +Applies the function `iterator` to each item in `arr`, in parallel. +The `iterator` is called with an item from the list, and a callback for when it +has finished. If the `iterator` passes an error to its `callback`, the main +`callback` (for the `each` function) is immediately called with the error. + +Note, that since this function applies `iterator` to each item in parallel, +there is no guarantee that the iterator functions will complete in order. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A function to apply to each item in `arr`. + The iterator is passed a `callback(err)` which must be called once it has + completed. If no error has occured, the `callback` should be run without + arguments or with an explicit `null` argument. +* `callback(err)` - A callback which is called when all `iterator` functions + have finished, or an error occurs. + +__Examples__ + + +```js +// assuming openFiles is an array of file names and saveFile is a function +// to save the modified contents of that file: + +async.each(openFiles, saveFile, function(err){ + // if any of the saves produced an error, err would equal that error +}); +``` + +```js +// assuming openFiles is an array of file names + +async.each(openFiles, function( file, callback) { + + // Perform operation on file here. + console.log('Processing file ' + file); + + if( file.length > 32 ) { + console.log('This file name is too long'); + callback('File name too long'); + } else { + // Do work to process file here + console.log('File processed'); + callback(); + } +}, function(err){ + // if any of the file processing produced an error, err would equal that error + if( err ) { + // One of the iterations produced an error. + // All processing will now stop. + console.log('A file failed to process'); + } else { + console.log('All files have been processed successfully'); + } +}); +``` + +--------------------------------------- + + + +### eachSeries(arr, iterator, callback) + +The same as [`each`](#each), only `iterator` is applied to each item in `arr` in +series. The next `iterator` is only called once the current one has completed. +This means the `iterator` functions will complete in order. + + +--------------------------------------- + + + +### eachLimit(arr, limit, iterator, callback) + +The same as [`each`](#each), only no more than `limit` `iterator`s will be simultaneously +running at any time. + +Note that the items in `arr` are not processed in batches, so there is no guarantee that +the first `limit` `iterator` functions will complete before any others are started. + +__Arguments__ + +* `arr` - An array to iterate over. +* `limit` - The maximum number of `iterator`s to run at any time. +* `iterator(item, callback)` - A function to apply to each item in `arr`. + The iterator is passed a `callback(err)` which must be called once it has + completed. If no error has occured, the callback should be run without + arguments or with an explicit `null` argument. +* `callback(err)` - A callback which is called when all `iterator` functions + have finished, or an error occurs. + +__Example__ + +```js +// Assume documents is an array of JSON objects and requestApi is a +// function that interacts with a rate-limited REST api. + +async.eachLimit(documents, 20, requestApi, function(err){ + // if any of the saves produced an error, err would equal that error +}); +``` + +--------------------------------------- + + +### map(arr, iterator, callback) + +Produces a new array of values by mapping each value in `arr` through +the `iterator` function. The `iterator` is called with an item from `arr` and a +callback for when it has finished processing. Each of these callback takes 2 arguments: +an `error`, and the transformed item from `arr`. If `iterator` passes an error to this +callback, the main `callback` (for the `map` function) is immediately called with the error. + +Note, that since this function applies the `iterator` to each item in parallel, +there is no guarantee that the `iterator` functions will complete in order. +However, the results array will be in the same order as the original `arr`. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A function to apply to each item in `arr`. + The iterator is passed a `callback(err, transformed)` which must be called once + it has completed with an error (which can be `null`) and a transformed item. +* `callback(err, results)` - A callback which is called when all `iterator` + functions have finished, or an error occurs. Results is an array of the + transformed items from the `arr`. + +__Example__ + +```js +async.map(['file1','file2','file3'], fs.stat, function(err, results){ + // results is now an array of stats for each file +}); +``` + +--------------------------------------- + + +### mapSeries(arr, iterator, callback) + +The same as [`map`](#map), only the `iterator` is applied to each item in `arr` in +series. The next `iterator` is only called once the current one has completed. +The results array will be in the same order as the original. + + +--------------------------------------- + + +### mapLimit(arr, limit, iterator, callback) + +The same as [`map`](#map), only no more than `limit` `iterator`s will be simultaneously +running at any time. + +Note that the items are not processed in batches, so there is no guarantee that +the first `limit` `iterator` functions will complete before any others are started. + +__Arguments__ + +* `arr` - An array to iterate over. +* `limit` - The maximum number of `iterator`s to run at any time. +* `iterator(item, callback)` - A function to apply to each item in `arr`. + The iterator is passed a `callback(err, transformed)` which must be called once + it has completed with an error (which can be `null`) and a transformed item. +* `callback(err, results)` - A callback which is called when all `iterator` + calls have finished, or an error occurs. The result is an array of the + transformed items from the original `arr`. + +__Example__ + +```js +async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){ + // results is now an array of stats for each file +}); +``` + +--------------------------------------- + + + +### filter(arr, iterator, callback) + +__Alias:__ `select` + +Returns a new array of all the values in `arr` which pass an async truth test. +_The callback for each `iterator` call only accepts a single argument of `true` or +`false`; it does not accept an error argument first!_ This is in-line with the +way node libraries work with truth tests like `fs.exists`. This operation is +performed in parallel, but the results array will be in the same order as the +original. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A truth test to apply to each item in `arr`. + The `iterator` is passed a `callback(truthValue)`, which must be called with a + boolean argument once it has completed. +* `callback(results)` - A callback which is called after all the `iterator` + functions have finished. + +__Example__ + +```js +async.filter(['file1','file2','file3'], fs.exists, function(results){ + // results now equals an array of the existing files +}); +``` + +--------------------------------------- + + + +### filterSeries(arr, iterator, callback) + +__Alias:__ `selectSeries` + +The same as [`filter`](#filter) only the `iterator` is applied to each item in `arr` in +series. The next `iterator` is only called once the current one has completed. +The results array will be in the same order as the original. + +--------------------------------------- + + +### reject(arr, iterator, callback) + +The opposite of [`filter`](#filter). Removes values that pass an `async` truth test. + +--------------------------------------- + + +### rejectSeries(arr, iterator, callback) + +The same as [`reject`](#reject), only the `iterator` is applied to each item in `arr` +in series. + + +--------------------------------------- + + +### reduce(arr, memo, iterator, callback) + +__Aliases:__ `inject`, `foldl` + +Reduces `arr` into a single value using an async `iterator` to return +each successive step. `memo` is the initial state of the reduction. +This function only operates in series. + +For performance reasons, it may make sense to split a call to this function into +a parallel map, and then use the normal `Array.prototype.reduce` on the results. +This function is for situations where each step in the reduction needs to be async; +if you can get the data before reducing it, then it's probably a good idea to do so. + +__Arguments__ + +* `arr` - An array to iterate over. +* `memo` - The initial state of the reduction. +* `iterator(memo, item, callback)` - A function applied to each item in the + array to produce the next step in the reduction. The `iterator` is passed a + `callback(err, reduction)` which accepts an optional error as its first + argument, and the state of the reduction as the second. If an error is + passed to the callback, the reduction is stopped and the main `callback` is + immediately called with the error. +* `callback(err, result)` - A callback which is called after all the `iterator` + functions have finished. Result is the reduced value. + +__Example__ + +```js +async.reduce([1,2,3], 0, function(memo, item, callback){ + // pointless async: + process.nextTick(function(){ + callback(null, memo + item) + }); +}, function(err, result){ + // result is now equal to the last value of memo, which is 6 +}); +``` + +--------------------------------------- + + +### reduceRight(arr, memo, iterator, callback) + +__Alias:__ `foldr` + +Same as [`reduce`](#reduce), only operates on `arr` in reverse order. + + +--------------------------------------- + + +### detect(arr, iterator, callback) + +Returns the first value in `arr` that passes an async truth test. The +`iterator` is applied in parallel, meaning the first iterator to return `true` will +fire the detect `callback` with that result. That means the result might not be +the first item in the original `arr` (in terms of order) that passes the test. + +If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries). + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A truth test to apply to each item in `arr`. + The iterator is passed a `callback(truthValue)` which must be called with a + boolean argument once it has completed. +* `callback(result)` - A callback which is called as soon as any iterator returns + `true`, or after all the `iterator` functions have finished. Result will be + the first item in the array that passes the truth test (iterator) or the + value `undefined` if none passed. + +__Example__ + +```js +async.detect(['file1','file2','file3'], fs.exists, function(result){ + // result now equals the first file in the list that exists +}); +``` + +--------------------------------------- + + +### detectSeries(arr, iterator, callback) + +The same as [`detect`](#detect), only the `iterator` is applied to each item in `arr` +in series. This means the result is always the first in the original `arr` (in +terms of array order) that passes the truth test. + + +--------------------------------------- + + +### sortBy(arr, iterator, callback) + +Sorts a list by the results of running each `arr` value through an async `iterator`. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A function to apply to each item in `arr`. + The iterator is passed a `callback(err, sortValue)` which must be called once it + has completed with an error (which can be `null`) and a value to use as the sort + criteria. +* `callback(err, results)` - A callback which is called after all the `iterator` + functions have finished, or an error occurs. Results is the items from + the original `arr` sorted by the values returned by the `iterator` calls. + +__Example__ + +```js +async.sortBy(['file1','file2','file3'], function(file, callback){ + fs.stat(file, function(err, stats){ + callback(err, stats.mtime); + }); +}, function(err, results){ + // results is now the original array of files sorted by + // modified date +}); +``` + +__Sort Order__ + +By modifying the callback parameter the sorting order can be influenced: + +```js +//ascending order +async.sortBy([1,9,3,5], function(x, callback){ + callback(err, x); +}, function(err,result){ + //result callback +} ); + +//descending order +async.sortBy([1,9,3,5], function(x, callback){ + callback(err, x*-1); //<- x*-1 instead of x, turns the order around +}, function(err,result){ + //result callback +} ); +``` + +--------------------------------------- + + +### some(arr, iterator, callback) + +__Alias:__ `any` + +Returns `true` if at least one element in the `arr` satisfies an async test. +_The callback for each iterator call only accepts a single argument of `true` or +`false`; it does not accept an error argument first!_ This is in-line with the +way node libraries work with truth tests like `fs.exists`. Once any iterator +call returns `true`, the main `callback` is immediately called. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A truth test to apply to each item in the array + in parallel. The iterator is passed a callback(truthValue) which must be + called with a boolean argument once it has completed. +* `callback(result)` - A callback which is called as soon as any iterator returns + `true`, or after all the iterator functions have finished. Result will be + either `true` or `false` depending on the values of the async tests. + +__Example__ + +```js +async.some(['file1','file2','file3'], fs.exists, function(result){ + // if result is true then at least one of the files exists +}); +``` + +--------------------------------------- + + +### every(arr, iterator, callback) + +__Alias:__ `all` + +Returns `true` if every element in `arr` satisfies an async test. +_The callback for each `iterator` call only accepts a single argument of `true` or +`false`; it does not accept an error argument first!_ This is in-line with the +way node libraries work with truth tests like `fs.exists`. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A truth test to apply to each item in the array + in parallel. The iterator is passed a callback(truthValue) which must be + called with a boolean argument once it has completed. +* `callback(result)` - A callback which is called after all the `iterator` + functions have finished. Result will be either `true` or `false` depending on + the values of the async tests. + +__Example__ + +```js +async.every(['file1','file2','file3'], fs.exists, function(result){ + // if result is true then every file exists +}); +``` + +--------------------------------------- + + +### concat(arr, iterator, callback) + +Applies `iterator` to each item in `arr`, concatenating the results. Returns the +concatenated list. The `iterator`s are called in parallel, and the results are +concatenated as they return. There is no guarantee that the results array will +be returned in the original order of `arr` passed to the `iterator` function. + +__Arguments__ + +* `arr` - An array to iterate over. +* `iterator(item, callback)` - A function to apply to each item in `arr`. + The iterator is passed a `callback(err, results)` which must be called once it + has completed with an error (which can be `null`) and an array of results. +* `callback(err, results)` - A callback which is called after all the `iterator` + functions have finished, or an error occurs. Results is an array containing + the concatenated results of the `iterator` function. + +__Example__ + +```js +async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ + // files is now a list of filenames that exist in the 3 directories +}); +``` + +--------------------------------------- + + +### concatSeries(arr, iterator, callback) + +Same as [`concat`](#concat), but executes in series instead of parallel. + + +## Control Flow + + +### series(tasks, [callback]) + +Run the functions in the `tasks` array in series, each one running once the previous +function has completed. If any functions in the series pass an error to its +callback, no more functions are run, and `callback` is immediately called with the value of the error. +Otherwise, `callback` receives an array of results when `tasks` have completed. + +It is also possible to use an object instead of an array. Each property will be +run as a function, and the results will be passed to the final `callback` as an object +instead of an array. This can be a more readable way of handling results from +[`series`](#series). + +**Note** that while many implementations preserve the order of object properties, the +[ECMAScript Language Specifcation](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) +explicitly states that + +> The mechanics and order of enumerating the properties is not specified. + +So if you rely on the order in which your series of functions are executed, and want +this to work on all platforms, consider using an array. + +__Arguments__ + +* `tasks` - An array or object containing functions to run, each function is passed + a `callback(err, result)` it must call on completion with an error `err` (which can + be `null`) and an optional `result` value. +* `callback(err, results)` - An optional callback to run once all the functions + have completed. This function gets a results array (or object) containing all + the result arguments passed to the `task` callbacks. + +__Example__ + +```js +async.series([ + function(callback){ + // do some stuff ... + callback(null, 'one'); + }, + function(callback){ + // do some more stuff ... + callback(null, 'two'); + } +], +// optional callback +function(err, results){ + // results is now equal to ['one', 'two'] +}); + + +// an example using an object instead of an array +async.series({ + one: function(callback){ + setTimeout(function(){ + callback(null, 1); + }, 200); + }, + two: function(callback){ + setTimeout(function(){ + callback(null, 2); + }, 100); + } +}, +function(err, results) { + // results is now equal to: {one: 1, two: 2} +}); +``` + +--------------------------------------- + + +### parallel(tasks, [callback]) + +Run the `tasks` array of functions in parallel, without waiting until the previous +function has completed. If any of the functions pass an error to its +callback, the main `callback` is immediately called with the value of the error. +Once the `tasks` have completed, the results are passed to the final `callback` as an +array. + +It is also possible to use an object instead of an array. Each property will be +run as a function and the results will be passed to the final `callback` as an object +instead of an array. This can be a more readable way of handling results from +[`parallel`](#parallel). + + +__Arguments__ + +* `tasks` - An array or object containing functions to run. Each function is passed + a `callback(err, result)` which it must call on completion with an error `err` + (which can be `null`) and an optional `result` value. +* `callback(err, results)` - An optional callback to run once all the functions + have completed. This function gets a results array (or object) containing all + the result arguments passed to the task callbacks. + +__Example__ + +```js +async.parallel([ + function(callback){ + setTimeout(function(){ + callback(null, 'one'); + }, 200); + }, + function(callback){ + setTimeout(function(){ + callback(null, 'two'); + }, 100); + } +], +// optional callback +function(err, results){ + // the results array will equal ['one','two'] even though + // the second function had a shorter timeout. +}); + + +// an example using an object instead of an array +async.parallel({ + one: function(callback){ + setTimeout(function(){ + callback(null, 1); + }, 200); + }, + two: function(callback){ + setTimeout(function(){ + callback(null, 2); + }, 100); + } +}, +function(err, results) { + // results is now equals to: {one: 1, two: 2} +}); +``` + +--------------------------------------- + + +### parallelLimit(tasks, limit, [callback]) + +The same as [`parallel`](#parallel), only `tasks` are executed in parallel +with a maximum of `limit` tasks executing at any time. + +Note that the `tasks` are not executed in batches, so there is no guarantee that +the first `limit` tasks will complete before any others are started. + +__Arguments__ + +* `tasks` - An array or object containing functions to run, each function is passed + a `callback(err, result)` it must call on completion with an error `err` (which can + be `null`) and an optional `result` value. +* `limit` - The maximum number of `tasks` to run at any time. +* `callback(err, results)` - An optional callback to run once all the functions + have completed. This function gets a results array (or object) containing all + the result arguments passed to the `task` callbacks. + +--------------------------------------- + + +### whilst(test, fn, callback) + +Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped, +or an error occurs. + +__Arguments__ + +* `test()` - synchronous truth test to perform before each execution of `fn`. +* `fn(callback)` - A function which is called each time `test` passes. The function is + passed a `callback(err)`, which must be called once it has completed with an + optional `err` argument. +* `callback(err)` - A callback which is called after the test fails and repeated + execution of `fn` has stopped. + +__Example__ + +```js +var count = 0; + +async.whilst( + function () { return count < 5; }, + function (callback) { + count++; + setTimeout(callback, 1000); + }, + function (err) { + // 5 seconds have passed + } +); +``` + +--------------------------------------- + + +### doWhilst(fn, test, callback) + +The post-check version of [`whilst`](#whilst). To reflect the difference in +the order of operations, the arguments `test` and `fn` are switched. + +`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript. + +--------------------------------------- + + +### until(test, fn, callback) + +Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped, +or an error occurs. + +The inverse of [`whilst`](#whilst). + +--------------------------------------- + + +### doUntil(fn, test, callback) + +Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`. + +--------------------------------------- + + +### forever(fn, errback) + +Calls the asynchronous function `fn` with a callback parameter that allows it to +call itself again, in series, indefinitely. + +If an error is passed to the callback then `errback` is called with the +error, and execution stops, otherwise it will never be called. + +```js +async.forever( + function(next) { + // next is suitable for passing to things that need a callback(err [, whatever]); + // it will result in this function being called again. + }, + function(err) { + // if next is called with a value in its first parameter, it will appear + // in here as 'err', and execution will stop. + } +); +``` + +--------------------------------------- + + +### waterfall(tasks, [callback]) + +Runs the `tasks` array of functions in series, each passing their results to the next in +the array. However, if any of the `tasks` pass an error to their own callback, the +next function is not executed, and the main `callback` is immediately called with +the error. + +__Arguments__ + +* `tasks` - An array of functions to run, each function is passed a + `callback(err, result1, result2, ...)` it must call on completion. The first + argument is an error (which can be `null`) and any further arguments will be + passed as arguments in order to the next task. +* `callback(err, [results])` - An optional callback to run once all the functions + have completed. This will be passed the results of the last task's callback. + + + +__Example__ + +```js +async.waterfall([ + function(callback){ + callback(null, 'one', 'two'); + }, + function(arg1, arg2, callback){ + // arg1 now equals 'one' and arg2 now equals 'two' + callback(null, 'three'); + }, + function(arg1, callback){ + // arg1 now equals 'three' + callback(null, 'done'); + } +], function (err, result) { + // result now equals 'done' +}); +``` + +--------------------------------------- + +### compose(fn1, fn2...) + +Creates a function which is a composition of the passed asynchronous +functions. Each function consumes the return value of the function that +follows. Composing functions `f()`, `g()`, and `h()` would produce the result of +`f(g(h()))`, only this version uses callbacks to obtain the return values. + +Each function is executed with the `this` binding of the composed function. + +__Arguments__ + +* `functions...` - the asynchronous functions to compose + + +__Example__ + +```js +function add1(n, callback) { + setTimeout(function () { + callback(null, n + 1); + }, 10); +} + +function mul3(n, callback) { + setTimeout(function () { + callback(null, n * 3); + }, 10); +} + +var add1mul3 = async.compose(mul3, add1); + +add1mul3(4, function (err, result) { + // result now equals 15 +}); +``` + +--------------------------------------- + +### seq(fn1, fn2...) + +Version of the compose function that is more natural to read. +Each following function consumes the return value of the latter function. + +Each function is executed with the `this` binding of the composed function. + +__Arguments__ + +* functions... - the asynchronous functions to compose + + +__Example__ + +```js +// Requires lodash (or underscore), express3 and dresende's orm2. +// Part of an app, that fetches cats of the logged user. +// This example uses `seq` function to avoid overnesting and error +// handling clutter. +app.get('/cats', function(request, response) { + function handleError(err, data, callback) { + if (err) { + console.error(err); + response.json({ status: 'error', message: err.message }); + } + else { + callback(data); + } + } + var User = request.models.User; + async.seq( + _.bind(User.get, User), // 'User.get' has signature (id, callback(err, data)) + handleError, + function(user, fn) { + user.getCats(fn); // 'getCats' has signature (callback(err, data)) + }, + handleError, + function(cats) { + response.json({ status: 'ok', message: 'Cats found', data: cats }); + } + )(req.session.user_id); + } +}); +``` + +--------------------------------------- + +### applyEach(fns, args..., callback) + +Applies the provided arguments to each function in the array, calling +`callback` after all functions have completed. If you only provide the first +argument, then it will return a function which lets you pass in the +arguments as if it were a single function call. + +__Arguments__ + +* `fns` - the asynchronous functions to all call with the same arguments +* `args...` - any number of separate arguments to pass to the function +* `callback` - the final argument should be the callback, called when all + functions have completed processing + + +__Example__ + +```js +async.applyEach([enableSearch, updateSchema], 'bucket', callback); + +// partial application example: +async.each( + buckets, + async.applyEach([enableSearch, updateSchema]), + callback +); +``` + +--------------------------------------- + + +### applyEachSeries(arr, iterator, callback) + +The same as [`applyEach`](#applyEach) only the functions are applied in series. + +--------------------------------------- + + +### queue(worker, concurrency) + +Creates a `queue` object with the specified `concurrency`. Tasks added to the +`queue` are processed in parallel (up to the `concurrency` limit). If all +`worker`s are in progress, the task is queued until one becomes available. +Once a `worker` completes a `task`, that `task`'s callback is called. + +__Arguments__ + +* `worker(task, callback)` - An asynchronous function for processing a queued + task, which must call its `callback(err)` argument when finished, with an + optional `error` as an argument. +* `concurrency` - An `integer` for determining how many `worker` functions should be + run in parallel. + +__Queue objects__ + +The `queue` object returned by this function has the following properties and +methods: + +* `length()` - a function returning the number of items waiting to be processed. +* `started` - a function returning whether or not any items have been pushed and processed by the queue +* `running()` - a function returning the number of items currently being processed. +* `idle()` - a function returning false if there are items waiting or being processed, or true if not. +* `concurrency` - an integer for determining how many `worker` functions should be + run in parallel. This property can be changed after a `queue` is created to + alter the concurrency on-the-fly. +* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once + the `worker` has finished processing the task. Instead of a single task, a `tasks` array + can be submitted. The respective callback is used for every task in the list. +* `unshift(task, [callback])` - add a new task to the front of the `queue`. +* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit, + and further tasks will be queued. +* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`. +* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`. +* `paused` - a boolean for determining whether the queue is in a paused state +* `pause()` - a function that pauses the processing of tasks until `resume()` is called. +* `resume()` - a function that resumes the processing of queued tasks when the queue is paused. +* `kill()` - a function that empties remaining tasks from the queue forcing it to go idle. + +__Example__ + +```js +// create a queue object with concurrency 2 + +var q = async.queue(function (task, callback) { + console.log('hello ' + task.name); + callback(); +}, 2); + + +// assign a callback +q.drain = function() { + console.log('all items have been processed'); +} + +// add some items to the queue + +q.push({name: 'foo'}, function (err) { + console.log('finished processing foo'); +}); +q.push({name: 'bar'}, function (err) { + console.log('finished processing bar'); +}); + +// add some items to the queue (batch-wise) + +q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) { + console.log('finished processing bar'); +}); + +// add some items to the front of the queue + +q.unshift({name: 'bar'}, function (err) { + console.log('finished processing bar'); +}); +``` + + +--------------------------------------- + + +### priorityQueue(worker, concurrency) + +The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects: + +* `push(task, priority, [callback])` - `priority` should be a number. If an array of + `tasks` is given, all tasks will be assigned the same priority. +* The `unshift` method was removed. + +--------------------------------------- + + +### cargo(worker, [payload]) + +Creates a `cargo` object with the specified payload. Tasks added to the +cargo will be processed altogether (up to the `payload` limit). If the +`worker` is in progress, the task is queued until it becomes available. Once +the `worker` has completed some tasks, each callback of those tasks is called. +Check out [this animation](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) for how `cargo` and `queue` work. + +While [queue](#queue) passes only one task to one of a group of workers +at a time, cargo passes an array of tasks to a single worker, repeating +when the worker is finished. + +__Arguments__ + +* `worker(tasks, callback)` - An asynchronous function for processing an array of + queued tasks, which must call its `callback(err)` argument when finished, with + an optional `err` argument. +* `payload` - An optional `integer` for determining how many tasks should be + processed per round; if omitted, the default is unlimited. + +__Cargo objects__ + +The `cargo` object returned by this function has the following properties and +methods: + +* `length()` - A function returning the number of items waiting to be processed. +* `payload` - An `integer` for determining how many tasks should be + process per round. This property can be changed after a `cargo` is created to + alter the payload on-the-fly. +* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called + once the `worker` has finished processing the task. Instead of a single task, an array of `tasks` + can be submitted. The respective callback is used for every task in the list. +* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued. +* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`. +* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`. + +__Example__ + +```js +// create a cargo object with payload 2 + +var cargo = async.cargo(function (tasks, callback) { + for(var i=0; i +### auto(tasks, [callback]) + +Determines the best order for running the functions in `tasks`, based on their +requirements. Each function can optionally depend on other functions being completed +first, and each function is run as soon as its requirements are satisfied. + +If any of the functions pass an error to their callback, it will not +complete (so any other functions depending on it will not run), and the main +`callback` is immediately called with the error. Functions also receive an +object containing the results of functions which have completed so far. + +Note, all functions are called with a `results` object as a second argument, +so it is unsafe to pass functions in the `tasks` object which cannot handle the +extra argument. + +For example, this snippet of code: + +```js +async.auto({ + readData: async.apply(fs.readFile, 'data.txt', 'utf-8') +}, callback); +``` + +will have the effect of calling `readFile` with the results object as the last +argument, which will fail: + +```js +fs.readFile('data.txt', 'utf-8', cb, {}); +``` + +Instead, wrap the call to `readFile` in a function which does not forward the +`results` object: + +```js +async.auto({ + readData: function(cb, results){ + fs.readFile('data.txt', 'utf-8', cb); + } +}, callback); +``` + +__Arguments__ + +* `tasks` - An object. Each of its properties is either a function or an array of + requirements, with the function itself the last item in the array. The object's key + of a property serves as the name of the task defined by that property, + i.e. can be used when specifying requirements for other tasks. + The function receives two arguments: (1) a `callback(err, result)` which must be + called when finished, passing an `error` (which can be `null`) and the result of + the function's execution, and (2) a `results` object, containing the results of + the previously executed functions. +* `callback(err, results)` - An optional callback which is called when all the + tasks have been completed. It receives the `err` argument if any `tasks` + pass an error to their callback. Results are always returned; however, if + an error occurs, no further `tasks` will be performed, and the results + object will only contain partial results. + + +__Example__ + +```js +async.auto({ + get_data: function(callback){ + console.log('in get_data'); + // async code to get some data + callback(null, 'data', 'converted to array'); + }, + make_folder: function(callback){ + console.log('in make_folder'); + // async code to create a directory to store a file in + // this is run at the same time as getting the data + callback(null, 'folder'); + }, + write_file: ['get_data', 'make_folder', function(callback, results){ + console.log('in write_file', JSON.stringify(results)); + // once there is some data and the directory exists, + // write the data to a file in the directory + callback(null, 'filename'); + }], + email_link: ['write_file', function(callback, results){ + console.log('in email_link', JSON.stringify(results)); + // once the file is written let's email a link to it... + // results.write_file contains the filename returned by write_file. + callback(null, {'file':results.write_file, 'email':'user@example.com'}); + }] +}, function(err, results) { + console.log('err = ', err); + console.log('results = ', results); +}); +``` + +This is a fairly trivial example, but to do this using the basic parallel and +series functions would look like this: + +```js +async.parallel([ + function(callback){ + console.log('in get_data'); + // async code to get some data + callback(null, 'data', 'converted to array'); + }, + function(callback){ + console.log('in make_folder'); + // async code to create a directory to store a file in + // this is run at the same time as getting the data + callback(null, 'folder'); + } +], +function(err, results){ + async.series([ + function(callback){ + console.log('in write_file', JSON.stringify(results)); + // once there is some data and the directory exists, + // write the data to a file in the directory + results.push('filename'); + callback(null); + }, + function(callback){ + console.log('in email_link', JSON.stringify(results)); + // once the file is written let's email a link to it... + callback(null, {'file':results.pop(), 'email':'user@example.com'}); + } + ]); +}); +``` + +For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding +new tasks much easier (and the code more readable). + + +--------------------------------------- + + +### retry([times = 5], task, [callback]) + +Attempts to get a successful response from `task` no more than `times` times before +returning an error. If the task is successful, the `callback` will be passed the result +of the successfull task. If all attemps fail, the callback will be passed the error and +result (if any) of the final attempt. + +__Arguments__ + +* `times` - An integer indicating how many times to attempt the `task` before giving up. Defaults to 5. +* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)` + which must be called when finished, passing `err` (which can be `null`) and the `result` of + the function's execution, and (2) a `results` object, containing the results of + the previously executed functions (if nested inside another control flow). +* `callback(err, results)` - An optional callback which is called when the + task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`. + +The [`retry`](#retry) function can be used as a stand-alone control flow by passing a +callback, as shown below: + +```js +async.retry(3, apiMethod, function(err, result) { + // do something with the result +}); +``` + +It can also be embeded within other control flow functions to retry individual methods +that are not as reliable, like this: + +```js +async.auto({ + users: api.getUsers.bind(api), + payments: async.retry(3, api.getPayments.bind(api)) +}, function(err, results) { + // do something with the results +}); +``` + + +--------------------------------------- + + +### iterator(tasks) + +Creates an iterator function which calls the next function in the `tasks` array, +returning a continuation to call the next one after that. It's also possible to +“peek” at the next iterator with `iterator.next()`. + +This function is used internally by the `async` module, but can be useful when +you want to manually control the flow of functions in series. + +__Arguments__ + +* `tasks` - An array of functions to run. + +__Example__ + +```js +var iterator = async.iterator([ + function(){ sys.p('one'); }, + function(){ sys.p('two'); }, + function(){ sys.p('three'); } +]); + +node> var iterator2 = iterator(); +'one' +node> var iterator3 = iterator2(); +'two' +node> iterator3(); +'three' +node> var nextfn = iterator2.next(); +node> nextfn(); +'three' +``` + +--------------------------------------- + + +### apply(function, arguments..) + +Creates a continuation function with some arguments already applied. + +Useful as a shorthand when combined with other control flow functions. Any arguments +passed to the returned function are added to the arguments originally passed +to apply. + +__Arguments__ + +* `function` - The function you want to eventually apply all arguments to. +* `arguments...` - Any number of arguments to automatically apply when the + continuation is called. + +__Example__ + +```js +// using apply + +async.parallel([ + async.apply(fs.writeFile, 'testfile1', 'test1'), + async.apply(fs.writeFile, 'testfile2', 'test2'), +]); + + +// the same process without using apply + +async.parallel([ + function(callback){ + fs.writeFile('testfile1', 'test1', callback); + }, + function(callback){ + fs.writeFile('testfile2', 'test2', callback); + } +]); +``` + +It's possible to pass any number of additional arguments when calling the +continuation: + +```js +node> var fn = async.apply(sys.puts, 'one'); +node> fn('two', 'three'); +one +two +three +``` + +--------------------------------------- + + +### nextTick(callback) + +Calls `callback` on a later loop around the event loop. In Node.js this just +calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)` +if available, otherwise `setTimeout(callback, 0)`, which means other higher priority +events may precede the execution of `callback`. + +This is used internally for browser-compatibility purposes. + +__Arguments__ + +* `callback` - The function to call on a later loop around the event loop. + +__Example__ + +```js +var call_order = []; +async.nextTick(function(){ + call_order.push('two'); + // call_order now equals ['one','two'] +}); +call_order.push('one') +``` + + +### times(n, callback) + +Calls the `callback` function `n` times, and accumulates results in the same manner +you would use with [`map`](#map). + +__Arguments__ + +* `n` - The number of times to run the function. +* `callback` - The function to call `n` times. + +__Example__ + +```js +// Pretend this is some complicated async factory +var createUser = function(id, callback) { + callback(null, { + id: 'user' + id + }) +} +// generate 5 users +async.times(5, function(n, next){ + createUser(n, function(err, user) { + next(err, user) + }) +}, function(err, users) { + // we should now have 5 users +}); +``` + + +### timesSeries(n, callback) + +The same as [`times`](#times), only the iterator is applied to each item in `arr` in +series. The next `iterator` is only called once the current one has completed. +The results array will be in the same order as the original. + + +## Utils + + +### memoize(fn, [hasher]) + +Caches the results of an `async` function. When creating a hash to store function +results against, the callback is omitted from the hash and an optional hash +function can be used. + +The cache of results is exposed as the `memo` property of the function returned +by `memoize`. + +__Arguments__ + +* `fn` - The function to proxy and cache results from. +* `hasher` - Tn optional function for generating a custom hash for storing + results. It has all the arguments applied to it apart from the callback, and + must be synchronous. + +__Example__ + +```js +var slow_fn = function (name, callback) { + // do something + callback(null, result); +}; +var fn = async.memoize(slow_fn); + +// fn can now be used as if it were slow_fn +fn('some name', function () { + // callback +}); +``` + + +### unmemoize(fn) + +Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized +form. Handy for testing. + +__Arguments__ + +* `fn` - the memoized function + + +### log(function, arguments) + +Logs the result of an `async` function to the `console`. Only works in Node.js or +in browsers that support `console.log` and `console.error` (such as FF and Chrome). +If multiple arguments are returned from the async function, `console.log` is +called on each argument in order. + +__Arguments__ + +* `function` - The function you want to eventually apply all arguments to. +* `arguments...` - Any number of arguments to apply to the function. + +__Example__ + +```js +var hello = function(name, callback){ + setTimeout(function(){ + callback(null, 'hello ' + name); + }, 1000); +}; +``` +```js +node> async.log(hello, 'world'); +'hello world' +``` + +--------------------------------------- + + +### dir(function, arguments) + +Logs the result of an `async` function to the `console` using `console.dir` to +display the properties of the resulting object. Only works in Node.js or +in browsers that support `console.dir` and `console.error` (such as FF and Chrome). +If multiple arguments are returned from the async function, `console.dir` is +called on each argument in order. + +__Arguments__ + +* `function` - The function you want to eventually apply all arguments to. +* `arguments...` - Any number of arguments to apply to the function. + +__Example__ + +```js +var hello = function(name, callback){ + setTimeout(function(){ + callback(null, {hello: name}); + }, 1000); +}; +``` +```js +node> async.dir(hello, 'world'); +{hello: 'world'} +``` + +--------------------------------------- + + +### noConflict() + +Changes the value of `async` back to its original value, returning a reference to the +`async` object. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/component.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/component.json new file mode 100644 index 0000000..bbb0115 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/component.json @@ -0,0 +1,11 @@ +{ + "name": "async", + "repo": "caolan/async", + "description": "Higher-order functions and common patterns for asynchronous code", + "version": "0.1.23", + "keywords": [], + "dependencies": {}, + "development": {}, + "main": "lib/async.js", + "scripts": [ "lib/async.js" ] +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js new file mode 100755 index 0000000..01e8afc --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js @@ -0,0 +1,1123 @@ +/*! + * async + * https://github.com/caolan/async + * + * Copyright 2010-2014 Caolan McMahon + * Released under the MIT license + */ +/*jshint onevar: false, indent:4 */ +/*global setImmediate: false, setTimeout: false, console: false */ +(function () { + + var async = {}; + + // global on the server, window in the browser + var root, previous_async; + + root = this; + if (root != null) { + previous_async = root.async; + } + + async.noConflict = function () { + root.async = previous_async; + return async; + }; + + function only_once(fn) { + var called = false; + return function() { + if (called) throw new Error("Callback was already called."); + called = true; + fn.apply(root, arguments); + } + } + + //// cross-browser compatiblity functions //// + + var _toString = Object.prototype.toString; + + var _isArray = Array.isArray || function (obj) { + return _toString.call(obj) === '[object Array]'; + }; + + var _each = function (arr, iterator) { + if (arr.forEach) { + return arr.forEach(iterator); + } + for (var i = 0; i < arr.length; i += 1) { + iterator(arr[i], i, arr); + } + }; + + var _map = function (arr, iterator) { + if (arr.map) { + return arr.map(iterator); + } + var results = []; + _each(arr, function (x, i, a) { + results.push(iterator(x, i, a)); + }); + return results; + }; + + var _reduce = function (arr, iterator, memo) { + if (arr.reduce) { + return arr.reduce(iterator, memo); + } + _each(arr, function (x, i, a) { + memo = iterator(memo, x, i, a); + }); + return memo; + }; + + var _keys = function (obj) { + if (Object.keys) { + return Object.keys(obj); + } + var keys = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + keys.push(k); + } + } + return keys; + }; + + //// exported async module functions //// + + //// nextTick implementation with browser-compatible fallback //// + if (typeof process === 'undefined' || !(process.nextTick)) { + if (typeof setImmediate === 'function') { + async.nextTick = function (fn) { + // not a direct alias for IE10 compatibility + setImmediate(fn); + }; + async.setImmediate = async.nextTick; + } + else { + async.nextTick = function (fn) { + setTimeout(fn, 0); + }; + async.setImmediate = async.nextTick; + } + } + else { + async.nextTick = process.nextTick; + if (typeof setImmediate !== 'undefined') { + async.setImmediate = function (fn) { + // not a direct alias for IE10 compatibility + setImmediate(fn); + }; + } + else { + async.setImmediate = async.nextTick; + } + } + + async.each = function (arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length) { + return callback(); + } + var completed = 0; + _each(arr, function (x) { + iterator(x, only_once(done) ); + }); + function done(err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed >= arr.length) { + callback(); + } + } + } + }; + async.forEach = async.each; + + async.eachSeries = function (arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length) { + return callback(); + } + var completed = 0; + var iterate = function () { + iterator(arr[completed], function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed >= arr.length) { + callback(); + } + else { + iterate(); + } + } + }); + }; + iterate(); + }; + async.forEachSeries = async.eachSeries; + + async.eachLimit = function (arr, limit, iterator, callback) { + var fn = _eachLimit(limit); + fn.apply(null, [arr, iterator, callback]); + }; + async.forEachLimit = async.eachLimit; + + var _eachLimit = function (limit) { + + return function (arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length || limit <= 0) { + return callback(); + } + var completed = 0; + var started = 0; + var running = 0; + + (function replenish () { + if (completed >= arr.length) { + return callback(); + } + + while (running < limit && started < arr.length) { + started += 1; + running += 1; + iterator(arr[started - 1], function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + running -= 1; + if (completed >= arr.length) { + callback(); + } + else { + replenish(); + } + } + }); + } + })(); + }; + }; + + + var doParallel = function (fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [async.each].concat(args)); + }; + }; + var doParallelLimit = function(limit, fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [_eachLimit(limit)].concat(args)); + }; + }; + var doSeries = function (fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [async.eachSeries].concat(args)); + }; + }; + + + var _asyncMap = function (eachfn, arr, iterator, callback) { + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + if (!callback) { + eachfn(arr, function (x, callback) { + iterator(x.value, function (err) { + callback(err); + }); + }); + } else { + var results = []; + eachfn(arr, function (x, callback) { + iterator(x.value, function (err, v) { + results[x.index] = v; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + async.map = doParallel(_asyncMap); + async.mapSeries = doSeries(_asyncMap); + async.mapLimit = function (arr, limit, iterator, callback) { + return _mapLimit(limit)(arr, iterator, callback); + }; + + var _mapLimit = function(limit) { + return doParallelLimit(limit, _asyncMap); + }; + + // reduce only has a series version, as doing reduce in parallel won't + // work in many situations. + async.reduce = function (arr, memo, iterator, callback) { + async.eachSeries(arr, function (x, callback) { + iterator(memo, x, function (err, v) { + memo = v; + callback(err); + }); + }, function (err) { + callback(err, memo); + }); + }; + // inject alias + async.inject = async.reduce; + // foldl alias + async.foldl = async.reduce; + + async.reduceRight = function (arr, memo, iterator, callback) { + var reversed = _map(arr, function (x) { + return x; + }).reverse(); + async.reduce(reversed, memo, iterator, callback); + }; + // foldr alias + async.foldr = async.reduceRight; + + var _filter = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (v) { + if (v) { + results.push(x); + } + callback(); + }); + }, function (err) { + callback(_map(results.sort(function (a, b) { + return a.index - b.index; + }), function (x) { + return x.value; + })); + }); + }; + async.filter = doParallel(_filter); + async.filterSeries = doSeries(_filter); + // select alias + async.select = async.filter; + async.selectSeries = async.filterSeries; + + var _reject = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (v) { + if (!v) { + results.push(x); + } + callback(); + }); + }, function (err) { + callback(_map(results.sort(function (a, b) { + return a.index - b.index; + }), function (x) { + return x.value; + })); + }); + }; + async.reject = doParallel(_reject); + async.rejectSeries = doSeries(_reject); + + var _detect = function (eachfn, arr, iterator, main_callback) { + eachfn(arr, function (x, callback) { + iterator(x, function (result) { + if (result) { + main_callback(x); + main_callback = function () {}; + } + else { + callback(); + } + }); + }, function (err) { + main_callback(); + }); + }; + async.detect = doParallel(_detect); + async.detectSeries = doSeries(_detect); + + async.some = function (arr, iterator, main_callback) { + async.each(arr, function (x, callback) { + iterator(x, function (v) { + if (v) { + main_callback(true); + main_callback = function () {}; + } + callback(); + }); + }, function (err) { + main_callback(false); + }); + }; + // any alias + async.any = async.some; + + async.every = function (arr, iterator, main_callback) { + async.each(arr, function (x, callback) { + iterator(x, function (v) { + if (!v) { + main_callback(false); + main_callback = function () {}; + } + callback(); + }); + }, function (err) { + main_callback(true); + }); + }; + // all alias + async.all = async.every; + + async.sortBy = function (arr, iterator, callback) { + async.map(arr, function (x, callback) { + iterator(x, function (err, criteria) { + if (err) { + callback(err); + } + else { + callback(null, {value: x, criteria: criteria}); + } + }); + }, function (err, results) { + if (err) { + return callback(err); + } + else { + var fn = function (left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }; + callback(null, _map(results.sort(fn), function (x) { + return x.value; + })); + } + }); + }; + + async.auto = function (tasks, callback) { + callback = callback || function () {}; + var keys = _keys(tasks); + var remainingTasks = keys.length + if (!remainingTasks) { + return callback(); + } + + var results = {}; + + var listeners = []; + var addListener = function (fn) { + listeners.unshift(fn); + }; + var removeListener = function (fn) { + for (var i = 0; i < listeners.length; i += 1) { + if (listeners[i] === fn) { + listeners.splice(i, 1); + return; + } + } + }; + var taskComplete = function () { + remainingTasks-- + _each(listeners.slice(0), function (fn) { + fn(); + }); + }; + + addListener(function () { + if (!remainingTasks) { + var theCallback = callback; + // prevent final callback from calling itself if it errors + callback = function () {}; + + theCallback(null, results); + } + }); + + _each(keys, function (k) { + var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]]; + var taskCallback = function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + if (err) { + var safeResults = {}; + _each(_keys(results), function(rkey) { + safeResults[rkey] = results[rkey]; + }); + safeResults[k] = args; + callback(err, safeResults); + // stop subsequent errors hitting callback multiple times + callback = function () {}; + } + else { + results[k] = args; + async.setImmediate(taskComplete); + } + }; + var requires = task.slice(0, Math.abs(task.length - 1)) || []; + var ready = function () { + return _reduce(requires, function (a, x) { + return (a && results.hasOwnProperty(x)); + }, true) && !results.hasOwnProperty(k); + }; + if (ready()) { + task[task.length - 1](taskCallback, results); + } + else { + var listener = function () { + if (ready()) { + removeListener(listener); + task[task.length - 1](taskCallback, results); + } + }; + addListener(listener); + } + }); + }; + + async.retry = function(times, task, callback) { + var DEFAULT_TIMES = 5; + var attempts = []; + // Use defaults if times not passed + if (typeof times === 'function') { + callback = task; + task = times; + times = DEFAULT_TIMES; + } + // Make sure times is a number + times = parseInt(times, 10) || DEFAULT_TIMES; + var wrappedTask = function(wrappedCallback, wrappedResults) { + var retryAttempt = function(task, finalAttempt) { + return function(seriesCallback) { + task(function(err, result){ + seriesCallback(!err || finalAttempt, {err: err, result: result}); + }, wrappedResults); + }; + }; + while (times) { + attempts.push(retryAttempt(task, !(times-=1))); + } + async.series(attempts, function(done, data){ + data = data[data.length - 1]; + (wrappedCallback || callback)(data.err, data.result); + }); + } + // If a callback is passed, run this as a controll flow + return callback ? wrappedTask() : wrappedTask + }; + + async.waterfall = function (tasks, callback) { + callback = callback || function () {}; + if (!_isArray(tasks)) { + var err = new Error('First argument to waterfall must be an array of functions'); + return callback(err); + } + if (!tasks.length) { + return callback(); + } + var wrapIterator = function (iterator) { + return function (err) { + if (err) { + callback.apply(null, arguments); + callback = function () {}; + } + else { + var args = Array.prototype.slice.call(arguments, 1); + var next = iterator.next(); + if (next) { + args.push(wrapIterator(next)); + } + else { + args.push(callback); + } + async.setImmediate(function () { + iterator.apply(null, args); + }); + } + }; + }; + wrapIterator(async.iterator(tasks))(); + }; + + var _parallel = function(eachfn, tasks, callback) { + callback = callback || function () {}; + if (_isArray(tasks)) { + eachfn.map(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args); + }); + } + }, callback); + } + else { + var results = {}; + eachfn.each(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.parallel = function (tasks, callback) { + _parallel({ map: async.map, each: async.each }, tasks, callback); + }; + + async.parallelLimit = function(tasks, limit, callback) { + _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); + }; + + async.series = function (tasks, callback) { + callback = callback || function () {}; + if (_isArray(tasks)) { + async.mapSeries(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args); + }); + } + }, callback); + } + else { + var results = {}; + async.eachSeries(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.iterator = function (tasks) { + var makeCallback = function (index) { + var fn = function () { + if (tasks.length) { + tasks[index].apply(null, arguments); + } + return fn.next(); + }; + fn.next = function () { + return (index < tasks.length - 1) ? makeCallback(index + 1): null; + }; + return fn; + }; + return makeCallback(0); + }; + + async.apply = function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + return function () { + return fn.apply( + null, args.concat(Array.prototype.slice.call(arguments)) + ); + }; + }; + + var _concat = function (eachfn, arr, fn, callback) { + var r = []; + eachfn(arr, function (x, cb) { + fn(x, function (err, y) { + r = r.concat(y || []); + cb(err); + }); + }, function (err) { + callback(err, r); + }); + }; + async.concat = doParallel(_concat); + async.concatSeries = doSeries(_concat); + + async.whilst = function (test, iterator, callback) { + if (test()) { + iterator(function (err) { + if (err) { + return callback(err); + } + async.whilst(test, iterator, callback); + }); + } + else { + callback(); + } + }; + + async.doWhilst = function (iterator, test, callback) { + iterator(function (err) { + if (err) { + return callback(err); + } + var args = Array.prototype.slice.call(arguments, 1); + if (test.apply(null, args)) { + async.doWhilst(iterator, test, callback); + } + else { + callback(); + } + }); + }; + + async.until = function (test, iterator, callback) { + if (!test()) { + iterator(function (err) { + if (err) { + return callback(err); + } + async.until(test, iterator, callback); + }); + } + else { + callback(); + } + }; + + async.doUntil = function (iterator, test, callback) { + iterator(function (err) { + if (err) { + return callback(err); + } + var args = Array.prototype.slice.call(arguments, 1); + if (!test.apply(null, args)) { + async.doUntil(iterator, test, callback); + } + else { + callback(); + } + }); + }; + + async.queue = function (worker, concurrency) { + if (concurrency === undefined) { + concurrency = 1; + } + function _insert(q, data, pos, callback) { + if (!q.started){ + q.started = true; + } + if (!_isArray(data)) { + data = [data]; + } + if(data.length == 0) { + // call drain immediately if there are no tasks + return async.setImmediate(function() { + if (q.drain) { + q.drain(); + } + }); + } + _each(data, function(task) { + var item = { + data: task, + callback: typeof callback === 'function' ? callback : null + }; + + if (pos) { + q.tasks.unshift(item); + } else { + q.tasks.push(item); + } + + if (q.saturated && q.tasks.length === q.concurrency) { + q.saturated(); + } + async.setImmediate(q.process); + }); + } + + var workers = 0; + var q = { + tasks: [], + concurrency: concurrency, + saturated: null, + empty: null, + drain: null, + started: false, + paused: false, + push: function (data, callback) { + _insert(q, data, false, callback); + }, + kill: function () { + q.drain = null; + q.tasks = []; + }, + unshift: function (data, callback) { + _insert(q, data, true, callback); + }, + process: function () { + if (!q.paused && workers < q.concurrency && q.tasks.length) { + var task = q.tasks.shift(); + if (q.empty && q.tasks.length === 0) { + q.empty(); + } + workers += 1; + var next = function () { + workers -= 1; + if (task.callback) { + task.callback.apply(task, arguments); + } + if (q.drain && q.tasks.length + workers === 0) { + q.drain(); + } + q.process(); + }; + var cb = only_once(next); + worker(task.data, cb); + } + }, + length: function () { + return q.tasks.length; + }, + running: function () { + return workers; + }, + idle: function() { + return q.tasks.length + workers === 0; + }, + pause: function () { + if (q.paused === true) { return; } + q.paused = true; + q.process(); + }, + resume: function () { + if (q.paused === false) { return; } + q.paused = false; + q.process(); + } + }; + return q; + }; + + async.priorityQueue = function (worker, concurrency) { + + function _compareTasks(a, b){ + return a.priority - b.priority; + }; + + function _binarySearch(sequence, item, compare) { + var beg = -1, + end = sequence.length - 1; + while (beg < end) { + var mid = beg + ((end - beg + 1) >>> 1); + if (compare(item, sequence[mid]) >= 0) { + beg = mid; + } else { + end = mid - 1; + } + } + return beg; + } + + function _insert(q, data, priority, callback) { + if (!q.started){ + q.started = true; + } + if (!_isArray(data)) { + data = [data]; + } + if(data.length == 0) { + // call drain immediately if there are no tasks + return async.setImmediate(function() { + if (q.drain) { + q.drain(); + } + }); + } + _each(data, function(task) { + var item = { + data: task, + priority: priority, + callback: typeof callback === 'function' ? callback : null + }; + + q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item); + + if (q.saturated && q.tasks.length === q.concurrency) { + q.saturated(); + } + async.setImmediate(q.process); + }); + } + + // Start with a normal queue + var q = async.queue(worker, concurrency); + + // Override push to accept second parameter representing priority + q.push = function (data, priority, callback) { + _insert(q, data, priority, callback); + }; + + // Remove unshift function + delete q.unshift; + + return q; + }; + + async.cargo = function (worker, payload) { + var working = false, + tasks = []; + + var cargo = { + tasks: tasks, + payload: payload, + saturated: null, + empty: null, + drain: null, + drained: true, + push: function (data, callback) { + if (!_isArray(data)) { + data = [data]; + } + _each(data, function(task) { + tasks.push({ + data: task, + callback: typeof callback === 'function' ? callback : null + }); + cargo.drained = false; + if (cargo.saturated && tasks.length === payload) { + cargo.saturated(); + } + }); + async.setImmediate(cargo.process); + }, + process: function process() { + if (working) return; + if (tasks.length === 0) { + if(cargo.drain && !cargo.drained) cargo.drain(); + cargo.drained = true; + return; + } + + var ts = typeof payload === 'number' + ? tasks.splice(0, payload) + : tasks.splice(0, tasks.length); + + var ds = _map(ts, function (task) { + return task.data; + }); + + if(cargo.empty) cargo.empty(); + working = true; + worker(ds, function () { + working = false; + + var args = arguments; + _each(ts, function (data) { + if (data.callback) { + data.callback.apply(null, args); + } + }); + + process(); + }); + }, + length: function () { + return tasks.length; + }, + running: function () { + return working; + } + }; + return cargo; + }; + + var _console_fn = function (name) { + return function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + fn.apply(null, args.concat([function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (typeof console !== 'undefined') { + if (err) { + if (console.error) { + console.error(err); + } + } + else if (console[name]) { + _each(args, function (x) { + console[name](x); + }); + } + } + }])); + }; + }; + async.log = _console_fn('log'); + async.dir = _console_fn('dir'); + /*async.info = _console_fn('info'); + async.warn = _console_fn('warn'); + async.error = _console_fn('error');*/ + + async.memoize = function (fn, hasher) { + var memo = {}; + var queues = {}; + hasher = hasher || function (x) { + return x; + }; + var memoized = function () { + var args = Array.prototype.slice.call(arguments); + var callback = args.pop(); + var key = hasher.apply(null, args); + if (key in memo) { + async.nextTick(function () { + callback.apply(null, memo[key]); + }); + } + else if (key in queues) { + queues[key].push(callback); + } + else { + queues[key] = [callback]; + fn.apply(null, args.concat([function () { + memo[key] = arguments; + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length; i < l; i++) { + q[i].apply(null, arguments); + } + }])); + } + }; + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; + }; + + async.unmemoize = function (fn) { + return function () { + return (fn.unmemoized || fn).apply(null, arguments); + }; + }; + + async.times = function (count, iterator, callback) { + var counter = []; + for (var i = 0; i < count; i++) { + counter.push(i); + } + return async.map(counter, iterator, callback); + }; + + async.timesSeries = function (count, iterator, callback) { + var counter = []; + for (var i = 0; i < count; i++) { + counter.push(i); + } + return async.mapSeries(counter, iterator, callback); + }; + + async.seq = function (/* functions... */) { + var fns = arguments; + return function () { + var that = this; + var args = Array.prototype.slice.call(arguments); + var callback = args.pop(); + async.reduce(fns, args, function (newargs, fn, cb) { + fn.apply(that, newargs.concat([function () { + var err = arguments[0]; + var nextargs = Array.prototype.slice.call(arguments, 1); + cb(err, nextargs); + }])) + }, + function (err, results) { + callback.apply(that, [err].concat(results)); + }); + }; + }; + + async.compose = function (/* functions... */) { + return async.seq.apply(null, Array.prototype.reverse.call(arguments)); + }; + + var _applyEach = function (eachfn, fns /*args...*/) { + var go = function () { + var that = this; + var args = Array.prototype.slice.call(arguments); + var callback = args.pop(); + return eachfn(fns, function (fn, cb) { + fn.apply(that, args.concat([cb])); + }, + callback); + }; + if (arguments.length > 2) { + var args = Array.prototype.slice.call(arguments, 2); + return go.apply(this, args); + } + else { + return go; + } + }; + async.applyEach = doParallel(_applyEach); + async.applyEachSeries = doSeries(_applyEach); + + async.forever = function (fn, callback) { + function next(err) { + if (err) { + if (callback) { + return callback(err); + } + throw err; + } + fn(next); + } + next(); + }; + + // Node.js + if (typeof module !== 'undefined' && module.exports) { + module.exports = async; + } + // AMD / RequireJS + else if (typeof define !== 'undefined' && define.amd) { + define([], function () { + return async; + }); + } + // included directly via ')); + expect(boom.response.payload.message).to.not.contain(''); + 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(''); + expect(encoded).to.equal('<script>alert(1)</script>'); + done(); + }); + + it('encodes < and > as named characters', function (done) { + + var encoded = Hoek.escapeHtml(' +``` + +Or in node.js: + +``` +npm install node-uuid +``` + +```javascript +var uuid = require('node-uuid'); +``` + +Then create some ids ... + +```javascript +// Generate a v1 (time-based) id +uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' + +// Generate a v4 (random) id +uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1' +``` + +## API + +### uuid.v1([`options` [, `buffer` [, `offset`]]]) + +Generate and return a RFC4122 v1 (timestamp-based) UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1. + * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used. + * `msecs` - (Number | Date) Time in milliseconds since unix Epoch. Default: The current time is used. + * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Notes: + +1. The randomly generated node id is only guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.) + +Example: Generate string UUID with fully-specified options + +```javascript +uuid.v1({ + node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab], + clockseq: 0x1234, + msecs: new Date('2011-11-01').getTime(), + nsecs: 5678 +}); // -> "710b962e-041c-11e1-9234-0123456789ab" +``` + +Example: In-place generation of two binary IDs + +```javascript +// Generate two ids in an array +var arr = new Array(32); // -> [] +uuid.v1(null, arr, 0); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15] +uuid.v1(null, arr, 16); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15 02 a3 1c b0 14 32 11 e1 85 58 0b 48 8e 4f c1 15] + +// Optionally use uuid.unparse() to get stringify the ids +uuid.unparse(buffer); // -> '02a2ce90-1432-11e1-8558-0b488e4fc115' +uuid.unparse(buffer, 16) // -> '02a31cb0-1432-11e1-8558-0b488e4fc115' +``` + +### uuid.v4([`options` [, `buffer` [, `offset`]]]) + +Generate and return a RFC4122 v4 UUID. + +* `options` - (Object) Optional uuid state to apply. Properties may include: + + * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values + * `rng` - (Function) Random # generator to use. Set to one of the built-in generators - `uuid.mathRNG` (all platforms), `uuid.nodeRNG` (node.js only), `uuid.whatwgRNG` (WebKit only) - or a custom function that returns an array[16] of byte values. + +* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. +* `offset` - (Number) Starting index in `buffer` at which to begin writing. + +Returns `buffer`, if specified, otherwise the string form of the UUID + +Example: Generate string UUID with fully-specified options + +```javascript +uuid.v4({ + random: [ + 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea, + 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36 + ] +}); +// -> "109156be-c4fb-41ea-b1b4-efe1671c5836" +``` + +Example: Generate two IDs in a single buffer + +```javascript +var buffer = new Array(32); // (or 'new Buffer' in node.js) +uuid.v4(null, buffer, 0); +uuid.v4(null, buffer, 16); +``` + +### uuid.parse(id[, buffer[, offset]]) +### uuid.unparse(buffer[, offset]) + +Parse and unparse UUIDs + + * `id` - (String) UUID(-like) string + * `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. Default: A new Array or Buffer is used + * `offset` - (Number) Starting index in `buffer` at which to begin writing. Default: 0 + +Example parsing and unparsing a UUID string + +```javascript +var bytes = uuid.parse('797ff043-11eb-11e1-80d6-510998755d10'); // -> +var string = uuid.unparse(bytes); // -> '797ff043-11eb-11e1-80d6-510998755d10' +``` + +### uuid.noConflict() + +(Browsers only) Set `uuid` property back to it's previous value. + +Returns the node-uuid object. + +Example: + +```javascript +var myUuid = uuid.noConflict(); +myUuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a' +``` + +## Deprecated APIs + +Support for the following v1.2 APIs is available in v1.3, but is deprecated and will be removed in the next major version. + +### uuid([format [, buffer [, offset]]]) + +uuid() has become uuid.v4(), and the `format` argument is now implicit in the `buffer` argument. (i.e. if you specify a buffer, the format is assumed to be binary). + +### uuid.BufferClass + +The class of container created when generating binary uuid data if no buffer argument is specified. This is expected to go away, with no replacement API. + +## Testing + +In node.js + +``` +> cd test +> node test.js +``` + +In Browser + +``` +open test/test.html +``` + +### Benchmarking + +Requires node.js + +``` +npm install uuid uuid-js +node benchmark/benchmark.js +``` + +For a more complete discussion of node-uuid performance, please see the `benchmark/README.md` file, and the [benchmark wiki](https://github.com/broofa/node-uuid/wiki/Benchmark) + +For browser performance [checkout the JSPerf tests](http://jsperf.com/node-uuid-performance). + +## Release notes + +### 1.4.0 + +* Improved module context detection +* Removed public RNG functions + +### 1.3.2 + +* Improve tests and handling of v1() options (Issue #24) +* Expose RNG option to allow for perf testing with different generators + +### 1.3.0 + +* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)! +* Support for node.js crypto API +* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md new file mode 100644 index 0000000..aaeb2ea --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md @@ -0,0 +1,53 @@ +# node-uuid Benchmarks + +### Results + +To see the results of our benchmarks visit https://github.com/broofa/node-uuid/wiki/Benchmark + +### Run them yourself + +node-uuid comes with some benchmarks to measure performance of generating UUIDs. These can be run using node.js. node-uuid is being benchmarked against some other uuid modules, that are available through npm namely `uuid` and `uuid-js`. + +To prepare and run the benchmark issue; + +``` +npm install uuid uuid-js +node benchmark/benchmark.js +``` + +You'll see an output like this one: + +``` +# v4 +nodeuuid.v4(): 854700 uuids/second +nodeuuid.v4('binary'): 788643 uuids/second +nodeuuid.v4('binary', buffer): 1336898 uuids/second +uuid(): 479386 uuids/second +uuid('binary'): 582072 uuids/second +uuidjs.create(4): 312304 uuids/second + +# v1 +nodeuuid.v1(): 938086 uuids/second +nodeuuid.v1('binary'): 683060 uuids/second +nodeuuid.v1('binary', buffer): 1644736 uuids/second +uuidjs.create(1): 190621 uuids/second +``` + +* The `uuid()` entries are for Nikhil Marathe's [uuid module](https://bitbucket.org/nikhilm/uuidjs) which is a wrapper around the native libuuid library. +* The `uuidjs()` entries are for Patrick Negri's [uuid-js module](https://github.com/pnegri/uuid-js) which is a pure javascript implementation based on [UUID.js](https://github.com/LiosK/UUID.js) by LiosK. + +If you want to get more reliable results you can run the benchmark multiple times and write the output into a log file: + +``` +for i in {0..9}; do node benchmark/benchmark.js >> benchmark/bench_0.4.12.log; done; +``` + +If you're interested in how performance varies between different node versions, you can issue the above command multiple times. + +You can then use the shell script `bench.sh` provided in this directory to calculate the averages over all benchmark runs and draw a nice plot: + +``` +(cd benchmark/ && ./bench.sh) +``` + +This assumes you have [gnuplot](http://www.gnuplot.info/) and [ImageMagick](http://www.imagemagick.org/) installed. You'll find a nice `bench.png` graph in the `benchmark/` directory then. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu new file mode 100644 index 0000000..a342fbb --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu @@ -0,0 +1,174 @@ +#!/opt/local/bin/gnuplot -persist +# +# +# G N U P L O T +# Version 4.4 patchlevel 3 +# last modified March 2011 +# System: Darwin 10.8.0 +# +# Copyright (C) 1986-1993, 1998, 2004, 2007-2010 +# Thomas Williams, Colin Kelley and many others +# +# gnuplot home: http://www.gnuplot.info +# faq, bugs, etc: type "help seeking-assistance" +# immediate help: type "help" +# plot window: hit 'h' +set terminal postscript eps noenhanced defaultplex \ + leveldefault color colortext \ + solid linewidth 1.2 butt noclip \ + palfuncparam 2000,0.003 \ + "Helvetica" 14 +set output 'bench.eps' +unset clip points +set clip one +unset clip two +set bar 1.000000 front +set border 31 front linetype -1 linewidth 1.000 +set xdata +set ydata +set zdata +set x2data +set y2data +set timefmt x "%d/%m/%y,%H:%M" +set timefmt y "%d/%m/%y,%H:%M" +set timefmt z "%d/%m/%y,%H:%M" +set timefmt x2 "%d/%m/%y,%H:%M" +set timefmt y2 "%d/%m/%y,%H:%M" +set timefmt cb "%d/%m/%y,%H:%M" +set boxwidth +set style fill empty border +set style rectangle back fc lt -3 fillstyle solid 1.00 border lt -1 +set style circle radius graph 0.02, first 0, 0 +set dummy x,y +set format x "% g" +set format y "% g" +set format x2 "% g" +set format y2 "% g" +set format z "% g" +set format cb "% g" +set angles radians +unset grid +set key title "" +set key outside left top horizontal Right noreverse enhanced autotitles columnhead nobox +set key noinvert samplen 4 spacing 1 width 0 height 0 +set key maxcolumns 2 maxrows 0 +unset label +unset arrow +set style increment default +unset style line +set style line 1 linetype 1 linewidth 2.000 pointtype 1 pointsize default pointinterval 0 +unset style arrow +set style histogram clustered gap 2 title offset character 0, 0, 0 +unset logscale +set offsets graph 0.05, 0.15, 0, 0 +set pointsize 1.5 +set pointintervalbox 1 +set encoding default +unset polar +unset parametric +unset decimalsign +set view 60, 30, 1, 1 +set samples 100, 100 +set isosamples 10, 10 +set surface +unset contour +set clabel '%8.3g' +set mapping cartesian +set datafile separator whitespace +unset hidden3d +set cntrparam order 4 +set cntrparam linear +set cntrparam levels auto 5 +set cntrparam points 5 +set size ratio 0 1,1 +set origin 0,0 +set style data points +set style function lines +set xzeroaxis linetype -2 linewidth 1.000 +set yzeroaxis linetype -2 linewidth 1.000 +set zzeroaxis linetype -2 linewidth 1.000 +set x2zeroaxis linetype -2 linewidth 1.000 +set y2zeroaxis linetype -2 linewidth 1.000 +set ticslevel 0.5 +set mxtics default +set mytics default +set mztics default +set mx2tics default +set my2tics default +set mcbtics default +set xtics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 +set xtics norangelimit +set xtics () +set ytics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 +set ytics autofreq norangelimit +set ztics border in scale 1,0.5 nomirror norotate offset character 0, 0, 0 +set ztics autofreq norangelimit +set nox2tics +set noy2tics +set cbtics border in scale 1,0.5 mirror norotate offset character 0, 0, 0 +set cbtics autofreq norangelimit +set title "" +set title offset character 0, 0, 0 font "" norotate +set timestamp bottom +set timestamp "" +set timestamp offset character 0, 0, 0 font "" norotate +set rrange [ * : * ] noreverse nowriteback # (currently [8.98847e+307:-8.98847e+307] ) +set autoscale rfixmin +set autoscale rfixmax +set trange [ * : * ] noreverse nowriteback # (currently [-5.00000:5.00000] ) +set autoscale tfixmin +set autoscale tfixmax +set urange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) +set autoscale ufixmin +set autoscale ufixmax +set vrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) +set autoscale vfixmin +set autoscale vfixmax +set xlabel "" +set xlabel offset character 0, 0, 0 font "" textcolor lt -1 norotate +set x2label "" +set x2label offset character 0, 0, 0 font "" textcolor lt -1 norotate +set xrange [ * : * ] noreverse nowriteback # (currently [-0.150000:3.15000] ) +set autoscale xfixmin +set autoscale xfixmax +set x2range [ * : * ] noreverse nowriteback # (currently [0.00000:3.00000] ) +set autoscale x2fixmin +set autoscale x2fixmax +set ylabel "" +set ylabel offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 +set y2label "" +set y2label offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 +set yrange [ 0.00000 : 1.90000e+06 ] noreverse nowriteback # (currently [:] ) +set autoscale yfixmin +set autoscale yfixmax +set y2range [ * : * ] noreverse nowriteback # (currently [0.00000:1.90000e+06] ) +set autoscale y2fixmin +set autoscale y2fixmax +set zlabel "" +set zlabel offset character 0, 0, 0 font "" textcolor lt -1 norotate +set zrange [ * : * ] noreverse nowriteback # (currently [-10.0000:10.0000] ) +set autoscale zfixmin +set autoscale zfixmax +set cblabel "" +set cblabel offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270 +set cbrange [ * : * ] noreverse nowriteback # (currently [8.98847e+307:-8.98847e+307] ) +set autoscale cbfixmin +set autoscale cbfixmax +set zero 1e-08 +set lmargin -1 +set bmargin -1 +set rmargin -1 +set tmargin -1 +set pm3d explicit at s +set pm3d scansautomatic +set pm3d interpolate 1,1 flush begin noftriangles nohidden3d corners2color mean +set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB +set palette rgbformulae 7, 5, 15 +set colorbox default +set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.05, 0.6, 0 front bdefault +set loadpath +set fontpath +set fit noerrorvariables +GNUTERM = "aqua" +plot 'bench_results.txt' using 2:xticlabel(1) w lp lw 2, '' using 3:xticlabel(1) w lp lw 2, '' using 4:xticlabel(1) w lp lw 2, '' using 5:xticlabel(1) w lp lw 2, '' using 6:xticlabel(1) w lp lw 2, '' using 7:xticlabel(1) w lp lw 2, '' using 8:xticlabel(1) w lp lw 2, '' using 9:xticlabel(1) w lp lw 2 +# EOF diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh new file mode 100755 index 0000000..d870a0c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +# for a given node version run: +# for i in {0..9}; do node benchmark.js >> bench_0.6.2.log; done; + +PATTERNS=('nodeuuid.v1()' "nodeuuid.v1('binary'," 'nodeuuid.v4()' "nodeuuid.v4('binary'," "uuid()" "uuid('binary')" 'uuidjs.create(1)' 'uuidjs.create(4)' '140byte') +FILES=(node_uuid_v1_string node_uuid_v1_buf node_uuid_v4_string node_uuid_v4_buf libuuid_v4_string libuuid_v4_binary uuidjs_v1_string uuidjs_v4_string 140byte_es) +INDICES=(2 3 2 3 2 2 2 2 2) +VERSIONS=$( ls bench_*.log | sed -e 's/^bench_\([0-9\.]*\)\.log/\1/' | tr "\\n" " " ) +TMPJOIN="tmp_join" +OUTPUT="bench_results.txt" + +for I in ${!FILES[*]}; do + F=${FILES[$I]} + P=${PATTERNS[$I]} + INDEX=${INDICES[$I]} + echo "version $F" > $F + for V in $VERSIONS; do + (VAL=$( grep "$P" bench_$V.log | LC_ALL=en_US awk '{ sum += $'$INDEX' } END { print sum/NR }' ); echo $V $VAL) >> $F + done + if [ $I == 0 ]; then + cat $F > $TMPJOIN + else + join $TMPJOIN $F > $OUTPUT + cp $OUTPUT $TMPJOIN + fi + rm $F +done + +rm $TMPJOIN + +gnuplot bench.gnu +convert -density 200 -resize 800x560 -flatten bench.eps bench.png +rm bench.eps diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c new file mode 100644 index 0000000..dbfc75f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c @@ -0,0 +1,34 @@ +/* +Test performance of native C UUID generation + +To Compile: cc -luuid benchmark-native.c -o benchmark-native +*/ + +#include +#include +#include +#include + +int main() { + uuid_t myid; + char buf[36+1]; + int i; + struct timeval t; + double start, finish; + + gettimeofday(&t, NULL); + start = t.tv_sec + t.tv_usec/1e6; + + int n = 2e5; + for (i = 0; i < n; i++) { + uuid_generate(myid); + uuid_unparse(myid, buf); + } + + gettimeofday(&t, NULL); + finish = t.tv_sec + t.tv_usec/1e6; + double dur = finish - start; + + printf("%d uuids/sec", (int)(n/dur)); + return 0; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js new file mode 100644 index 0000000..40e6efb --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js @@ -0,0 +1,84 @@ +try { + var nodeuuid = require('../uuid'); +} catch (e) { + console.error('node-uuid require failed - skipping tests'); +} + +try { + var uuid = require('uuid'); +} catch (e) { + console.error('uuid require failed - skipping tests'); +} + +try { + var uuidjs = require('uuid-js'); +} catch (e) { + console.error('uuid-js require failed - skipping tests'); +} + +var N = 5e5; + +function rate(msg, t) { + console.log(msg + ': ' + + (N / (Date.now() - t) * 1e3 | 0) + + ' uuids/second'); +} + +console.log('# v4'); + +// node-uuid - string form +if (nodeuuid) { + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4(); + rate('nodeuuid.v4() - using node.js crypto RNG', t); + + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4({rng: nodeuuid.mathRNG}); + rate('nodeuuid.v4() - using Math.random() RNG', t); + + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary'); + rate('nodeuuid.v4(\'binary\')', t); + + var buffer = new nodeuuid.BufferClass(16); + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary', buffer); + rate('nodeuuid.v4(\'binary\', buffer)', t); +} + +// libuuid - string form +if (uuid) { + for (var i = 0, t = Date.now(); i < N; i++) uuid(); + rate('uuid()', t); + + for (var i = 0, t = Date.now(); i < N; i++) uuid('binary'); + rate('uuid(\'binary\')', t); +} + +// uuid-js - string form +if (uuidjs) { + for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(4); + rate('uuidjs.create(4)', t); +} + +// 140byte.es +for (var i = 0, t = Date.now(); i < N; i++) 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(s,r){r=Math.random()*16|0;return (s=='x'?r:r&0x3|0x8).toString(16)}); +rate('140byte.es_v4', t); + +console.log(''); +console.log('# v1'); + +// node-uuid - v1 string form +if (nodeuuid) { + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1(); + rate('nodeuuid.v1()', t); + + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary'); + rate('nodeuuid.v1(\'binary\')', t); + + var buffer = new nodeuuid.BufferClass(16); + for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary', buffer); + rate('nodeuuid.v1(\'binary\', buffer)', t); +} + +// uuid-js - v1 string form +if (uuidjs) { + for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(1); + rate('uuidjs.create(1)', t); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json new file mode 100644 index 0000000..ace2134 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json @@ -0,0 +1,18 @@ +{ + "name": "node-uuid", + "repo": "broofa/node-uuid", + "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.", + "version": "1.4.0", + "author": "Robert Kieffer ", + "contributors": [ + {"name": "Christoph Tavan ", "github": "https://github.com/ctavan"} + ], + "keywords": ["uuid", "guid", "rfc4122"], + "dependencies": {}, + "development": {}, + "main": "uuid.js", + "scripts": [ + "uuid.js" + ], + "license": "MIT" +} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json new file mode 100644 index 0000000..b6473e9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json @@ -0,0 +1,54 @@ +{ + "name": "node-uuid", + "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.", + "url": "http://github.com/broofa/node-uuid", + "keywords": [ + "uuid", + "guid", + "rfc4122" + ], + "author": { + "name": "Robert Kieffer", + "email": "robert@broofa.com" + }, + "contributors": [ + { + "name": "Christoph Tavan", + "email": "dev@tavan.de" + } + ], + "lib": ".", + "main": "./uuid.js", + "repository": { + "type": "git", + "url": "https://github.com/broofa/node-uuid.git" + }, + "version": "1.4.1", + "readme": "# node-uuid\n\nSimple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS.\n\nFeatures:\n\n* Generate RFC4122 version 1 or version 4 UUIDs\n* Runs in node.js and all browsers.\n* Registered as a [ComponentJS](https://github.com/component/component) [component](https://github.com/component/component/wiki/Components) ('broofa/node-uuid').\n* Cryptographically strong random # generation on supporting platforms\n* 1.1K minified and gzip'ed (Want something smaller? Check this [crazy shit](https://gist.github.com/982883) out! )\n* [Annotated source code](http://broofa.github.com/node-uuid/docs/uuid.html)\n\n## Getting Started\n\nInstall it in your browser:\n\n```html\n\n```\n\nOr in node.js:\n\n```\nnpm install node-uuid\n```\n\n```javascript\nvar uuid = require('node-uuid');\n```\n\nThen create some ids ...\n\n```javascript\n// Generate a v1 (time-based) id\nuuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'\n\n// Generate a v4 (random) id\nuuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'\n```\n\n## API\n\n### uuid.v1([`options` [, `buffer` [, `offset`]]])\n\nGenerate and return a RFC4122 v1 (timestamp-based) UUID.\n\n* `options` - (Object) Optional uuid state to apply. Properties may include:\n\n * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1.\n * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used.\n * `msecs` - (Number | Date) Time in milliseconds since unix Epoch. Default: The current time is used.\n * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2.\n\n* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.\n* `offset` - (Number) Starting index in `buffer` at which to begin writing.\n\nReturns `buffer`, if specified, otherwise the string form of the UUID\n\nNotes:\n\n1. The randomly generated node id is only guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.)\n\nExample: Generate string UUID with fully-specified options\n\n```javascript\nuuid.v1({\n node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],\n clockseq: 0x1234,\n msecs: new Date('2011-11-01').getTime(),\n nsecs: 5678\n}); // -> \"710b962e-041c-11e1-9234-0123456789ab\"\n```\n\nExample: In-place generation of two binary IDs\n\n```javascript\n// Generate two ids in an array\nvar arr = new Array(32); // -> []\nuuid.v1(null, arr, 0); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15]\nuuid.v1(null, arr, 16); // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15 02 a3 1c b0 14 32 11 e1 85 58 0b 48 8e 4f c1 15]\n\n// Optionally use uuid.unparse() to get stringify the ids\nuuid.unparse(buffer); // -> '02a2ce90-1432-11e1-8558-0b488e4fc115'\nuuid.unparse(buffer, 16) // -> '02a31cb0-1432-11e1-8558-0b488e4fc115'\n```\n\n### uuid.v4([`options` [, `buffer` [, `offset`]]])\n\nGenerate and return a RFC4122 v4 UUID.\n\n* `options` - (Object) Optional uuid state to apply. Properties may include:\n\n * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values\n * `rng` - (Function) Random # generator to use. Set to one of the built-in generators - `uuid.mathRNG` (all platforms), `uuid.nodeRNG` (node.js only), `uuid.whatwgRNG` (WebKit only) - or a custom function that returns an array[16] of byte values.\n\n* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.\n* `offset` - (Number) Starting index in `buffer` at which to begin writing.\n\nReturns `buffer`, if specified, otherwise the string form of the UUID\n\nExample: Generate string UUID with fully-specified options\n\n```javascript\nuuid.v4({\n random: [\n 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea,\n 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36\n ]\n});\n// -> \"109156be-c4fb-41ea-b1b4-efe1671c5836\"\n```\n\nExample: Generate two IDs in a single buffer\n\n```javascript\nvar buffer = new Array(32); // (or 'new Buffer' in node.js)\nuuid.v4(null, buffer, 0);\nuuid.v4(null, buffer, 16);\n```\n\n### uuid.parse(id[, buffer[, offset]])\n### uuid.unparse(buffer[, offset])\n\nParse and unparse UUIDs\n\n * `id` - (String) UUID(-like) string\n * `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. Default: A new Array or Buffer is used\n * `offset` - (Number) Starting index in `buffer` at which to begin writing. Default: 0\n\nExample parsing and unparsing a UUID string\n\n```javascript\nvar bytes = uuid.parse('797ff043-11eb-11e1-80d6-510998755d10'); // -> \nvar string = uuid.unparse(bytes); // -> '797ff043-11eb-11e1-80d6-510998755d10'\n```\n\n### uuid.noConflict()\n\n(Browsers only) Set `uuid` property back to it's previous value.\n\nReturns the node-uuid object.\n\nExample:\n\n```javascript\nvar myUuid = uuid.noConflict();\nmyUuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'\n```\n\n## Deprecated APIs\n\nSupport for the following v1.2 APIs is available in v1.3, but is deprecated and will be removed in the next major version.\n\n### uuid([format [, buffer [, offset]]])\n\nuuid() has become uuid.v4(), and the `format` argument is now implicit in the `buffer` argument. (i.e. if you specify a buffer, the format is assumed to be binary).\n\n### uuid.BufferClass\n\nThe class of container created when generating binary uuid data if no buffer argument is specified. This is expected to go away, with no replacement API.\n\n## Testing\n\nIn node.js\n\n```\n> cd test\n> node test.js\n```\n\nIn Browser\n\n```\nopen test/test.html\n```\n\n### Benchmarking\n\nRequires node.js\n\n```\nnpm install uuid uuid-js\nnode benchmark/benchmark.js\n```\n\nFor a more complete discussion of node-uuid performance, please see the `benchmark/README.md` file, and the [benchmark wiki](https://github.com/broofa/node-uuid/wiki/Benchmark)\n\nFor browser performance [checkout the JSPerf tests](http://jsperf.com/node-uuid-performance).\n\n## Release notes\n\n### 1.4.0\n\n* Improved module context detection\n* Removed public RNG functions\n\n### 1.3.2\n\n* Improve tests and handling of v1() options (Issue #24)\n* Expose RNG option to allow for perf testing with different generators\n\n### 1.3.0\n\n* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)!\n* Support for node.js crypto API\n* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/broofa/node-uuid/issues" + }, + "_id": "node-uuid@1.4.1", + "dist": { + "shasum": "39aef510e5889a3dca9c895b506c73aae1bac048", + "tarball": "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz" + }, + "_from": "node-uuid@~1.4.0", + "_npmVersion": "1.3.6", + "_npmUser": { + "name": "broofa", + "email": "robert@broofa.com" + }, + "maintainers": [ + { + "name": "broofa", + "email": "robert@broofa.com" + } + ], + "directories": {}, + "_shasum": "39aef510e5889a3dca9c895b506c73aae1bac048", + "_resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.1.tgz", + "homepage": "https://github.com/broofa/node-uuid", + "scripts": {} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js new file mode 100644 index 0000000..05af822 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js @@ -0,0 +1,63 @@ +var assert = require('assert'), + nodeuuid = require('../uuid'), + uuidjs = require('uuid-js'), + libuuid = require('uuid').generate, + util = require('util'), + exec = require('child_process').exec, + os = require('os'); + +// On Mac Os X / macports there's only the ossp-uuid package that provides uuid +// On Linux there's uuid-runtime which provides uuidgen +var uuidCmd = os.type() === 'Darwin' ? 'uuid -1' : 'uuidgen -t'; + +function compare(ids) { + console.log(ids); + for (var i = 0; i < ids.length; i++) { + var id = ids[i].split('-'); + id = [id[2], id[1], id[0]].join(''); + ids[i] = id; + } + var sorted = ([].concat(ids)).sort(); + + if (sorted.toString() !== ids.toString()) { + console.log('Warning: sorted !== ids'); + } else { + console.log('everything in order!'); + } +} + +// Test time order of v1 uuids +var ids = []; +while (ids.length < 10e3) ids.push(nodeuuid.v1()); + +var max = 10; +console.log('node-uuid:'); +ids = []; +for (var i = 0; i < max; i++) ids.push(nodeuuid.v1()); +compare(ids); + +console.log(''); +console.log('uuidjs:'); +ids = []; +for (var i = 0; i < max; i++) ids.push(uuidjs.create(1).toString()); +compare(ids); + +console.log(''); +console.log('libuuid:'); +ids = []; +var count = 0; +var last = function() { + compare(ids); +} +var cb = function(err, stdout, stderr) { + ids.push(stdout.substring(0, stdout.length-1)); + count++; + if (count < max) { + return next(); + } + last(); +}; +var next = function() { + exec(uuidCmd, cb); +}; +next(); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html new file mode 100644 index 0000000..d80326e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js new file mode 100644 index 0000000..2469225 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js @@ -0,0 +1,228 @@ +if (!this.uuid) { + // node.js + uuid = require('../uuid'); +} + +// +// x-platform log/assert shims +// + +function _log(msg, type) { + type = type || 'log'; + + if (typeof(document) != 'undefined') { + document.write('
    ' + msg.replace(/\n/g, '
    ') + '
    '); + } + if (typeof(console) != 'undefined') { + var color = { + log: '\033[39m', + warn: '\033[33m', + error: '\033[31m' + }; + console[type](color[type] + msg + color.log); + } +} + +function log(msg) {_log(msg, 'log');} +function warn(msg) {_log(msg, 'warn');} +function error(msg) {_log(msg, 'error');} + +function assert(res, msg) { + if (!res) { + error('FAIL: ' + msg); + } else { + log('Pass: ' + msg); + } +} + +// +// Unit tests +// + +// Verify ordering of v1 ids created with explicit times +var TIME = 1321644961388; // 2011-11-18 11:36:01.388-08:00 + +function compare(name, ids) { + ids = ids.map(function(id) { + return id.split('-').reverse().join('-'); + }).sort(); + var sorted = ([].concat(ids)).sort(); + + assert(sorted.toString() == ids.toString(), name + ' have expected order'); +} + +// Verify ordering of v1 ids created using default behavior +compare('uuids with current time', [ + uuid.v1(), + uuid.v1(), + uuid.v1(), + uuid.v1(), + uuid.v1() +]); + +// Verify ordering of v1 ids created with explicit times +compare('uuids with time option', [ + uuid.v1({msecs: TIME - 10*3600*1000}), + uuid.v1({msecs: TIME - 1}), + uuid.v1({msecs: TIME}), + uuid.v1({msecs: TIME + 1}), + uuid.v1({msecs: TIME + 28*24*3600*1000}) +]); + +assert( + uuid.v1({msecs: TIME}) != uuid.v1({msecs: TIME}), + 'IDs created at same msec are different' +); + +// Verify throw if too many ids created +var thrown = false; +try { + uuid.v1({msecs: TIME, nsecs: 10000}); +} catch (e) { + thrown = true; +} +assert(thrown, 'Exception thrown when > 10K ids created in 1 ms'); + +// Verify clock regression bumps clockseq +var uidt = uuid.v1({msecs: TIME}); +var uidtb = uuid.v1({msecs: TIME - 1}); +assert( + parseInt(uidtb.split('-')[3], 16) - parseInt(uidt.split('-')[3], 16) === 1, + 'Clock regression by msec increments the clockseq' +); + +// Verify clock regression bumps clockseq +var uidtn = uuid.v1({msecs: TIME, nsecs: 10}); +var uidtnb = uuid.v1({msecs: TIME, nsecs: 9}); +assert( + parseInt(uidtnb.split('-')[3], 16) - parseInt(uidtn.split('-')[3], 16) === 1, + 'Clock regression by nsec increments the clockseq' +); + +// Verify explicit options produce expected id +var id = uuid.v1({ + msecs: 1321651533573, + nsecs: 5432, + clockseq: 0x385c, + node: [ 0x61, 0xcd, 0x3c, 0xbb, 0x32, 0x10 ] +}); +assert(id == 'd9428888-122b-11e1-b85c-61cd3cbb3210', 'Explicit options produce expected id'); + +// Verify adjacent ids across a msec boundary are 1 time unit apart +var u0 = uuid.v1({msecs: TIME, nsecs: 9999}); +var u1 = uuid.v1({msecs: TIME + 1, nsecs: 0}); + +var before = u0.split('-')[0], after = u1.split('-')[0]; +var dt = parseInt(after, 16) - parseInt(before, 16); +assert(dt === 1, 'Ids spanning 1ms boundary are 100ns apart'); + +// +// Test parse/unparse +// + +id = '00112233445566778899aabbccddeeff'; +assert(uuid.unparse(uuid.parse(id.substr(0,10))) == + '00112233-4400-0000-0000-000000000000', 'Short parse'); +assert(uuid.unparse(uuid.parse('(this is the uuid -> ' + id + id)) == + '00112233-4455-6677-8899-aabbccddeeff', 'Dirty parse'); + +// +// Perf tests +// + +var generators = { + v1: uuid.v1, + v4: uuid.v4 +}; + +var UUID_FORMAT = { + v1: /[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i, + v4: /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i +}; + +var N = 1e4; + +// Get %'age an actual value differs from the ideal value +function divergence(actual, ideal) { + return Math.round(100*100*(actual - ideal)/ideal)/100; +} + +function rate(msg, t) { + log(msg + ': ' + (N / (Date.now() - t) * 1e3 | 0) + ' uuids\/second'); +} + +for (var version in generators) { + var counts = {}, max = 0; + var generator = generators[version]; + var format = UUID_FORMAT[version]; + + log('\nSanity check ' + N + ' ' + version + ' uuids'); + for (var i = 0, ok = 0; i < N; i++) { + id = generator(); + if (!format.test(id)) { + throw Error(id + ' is not a valid UUID string'); + } + + if (id != uuid.unparse(uuid.parse(id))) { + assert(fail, id + ' is not a valid id'); + } + + // Count digits for our randomness check + if (version == 'v4') { + var digits = id.replace(/-/g, '').split(''); + for (var j = digits.length-1; j >= 0; j--) { + var c = digits[j]; + max = Math.max(max, counts[c] = (counts[c] || 0) + 1); + } + } + } + + // Check randomness for v4 UUIDs + if (version == 'v4') { + // Limit that we get worried about randomness. (Purely empirical choice, this!) + var limit = 2*100*Math.sqrt(1/N); + + log('\nChecking v4 randomness. Distribution of Hex Digits (% deviation from ideal)'); + + for (var i = 0; i < 16; i++) { + var c = i.toString(16); + var bar = '', n = counts[c], p = Math.round(n/max*100|0); + + // 1-3,5-8, and D-F: 1:16 odds over 30 digits + var ideal = N*30/16; + if (i == 4) { + // 4: 1:1 odds on 1 digit, plus 1:16 odds on 30 digits + ideal = N*(1 + 30/16); + } else if (i >= 8 && i <= 11) { + // 8-B: 1:4 odds on 1 digit, plus 1:16 odds on 30 digits + ideal = N*(1/4 + 30/16); + } else { + // Otherwise: 1:16 odds on 30 digits + ideal = N*30/16; + } + var d = divergence(n, ideal); + + // Draw bar using UTF squares (just for grins) + var s = n/max*50 | 0; + while (s--) bar += '='; + + assert(Math.abs(d) < limit, c + ' |' + bar + '| ' + counts[c] + ' (' + d + '% < ' + limit + '%)'); + } + } +} + +// Perf tests +for (var version in generators) { + log('\nPerformance testing ' + version + ' UUIDs'); + var generator = generators[version]; + var buf = new uuid.BufferClass(16); + + for (var i = 0, t = Date.now(); i < N; i++) generator(); + rate('uuid.' + version + '()', t); + + for (var i = 0, t = Date.now(); i < N; i++) generator('binary'); + rate('uuid.' + version + '(\'binary\')', t); + + for (var i = 0, t = Date.now(); i < N; i++) generator('binary', buf); + rate('uuid.' + version + '(\'binary\', buffer)', t); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js new file mode 100644 index 0000000..2fac6dc --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js @@ -0,0 +1,245 @@ +// uuid.js +// +// Copyright (c) 2010-2012 Robert Kieffer +// MIT License - http://opensource.org/licenses/mit-license.php + +(function() { + var _global = this; + + // Unique ID creation requires a high quality random # generator. We feature + // detect to determine the best RNG source, normalizing to a function that + // returns 128-bits of randomness, since that's what's usually required + var _rng; + + // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html + // + // Moderately fast, high quality + if (typeof(require) == 'function') { + try { + var _rb = require('crypto').randomBytes; + _rng = _rb && function() {return _rb(16);}; + } catch(e) {} + } + + if (!_rng && _global.crypto && crypto.getRandomValues) { + // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto + // + // Moderately fast, high quality + var _rnds8 = new Uint8Array(16); + _rng = function whatwgRNG() { + crypto.getRandomValues(_rnds8); + return _rnds8; + }; + } + + if (!_rng) { + // Math.random()-based (RNG) + // + // If all else fails, use Math.random(). It's fast, but is of unspecified + // quality. + var _rnds = new Array(16); + _rng = function() { + for (var i = 0, r; i < 16; i++) { + if ((i & 0x03) === 0) r = Math.random() * 0x100000000; + _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff; + } + + return _rnds; + }; + } + + // Buffer class to use + var BufferClass = typeof(Buffer) == 'function' ? Buffer : Array; + + // Maps for number <-> hex string conversion + var _byteToHex = []; + var _hexToByte = {}; + for (var i = 0; i < 256; i++) { + _byteToHex[i] = (i + 0x100).toString(16).substr(1); + _hexToByte[_byteToHex[i]] = i; + } + + // **`parse()` - Parse a UUID into it's component bytes** + function parse(s, buf, offset) { + var i = (buf && offset) || 0, ii = 0; + + buf = buf || []; + s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { + if (ii < 16) { // Don't overflow! + buf[i + ii++] = _hexToByte[oct]; + } + }); + + // Zero out remaining bytes if string was short + while (ii < 16) { + buf[i + ii++] = 0; + } + + return buf; + } + + // **`unparse()` - Convert UUID byte array (ala parse()) into a string** + function unparse(buf, offset) { + var i = offset || 0, bth = _byteToHex; + return bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + '-' + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]] + + bth[buf[i++]] + bth[buf[i++]]; + } + + // **`v1()` - Generate time-based UUID** + // + // Inspired by https://github.com/LiosK/UUID.js + // and http://docs.python.org/library/uuid.html + + // random #'s we need to init node and clockseq + var _seedBytes = _rng(); + + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + var _nodeId = [ + _seedBytes[0] | 0x01, + _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] + ]; + + // Per 4.2.2, randomize (14 bit) clockseq + var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; + + // Previous uuid creation time + var _lastMSecs = 0, _lastNSecs = 0; + + // See https://github.com/broofa/node-uuid for API details + function v1(options, buf, offset) { + var i = buf && offset || 0; + var b = buf || []; + + options = options || {}; + + var clockseq = options.clockseq != null ? options.clockseq : _clockseq; + + // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + var msecs = options.msecs != null ? options.msecs : new Date().getTime(); + + // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; + + // Time since last uuid creation (in msecs) + var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; + + // Per 4.2.1.2, Bump clockseq on clock regression + if (dt < 0 && options.clockseq == null) { + clockseq = clockseq + 1 & 0x3fff; + } + + // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { + nsecs = 0; + } + + // Per 4.2.1.2 Throw error if too many uuids are requested + if (nsecs >= 10000) { + throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; + + // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + msecs += 12219292800000; + + // `time_low` + var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; + + // `time_mid` + var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; + + // `time_high_and_version` + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + b[i++] = tmh >>> 16 & 0xff; + + // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + b[i++] = clockseq >>> 8 | 0x80; + + // `clock_seq_low` + b[i++] = clockseq & 0xff; + + // `node` + var node = options.node || _nodeId; + for (var n = 0; n < 6; n++) { + b[i + n] = node[n]; + } + + return buf ? buf : unparse(b); + } + + // **`v4()` - Generate random UUID** + + // See https://github.com/broofa/node-uuid for API details + function v4(options, buf, offset) { + // Deprecated - 'format' argument, as supported in v1.2 + var i = buf && offset || 0; + + if (typeof(options) == 'string') { + buf = options == 'binary' ? new BufferClass(16) : null; + options = null; + } + options = options || {}; + + var rnds = options.random || (options.rng || _rng)(); + + // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + + // Copy bytes to buffer, if provided + if (buf) { + for (var ii = 0; ii < 16; ii++) { + buf[i + ii] = rnds[ii]; + } + } + + return buf || unparse(rnds); + } + + // Export public API + var uuid = v4; + uuid.v1 = v1; + uuid.v4 = v4; + uuid.parse = parse; + uuid.unparse = unparse; + uuid.BufferClass = BufferClass; + + if (typeof define === 'function' && define.amd) { + // Publish as AMD module + define(function() {return uuid;}); + } else if (typeof(module) != 'undefined' && module.exports) { + // Publish as node.js module + module.exports = uuid; + } else { + // Publish as global (in browsers) + var _previousRoot = _global.uuid; + + // **`noConflict()` - (browser only) to reset global 'uuid' var** + uuid.noConflict = function() { + _global.uuid = _previousRoot; + return uuid; + }; + + _global.uuid = uuid; + } +}).call(this); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md new file mode 100644 index 0000000..34c4a85 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md @@ -0,0 +1,4 @@ +oauth-sign +========== + +OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js new file mode 100644 index 0000000..3a86aca --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js @@ -0,0 +1,81 @@ +var crypto = require('crypto') + , qs = require('querystring') + ; + +function sha1 (key, body) { + return crypto.createHmac('sha1', key).update(body).digest('base64') +} + +function rfc3986 (str) { + return encodeURIComponent(str) + .replace(/!/g,'%21') + .replace(/\*/g,'%2A') + .replace(/\(/g,'%28') + .replace(/\)/g,'%29') + .replace(/'/g,'%27') + ; +} + +// Maps object to bi-dimensional array +// Converts { foo: 'A', bar: [ 'b', 'B' ]} to +// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ] +function map (obj) { + var key, val, arr = [] + for (key in obj) { + val = obj[key] + if (Array.isArray(val)) + for (var i = 0; i < val.length; i++) + arr.push([key, val[i]]) + else + arr.push([key, val]) + } + return arr +} + +// Compare function for sort +function compare (a, b) { + return a > b ? 1 : a < b ? -1 : 0 +} + +function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { + // adapted from https://dev.twitter.com/docs/auth/oauth and + // https://dev.twitter.com/docs/auth/creating-signature + + // Parameter normalization + // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2 + var normalized = map(params) + // 1. First, the name and value of each parameter are encoded + .map(function (p) { + return [ rfc3986(p[0]), rfc3986(p[1] || '') ] + }) + // 2. The parameters are sorted by name, using ascending byte value + // ordering. If two or more parameters share the same name, they + // are sorted by their value. + .sort(function (a, b) { + return compare(a[0], b[0]) || compare(a[1], b[1]) + }) + // 3. The name of each parameter is concatenated to its corresponding + // value using an "=" character (ASCII code 61) as a separator, even + // if the value is empty. + .map(function (p) { return p.join('=') }) + // 4. The sorted name/value pairs are concatenated together into a + // single string by using an "&" character (ASCII code 38) as + // separator. + .join('&') + + var base = [ + rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'), + rfc3986(base_uri), + rfc3986(normalized) + ].join('&') + + var key = [ + consumer_secret || '', + token_secret || '' + ].map(rfc3986).join('&') + + return sha1(key, base) +} + +exports.hmacsign = hmacsign +exports.rfc3986 = rfc3986 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json new file mode 100644 index 0000000..d0e82fe --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json @@ -0,0 +1,49 @@ +{ + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "name": "oauth-sign", + "description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.", + "version": "0.4.0", + "repository": { + "url": "https://github.com/mikeal/oauth-sign" + }, + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "scripts": { + "test": "node test.js" + }, + "readme": "oauth-sign\n==========\n\nOAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module. \n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/mikeal/oauth-sign/issues" + }, + "_id": "oauth-sign@0.4.0", + "dist": { + "shasum": "f22956f31ea7151a821e5f2fb32c113cad8b9f69", + "tarball": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz" + }, + "_from": "oauth-sign@~0.4.0", + "_npmVersion": "1.3.2", + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "maintainers": [ + { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + } + ], + "directories": {}, + "_shasum": "f22956f31ea7151a821e5f2fb32c113cad8b9f69", + "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", + "homepage": "https://github.com/mikeal/oauth-sign" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/test.js new file mode 100644 index 0000000..b7a4c80 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/test.js @@ -0,0 +1,63 @@ +var hmacsign = require('./index').hmacsign + , assert = require('assert') + , qs = require('querystring') + ; + +// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth + +var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', + { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' + , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' + , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' + , oauth_signature_method: 'HMAC-SHA1' + , oauth_timestamp: '1272323042' + , oauth_version: '1.0' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") + +console.log(reqsign) +console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') +assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') + +var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', + { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' + , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' + , oauth_signature_method: 'HMAC-SHA1' + , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' + , oauth_timestamp: '1272323047' + , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' + , oauth_version: '1.0' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") + +console.log(accsign) +console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') +assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') + +var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', + { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" + , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" + , oauth_signature_method: "HMAC-SHA1" + , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" + , oauth_timestamp: "1272325550" + , oauth_version: "1.0" + , status: 'setting up my twitter 私のさえずりを設定する' + }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") + +console.log(upsign) +console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') +assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') + +// example in rfc5849 +var params = qs.parse('b5=%3D%253D&a3=a&c%40=&a2=r%20b' + '&' + 'c2&a3=2+q') +params.oauth_consumer_key = '9djdj82h48djs9d2' +params.oauth_token = 'kkk9d7dh3k39sjv7' +params.oauth_nonce = '7d8f3e4a' +params.oauth_signature_method = 'HMAC-SHA1' +params.oauth_timestamp = '137131201' + +var rfc5849sign = hmacsign('POST', 'http://example.com/request', + params, "j49sk3j29djd", "dh893hdasih9") + +console.log(rfc5849sign) +console.log('r6/TJjbCOr97/+UU0NsvSne7s5g=') +assert.equal(rfc5849sign, 'r6/TJjbCOr97/+UU0NsvSne7s5g=') + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintrc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintrc new file mode 100644 index 0000000..997b3f7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jshintrc @@ -0,0 +1,10 @@ +{ + "node": true, + + "curly": true, + "latedef": true, + "quotmark": true, + "undef": true, + "unused": true, + "trailing": true +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.npmignore new file mode 100644 index 0000000..7e1574d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.npmignore @@ -0,0 +1,18 @@ +.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 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.travis.yml new file mode 100644 index 0000000..c891dd0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.travis.yml @@ -0,0 +1,4 @@ +language: node_js + +node_js: + - 0.10 \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md new file mode 100644 index 0000000..8928361 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md @@ -0,0 +1 @@ +Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md). diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE new file mode 100755 index 0000000..d456948 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2014 Nathan LaFreniere and other contributors. +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/qs/graphs/contributors diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/Makefile b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/Makefile new file mode 100644 index 0000000..600a700 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/Makefile @@ -0,0 +1,8 @@ +test: + @node node_modules/lab/bin/lab +test-cov: + @node node_modules/lab/bin/lab -t 100 +test-cov-html: + @node node_modules/lab/bin/lab -r html -o coverage.html + +.PHONY: test test-cov test-cov-html \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/README.md new file mode 100755 index 0000000..b861887 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/README.md @@ -0,0 +1,192 @@ +# qs + +A querystring parsing and stringifying library with some added security. + +[![Build Status](https://secure.travis-ci.org/hapijs/qs.svg)](http://travis-ci.org/hapijs/qs) + +Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf) + +The **qs** module was originally created and maintained by [TJ Holowaychuk](https://github.com/visionmedia/node-querystring). + +## Usage + +```javascript +var Qs = require('qs'); + +var obj = Qs.parse('a=c'); // { a: 'c' } +var str = Qs.stringify(obj); // 'a=c' +``` + +### Parsing Objects + +```javascript +Qs.parse(string, [depth], [delimiter]); +``` + +**qs** allows you to create nested objects within your query strings, by surrounding the name of sub-keys with square brackets `[]`. +For example, the string `'foo[bar]=baz'` converts to: + +```javascript +{ + foo: { + bar: 'baz' + } +} +``` + +URI encoded strings work too: + +```javascript +Qs.parse('a%5Bb%5D=c'); +// { a: { b: 'c' } } +``` + +You can also nest your objects, like `'foo[bar][baz]=foobarbaz'`: + +```javascript +{ + foo: { + bar: { + baz: 'foobarbaz' + } + } +} +``` + +By default, when nesting objects **qs** will only parse up to 5 children deep. This means if you attempt to parse a string like +`'a[b][c][d][e][f][g][h][i]=j'` your resulting object will be: + +```javascript +{ + a: { + b: { + c: { + d: { + e: { + f: { + '[g][h][i]': 'j' + } + } + } + } + } + } +} +``` + +This depth can be overridden by passing a `depth` option to `Qs.parse(string, depth)`: + +```javascript +Qs.parse('a[b][c][d][e][f][g][h][i]=j', 1); +// { a: { b: { '[c][d][e][f][g][h][i]': 'j' } } } +``` + +The depth limit mitigate abuse when **qs** is used to parse user input, and it is recommended to keep it a reasonably small number. + +An optional delimiter can also be passed: + +```javascript +Qs.parse('a=b;c=d', ';'); +// { a: 'b', c: 'd' } +``` + +### Parsing Arrays + +**qs** can also parse arrays using a similar `[]` notation: + +```javascript +Qs.parse('a[]=b&a[]=c'); +// { a: ['b', 'c'] } +``` + +You may specify an index as well: + +```javascript +Qs.parse('a[1]=c&a[0]=b'); +// { a: ['b', 'c'] } +``` + +Note that the only difference between an index in an array and a key in an object is that the value between the brackets must be a number +to create an array. When creating arrays with specific indices, **qs** will compact a sparse array to only the existing values preserving +their order: + +```javascript +Qs.parse('a[1]=b&a[15]=c'); +// { a: ['b', 'c'] } +``` + +Note that an empty string is also a value, and will be preserved: + +```javascript +Qs.parse('a[]=&a[]=b'); +// { a: ['', 'b'] } +Qs.parse('a[0]=b&a[1]=&a[2]=c'); +// { a: ['b', '', 'c'] } +``` + +**qs** will also limit specifying indices in an array to a maximum index of `20`. Any array members with an index of greater than `20` will +instead be converted to an object with the index as the key: + +```javascript +Qs.parse('a[100]=b'); +// { a: { '100': 'b' } } +``` + +If you mix notations, **qs** will merge the two items into an object: + +```javascript +Qs.parse('a[0]=b&a[b]=c'); +// { a: { '0': 'b', b: 'c' } } +``` + +You can also create arrays of objects: + +```javascript +Qs.parse('a[][b]=c'); +// { a: [{ b: 'c' }] } +``` + +### Stringifying + +```javascript +Qs.stringify(object, [delimiter]); +``` + +When stringifying, **qs** always URI encodes output. Objects are stringified as you would expect: + +```javascript +Qs.stringify({ a: 'b' }); +// 'a=b' +Qs.stringify({ a: { b: 'c' } }); +// 'a%5Bb%5D=c' +``` + +Examples beyond this point will be shown as though the output is not URI encoded for clarity. Please note that the return values in these cases *will* be URI encoded during real usage. + +When arrays are stringified, they are always given explicit indices: + +```javascript +Qs.stringify({ a: ['b', 'c', 'd'] }); +// 'a[0]=b&a[1]=c&a[2]=d' +``` + +Empty strings and null values will omit the value, but the equals sign (=) remains in place: + +```javascript +Qs.stringify({ a: '' }); +// 'a=' +``` + +Properties that are set to `undefined` will be omitted entirely: + +```javascript +Qs.stringify({ a: null, b: undefined }); +// 'a=' +``` + +The delimiter may be overridden with stringify as well: + +```javascript +Qs.stringify({ a: 'b', c: 'd' }, ';'); +// 'a=b;c=d' +``` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/index.js new file mode 100644 index 0000000..bb0a047 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/index.js @@ -0,0 +1 @@ +module.exports = require('./lib'); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js new file mode 100755 index 0000000..0e09493 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js @@ -0,0 +1,15 @@ +// Load modules + +var Stringify = require('./stringify'); +var Parse = require('./parse'); + + +// Declare internals + +var internals = {}; + + +module.exports = { + stringify: Stringify, + parse: Parse +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js new file mode 100755 index 0000000..4a3fdd9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js @@ -0,0 +1,155 @@ +// Load modules + +var Utils = require('./utils'); + + +// Declare internals + +var internals = { + delimiter: '&', + depth: 5, + arrayLimit: 20, + parametersLimit: 1000 +}; + + +internals.parseValues = function (str, delimiter) { + + delimiter = typeof delimiter === 'string' ? delimiter : internals.delimiter; + + var obj = {}; + var parts = str.split(delimiter, internals.parametersLimit); + + for (var i = 0, il = parts.length; i < il; ++i) { + var part = parts[i]; + var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1; + + if (pos === -1) { + obj[Utils.decode(part)] = ''; + } + else { + var key = Utils.decode(part.slice(0, pos)); + var val = Utils.decode(part.slice(pos + 1)); + + if (!obj[key]) { + obj[key] = val; + } + else { + obj[key] = [].concat(obj[key]).concat(val); + } + } + } + + return obj; +}; + + +internals.parseObject = function (chain, val) { + + if (!chain.length) { + return val; + } + + var root = chain.shift(); + + var obj = {}; + if (root === '[]') { + obj = []; + obj = obj.concat(internals.parseObject(chain, val)); + } + else { + var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root; + var index = parseInt(cleanRoot, 10); + if (!isNaN(index) && + root !== cleanRoot && + index <= internals.arrayLimit) { + + obj = []; + obj[index] = internals.parseObject(chain, val); + } + else { + obj[cleanRoot] = internals.parseObject(chain, val); + } + } + + return obj; +}; + + +internals.parseKeys = function (key, val, depth) { + + if (!key) { + return; + } + + // The regex chunks + + var parent = /^([^\[\]]*)/; + var child = /(\[[^\[\]]*\])/g; + + // Get the parent + + var segment = parent.exec(key); + + // Don't allow them to overwrite object prototype properties + + if (Object.prototype.hasOwnProperty(segment[1])) { + return; + } + + // Stash the parent if it exists + + var keys = []; + if (segment[1]) { + keys.push(segment[1]); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while ((segment = child.exec(key)) !== null && i < depth) { + + ++i; + if (!Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) { + keys.push(segment[1]); + } + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return internals.parseObject(keys, val); +}; + + +module.exports = function (str, depth, delimiter) { + + if (str === '' || + str === null || + typeof str === 'undefined') { + + return {}; + } + + if (typeof depth !== 'number') { + delimiter = depth; + depth = internals.depth; + } + + var tempObj = typeof str === 'string' ? internals.parseValues(str, delimiter) : Utils.clone(str); + var obj = {}; + + // Iterate over the keys and setup the new object + // + for (var key in tempObj) { + if (tempObj.hasOwnProperty(key)) { + var newObj = internals.parseKeys(key, tempObj[key], depth); + obj = Utils.merge(obj, newObj); + } + } + + return Utils.compact(obj); +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js new file mode 100755 index 0000000..1cc3df9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js @@ -0,0 +1,55 @@ +// Load modules + + +// Declare internals + +var internals = { + delimiter: '&' +}; + + +internals.stringify = function (obj, prefix) { + + if (Buffer.isBuffer(obj)) { + obj = obj.toString(); + } + else if (obj instanceof Date) { + obj = obj.toISOString(); + } + else if (obj === null) { + obj = ''; + } + + if (typeof obj === 'string' || + typeof obj === 'number' || + typeof obj === 'boolean') { + + return [encodeURIComponent(prefix) + '=' + encodeURIComponent(obj)]; + } + + var values = []; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + values = values.concat(internals.stringify(obj[key], prefix + '[' + key + ']')); + } + } + + return values; +}; + + +module.exports = function (obj, delimiter) { + + delimiter = typeof delimiter === 'undefined' ? internals.delimiter : delimiter; + + var keys = []; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + keys = keys.concat(internals.stringify(obj[key], key)); + } + } + + return keys.join(delimiter); +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js new file mode 100755 index 0000000..3f5c149 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js @@ -0,0 +1,133 @@ +// Load modules + + +// Declare internals + +var internals = {}; + + +exports.arrayToObject = function (source) { + + var obj = {}; + for (var i = 0, il = source.length; i < il; ++i) { + if (typeof source[i] !== 'undefined') { + + obj[i] = source[i]; + } + } + + return obj; +}; + + +exports.clone = function (source) { + + if (typeof source !== 'object' || + source === null) { + + return source; + } + + if (Buffer.isBuffer(source)) { + return source.toString(); + } + + var obj = Array.isArray(source) ? [] : {}; + for (var i in source) { + if (source.hasOwnProperty(i)) { + obj[i] = exports.clone(source[i]); + } + } + + return obj; +}; + + +exports.merge = function (target, source) { + + if (!source) { + return target; + } + + var obj = exports.clone(target); + + if (Array.isArray(source)) { + for (var i = 0, il = source.length; i < il; ++i) { + if (typeof source[i] !== 'undefined') { + if (typeof obj[i] === 'object') { + obj[i] = exports.merge(obj[i], source[i]); + } + else { + obj[i] = source[i]; + } + } + } + + return obj; + } + + if (Array.isArray(obj)) { + obj = exports.arrayToObject(obj); + } + + 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 (!obj[key]) { + obj[key] = exports.clone(value); + } + else { + obj[key] = exports.merge(obj[key], value); + } + } + else { + obj[key] = value; + } + } + + return obj; +}; + + +exports.decode = function (str) { + + try { + return decodeURIComponent(str.replace(/\+/g, ' ')); + } catch (e) { + return str; + } +}; + + +exports.compact = function (obj) { + + if (typeof obj !== 'object' || obj === null) { + return obj; + } + + var compacted = {}; + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + if (Array.isArray(obj[key])) { + compacted[key] = []; + + for (var i = 0, l = obj[key].length; i < l; i++) { + if (typeof obj[key][i] !== 'undefined') { + compacted[key].push(obj[key][i]); + } + } + } + else { + compacted[key] = exports.compact(obj[key]); + } + } + } + + return compacted; +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json new file mode 100755 index 0000000..7b19170 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json @@ -0,0 +1,61 @@ +{ + "name": "qs", + "version": "1.2.2", + "description": "A querystring parser that supports nesting and arrays, with a depth limit", + "homepage": "https://github.com/hapijs/qs", + "main": "index.js", + "dependencies": {}, + "devDependencies": { + "lab": "3.x.x" + }, + "scripts": { + "test": "make test-cov" + }, + "repository": { + "type": "git", + "url": "https://github.com/hapijs/qs.git" + }, + "keywords": [ + "querystring", + "qs" + ], + "author": { + "name": "Nathan LaFreniere", + "email": "quitlahok@gmail.com" + }, + "licenses": [ + { + "type": "BSD", + "url": "http://github.com/hapijs/qs/raw/master/LICENSE" + } + ], + "gitHead": "bd9455fea88d1c51a80dbf57ef0f99b4e553177d", + "bugs": { + "url": "https://github.com/hapijs/qs/issues" + }, + "_id": "qs@1.2.2", + "_shasum": "19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88", + "_from": "qs@~1.2.0", + "_npmVersion": "1.4.21", + "_npmUser": { + "name": "hueniverse", + "email": "eran@hueniverse.com" + }, + "maintainers": [ + { + "name": "nlf", + "email": "quitlahok@gmail.com" + }, + { + "name": "hueniverse", + "email": "eran@hueniverse.com" + } + ], + "dist": { + "shasum": "19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88", + "tarball": "http://registry.npmjs.org/qs/-/qs-1.2.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js new file mode 100755 index 0000000..c00e7be --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js @@ -0,0 +1,301 @@ +// Load modules + +var Lab = require('lab'); +var Qs = require('../'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var expect = Lab.expect; +var before = Lab.before; +var after = Lab.after; +var describe = Lab.experiment; +var it = Lab.test; + + +describe('#parse', function () { + + it('parses a simple string', function (done) { + + expect(Qs.parse('0=foo')).to.deep.equal({ '0': 'foo' }); + expect(Qs.parse('foo=c++')).to.deep.equal({ foo: 'c ' }); + expect(Qs.parse('a[>=]=23')).to.deep.equal({ a: { '>=': '23' } }); + expect(Qs.parse('a[<=>]==23')).to.deep.equal({ a: { '<=>': '=23' } }); + expect(Qs.parse('a[==]=23')).to.deep.equal({ a: { '==': '23' } }); + expect(Qs.parse('foo')).to.deep.equal({ foo: '' }); + expect(Qs.parse('foo=bar')).to.deep.equal({ foo: 'bar' }); + expect(Qs.parse(' foo = bar = baz ')).to.deep.equal({ ' foo ': ' bar = baz ' }); + expect(Qs.parse('foo=bar=baz')).to.deep.equal({ foo: 'bar=baz' }); + expect(Qs.parse('foo=bar&bar=baz')).to.deep.equal({ foo: 'bar', bar: 'baz' }); + expect(Qs.parse('foo=bar&baz')).to.deep.equal({ foo: 'bar', baz: '' }); + expect(Qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World')).to.deep.equal({ + cht: 'p3', + chd: 't:60,40', + chs: '250x100', + chl: 'Hello|World' + }); + done(); + }); + + it('parses a single nested string', function (done) { + + expect(Qs.parse('a[b]=c')).to.deep.equal({ a: { b: 'c' } }); + done(); + }); + + it('parses a double nested string', function (done) { + + expect(Qs.parse('a[b][c]=d')).to.deep.equal({ a: { b: { c: 'd' } } }); + done(); + }); + + it('defaults to a depth of 5', function (done) { + + expect(Qs.parse('a[b][c][d][e][f][g][h]=i')).to.deep.equal({ a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } }); + done(); + }); + + it('only parses one level when depth = 1', function (done) { + + expect(Qs.parse('a[b][c]=d', 1)).to.deep.equal({ a: { b: { '[c]': 'd' } } }); + expect(Qs.parse('a[b][c][d]=e', 1)).to.deep.equal({ a: { b: { '[c][d]': 'e' } } }); + done(); + }); + + it('parses a simple array', function (done) { + + expect(Qs.parse('a=b&a=c')).to.deep.equal({ a: ['b', 'c'] }); + done(); + }); + + it('parses an explicit array', function (done) { + + expect(Qs.parse('a[]=b')).to.deep.equal({ a: ['b'] }); + expect(Qs.parse('a[]=b&a[]=c')).to.deep.equal({ a: ['b', 'c'] }); + expect(Qs.parse('a[]=b&a[]=c&a[]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); + done(); + }); + + it('parses a nested array', function (done) { + + expect(Qs.parse('a[b][]=c&a[b][]=d')).to.deep.equal({ a: { b: ['c', 'd'] } }); + expect(Qs.parse('a[>=]=25')).to.deep.equal({ a: { '>=': '25' } }); + done(); + }); + + it('allows to specify array indices', function (done) { + + expect(Qs.parse('a[1]=c&a[0]=b&a[2]=d')).to.deep.equal({ a: ['b', 'c', 'd'] }); + expect(Qs.parse('a[1]=c&a[0]=b')).to.deep.equal({ a: ['b', 'c'] }); + expect(Qs.parse('a[1]=c')).to.deep.equal({ a: ['c'] }); + done(); + }); + + it('limits specific array indices to 20', function (done) { + + expect(Qs.parse('a[20]=a')).to.deep.equal({ a: ['a'] }); + expect(Qs.parse('a[21]=a')).to.deep.equal({ a: { '21': 'a' } }); + done(); + }); + + it('supports encoded = signs', function (done) { + + expect(Qs.parse('he%3Dllo=th%3Dere')).to.deep.equal({ 'he=llo': 'th=ere' }); + done(); + }); + + it('is ok with url encoded strings', function (done) { + + expect(Qs.parse('a[b%20c]=d')).to.deep.equal({ a: { 'b c': 'd' } }); + expect(Qs.parse('a[b]=c%20d')).to.deep.equal({ a: { b: 'c d' } }); + done(); + }); + + it('allows brackets in the value', function (done) { + + expect(Qs.parse('pets=["tobi"]')).to.deep.equal({ pets: '["tobi"]' }); + expect(Qs.parse('operators=[">=", "<="]')).to.deep.equal({ operators: '[">=", "<="]' }); + done(); + }); + + it('allows empty values', function (done) { + + expect(Qs.parse('')).to.deep.equal({}); + expect(Qs.parse(null)).to.deep.equal({}); + expect(Qs.parse(undefined)).to.deep.equal({}); + done(); + }); + + it('transforms arrays to objects', function (done) { + + expect(Qs.parse('foo[0]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); + expect(Qs.parse('foo[bad]=baz&foo[0]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); + expect(Qs.parse('foo[bad]=baz&foo[]=bar')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar' } }); + expect(Qs.parse('foo[]=bar&foo[bad]=baz')).to.deep.equal({ foo: { '0': 'bar', bad: 'baz' } }); + expect(Qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo')).to.deep.equal({ foo: { bad: 'baz', '0': 'bar', '1': 'foo' } }); + expect(Qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb')).to.deep.equal({foo: [ {a: 'a', b: 'b'}, {a: 'aa', b: 'bb'} ]}); + done(); + }); + + it('correctly prunes undefined values when converting an array to an object', function (done) { + + expect(Qs.parse('a[2]=b&a[99999999]=c')).to.deep.equal({ a: { '2': 'b', '99999999': 'c' } }); + done(); + }); + + it('supports malformed uri characters', function (done) { + + expect(Qs.parse('{%:%}')).to.deep.equal({ '{%:%}': '' }); + expect(Qs.parse('foo=%:%}')).to.deep.equal({ foo: '%:%}' }); + done(); + }); + + it('doesn\'t produce empty keys', function (done) { + + expect(Qs.parse('_r=1&')).to.deep.equal({ '_r': '1' }); + done(); + }); + + it('cannot override prototypes', function (done) { + + var obj = Qs.parse('toString=bad&bad[toString]=bad&constructor=bad'); + expect(typeof obj.toString).to.equal('function'); + expect(typeof obj.bad.toString).to.equal('function'); + expect(typeof obj.constructor).to.equal('function'); + done(); + }); + + it('cannot access Object prototype', function (done) { + + Qs.parse('constructor[prototype][bad]=bad'); + Qs.parse('bad[constructor][prototype][bad]=bad'); + expect(typeof Object.prototype.bad).to.equal('undefined'); + done(); + }); + + it('parses arrays of objects', function (done) { + + expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); + expect(Qs.parse('a[0][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); + done(); + }); + + it('allows for empty strings in arrays', function (done) { + + expect(Qs.parse('a[]=b&a[]=&a[]=c')).to.deep.equal({ a: ['b', '', 'c'] }); + expect(Qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]=')).to.deep.equal({ a: ['b', '', 'c', ''] }); + done(); + }); + + it('compacts sparse arrays', function (done) { + + expect(Qs.parse('a[10]=1&a[2]=2')).to.deep.equal({ a: ['2', '1'] }); + done(); + }); + + it('parses semi-parsed strings', function (done) { + + expect(Qs.parse({ 'a[b]': 'c' })).to.deep.equal({ a: { b: 'c' } }); + expect(Qs.parse({ 'a[b]': 'c', 'a[d]': 'e' })).to.deep.equal({ a: { b: 'c', d: 'e' } }); + done(); + }); + + it('parses buffers to strings', function (done) { + + var b = new Buffer('test'); + expect(Qs.parse({ a: b })).to.deep.equal({ a: b.toString() }); + done(); + }); + + it('continues parsing when no parent is found', function (done) { + + expect(Qs.parse('[]&a=b')).to.deep.equal({ '0': '', a: 'b' }); + expect(Qs.parse('[foo]=bar')).to.deep.equal({ foo: 'bar' }); + done(); + }); + + it('does not error when parsing a very long array', function (done) { + + var str = 'a[]=a'; + while (Buffer.byteLength(str) < 128 * 1024) { + str += '&' + str; + } + + expect(function () { + + Qs.parse(str); + }).to.not.throw(); + + done(); + }); + + it('should not throw when a native prototype has an enumerable property', { parallel: false }, function (done) { + + Object.prototype.crash = ''; + Array.prototype.crash = ''; + expect(Qs.parse.bind(null, 'a=b')).to.not.throw(); + expect(Qs.parse('a=b')).to.deep.equal({ a: 'b' }); + expect(Qs.parse.bind(null, 'a[][b]=c')).to.not.throw(); + expect(Qs.parse('a[][b]=c')).to.deep.equal({ a: [{ b: 'c' }] }); + delete Object.prototype.crash; + delete Array.prototype.crash; + done(); + }); + + it('parses a string with an alternative delimiter', function (done) { + + expect(Qs.parse('a=b;c=d', ';')).to.deep.equal({ a: 'b', c: 'd' }); + done(); + }); + + it('does not use non-string objects as delimiters', function (done) { + + expect(Qs.parse('a=b&c=d', {})).to.deep.equal({ a: 'b', c: 'd' }); + done(); + }); + + it('parses an object', function (done) { + + var input = { + "user[name]": {"pop[bob]": 3}, + "user[email]": null + }; + + var expected = { + "user": { + "name": {"pop[bob]": 3}, + "email": null + } + }; + + var result = Qs.parse(input); + + expect(result).to.deep.equal(expected); + done(); + }); + + it('parses an object and not child values', function (done) { + + var input = { + "user[name]": {"pop[bob]": { "test": 3 }}, + "user[email]": null + }; + + var expected = { + "user": { + "name": {"pop[bob]": { "test": 3 }}, + "email": null + } + }; + + var result = Qs.parse(input); + + expect(result).to.deep.equal(expected); + done(); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js new file mode 100755 index 0000000..7bf1df4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js @@ -0,0 +1,129 @@ +// Load modules + +var Lab = require('lab'); +var Qs = require('../'); + + +// Declare internals + +var internals = {}; + + +// Test shortcuts + +var expect = Lab.expect; +var before = Lab.before; +var after = Lab.after; +var describe = Lab.experiment; +var it = Lab.test; + + +describe('#stringify', function () { + + it('stringifies a querystring object', function (done) { + + expect(Qs.stringify({ a: 'b' })).to.equal('a=b'); + expect(Qs.stringify({ a: 1 })).to.equal('a=1'); + expect(Qs.stringify({ a: 1, b: 2 })).to.equal('a=1&b=2'); + done(); + }); + + it('stringifies a nested object', function (done) { + + expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); + expect(Qs.stringify({ a: { b: { c: { d: 'e' } } } })).to.equal('a%5Bb%5D%5Bc%5D%5Bd%5D=e'); + done(); + }); + + it('stringifies an array value', function (done) { + + expect(Qs.stringify({ a: ['b', 'c', 'd'] })).to.equal('a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d'); + done(); + }); + + it('stringifies a nested array value', function (done) { + + expect(Qs.stringify({ a: { b: ['c', 'd'] } })).to.equal('a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d'); + done(); + }); + + it('stringifies an object inside an array', function (done) { + + expect(Qs.stringify({ a: [{ b: 'c' }] })).to.equal('a%5B0%5D%5Bb%5D=c'); + expect(Qs.stringify({ a: [{ b: { c: [1] } }] })).to.equal('a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1'); + done(); + }); + + it('stringifies a complicated object', function (done) { + + expect(Qs.stringify({ a: { b: 'c', d: 'e' } })).to.equal('a%5Bb%5D=c&a%5Bd%5D=e'); + done(); + }); + + it('stringifies an empty value', function (done) { + + expect(Qs.stringify({ a: '' })).to.equal('a='); + expect(Qs.stringify({ a: '', b: '' })).to.equal('a=&b='); + expect(Qs.stringify({ a: null })).to.equal('a='); + expect(Qs.stringify({ a: { b: null } })).to.equal('a%5Bb%5D='); + done(); + }); + + it('drops keys with a value of undefined', function (done) { + + expect(Qs.stringify({ a: undefined })).to.equal(''); + expect(Qs.stringify({ a: { b: undefined, c: null } })).to.equal('a%5Bc%5D='); + done(); + }); + + it('url encodes values', function (done) { + + expect(Qs.stringify({ a: 'b c' })).to.equal('a=b%20c'); + done(); + }); + + it('stringifies a date', function (done) { + + var now = new Date(); + var str = 'a=' + encodeURIComponent(now.toISOString()); + expect(Qs.stringify({ a: now })).to.equal(str); + done(); + }); + + it('stringifies the weird object from qs', function (done) { + + expect(Qs.stringify({ 'my weird field': 'q1!2"\'w$5&7/z8)?' })).to.equal('my%20weird%20field=q1!2%22\'w%245%267%2Fz8)%3F'); + done(); + }); + + it('skips properties that are part of the object prototype', function (done) { + + Object.prototype.crash = 'test'; + expect(Qs.stringify({ a: 'b'})).to.equal('a=b'); + expect(Qs.stringify({ a: { b: 'c' } })).to.equal('a%5Bb%5D=c'); + delete Object.prototype.crash; + done(); + }); + + it('stringifies boolean values', function (done) { + + expect(Qs.stringify({ a: true })).to.equal('a=true'); + expect(Qs.stringify({ a: { b: true } })).to.equal('a%5Bb%5D=true'); + expect(Qs.stringify({ b: false })).to.equal('b=false'); + expect(Qs.stringify({ b: { c: false } })).to.equal('b%5Bc%5D=false'); + done(); + }); + + it('stringifies buffer values', function (done) { + + expect(Qs.stringify({ a: new Buffer('test') })).to.equal('a=test'); + expect(Qs.stringify({ a: { b: new Buffer('test') } })).to.equal('a%5Bb%5D=test'); + done(); + }); + + it('stringifies an object using an alternative delimiter', function (done) { + + expect(Qs.stringify({ a: 'b', c: 'd' }, ';')).to.equal('a=b;c=d'); + done(); + }); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore new file mode 100644 index 0000000..7dccd97 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore @@ -0,0 +1,15 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +node_modules +npm-debug.log \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml new file mode 100644 index 0000000..f1d0f13 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - 0.4 + - 0.6 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt new file mode 100644 index 0000000..eac1881 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt @@ -0,0 +1,4 @@ +Copyright 2012 Michael Hart (michael.hart.au@gmail.com) + +This project is free software released under the MIT license: +http://www.opensource.org/licenses/mit-license.php diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md new file mode 100644 index 0000000..32fc982 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md @@ -0,0 +1,38 @@ +# Decode streams into strings The Right Way(tm) + +```javascript +var fs = require('fs') +var zlib = require('zlib') +var strs = require('stringstream') + +var utf8Stream = fs.createReadStream('massiveLogFile.gz') + .pipe(zlib.createGunzip()) + .pipe(strs('utf8')) +``` + +No need to deal with `setEncoding()` weirdness, just compose streams +like they were supposed to be! + +Handles input and output encoding: + +```javascript +// Stream from utf8 to hex to base64... Why not, ay. +var hex64Stream = fs.createReadStream('myFile') + .pipe(strs('utf8', 'hex')) + .pipe(strs('hex', 'base64')) +``` + +Also deals with `base64` output correctly by aligning each emitted data +chunk so that there are no dangling `=` characters: + +```javascript +var stream = fs.createReadStream('myFile').pipe(strs('base64')) + +var base64Str = '' + +stream.on('data', function(data) { base64Str += data }) +stream.on('end', function() { + console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding() + console.log('Original file is: ' + new Buffer(base64Str, 'base64')) +}) +``` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js new file mode 100644 index 0000000..f82b85e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js @@ -0,0 +1,27 @@ +var fs = require('fs') +var zlib = require('zlib') +var strs = require('stringstream') + +var utf8Stream = fs.createReadStream('massiveLogFile.gz') + .pipe(zlib.createGunzip()) + .pipe(strs('utf8')) + +utf8Stream.pipe(process.stdout) + +// Stream from utf8 to hex to base64... Why not, ay. +var hex64Stream = fs.createReadStream('myFile') + .pipe(strs('utf8', 'hex')) + .pipe(strs('hex', 'base64')) + +hex64Stream.pipe(process.stdout) + +// Deals with base64 correctly by aligning chunks +var stream = fs.createReadStream('myFile').pipe(strs('base64')) + +var base64Str = '' + +stream.on('data', function(data) { base64Str += data }) +stream.on('end', function() { + console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding() + console.log('Original file is: ' + new Buffer(base64Str, 'base64')) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json new file mode 100644 index 0000000..f9caf4b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json @@ -0,0 +1,48 @@ +{ + "name": "stringstream", + "version": "0.0.4", + "description": "Encode and decode streams into string streams", + "author": { + "name": "Michael Hart", + "email": "michael.hart.au@gmail.com", + "url": "http://github.com/mhart" + }, + "main": "stringstream.js", + "keywords": [ + "string", + "stream", + "base64", + "gzip" + ], + "repository": { + "type": "git", + "url": "https://github.com/mhart/StringStream.git" + }, + "license": "MIT", + "readme": "# Decode streams into strings The Right Way(tm)\n\n```javascript\nvar fs = require('fs')\nvar zlib = require('zlib')\nvar strs = require('stringstream')\n\nvar utf8Stream = fs.createReadStream('massiveLogFile.gz')\n .pipe(zlib.createGunzip())\n .pipe(strs('utf8'))\n```\n\nNo need to deal with `setEncoding()` weirdness, just compose streams\nlike they were supposed to be!\n\nHandles input and output encoding:\n\n```javascript\n// Stream from utf8 to hex to base64... Why not, ay.\nvar hex64Stream = fs.createReadStream('myFile')\n .pipe(strs('utf8', 'hex'))\n .pipe(strs('hex', 'base64'))\n```\n\nAlso deals with `base64` output correctly by aligning each emitted data\nchunk so that there are no dangling `=` characters:\n\n```javascript\nvar stream = fs.createReadStream('myFile').pipe(strs('base64'))\n\nvar base64Str = ''\n\nstream.on('data', function(data) { base64Str += data })\nstream.on('end', function() {\n console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding()\n console.log('Original file is: ' + new Buffer(base64Str, 'base64'))\n})\n```\n", + "readmeFilename": "README.md", + "_id": "stringstream@0.0.4", + "dist": { + "shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92", + "tarball": "http://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz" + }, + "_npmVersion": "1.2.0", + "_npmUser": { + "name": "hichaelmart", + "email": "michael.hart.au@gmail.com" + }, + "maintainers": [ + { + "name": "hichaelmart", + "email": "michael.hart.au@gmail.com" + } + ], + "directories": {}, + "_shasum": "0f0e3423f942960b5692ac324a57dd093bc41a92", + "_from": "stringstream@~0.0.4", + "_resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz", + "bugs": { + "url": "https://github.com/mhart/StringStream/issues" + }, + "homepage": "https://github.com/mhart/StringStream" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js new file mode 100644 index 0000000..4ece127 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js @@ -0,0 +1,102 @@ +var util = require('util') +var Stream = require('stream') +var StringDecoder = require('string_decoder').StringDecoder + +module.exports = StringStream +module.exports.AlignedStringDecoder = AlignedStringDecoder + +function StringStream(from, to) { + if (!(this instanceof StringStream)) return new StringStream(from, to) + + Stream.call(this) + + if (from == null) from = 'utf8' + + this.readable = this.writable = true + this.paused = false + this.toEncoding = (to == null ? from : to) + this.fromEncoding = (to == null ? '' : from) + this.decoder = new AlignedStringDecoder(this.toEncoding) +} +util.inherits(StringStream, Stream) + +StringStream.prototype.write = function(data) { + if (!this.writable) { + var err = new Error('stream not writable') + err.code = 'EPIPE' + this.emit('error', err) + return false + } + if (this.fromEncoding) { + if (Buffer.isBuffer(data)) data = data.toString() + data = new Buffer(data, this.fromEncoding) + } + var string = this.decoder.write(data) + if (string.length) this.emit('data', string) + return !this.paused +} + +StringStream.prototype.flush = function() { + if (this.decoder.flush) { + var string = this.decoder.flush() + if (string.length) this.emit('data', string) + } +} + +StringStream.prototype.end = function() { + if (!this.writable && !this.readable) return + this.flush() + this.emit('end') + this.writable = this.readable = false + this.destroy() +} + +StringStream.prototype.destroy = function() { + this.decoder = null + this.writable = this.readable = false + this.emit('close') +} + +StringStream.prototype.pause = function() { + this.paused = true +} + +StringStream.prototype.resume = function () { + if (this.paused) this.emit('drain') + this.paused = false +} + +function AlignedStringDecoder(encoding) { + StringDecoder.call(this, encoding) + + switch (this.encoding) { + case 'base64': + this.write = alignedWrite + this.alignedBuffer = new Buffer(3) + this.alignedBytes = 0 + break + } +} +util.inherits(AlignedStringDecoder, StringDecoder) + +AlignedStringDecoder.prototype.flush = function() { + if (!this.alignedBuffer || !this.alignedBytes) return '' + var leftover = this.alignedBuffer.toString(this.encoding, 0, this.alignedBytes) + this.alignedBytes = 0 + return leftover +} + +function alignedWrite(buffer) { + var rem = (this.alignedBytes + buffer.length) % this.alignedBuffer.length + if (!rem && !this.alignedBytes) return buffer.toString(this.encoding) + + var returnBuffer = new Buffer(this.alignedBytes + buffer.length - rem) + + this.alignedBuffer.copy(returnBuffer, 0, 0, this.alignedBytes) + buffer.copy(returnBuffer, this.alignedBytes, 0, buffer.length - rem) + + buffer.copy(this.alignedBuffer, 0, buffer.length - rem, buffer.length) + this.alignedBytes = rem + + return returnBuffer.toString(this.encoding) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.jshintrc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.jshintrc new file mode 100644 index 0000000..fb11913 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.jshintrc @@ -0,0 +1,70 @@ +{ + "passfail" : false, + "maxerr" : 100, + + "browser" : false, + "node" : true, + "rhino" : false, + "couch" : false, + "wsh" : false, + + "jquery" : false, + "prototypejs" : false, + "mootools" : false, + "dojo" : false, + + "debug" : false, + "devel" : false, + + "esnext" : true, + "strict" : true, + "globalstrict" : true, + + "asi" : false, + "laxbreak" : false, + "bitwise" : true, + "boss" : false, + "curly" : true, + "eqeqeq" : false, + "eqnull" : true, + "evil" : false, + "expr" : false, + "forin" : false, + "immed" : true, + "lastsemic" : true, + "latedef" : false, + "loopfunc" : false, + "noarg" : true, + "regexp" : false, + "regexdash" : false, + "scripturl" : false, + "shadow" : false, + "supernew" : false, + "undef" : true, + "unused" : true, + + "newcap" : true, + "noempty" : true, + "nonew" : true, + "nomen" : false, + "onevar" : false, + "onecase" : true, + "plusplus" : false, + "proto" : false, + "sub" : true, + "trailing" : true, + "white" : false, + + "predef": [ + "describe", + "it", + "before", + "beforeEach", + "after", + "afterEach", + "expect", + "setTimeout", + "clearTimeout" + ], + "maxlen": 0 +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.npmignore new file mode 100644 index 0000000..54efff9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.npmignore @@ -0,0 +1,3 @@ +node_modules/ +.*.sw[nmop] +npm-debug.log diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.travis.yml new file mode 100644 index 0000000..5d89265 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: +- "0.10" +- "0.11" +matrix: + fast_finish: true + allow_failures: + - node_js: 0.11 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE new file mode 100644 index 0000000..3fac4c8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE @@ -0,0 +1,78 @@ +Copyright GoInstant, Inc. and other contributors. All rights reserved. +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. + +The following exceptions apply: + +=== + +`pubSufTest()` of generate-pubsuffix.js is in the public domain. + + // Any copyright is dedicated to the Public Domain. + // http://creativecommons.org/publicdomain/zero/1.0/ + +=== + +`public-suffix.txt` was obtained from + +via . + +That file contains the usual Mozilla triple-license, for which this project uses it +under the terms of the MPL 1.1: + + // ***** BEGIN LICENSE BLOCK ***** + // Version: MPL 1.1/GPL 2.0/LGPL 2.1 + // + // The contents of this file are subject to the Mozilla Public License Version + // 1.1 (the "License"); you may not use this file except in compliance with + // the License. You may obtain a copy of the License at + // http://www.mozilla.org/MPL/ + // + // Software distributed under the License is distributed on an "AS IS" basis, + // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + // for the specific language governing rights and limitations under the + // License. + // + // The Original Code is the Public Suffix List. + // + // The Initial Developer of the Original Code is + // Jo Hermans . + // Portions created by the Initial Developer are Copyright (C) 2007 + // the Initial Developer. All Rights Reserved. + // + // Contributor(s): + // Ruben Arakelyan + // Gervase Markham + // Pamela Greene + // David Triendl + // Jothan Frakes + // The kind representatives of many TLD registries + // + // Alternatively, the contents of this file may be used under the terms of + // either the GNU General Public License Version 2 or later (the "GPL"), or + // the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + // in which case the provisions of the GPL or the LGPL are applicable instead + // of those above. If you wish to allow use of your version of this file only + // under the terms of either the GPL or the LGPL, and not to allow others to + // use your version of this file under the terms of the MPL, indicate your + // decision by deleting the provisions above and replace them with the notice + // and other provisions required by the GPL or the LGPL. If you do not delete + // the provisions above, a recipient may use your version of this file under + // the terms of any one of the MPL, the GPL or the LGPL. + // + // ***** END LICENSE BLOCK ***** diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md new file mode 100644 index 0000000..9e6caee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md @@ -0,0 +1,412 @@ +[RFC6265](http://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js + +![Tough Cookie](http://www.goinstant.com.s3.amazonaws.com/tough-cookie.jpg) + +[![Build Status](https://travis-ci.org/goinstant/node-cookie.png?branch=master)](https://travis-ci.org/goinstant/node-cookie) + +[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie) +![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9) + +# Synopsis + +``` javascript +var tough = require('tough-cookie'); // note: not 'cookie', 'cookies' or 'node-cookie' +var Cookie = tough.Cookie; +var cookie = Cookie.parse(header); +cookie.value = 'somethingdifferent'; +header = cookie.toString(); + +var cookiejar = new tough.CookieJar(); +cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb); +// ... +cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) { + res.headers['cookie'] = cookies.join('; '); +}); +``` + +# Installation + +It's _so_ easy! + +`npm install tough-cookie` + +Requires `punycode`, which should get installed automatically for you. Note that node.js v0.6.2+ bundles punycode by default. + +Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken. + +# API + +tough +===== + +Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound". + +parseDate(string[,strict]) +----------------- + +Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. If strict is set to true then leading/trailing non-seperator characters around the time part will cause the parsing to fail (e.g. "Thu, 01 Jan 1970 00:00:010 GMT" has an extra trailing zero but Chrome, an assumedly RFC-compliant browser, treats this as valid). + +formatDate(date) +---------------- + +Format a Date into a RFC1123 string (the RFC6265-recommended format). + +canonicalDomain(str) +-------------------- + +Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects). + +domainMatch(str,domStr[,canonicalize=true]) +------------------------------------------- + +Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match". + +The `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not. + +defaultPath(path) +----------------- + +Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC. + +The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output. + +pathMatch(reqPath,cookiePath) +----------------------------- + +Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean. + +This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`. + +parse(header[,strict=false]) +---------------------------- + +alias for `Cookie.parse(header[,strict])` + +fromJSON(string) +---------------- + +alias for `Cookie.fromJSON(string)` + +getPublicSuffix(hostname) +------------------------- + +Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it. + +For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`. + +For further information, see http://publicsuffix.org/. This module derives its list from that site. + +cookieCompare(a,b) +------------------ + +For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). Longest `.path`s go first, then sorted oldest to youngest. + +``` javascript +var cookies = [ /* unsorted array of Cookie objects */ ]; +cookies = cookies.sort(cookieCompare); +``` + +permuteDomain(domain) +--------------------- + +Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores. + + +permutePath(path) +----------------- + +Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores. + +Cookie +====== + +Cookie.parse(header[,strict=false]) +----------------------------------- + +Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. If in strict mode, returns `undefined` if the cookie doesn't follow the guidelines in section 4 of RFC6265. Generally speaking, strict mode can be used to validate your own generated Set-Cookie headers, but acting as a client you want to be lenient and leave strict mode off. + +Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response: + +``` javascript +if (res.headers['set-cookie'] instanceof Array) + cookies = res.headers['set-cookie'].map(function (c) { return (Cookie.parse(c)); }); +else + cookies = [Cookie.parse(res.headers['set-cookie'])]; +``` + +Cookie.fromJSON(string) +----------------------- + +Convert a JSON string to a `Cookie` object. Does a `JSON.parse()` and converts the `.created`, `.lastAccessed` and `.expires` properties into `Date` objects. + +Properties +========== + + * _key_ - string - the name or key of the cookie (default "") + * _value_ - string - the value of the cookie (default "") + * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()` + * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()` + * _domain_ - string - the `Domain=` attribute of the cookie + * _path_ - string - the `Path=` of the cookie + * _secure_ - boolean - the `Secure` cookie flag + * _httpOnly_ - boolean - the `HttpOnly` cookie flag + * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside) + +After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes: + + * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied) + * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one. + * _created_ - `Date` - when this cookie was added to the jar + * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute. + +Construction([{options}]) +------------ + +Receives an options object that can contain any Cookie properties, uses the default for unspecified properties. + +.toString() +----------- + +encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`. + +.cookieString() +--------------- + +encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '='). + +.setExpires(String) +------------------- + +sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set. + +.setMaxAge(number) +------------------- + +sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly. + +.expiryTime([now=Date.now()]) +----------------------------- + +.expiryDate([now=Date.now()]) +----------------------------- + +expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds. + +Max-Age takes precedence over Expires (as per the RFC). The `.created` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute. + +If Expires (`.expires`) is set, that's returned. + +Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents). + +.TTL([now=Date.now()]) +--------- + +compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply. + +The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned. + +.canonicalizedDoman() +--------------------- + +.cdomain() +---------- + +return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters. + +.validate() +----------- + +Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive. + +validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct: + +``` javascript +if (cookie.validate() === true) { + // it's tasty +} else { + // yuck! +} +``` + +CookieJar +========= + +Construction([store = new MemoryCookieStore()][, rejectPublicSuffixes]) +------------ + +Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used. + + +Attributes +---------- + + * _rejectPublicSuffixes_ - boolean - reject cookies with domains like "com" and "co.uk" (default: `true`) + +Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods. + +.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie)) +------------------------------------------------------------------- + +Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.created`, `.lastAccessed` and `.hostOnly` properties. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _strict_ - boolean - default `false` - perform extra checks + * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. CookieStore errors aren't ignored by this option. + +As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual). + +.setCookieSync(cookieOrString, currentUrl, [{options}]) +------------------------------------------------------- + +Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +.storeCookie(cookie, [{options},] cb(err,cookie)) +------------------------------------------------- + +__REMOVED__ removed in lieu of the CookieStore API below + +.getCookies(currentUrl, [{options},] cb(err,cookies)) +----------------------------------------------------- + +Retrieve the list of cookies that can be sent in a Cookie header for the current url. + +If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given. + +The `options` object can be omitted and can have the following properties: + + * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies. + * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`. + * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies + * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially). + * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the CookieStore `fetchCookies` function (the default MemoryCookieStore supports it). + +The `.lastAccessed` property of the returned cookies will have been updated. + +.getCookiesSync(currentUrl, [{options}]) +---------------------------------------- + +Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +.getCookieString(...) +--------------------- + +Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`. + +.getCookieStringSync(...) +------------------------- + +Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +.getSetCookieStrings(...) +------------------------- + +Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`. + +.getSetCookieStringsSync(...) +----------------------------- + +Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`). + +Store +===== + +Base class for CookieJar stores. + +# CookieStore API + +The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores. + +Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. Stores are asynchronous by default, but if `store.synchronous` is set, then the `*Sync` methods on the CookieJar can be used. + +All `domain` parameters will have been normalized before calling. + +The Cookie store must have all of the following methods. + +store.findCookie(domain, path, key, cb(err,cookie)) +--------------------------------------------------- + +Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned. + +Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error). + +store.findCookies(domain, path, cb(err,cookies)) +------------------------------------------------ + +Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above. + +If no cookies are found, the callback MUST be passed an empty array. + +The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done. + +As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only). + +store.putCookie(cookie, cb(err)) +-------------------------------- + +Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur. + +The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties. + +Pass an error if the cookie cannot be stored. + +store.updateCookie(oldCookie, newCookie, cb(err)) +------------------------------------------------- + +Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store. + +The `.lastAccessed` property will always be different between the two objects and `.created` will always be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are sorted (or selected for deletion). + +Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object. + +The `newCookie` and `oldCookie` objects MUST NOT be modified. + +Pass an error if the newCookie cannot be stored. + +store.removeCookie(domain, path, key, cb(err)) +---------------------------------------------- + +Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint). + +The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie. + +store.removeCookies(domain, path, cb(err)) +------------------------------------------ + +Removes matching cookies from the store. The `path` paramter is optional, and if missing means all paths in a domain should be removed. + +Pass an error ONLY if removing any existing cookies failed. + +# TODO + + * _full_ RFC5890/RFC5891 canonicalization for domains in `cdomain()` + * the optional `punycode` requirement implements RFC3492, but RFC6265 requires RFC5891 + * better tests for `validate()`? + +# Copyright and License + +(tl;dr: MIT with some MPL/1.1) + +Copyright 2012- GoInstant, Inc. and other contributors. All rights reserved. +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. + +Portions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js new file mode 100644 index 0000000..74d76aa --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js @@ -0,0 +1,239 @@ +/* + * Copyright GoInstant, Inc. and other contributors. All rights reserved. + * 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. + */ +'use strict'; +var fs = require('fs'); +var assert = require('assert'); +var punycode = require('punycode'); + +fs.readFile('./public-suffix.txt', 'utf8', function(err,string) { + if (err) { + throw err; + } + var lines = string.split("\n"); + process.nextTick(function() { + processList(lines); + }); +}); + +var index = {}; + +var COMMENT = new RegExp('//.+'); +function processList(lines) { + while (lines.length) { + var line = lines.shift(); + line = line.replace(COMMENT,'').trim(); + if (!line) { + continue; + } + addToIndex(index,line); + } + + pubSufTest(); + + var w = fs.createWriteStream('./lib/pubsuffix.js',{ + flags: 'w', + encoding: 'utf8', + mode: parseInt('644',8) + }); + w.on('end', process.exit); + w.write("/****************************************************\n"); + w.write(" * AUTOMATICALLY GENERATED by generate-pubsuffix.js *\n"); + w.write(" * DO NOT EDIT! *\n"); + w.write(" ****************************************************/\n\n"); + + w.write("module.exports.getPublicSuffix = "); + w.write(getPublicSuffix.toString()); + w.write(";\n\n"); + + w.write("// The following generated structure is used under the MPL version 1.1\n"); + w.write("// See public-suffix.txt for more information\n\n"); + w.write("var index = module.exports.index = Object.freeze(\n"); + w.write(JSON.stringify(index)); + w.write(");\n\n"); + w.write("// END of automatically generated file\n"); + + w.end(); +} + +function addToIndex(index,line) { + var prefix = ''; + if (line.replace(/^(!|\*\.)/)) { + prefix = RegExp.$1; + line = line.slice(prefix.length); + } + line = prefix + punycode.toASCII(line); + + if (line.substr(0,1) == '!') { + index[line.substr(1)] = false; + } else { + index[line] = true; + } +} + +// include the licence in the function since it gets written to pubsuffix.js +function getPublicSuffix(domain) { + /* + * Copyright GoInstant, Inc. and other contributors. All rights reserved. + * 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. + */ + if (!domain) { + return null; + } + if (domain.match(/^\./)) { + return null; + } + + domain = domain.toLowerCase(); + var parts = domain.split('.').reverse(); + + var suffix = ''; + var suffixLen = 0; + for (var i=0; i suffixLen) { + return parts.slice(0,suffixLen+1).reverse().join('.'); + } + + return null; +} + +function checkPublicSuffix(give,get) { + var got = getPublicSuffix(give); + assert.equal(got, get, give+' should be '+(get==null?'NULL':get)+' but got '+got); +} + +// pubSufTest() was converted to JavaScript from http://publicsuffix.org/list/test.txt +function pubSufTest() { + // For this function-scope and this function-scope ONLY: + // Any copyright is dedicated to the Public Domain. + // http://creativecommons.org/publicdomain/zero/1.0/ + + // NULL input. + checkPublicSuffix(null, null); + // Mixed case. + checkPublicSuffix('COM', null); + checkPublicSuffix('example.COM', 'example.com'); + checkPublicSuffix('WwW.example.COM', 'example.com'); + // Leading dot. + checkPublicSuffix('.com', null); + checkPublicSuffix('.example', null); + checkPublicSuffix('.example.com', null); + checkPublicSuffix('.example.example', null); + // Unlisted TLD. + checkPublicSuffix('example', null); + checkPublicSuffix('example.example', null); + checkPublicSuffix('b.example.example', null); + checkPublicSuffix('a.b.example.example', null); + // Listed, but non-Internet, TLD. + checkPublicSuffix('local', null); + checkPublicSuffix('example.local', null); + checkPublicSuffix('b.example.local', null); + checkPublicSuffix('a.b.example.local', null); + // TLD with only 1 rule. + checkPublicSuffix('biz', null); + checkPublicSuffix('domain.biz', 'domain.biz'); + checkPublicSuffix('b.domain.biz', 'domain.biz'); + checkPublicSuffix('a.b.domain.biz', 'domain.biz'); + // TLD with some 2-level rules. + checkPublicSuffix('com', null); + checkPublicSuffix('example.com', 'example.com'); + checkPublicSuffix('b.example.com', 'example.com'); + checkPublicSuffix('a.b.example.com', 'example.com'); + checkPublicSuffix('uk.com', null); + checkPublicSuffix('example.uk.com', 'example.uk.com'); + checkPublicSuffix('b.example.uk.com', 'example.uk.com'); + checkPublicSuffix('a.b.example.uk.com', 'example.uk.com'); + checkPublicSuffix('test.ac', 'test.ac'); + // TLD with only 1 (wildcard) rule. + checkPublicSuffix('cy', null); + checkPublicSuffix('c.cy', null); + checkPublicSuffix('b.c.cy', 'b.c.cy'); + checkPublicSuffix('a.b.c.cy', 'b.c.cy'); + // More complex TLD. + checkPublicSuffix('jp', null); + checkPublicSuffix('test.jp', 'test.jp'); + checkPublicSuffix('www.test.jp', 'test.jp'); + checkPublicSuffix('ac.jp', null); + checkPublicSuffix('test.ac.jp', 'test.ac.jp'); + checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); + checkPublicSuffix('kyoto.jp', null); + checkPublicSuffix('c.kyoto.jp', null); + checkPublicSuffix('b.c.kyoto.jp', 'b.c.kyoto.jp'); + checkPublicSuffix('a.b.c.kyoto.jp', 'b.c.kyoto.jp'); + checkPublicSuffix('pref.kyoto.jp', 'pref.kyoto.jp'); // Exception rule. + checkPublicSuffix('www.pref.kyoto.jp', 'pref.kyoto.jp'); // Exception rule. + checkPublicSuffix('city.kyoto.jp', 'city.kyoto.jp'); // Exception rule. + checkPublicSuffix('www.city.kyoto.jp', 'city.kyoto.jp'); // Exception rule. + // TLD with a wildcard rule and exceptions. + checkPublicSuffix('om', null); + checkPublicSuffix('test.om', null); + checkPublicSuffix('b.test.om', 'b.test.om'); + checkPublicSuffix('a.b.test.om', 'b.test.om'); + checkPublicSuffix('songfest.om', 'songfest.om'); + checkPublicSuffix('www.songfest.om', 'songfest.om'); + // US K12. + checkPublicSuffix('us', null); + checkPublicSuffix('test.us', 'test.us'); + checkPublicSuffix('www.test.us', 'test.us'); + checkPublicSuffix('ak.us', null); + checkPublicSuffix('test.ak.us', 'test.ak.us'); + checkPublicSuffix('www.test.ak.us', 'test.ak.us'); + checkPublicSuffix('k12.ak.us', null); + checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); + checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); + + +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js new file mode 100644 index 0000000..c93e927 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js @@ -0,0 +1,1107 @@ +/* + * Copyright GoInstant, Inc. and other contributors. All rights reserved. + * 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. + */ + +'use strict'; +var net = require('net'); +var urlParse = require('url').parse; +var pubsuffix = require('./pubsuffix'); +var Store = require('./store').Store; + +var punycode; +try { + punycode = require('punycode'); +} catch(e) { + console.warn("cookie: can't load punycode; won't use punycode for domain normalization"); +} + +var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/; + +// From RFC2616 S2.2: +var TOKEN = /[\x21\x23-\x26\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/; + +// From RFC6265 S4.1.1 +// note that it excludes \x3B ";" +var COOKIE_OCTET = /[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/; +var COOKIE_OCTETS = new RegExp('^'+COOKIE_OCTET.source+'$'); + +// The name/key cannot be empty but the value can (S5.2): +var COOKIE_PAIR_STRICT = new RegExp('^('+TOKEN.source+'+)=("?)('+COOKIE_OCTET.source+'*)\\2$'); +var COOKIE_PAIR = /^([^=\s]+)\s*=\s*("?)\s*(.*)\s*\2\s*$/; + +// RFC6265 S4.1.1 defines extension-av as 'any CHAR except CTLs or ";"' +// Note ';' is \x3B +var NON_CTL_SEMICOLON = /[\x20-\x3A\x3C-\x7E]+/; +var EXTENSION_AV = NON_CTL_SEMICOLON; +var PATH_VALUE = NON_CTL_SEMICOLON; + +// Used for checking whether or not there is a trailing semi-colon +var TRAILING_SEMICOLON = /;+$/; + +/* RFC6265 S5.1.1.5: + * [fail if] the day-of-month-value is less than 1 or greater than 31 + */ +var DAY_OF_MONTH = /^(0?[1-9]|[12][0-9]|3[01])$/; + +/* RFC6265 S5.1.1.5: + * [fail if] + * * the hour-value is greater than 23, + * * the minute-value is greater than 59, or + * * the second-value is greater than 59. + */ +var TIME = /(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])/; +var STRICT_TIME = /^(0?[0-9]|1[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/; + +var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)$/i; +var MONTH_TO_NUM = { + jan:0, feb:1, mar:2, apr:3, may:4, jun:5, + jul:6, aug:7, sep:8, oct:9, nov:10, dec:11 +}; +var NUM_TO_MONTH = [ + 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' +]; +var NUM_TO_DAY = [ + 'Sun','Mon','Tue','Wed','Thu','Fri','Sat' +]; + +var YEAR = /^([1-9][0-9]{1,3})$/; // 2 to 4 digits + +var MAX_TIME = 2147483647000; // 31-bit max +var MIN_TIME = 0; // 31-bit min + + +// RFC6265 S5.1.1 date parser: +function parseDate(str,strict) { + if (!str) { + return; + } + var found_time, found_dom, found_month, found_year; + + /* RFC6265 S5.1.1: + * 2. Process each date-token sequentially in the order the date-tokens + * appear in the cookie-date + */ + var tokens = str.split(DATE_DELIM); + if (!tokens) { + return; + } + + var date = new Date(); + date.setMilliseconds(0); + + for (var i=0; i= 10 ? d : '0'+d; + var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h; + var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m; + var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s; + return NUM_TO_DAY[date.getUTCDay()] + ', ' + + d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+ + h+':'+m+':'+s+' GMT'; +} + +// S5.1.2 Canonicalized Host Names +function canonicalDomain(str) { + if (str == null) { + return null; + } + str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading . + + // convert to IDN if any non-ASCII characters + if (punycode && /[^\u0001-\u007f]/.test(str)) { + str = punycode.toASCII(str); + } + + return str.toLowerCase(); +} + +// S5.1.3 Domain Matching +function domainMatch(str, domStr, canonicalize) { + if (str == null || domStr == null) { + return null; + } + if (canonicalize !== false) { + str = canonicalDomain(str); + domStr = canonicalDomain(domStr); + } + + /* + * "The domain string and the string are identical. (Note that both the + * domain string and the string will have been canonicalized to lower case at + * this point)" + */ + if (str == domStr) { + return true; + } + + /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */ + + /* "* The string is a host name (i.e., not an IP address)." */ + if (net.isIP(str)) { + return false; + } + + /* "* The domain string is a suffix of the string" */ + var idx = str.indexOf(domStr); + if (idx <= 0) { + return false; // it's a non-match (-1) or prefix (0) + } + + // e.g "a.b.c".indexOf("b.c") === 2 + // 5 === 3+2 + if (str.length !== domStr.length + idx) { // it's not a suffix + return false; + } + + /* "* The last character of the string that is not included in the domain + * string is a %x2E (".") character." */ + if (str.substr(idx-1,1) !== '.') { + return false; + } + + return true; +} + + +// RFC6265 S5.1.4 Paths and Path-Match + +/* + * "The user agent MUST use an algorithm equivalent to the following algorithm + * to compute the default-path of a cookie:" + * + * Assumption: the path (and not query part or absolute uri) is passed in. + */ +function defaultPath(path) { + // "2. If the uri-path is empty or if the first character of the uri-path is not + // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps. + if (!path || path.substr(0,1) !== "/") { + return "/"; + } + + // "3. If the uri-path contains no more than one %x2F ("/") character, output + // %x2F ("/") and skip the remaining step." + if (path === "/") { + return path; + } + + var rightSlash = path.lastIndexOf("/"); + if (rightSlash === 0) { + return "/"; + } + + // "4. Output the characters of the uri-path from the first character up to, + // but not including, the right-most %x2F ("/")." + return path.slice(0, rightSlash); +} + +/* + * "A request-path path-matches a given cookie-path if at least one of the + * following conditions holds:" + */ +function pathMatch(reqPath,cookiePath) { + // "o The cookie-path and the request-path are identical." + if (cookiePath === reqPath) { + return true; + } + + var idx = reqPath.indexOf(cookiePath); + if (idx === 0) { + // "o The cookie-path is a prefix of the request-path, and the last + // character of the cookie-path is %x2F ("/")." + if (cookiePath.substr(-1) === "/") { + return true; + } + + // " o The cookie-path is a prefix of the request-path, and the first + // character of the request-path that is not included in the cookie- path + // is a %x2F ("/") character." + if (reqPath.substr(cookiePath.length,1) === "/") { + return true; + } + } + + return false; +} + +function parse(str, strict) { + str = str.trim(); + + // S4.1.1 Trailing semi-colons are not part of the specification. + // If we are not in strict mode we remove the trailing semi-colons. + var semiColonCheck = TRAILING_SEMICOLON.exec(str); + if (semiColonCheck) { + if (strict) { + return; + } + str = str.slice(0, semiColonCheck.index); + } + + // We use a regex to parse the "name-value-pair" part of S5.2 + var firstSemi = str.indexOf(';'); // S5.2 step 1 + var pairRx = strict ? COOKIE_PAIR_STRICT : COOKIE_PAIR; + var result = pairRx.exec(firstSemi === -1 ? str : str.substr(0,firstSemi)); + + // Rx satisfies the "the name string is empty" and "lacks a %x3D ("=")" + // constraints as well as trimming any whitespace. + if (!result) { + return; + } + + var c = new Cookie(); + c.key = result[1]; // the regexp should trim() already + c.value = result[3]; // [2] is quotes or empty-string + + if (firstSemi === -1) { + return c; + } + + // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string + // (including the %x3B (";") in question)." plus later on in the same section + // "discard the first ";" and trim". + var unparsed = str.slice(firstSemi).replace(/^\s*;\s*/,'').trim(); + + // "If the unparsed-attributes string is empty, skip the rest of these + // steps." + if (unparsed.length === 0) { + return c; + } + + /* + * S5.2 says that when looping over the items "[p]rocess the attribute-name + * and attribute-value according to the requirements in the following + * subsections" for every item. Plus, for many of the individual attributes + * in S5.3 it says to use the "attribute-value of the last attribute in the + * cookie-attribute-list". Therefore, in this implementation, we overwrite + * the previous value. + */ + var cookie_avs = unparsed.split(/\s*;\s*/); + while (cookie_avs.length) { + var av = cookie_avs.shift(); + + if (strict && !EXTENSION_AV.test(av)) { + return; + } + + var av_sep = av.indexOf('='); + var av_key, av_value; + if (av_sep === -1) { + av_key = av; + av_value = null; + } else { + av_key = av.substr(0,av_sep); + av_value = av.substr(av_sep+1); + } + + av_key = av_key.trim().toLowerCase(); + if (av_value) { + av_value = av_value.trim(); + } + + switch(av_key) { + case 'expires': // S5.2.1 + if (!av_value) {if(strict){return;}else{break;} } + var exp = parseDate(av_value,strict); + // "If the attribute-value failed to parse as a cookie date, ignore the + // cookie-av." + if (exp == null) { if(strict){return;}else{break;} } + c.expires = exp; + // over and underflow not realistically a concern: V8's getTime() seems to + // store something larger than a 32-bit time_t (even with 32-bit node) + break; + + case 'max-age': // S5.2.2 + if (!av_value) { if(strict){return;}else{break;} } + // "If the first character of the attribute-value is not a DIGIT or a "-" + // character ...[or]... If the remainder of attribute-value contains a + // non-DIGIT character, ignore the cookie-av." + if (!/^-?[0-9]+$/.test(av_value)) { if(strict){return;}else{break;} } + var delta = parseInt(av_value,10); + if (strict && delta <= 0) { + return; // S4.1.1 + } + // "If delta-seconds is less than or equal to zero (0), let expiry-time + // be the earliest representable date and time." + c.setMaxAge(delta); + break; + + case 'domain': // S5.2.3 + // "If the attribute-value is empty, the behavior is undefined. However, + // the user agent SHOULD ignore the cookie-av entirely." + if (!av_value) { if(strict){return;}else{break;} } + // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E + // (".") character." + var domain = av_value.trim().replace(/^\./,''); + if (!domain) { if(strict){return;}else{break;} } // see "is empty" above + // "Convert the cookie-domain to lower case." + c.domain = domain.toLowerCase(); + break; + + case 'path': // S5.2.4 + /* + * "If the attribute-value is empty or if the first character of the + * attribute-value is not %x2F ("/"): + * Let cookie-path be the default-path. + * Otherwise: + * Let cookie-path be the attribute-value." + * + * We'll represent the default-path as null since it depends on the + * context of the parsing. + */ + if (!av_value || av_value.substr(0,1) != "/") { + if(strict){return;}else{break;} + } + c.path = av_value; + break; + + case 'secure': // S5.2.5 + /* + * "If the attribute-name case-insensitively matches the string "Secure", + * the user agent MUST append an attribute to the cookie-attribute-list + * with an attribute-name of Secure and an empty attribute-value." + */ + if (av_value != null) { if(strict){return;} } + c.secure = true; + break; + + case 'httponly': // S5.2.6 -- effectively the same as 'secure' + if (av_value != null) { if(strict){return;} } + c.httpOnly = true; + break; + + default: + c.extensions = c.extensions || []; + c.extensions.push(av); + break; + } + } + + // ensure a default date for sorting: + c.creation = new Date(); + return c; +} + +function fromJSON(str) { + if (!str) { + return null; + } + + var obj; + try { + obj = JSON.parse(str); + } catch (e) { + return null; + } + + var c = new Cookie(); + for (var i=0; i 1) { + var lindex = path.lastIndexOf('/'); + if (lindex === 0) { + break; + } + path = path.substr(0,lindex); + permutations.push(path); + } + permutations.push('/'); + return permutations; +} + + +function Cookie (opts) { + if (typeof opts !== "object") { + return; + } + Object.keys(opts).forEach(function (key) { + if (Cookie.prototype.hasOwnProperty(key)) { + this[key] = opts[key] || Cookie.prototype[key]; + } + }.bind(this)); +} + +Cookie.parse = parse; +Cookie.fromJSON = fromJSON; + +Cookie.prototype.key = ""; +Cookie.prototype.value = ""; + +// the order in which the RFC has them: +Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity +Cookie.prototype.maxAge = null; // takes precedence over expires for TTL +Cookie.prototype.domain = null; +Cookie.prototype.path = null; +Cookie.prototype.secure = false; +Cookie.prototype.httpOnly = false; +Cookie.prototype.extensions = null; + +// set by the CookieJar: +Cookie.prototype.hostOnly = null; // boolean when set +Cookie.prototype.pathIsDefault = null; // boolean when set +Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse +Cookie.prototype.lastAccessed = null; // Date when set + +var cookieProperties = Object.freeze(Object.keys(Cookie.prototype).map(function(p) { + if (p instanceof Function) { + return; + } + return p; +})); +var numCookieProperties = cookieProperties.length; + +Cookie.prototype.inspect = function inspect() { + var now = Date.now(); + return 'Cookie="'+this.toString() + + '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') + + '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') + + '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') + + '"'; +}; + +Cookie.prototype.validate = function validate() { + if (!COOKIE_OCTETS.test(this.value)) { + return false; + } + if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires,true)) { + return false; + } + if (this.maxAge != null && this.maxAge <= 0) { + return false; // "Max-Age=" non-zero-digit *DIGIT + } + if (this.path != null && !PATH_VALUE.test(this.path)) { + return false; + } + + var cdomain = this.cdomain(); + if (cdomain) { + if (cdomain.match(/\.$/)) { + return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this + } + var suffix = pubsuffix.getPublicSuffix(cdomain); + if (suffix == null) { // it's a public suffix + return false; + } + } + return true; +}; + +Cookie.prototype.setExpires = function setExpires(exp) { + if (exp instanceof Date) { + this.expires = exp; + } else { + this.expires = parseDate(exp) || "Infinity"; + } +}; + +Cookie.prototype.setMaxAge = function setMaxAge(age) { + if (age === Infinity || age === -Infinity) { + this.maxAge = age.toString(); // so JSON.stringify() works + } else { + this.maxAge = age; + } +}; + +// gives Cookie header format +Cookie.prototype.cookieString = function cookieString() { + var val = this.value; + if (val == null) { + val = ''; + } + return this.key+'='+val; +}; + +// gives Set-Cookie header format +Cookie.prototype.toString = function toString() { + var str = this.cookieString(); + + if (this.expires != Infinity) { + if (this.expires instanceof Date) { + str += '; Expires='+formatDate(this.expires); + } else { + str += '; Expires='+this.expires; + } + } + + if (this.maxAge != null && this.maxAge != Infinity) { + str += '; Max-Age='+this.maxAge; + } + + if (this.domain && !this.hostOnly) { + str += '; Domain='+this.domain; + } + if (this.path) { + str += '; Path='+this.path; + } + + if (this.secure) { + str += '; Secure'; + } + if (this.httpOnly) { + str += '; HttpOnly'; + } + if (this.extensions) { + this.extensions.forEach(function(ext) { + str += '; '+ext; + }); + } + + return str; +}; + +// TTL() partially replaces the "expiry-time" parts of S5.3 step 3 (setCookie() +// elsewhere) +// S5.3 says to give the "latest representable date" for which we use Infinity +// For "expired" we use 0 +Cookie.prototype.TTL = function TTL(now) { + /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires + * attribute, the Max-Age attribute has precedence and controls the + * expiration date of the cookie. + * (Concurs with S5.3 step 3) + */ + if (this.maxAge != null) { + return this.maxAge<=0 ? 0 : this.maxAge*1000; + } + + var expires = this.expires; + if (expires != Infinity) { + if (!(expires instanceof Date)) { + expires = parseDate(expires) || Infinity; + } + + if (expires == Infinity) { + return Infinity; + } + + return expires.getTime() - (now || Date.now()); + } + + return Infinity; +}; + +// expiryTime() replaces the "expiry-time" parts of S5.3 step 3 (setCookie() +// elsewhere) +Cookie.prototype.expiryTime = function expiryTime(now) { + if (this.maxAge != null) { + var relativeTo = this.creation || now || new Date(); + var age = (this.maxAge <= 0) ? -Infinity : this.maxAge*1000; + return relativeTo.getTime() + age; + } + + if (this.expires == Infinity) { + return Infinity; + } + return this.expires.getTime(); +}; + +// expiryDate() replaces the "expiry-time" parts of S5.3 step 3 (setCookie() +// elsewhere), except it returns a Date +Cookie.prototype.expiryDate = function expiryDate(now) { + var millisec = this.expiryTime(now); + if (millisec == Infinity) { + return new Date(MAX_TIME); + } else if (millisec == -Infinity) { + return new Date(MIN_TIME); + } else { + return new Date(millisec); + } +}; + +// This replaces the "persistent-flag" parts of S5.3 step 3 +Cookie.prototype.isPersistent = function isPersistent() { + return (this.maxAge != null || this.expires != Infinity); +}; + +// Mostly S5.1.2 and S5.2.3: +Cookie.prototype.cdomain = +Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() { + if (this.domain == null) { + return null; + } + return canonicalDomain(this.domain); +}; + + +var memstore; +function CookieJar(store, rejectPublicSuffixes) { + if (rejectPublicSuffixes != null) { + this.rejectPublicSuffixes = rejectPublicSuffixes; + } + + if (!store) { + memstore = memstore || require('./memstore'); + store = new memstore.MemoryCookieStore(); + } + this.store = store; +} +CookieJar.prototype.store = null; +CookieJar.prototype.rejectPublicSuffixes = true; +var CAN_BE_SYNC = []; + +CAN_BE_SYNC.push('setCookie'); +CookieJar.prototype.setCookie = function(cookie, url, options, cb) { + var err; + var context = (url instanceof Object) ? url : urlParse(url); + if (options instanceof Function) { + cb = options; + options = {}; + } + + var host = canonicalDomain(context.hostname); + + // S5.3 step 1 + if (!(cookie instanceof Cookie)) { + cookie = Cookie.parse(cookie, options.strict === true); + } + if (!cookie) { + err = new Error("Cookie failed to parse"); + return cb(options.ignoreError ? null : err); + } + + // S5.3 step 2 + var now = options.now || new Date(); // will assign later to save effort in the face of errors + + // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie() + + // S5.3 step 4: NOOP; domain is null by default + + // S5.3 step 5: public suffixes + if (this.rejectPublicSuffixes && cookie.domain) { + var suffix = pubsuffix.getPublicSuffix(cookie.cdomain()); + if (suffix == null) { // e.g. "com" + err = new Error("Cookie has domain set to a public suffix"); + return cb(options.ignoreError ? null : err); + } + } + + // S5.3 step 6: + if (cookie.domain) { + if (!domainMatch(host, cookie.cdomain(), false)) { + err = new Error("Cookie not in this host's domain. Cookie:"+cookie.cdomain()+" Request:"+host); + return cb(options.ignoreError ? null : err); + } + + if (cookie.hostOnly == null) { // don't reset if already set + cookie.hostOnly = false; + } + + } else { + cookie.hostOnly = true; + cookie.domain = host; + } + + // S5.3 step 7: "Otherwise, set the cookie's path to the default-path of the + // request-uri" + if (!cookie.path) { + cookie.path = defaultPath(context.pathname); + cookie.pathIsDefault = true; + } else { + if (cookie.path.length > 1 && cookie.path.substr(-1) == '/') { + cookie.path = cookie.path.slice(0,-1); + } + } + + // S5.3 step 8: NOOP; secure attribute + // S5.3 step 9: NOOP; httpOnly attribute + + // S5.3 step 10 + if (options.http === false && cookie.httpOnly) { + err = new Error("Cookie is HttpOnly and this isn't an HTTP API"); + return cb(options.ignoreError ? null : err); + } + + var store = this.store; + + if (!store.updateCookie) { + store.updateCookie = function(oldCookie, newCookie, cb) { + this.putCookie(newCookie, cb); + }; + } + + function withCookie(err, oldCookie) { + if (err) { + return cb(err); + } + + var next = function(err) { + if (err) { + return cb(err); + } else { + cb(null, cookie); + } + }; + + if (oldCookie) { + // S5.3 step 11 - "If the cookie store contains a cookie with the same name, + // domain, and path as the newly created cookie:" + if (options.http === false && oldCookie.httpOnly) { // step 11.2 + err = new Error("old Cookie is HttpOnly and this isn't an HTTP API"); + return cb(options.ignoreError ? null : err); + } + cookie.creation = oldCookie.creation; // step 11.3 + cookie.lastAccessed = now; + // Step 11.4 (delete cookie) is implied by just setting the new one: + store.updateCookie(oldCookie, cookie, next); // step 12 + + } else { + cookie.creation = cookie.lastAccessed = now; + store.putCookie(cookie, next); // step 12 + } + } + + store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie); +}; + +// RFC6365 S5.4 +CAN_BE_SYNC.push('getCookies'); +CookieJar.prototype.getCookies = function(url, options, cb) { + var context = (url instanceof Object) ? url : urlParse(url); + if (options instanceof Function) { + cb = options; + options = {}; + } + + var host = canonicalDomain(context.hostname); + var path = context.pathname || '/'; + + var secure = options.secure; + if (secure == null && context.protocol && + (context.protocol == 'https:' || context.protocol == 'wss:')) + { + secure = true; + } + + var http = options.http; + if (http == null) { + http = true; + } + + var now = options.now || Date.now(); + var expireCheck = options.expire !== false; + var allPaths = !!options.allPaths; + var store = this.store; + + function matchingCookie(c) { + // "Either: + // The cookie's host-only-flag is true and the canonicalized + // request-host is identical to the cookie's domain. + // Or: + // The cookie's host-only-flag is false and the canonicalized + // request-host domain-matches the cookie's domain." + if (c.hostOnly) { + if (c.domain != host) { + return false; + } + } else { + if (!domainMatch(host, c.domain, false)) { + return false; + } + } + + // "The request-uri's path path-matches the cookie's path." + if (!allPaths && !pathMatch(path, c.path)) { + return false; + } + + // "If the cookie's secure-only-flag is true, then the request-uri's + // scheme must denote a "secure" protocol" + if (c.secure && !secure) { + return false; + } + + // "If the cookie's http-only-flag is true, then exclude the cookie if the + // cookie-string is being generated for a "non-HTTP" API" + if (c.httpOnly && !http) { + return false; + } + + // deferred from S5.3 + // non-RFC: allow retention of expired cookies by choice + if (expireCheck && c.expiryTime() <= now) { + store.removeCookie(c.domain, c.path, c.key, function(){}); // result ignored + return false; + } + + return true; + } + + store.findCookies(host, allPaths ? null : path, function(err,cookies) { + if (err) { + return cb(err); + } + + cookies = cookies.filter(matchingCookie); + + // sorting of S5.4 part 2 + if (options.sort !== false) { + cookies = cookies.sort(cookieCompare); + } + + // S5.4 part 3 + var now = new Date(); + cookies.forEach(function(c) { + c.lastAccessed = now; + }); + // TODO persist lastAccessed + + cb(null,cookies); + }); +}; + +CAN_BE_SYNC.push('getCookieString'); +CookieJar.prototype.getCookieString = function(/*..., cb*/) { + var args = Array.prototype.slice.call(arguments,0); + var cb = args.pop(); + var next = function(err,cookies) { + if (err) { + cb(err); + } else { + cb(null, cookies.map(function(c){ + return c.cookieString(); + }).join('; ')); + } + }; + args.push(next); + this.getCookies.apply(this,args); +}; + +CAN_BE_SYNC.push('getSetCookieStrings'); +CookieJar.prototype.getSetCookieStrings = function(/*..., cb*/) { + var args = Array.prototype.slice.call(arguments,0); + var cb = args.pop(); + var next = function(err,cookies) { + if (err) { + cb(err); + } else { + cb(null, cookies.map(function(c){ + return c.toString(); + })); + } + }; + args.push(next); + this.getCookies.apply(this,args); +}; + +// Use a closure to provide a true imperative API for synchronous stores. +function syncWrap(method) { + return function() { + if (!this.store.synchronous) { + throw new Error('CookieJar store is not synchronous; use async API instead.'); + } + + var args = Array.prototype.slice.call(arguments); + var syncErr, syncResult; + args.push(function syncCb(err, result) { + syncErr = err; + syncResult = result; + }); + this[method].apply(this, args); + + if (syncErr) { + throw syncErr; + } + return syncResult; + }; +} + +// wrap all declared CAN_BE_SYNC methods in the sync wrapper +CAN_BE_SYNC.forEach(function(method) { + CookieJar.prototype[method+'Sync'] = syncWrap(method); +}); + +module.exports = { + CookieJar: CookieJar, + Cookie: Cookie, + Store: Store, + parseDate: parseDate, + formatDate: formatDate, + parse: parse, + fromJSON: fromJSON, + domainMatch: domainMatch, + defaultPath: defaultPath, + pathMatch: pathMatch, + getPublicSuffix: pubsuffix.getPublicSuffix, + cookieCompare: cookieCompare, + permuteDomain: permuteDomain, + permutePath: permutePath, + canonicalDomain: canonicalDomain, +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js new file mode 100644 index 0000000..fc5774c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js @@ -0,0 +1,123 @@ +'use strict'; +var tough = require('./cookie'); +var Store = require('./store').Store; +var permuteDomain = tough.permuteDomain; +var permutePath = tough.permutePath; +var util = require('util'); + +function MemoryCookieStore() { + Store.call(this); + this.idx = {}; +} +util.inherits(MemoryCookieStore, Store); +exports.MemoryCookieStore = MemoryCookieStore; +MemoryCookieStore.prototype.idx = null; +MemoryCookieStore.prototype.synchronous = true; + +// force a default depth: +MemoryCookieStore.prototype.inspect = function() { + return "{ idx: "+util.inspect(this.idx, false, 2)+' }'; +}; + +MemoryCookieStore.prototype.findCookie = function(domain, path, key, cb) { + if (!this.idx[domain]) { + return cb(null,undefined); + } + if (!this.idx[domain][path]) { + return cb(null,undefined); + } + return cb(null,this.idx[domain][path][key]||null); +}; + +MemoryCookieStore.prototype.findCookies = function(domain, path, cb) { + var results = []; + if (!domain) { + return cb(null,[]); + } + + var pathMatcher; + if (!path) { + // null or '/' means "all paths" + pathMatcher = function matchAll(domainIndex) { + for (var curPath in domainIndex) { + var pathIndex = domainIndex[curPath]; + for (var key in pathIndex) { + results.push(pathIndex[key]); + } + } + }; + + } else if (path === '/') { + pathMatcher = function matchSlash(domainIndex) { + var pathIndex = domainIndex['/']; + if (!pathIndex) { + return; + } + for (var key in pathIndex) { + results.push(pathIndex[key]); + } + }; + + } else { + var paths = permutePath(path) || [path]; + pathMatcher = function matchRFC(domainIndex) { + paths.forEach(function(curPath) { + var pathIndex = domainIndex[curPath]; + if (!pathIndex) { + return; + } + for (var key in pathIndex) { + results.push(pathIndex[key]); + } + }); + }; + } + + var domains = permuteDomain(domain) || [domain]; + var idx = this.idx; + domains.forEach(function(curDomain) { + var domainIndex = idx[curDomain]; + if (!domainIndex) { + return; + } + pathMatcher(domainIndex); + }); + + cb(null,results); +}; + +MemoryCookieStore.prototype.putCookie = function(cookie, cb) { + if (!this.idx[cookie.domain]) { + this.idx[cookie.domain] = {}; + } + if (!this.idx[cookie.domain][cookie.path]) { + this.idx[cookie.domain][cookie.path] = {}; + } + this.idx[cookie.domain][cookie.path][cookie.key] = cookie; + cb(null); +}; + +MemoryCookieStore.prototype.updateCookie = function updateCookie(oldCookie, newCookie, cb) { + // updateCookie() may avoid updating cookies that are identical. For example, + // lastAccessed may not be important to some stores and an equality + // comparison could exclude that field. + this.putCookie(newCookie,cb); +}; + +MemoryCookieStore.prototype.removeCookie = function removeCookie(domain, path, key, cb) { + if (this.idx[domain] && this.idx[domain][path] && this.idx[domain][path][key]) { + delete this.idx[domain][path][key]; + } + cb(null); +}; + +MemoryCookieStore.prototype.removeCookies = function removeCookies(domain, path, cb) { + if (this.idx[domain]) { + if (path) { + delete this.idx[domain][path]; + } else { + delete this.idx[domain]; + } + } + return cb(null); +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js new file mode 100644 index 0000000..a703147 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js @@ -0,0 +1,69 @@ +/**************************************************** + * AUTOMATICALLY GENERATED by generate-pubsuffix.js * + * DO NOT EDIT! * + ****************************************************/ + +module.exports.getPublicSuffix = function getPublicSuffix(domain) { + /* + * Copyright GoInstant, Inc. and other contributors. All rights reserved. + * 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. + */ + if (!domain) return null; + if (domain.match(/^\./)) return null; + + domain = domain.toLowerCase(); + var parts = domain.split('.').reverse(); + + var suffix = ''; + var suffixLen = 0; + for (var i=0; i suffixLen) { + return parts.slice(0,suffixLen+1).reverse().join('.'); + } + + return null; +}; + +// The following generated structure is used under the MPL version 1.1 +// See public-suffix.txt for more information + +var index = module.exports.index = Object.freeze( +{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"*.ar":true,"congresodelalengua3.ar":false,"educ.ar":false,"gobiernoelectronico.ar":false,"mecon.ar":false,"nacion.ar":false,"nic.ar":false,"promocion.ar":false,"retina.ar":false,"uba.ar":false,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"csiro.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"act.gov.au":true,"nt.gov.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"can.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mus.br":true,"net.br":true,"nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"gov.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cx":true,"gov.cx":true,"*.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"*.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"org.gg":true,"net.gg":true,"sch.gg":true,"gov.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"gm":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"*.gt":true,"www.gt":false,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"co.id":true,"go.id":true,"mil.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"*.il":true,"im":true,"co.im":true,"ltd.co.im":true,"plc.co.im":true,"net.im":true,"gov.im":true,"org.im":true,"nic.im":true,"ac.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"agrigento.it":true,"ag.it":true,"alessandria.it":true,"al.it":true,"ancona.it":true,"an.it":true,"aosta.it":true,"aoste.it":true,"ao.it":true,"arezzo.it":true,"ar.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"ap.it":true,"asti.it":true,"at.it":true,"avellino.it":true,"av.it":true,"bari.it":true,"ba.it":true,"andria-barletta-trani.it":true,"andriabarlettatrani.it":true,"trani-barletta-andria.it":true,"tranibarlettaandria.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"andria-trani-barletta.it":true,"andriatranibarletta.it":true,"trani-andria-barletta.it":true,"traniandriabarletta.it":true,"bt.it":true,"belluno.it":true,"bl.it":true,"benevento.it":true,"bn.it":true,"bergamo.it":true,"bg.it":true,"biella.it":true,"bi.it":true,"bologna.it":true,"bo.it":true,"bolzano.it":true,"bozen.it":true,"balsan.it":true,"alto-adige.it":true,"altoadige.it":true,"suedtirol.it":true,"bz.it":true,"brescia.it":true,"bs.it":true,"brindisi.it":true,"br.it":true,"cagliari.it":true,"ca.it":true,"caltanissetta.it":true,"cl.it":true,"campobasso.it":true,"cb.it":true,"carboniaiglesias.it":true,"carbonia-iglesias.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"ci.it":true,"caserta.it":true,"ce.it":true,"catania.it":true,"ct.it":true,"catanzaro.it":true,"cz.it":true,"chieti.it":true,"ch.it":true,"como.it":true,"co.it":true,"cosenza.it":true,"cs.it":true,"cremona.it":true,"cr.it":true,"crotone.it":true,"kr.it":true,"cuneo.it":true,"cn.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"ogliastra.it":true,"og.it":true,"enna.it":true,"en.it":true,"ferrara.it":true,"fe.it":true,"fermo.it":true,"fm.it":true,"firenze.it":true,"florence.it":true,"fi.it":true,"foggia.it":true,"fg.it":true,"forli-cesena.it":true,"forlicesena.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"fc.it":true,"frosinone.it":true,"fr.it":true,"genova.it":true,"genoa.it":true,"ge.it":true,"gorizia.it":true,"go.it":true,"grosseto.it":true,"gr.it":true,"imperia.it":true,"im.it":true,"isernia.it":true,"is.it":true,"laquila.it":true,"aquila.it":true,"aq.it":true,"la-spezia.it":true,"laspezia.it":true,"sp.it":true,"latina.it":true,"lt.it":true,"lecce.it":true,"le.it":true,"lecco.it":true,"lc.it":true,"livorno.it":true,"li.it":true,"lodi.it":true,"lo.it":true,"lucca.it":true,"lu.it":true,"macerata.it":true,"mc.it":true,"mantova.it":true,"mn.it":true,"massa-carrara.it":true,"massacarrara.it":true,"carrara-massa.it":true,"carraramassa.it":true,"ms.it":true,"matera.it":true,"mt.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"vs.it":true,"messina.it":true,"me.it":true,"milano.it":true,"milan.it":true,"mi.it":true,"modena.it":true,"mo.it":true,"monza.it":true,"monza-brianza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"monza-e-della-brianza.it":true,"mb.it":true,"napoli.it":true,"naples.it":true,"na.it":true,"novara.it":true,"no.it":true,"nuoro.it":true,"nu.it":true,"oristano.it":true,"or.it":true,"padova.it":true,"padua.it":true,"pd.it":true,"palermo.it":true,"pa.it":true,"parma.it":true,"pr.it":true,"pavia.it":true,"pv.it":true,"perugia.it":true,"pg.it":true,"pescara.it":true,"pe.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"pu.it":true,"piacenza.it":true,"pc.it":true,"pisa.it":true,"pi.it":true,"pistoia.it":true,"pt.it":true,"pordenone.it":true,"pn.it":true,"potenza.it":true,"pz.it":true,"prato.it":true,"po.it":true,"ragusa.it":true,"rg.it":true,"ravenna.it":true,"ra.it":true,"reggio-calabria.it":true,"reggiocalabria.it":true,"rc.it":true,"reggio-emilia.it":true,"reggioemilia.it":true,"re.it":true,"rieti.it":true,"ri.it":true,"rimini.it":true,"rn.it":true,"roma.it":true,"rome.it":true,"rm.it":true,"rovigo.it":true,"ro.it":true,"salerno.it":true,"sa.it":true,"sassari.it":true,"ss.it":true,"savona.it":true,"sv.it":true,"siena.it":true,"si.it":true,"siracusa.it":true,"sr.it":true,"sondrio.it":true,"so.it":true,"taranto.it":true,"ta.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"ot.it":true,"teramo.it":true,"te.it":true,"terni.it":true,"tr.it":true,"torino.it":true,"turin.it":true,"to.it":true,"trapani.it":true,"tp.it":true,"trento.it":true,"trentino.it":true,"tn.it":true,"treviso.it":true,"tv.it":true,"trieste.it":true,"ts.it":true,"udine.it":true,"ud.it":true,"varese.it":true,"va.it":true,"venezia.it":true,"venice.it":true,"ve.it":true,"verbania.it":true,"vb.it":true,"vercelli.it":true,"vc.it":true,"verona.it":true,"vr.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vv.it":true,"vicenza.it":true,"vi.it":true,"viterbo.it":true,"vt.it":true,"je":true,"co.je":true,"org.je":true,"net.je":true,"sch.je":true,"gov.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"*.aichi.jp":true,"*.akita.jp":true,"*.aomori.jp":true,"*.chiba.jp":true,"*.ehime.jp":true,"*.fukui.jp":true,"*.fukuoka.jp":true,"*.fukushima.jp":true,"*.gifu.jp":true,"*.gunma.jp":true,"*.hiroshima.jp":true,"*.hokkaido.jp":true,"*.hyogo.jp":true,"*.ibaraki.jp":true,"*.ishikawa.jp":true,"*.iwate.jp":true,"*.kagawa.jp":true,"*.kagoshima.jp":true,"*.kanagawa.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.kochi.jp":true,"*.kumamoto.jp":true,"*.kyoto.jp":true,"*.mie.jp":true,"*.miyagi.jp":true,"*.miyazaki.jp":true,"*.nagano.jp":true,"*.nagasaki.jp":true,"*.nagoya.jp":true,"*.nara.jp":true,"*.niigata.jp":true,"*.oita.jp":true,"*.okayama.jp":true,"*.okinawa.jp":true,"*.osaka.jp":true,"*.saga.jp":true,"*.saitama.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.shiga.jp":true,"*.shimane.jp":true,"*.shizuoka.jp":true,"*.tochigi.jp":true,"*.tokushima.jp":true,"*.tokyo.jp":true,"*.tottori.jp":true,"*.toyama.jp":true,"*.wakayama.jp":true,"*.yamagata.jp":true,"*.yamaguchi.jp":true,"*.yamanashi.jp":true,"*.yokohama.jp":true,"metro.tokyo.jp":false,"pref.aichi.jp":false,"pref.akita.jp":false,"pref.aomori.jp":false,"pref.chiba.jp":false,"pref.ehime.jp":false,"pref.fukui.jp":false,"pref.fukuoka.jp":false,"pref.fukushima.jp":false,"pref.gifu.jp":false,"pref.gunma.jp":false,"pref.hiroshima.jp":false,"pref.hokkaido.jp":false,"pref.hyogo.jp":false,"pref.ibaraki.jp":false,"pref.ishikawa.jp":false,"pref.iwate.jp":false,"pref.kagawa.jp":false,"pref.kagoshima.jp":false,"pref.kanagawa.jp":false,"pref.kochi.jp":false,"pref.kumamoto.jp":false,"pref.kyoto.jp":false,"pref.mie.jp":false,"pref.miyagi.jp":false,"pref.miyazaki.jp":false,"pref.nagano.jp":false,"pref.nagasaki.jp":false,"pref.nara.jp":false,"pref.niigata.jp":false,"pref.oita.jp":false,"pref.okayama.jp":false,"pref.okinawa.jp":false,"pref.osaka.jp":false,"pref.saga.jp":false,"pref.saitama.jp":false,"pref.shiga.jp":false,"pref.shimane.jp":false,"pref.shizuoka.jp":false,"pref.tochigi.jp":false,"pref.tokushima.jp":false,"pref.tottori.jp":false,"pref.toyama.jp":false,"pref.wakayama.jp":false,"pref.yamagata.jp":false,"pref.yamaguchi.jp":false,"pref.yamanashi.jp":false,"city.chiba.jp":false,"city.fukuoka.jp":false,"city.hiroshima.jp":false,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.kyoto.jp":false,"city.nagoya.jp":false,"city.niigata.jp":false,"city.okayama.jp":false,"city.osaka.jp":false,"city.saitama.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.shizuoka.jp":false,"city.yokohama.jp":false,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"*.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ac.ng":true,"com.ng":true,"edu.ng":true,"gov.ng":true,"net.ng":true,"org.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"*.nz":true,"*.om":true,"mediaphone.om":false,"nawrastelecom.om":false,"nawras.om":false,"omanmobile.om":false,"omanpost.om":false,"omantel.om":false,"rakpetroleum.om":false,"siemens.om":false,"songfest.om":false,"statecouncil.om":false,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"com.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"info.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"net.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"org.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"6bone.pl":true,"art.pl":true,"mbone.pl":true,"gov.pl":true,"uw.gov.pl":true,"um.gov.pl":true,"ug.gov.pl":true,"upow.gov.pl":true,"starostwo.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"po.gov.pl":true,"pa.gov.pl":true,"ngo.pl":true,"irc.pl":true,"usenet.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"siedlce.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"waw.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"*.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"mosreg.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"pskov.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"sshn.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"si":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"*.sv":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"*.tr":true,"nic.tr":false,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"ac.tz":true,"co.tz":true,"go.tz":true,"mil.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"chernigov.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"ks.ua":true,"kv.ua":true,"lg.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lviv.ua":true,"mk.ua":true,"nikolaev.ua":true,"od.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rovno.ua":true,"rv.ua":true,"sebastopol.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vn.ua":true,"zaporizhzhe.ua":true,"zp.ua":true,"zhitomir.ua":true,"zt.ua":true,"co.ua":true,"pp.ua":true,"ug":true,"co.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"or.ug":true,"*.uk":true,"*.sch.uk":true,"bl.uk":false,"british-library.uk":false,"icnet.uk":false,"jet.uk":false,"mod.uk":false,"nel.uk":false,"nhs.uk":false,"nic.uk":false,"nls.uk":false,"national-library-scotland.uk":false,"parliament.uk":false,"police.uk":false,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.nd.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.sd.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wv.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wv.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"*.uy":true,"uz":true,"com.uz":true,"co.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"*.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--54b7fta0cc":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--mgb9awbf":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"*.za":true,"*.zm":true,"*.zw":true,"biz.at":true,"info.at":true,"priv.at":true,"co.ca":true,"ar.com":true,"br.com":true,"cn.com":true,"de.com":true,"eu.com":true,"gb.com":true,"gr.com":true,"hu.com":true,"jpn.com":true,"kr.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"uk.com":true,"us.com":true,"uy.com":true,"za.com":true,"gb.net":true,"jp.net":true,"se.net":true,"uk.net":true,"ae.org":true,"us.org":true,"com.de":true,"operaunite.com":true,"appspot.com":true,"iki.fi":true,"c.la":true,"za.net":true,"za.org":true,"co.nl":true,"co.no":true,"co.pl":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true}); + +// END of automatically generated file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js new file mode 100644 index 0000000..f8433df --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js @@ -0,0 +1,37 @@ +'use strict'; +/*jshint unused:false */ + +function Store() { +} +exports.Store = Store; + +// Stores may be synchronous, but are still required to use a +// Continuation-Passing Style API. The CookieJar itself will expose a "*Sync" +// API that converts from synchronous-callbacks to imperative style. +Store.prototype.synchronous = false; + +Store.prototype.findCookie = function(domain, path, key, cb) { + throw new Error('findCookie is not implemented'); +}; + +Store.prototype.findCookies = function(domain, path, cb) { + throw new Error('findCookies is not implemented'); +}; + +Store.prototype.putCookie = function(cookie, cb) { + throw new Error('putCookie is not implemented'); +}; + +Store.prototype.updateCookie = function(oldCookie, newCookie, cb) { + // recommended default implementation: + // return this.putCookie(newCookie, cb); + throw new Error('updateCookie is not implemented'); +}; + +Store.prototype.removeCookie = function(domain, path, key, cb) { + throw new Error('removeCookie is not implemented'); +}; + +Store.prototype.removeCookies = function removeCookies(domain, path, cb) { + throw new Error('removeCookies is not implemented'); +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt new file mode 100644 index 0000000..97067e5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt @@ -0,0 +1,20 @@ +Copyright Mathias Bynens + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md new file mode 100644 index 0000000..577f2c7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md @@ -0,0 +1,176 @@ +# Punycode.js [![Build status](https://travis-ci.org/bestiejs/punycode.js.svg?branch=master)](https://travis-ci.org/bestiejs/punycode.js) [![Code coverage status](http://img.shields.io/coveralls/bestiejs/punycode.js/master.svg)](https://coveralls.io/r/bestiejs/punycode.js) [![Dependency status](https://gemnasium.com/bestiejs/punycode.js.svg)](https://gemnasium.com/bestiejs/punycode.js) + +A robust Punycode converter that fully complies to [RFC 3492](http://tools.ietf.org/html/rfc3492) and [RFC 5891](http://tools.ietf.org/html/rfc5891), and works on nearly all JavaScript platforms. + +This JavaScript library is the result of comparing, optimizing and documenting different open-source implementations of the Punycode algorithm: + +* [The C example code from RFC 3492](http://tools.ietf.org/html/rfc3492#appendix-C) +* [`punycode.c` by _Markus W. Scherer_ (IBM)](http://opensource.apple.com/source/ICU/ICU-400.42/icuSources/common/punycode.c) +* [`punycode.c` by _Ben Noordhuis_](https://github.com/bnoordhuis/punycode/blob/master/punycode.c) +* [JavaScript implementation by _some_](http://stackoverflow.com/questions/183485/can-anyone-recommend-a-good-free-javascript-for-punycode-to-unicode-conversion/301287#301287) +* [`punycode.js` by _Ben Noordhuis_](https://github.com/joyent/node/blob/426298c8c1c0d5b5224ac3658c41e7c2a3fe9377/lib/punycode.js) (note: [not fully compliant](https://github.com/joyent/node/issues/2072)) + +This project is [bundled](https://github.com/joyent/node/blob/master/lib/punycode.js) with [Node.js v0.6.2+](https://github.com/joyent/node/compare/975f1930b1...61e796decc). + +## Installation + +Via [npm](http://npmjs.org/) (only required for Node.js releases older than v0.6.2): + +```bash +npm install punycode +``` + +Via [Bower](http://bower.io/): + +```bash +bower install punycode +``` + +Via [Component](https://github.com/component/component): + +```bash +component install bestiejs/punycode.js +``` + +In a browser: + +```html + +``` + +In [Narwhal](http://narwhaljs.org/), [Node.js](http://nodejs.org/), and [RingoJS](http://ringojs.org/): + +```js +var punycode = require('punycode'); +``` + +In [Rhino](http://www.mozilla.org/rhino/): + +```js +load('punycode.js'); +``` + +Using an AMD loader like [RequireJS](http://requirejs.org/): + +```js +require( + { + 'paths': { + 'punycode': 'path/to/punycode' + } + }, + ['punycode'], + function(punycode) { + console.log(punycode); + } +); +``` + +## API + +### `punycode.decode(string)` + +Converts a Punycode string of ASCII symbols to a string of Unicode symbols. + +```js +// decode domain name parts +punycode.decode('maana-pta'); // 'mañana' +punycode.decode('--dqo34k'); // '☃-⌘' +``` + +### `punycode.encode(string)` + +Converts a string of Unicode symbols to a Punycode string of ASCII symbols. + +```js +// encode domain name parts +punycode.encode('mañana'); // 'maana-pta' +punycode.encode('☃-⌘'); // '--dqo34k' +``` + +### `punycode.toUnicode(input)` + +Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode. + +```js +// decode domain names +punycode.toUnicode('xn--maana-pta.com'); +// → 'mañana.com' +punycode.toUnicode('xn----dqo34k.com'); +// → '☃-⌘.com' + +// decode email addresses +punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'); +// → 'джумла@джpумлатест.bрфa' +``` + +### `punycode.toASCII(input)` + +Converts a Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that's already in ASCII. + +```js +// encode domain names +punycode.toASCII('mañana.com'); +// → 'xn--maana-pta.com' +punycode.toASCII('☃-⌘.com'); +// → 'xn----dqo34k.com' + +// encode email addresses +punycode.toASCII('джумла@джpумлатест.bрфa'); +// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq' +``` + +### `punycode.ucs2` + +#### `punycode.ucs2.decode(string)` + +Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](http://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16. + +```js +punycode.ucs2.decode('abc'); +// → [0x61, 0x62, 0x63] +// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE: +punycode.ucs2.decode('\uD834\uDF06'); +// → [0x1D306] +``` + +#### `punycode.ucs2.encode(codePoints)` + +Creates a string based on an array of numeric code point values. + +```js +punycode.ucs2.encode([0x61, 0x62, 0x63]); +// → 'abc' +punycode.ucs2.encode([0x1D306]); +// → '\uD834\uDF06' +``` + +### `punycode.version` + +A string representing the current Punycode.js version number. + +## Unit tests & code coverage + +After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`. + +Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`. + +To generate the code coverage report, use `grunt cover`. + +Feel free to fork if you see possible improvements! + +## Author + +| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | +|---| +| [Mathias Bynens](http://mathiasbynens.be/) | + +## Contributors + +| [![twitter/jdalton](https://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") | +|---| +| [John-David Dalton](http://allyoucanleet.com/) | + +## License + +Punycode.js is available under the [MIT](http://mths.be/mit) license. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json new file mode 100644 index 0000000..ab13fc8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json @@ -0,0 +1,87 @@ +{ + "name": "punycode", + "version": "1.3.1", + "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.", + "homepage": "http://mths.be/punycode", + "main": "punycode.js", + "keywords": [ + "punycode", + "unicode", + "idn", + "idna", + "dns", + "url", + "domain" + ], + "licenses": [ + { + "type": "MIT", + "url": "http://mths.be/mit" + } + ], + "author": { + "name": "Mathias Bynens", + "url": "http://mathiasbynens.be/" + }, + "contributors": [ + { + "name": "Mathias Bynens", + "url": "http://mathiasbynens.be/" + }, + { + "name": "John-David Dalton", + "url": "http://allyoucanleet.com/" + } + ], + "repository": { + "type": "git", + "url": "https://github.com/bestiejs/punycode.js.git" + }, + "bugs": { + "url": "https://github.com/bestiejs/punycode.js/issues" + }, + "files": [ + "LICENSE-MIT.txt", + "punycode.js" + ], + "directories": { + "test": "tests" + }, + "scripts": { + "test": "node tests/tests.js" + }, + "devDependencies": { + "coveralls": "^2.10.1", + "grunt": "^0.4.5", + "grunt-contrib-uglify": "^0.5.0", + "grunt-shell": "^0.7.0", + "istanbul": "^0.2.13", + "qunit-extras": "^1.2.0", + "qunitjs": "~1.11.0", + "requirejs": "^2.1.14" + }, + "_id": "punycode@1.3.1", + "_shasum": "710afe5123c20a1530b712e3e682b9118fe8058e", + "_from": "punycode@>=0.2.0", + "_npmVersion": "1.4.9", + "_npmUser": { + "name": "mathias", + "email": "mathias@qiwi.be" + }, + "maintainers": [ + { + "name": "mathias", + "email": "mathias@qiwi.be" + }, + { + "name": "reconbot", + "email": "wizard@roborooter.com" + } + ], + "dist": { + "shasum": "710afe5123c20a1530b712e3e682b9118fe8058e", + "tarball": "http://registry.npmjs.org/punycode/-/punycode-1.3.1.tgz" + }, + "_resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js new file mode 100644 index 0000000..6ab1df3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js @@ -0,0 +1,528 @@ +/*! http://mths.be/punycode v1.3.1 by @mathias */ +;(function(root) { + + /** Detect free variables */ + var freeExports = typeof exports == 'object' && exports && + !exports.nodeType && exports; + var freeModule = typeof module == 'object' && module && + !module.nodeType && module; + var freeGlobal = typeof global == 'object' && global; + if ( + freeGlobal.global === freeGlobal || + freeGlobal.window === freeGlobal || + freeGlobal.self === freeGlobal + ) { + root = freeGlobal; + } + + /** + * The `punycode` object. + * @name punycode + * @type Object + */ + var punycode, + + /** Highest positive signed 32-bit float value */ + maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 + + /** Bootstring parameters */ + base = 36, + tMin = 1, + tMax = 26, + skew = 38, + damp = 700, + initialBias = 72, + initialN = 128, // 0x80 + delimiter = '-', // '\x2D' + + /** Regular expressions */ + regexPunycode = /^xn--/, + regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars + regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators + + /** Error messages */ + errors = { + 'overflow': 'Overflow: input needs wider integers to process', + 'not-basic': 'Illegal input >= 0x80 (not a basic code point)', + 'invalid-input': 'Invalid input' + }, + + /** Convenience shortcuts */ + baseMinusTMin = base - tMin, + floor = Math.floor, + stringFromCharCode = String.fromCharCode, + + /** Temporary variable */ + key; + + /*--------------------------------------------------------------------------*/ + + /** + * A generic error utility function. + * @private + * @param {String} type The error type. + * @returns {Error} Throws a `RangeError` with the applicable error message. + */ + function error(type) { + throw RangeError(errors[type]); + } + + /** + * A generic `Array#map` utility function. + * @private + * @param {Array} array The array to iterate over. + * @param {Function} callback The function that gets called for every array + * item. + * @returns {Array} A new array of values returned by the callback function. + */ + function map(array, fn) { + var length = array.length; + var result = []; + while (length--) { + result[length] = fn(array[length]); + } + return result; + } + + /** + * A simple `Array#map`-like wrapper to work with domain name strings or email + * addresses. + * @private + * @param {String} domain The domain name or email address. + * @param {Function} callback The function that gets called for every + * character. + * @returns {Array} A new string of characters returned by the callback + * function. + */ + function mapDomain(string, fn) { + var parts = string.split('@'); + var result = ''; + if (parts.length > 1) { + // In email addresses, only the domain name should be punycoded. Leave + // the local part (i.e. everything up to `@`) intact. + result = parts[0] + '@'; + string = parts[1]; + } + var labels = string.split(regexSeparators); + var encoded = map(labels, fn).join('.'); + return result + encoded; + } + + /** + * Creates an array containing the numeric code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, + * this function will convert a pair of surrogate halves (each of which + * UCS-2 exposes as separate characters) into a single code point, + * matching UTF-16. + * @see `punycode.ucs2.encode` + * @see + * @memberOf punycode.ucs2 + * @name decode + * @param {String} string The Unicode input string (UCS-2). + * @returns {Array} The new array of code points. + */ + function ucs2decode(string) { + var output = [], + counter = 0, + length = string.length, + value, + extra; + while (counter < length) { + value = string.charCodeAt(counter++); + if (value >= 0xD800 && value <= 0xDBFF && counter < length) { + // high surrogate, and there is a next character + extra = string.charCodeAt(counter++); + if ((extra & 0xFC00) == 0xDC00) { // low surrogate + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); + } else { + // unmatched surrogate; only append this code unit, in case the next + // code unit is the high surrogate of a surrogate pair + output.push(value); + counter--; + } + } else { + output.push(value); + } + } + return output; + } + + /** + * Creates a string based on an array of numeric code points. + * @see `punycode.ucs2.decode` + * @memberOf punycode.ucs2 + * @name encode + * @param {Array} codePoints The array of numeric code points. + * @returns {String} The new Unicode string (UCS-2). + */ + function ucs2encode(array) { + return map(array, function(value) { + var output = ''; + if (value > 0xFFFF) { + value -= 0x10000; + output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); + value = 0xDC00 | value & 0x3FF; + } + output += stringFromCharCode(value); + return output; + }).join(''); + } + + /** + * Converts a basic code point into a digit/integer. + * @see `digitToBasic()` + * @private + * @param {Number} codePoint The basic numeric code point value. + * @returns {Number} The numeric value of a basic code point (for use in + * representing integers) in the range `0` to `base - 1`, or `base` if + * the code point does not represent a value. + */ + function basicToDigit(codePoint) { + if (codePoint - 48 < 10) { + return codePoint - 22; + } + if (codePoint - 65 < 26) { + return codePoint - 65; + } + if (codePoint - 97 < 26) { + return codePoint - 97; + } + return base; + } + + /** + * Converts a digit/integer into a basic code point. + * @see `basicToDigit()` + * @private + * @param {Number} digit The numeric value of a basic code point. + * @returns {Number} The basic code point whose value (when used for + * representing integers) is `digit`, which needs to be in the range + * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is + * used; else, the lowercase form is used. The behavior is undefined + * if `flag` is non-zero and `digit` has no uppercase form. + */ + function digitToBasic(digit, flag) { + // 0..25 map to ASCII a..z or A..Z + // 26..35 map to ASCII 0..9 + return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); + } + + /** + * Bias adaptation function as per section 3.4 of RFC 3492. + * http://tools.ietf.org/html/rfc3492#section-3.4 + * @private + */ + function adapt(delta, numPoints, firstTime) { + var k = 0; + delta = firstTime ? floor(delta / damp) : delta >> 1; + delta += floor(delta / numPoints); + for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { + delta = floor(delta / baseMinusTMin); + } + return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); + } + + /** + * Converts a Punycode string of ASCII-only symbols to a string of Unicode + * symbols. + * @memberOf punycode + * @param {String} input The Punycode string of ASCII-only symbols. + * @returns {String} The resulting string of Unicode symbols. + */ + function decode(input) { + // Don't use UCS-2 + var output = [], + inputLength = input.length, + out, + i = 0, + n = initialN, + bias = initialBias, + basic, + j, + index, + oldi, + w, + k, + digit, + t, + /** Cached calculation results */ + baseMinusT; + + // Handle the basic code points: let `basic` be the number of input code + // points before the last delimiter, or `0` if there is none, then copy + // the first basic code points to the output. + + basic = input.lastIndexOf(delimiter); + if (basic < 0) { + basic = 0; + } + + for (j = 0; j < basic; ++j) { + // if it's not a basic code point + if (input.charCodeAt(j) >= 0x80) { + error('not-basic'); + } + output.push(input.charCodeAt(j)); + } + + // Main decoding loop: start just after the last delimiter if any basic code + // points were copied; start at the beginning otherwise. + + for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { + + // `index` is the index of the next character to be consumed. + // Decode a generalized variable-length integer into `delta`, + // which gets added to `i`. The overflow checking is easier + // if we increase `i` as we go, then subtract off its starting + // value at the end to obtain `delta`. + for (oldi = i, w = 1, k = base; /* no condition */; k += base) { + + if (index >= inputLength) { + error('invalid-input'); + } + + digit = basicToDigit(input.charCodeAt(index++)); + + if (digit >= base || digit > floor((maxInt - i) / w)) { + error('overflow'); + } + + i += digit * w; + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + + if (digit < t) { + break; + } + + baseMinusT = base - t; + if (w > floor(maxInt / baseMinusT)) { + error('overflow'); + } + + w *= baseMinusT; + + } + + out = output.length + 1; + bias = adapt(i - oldi, out, oldi == 0); + + // `i` was supposed to wrap around from `out` to `0`, + // incrementing `n` each time, so we'll fix that now: + if (floor(i / out) > maxInt - n) { + error('overflow'); + } + + n += floor(i / out); + i %= out; + + // Insert `n` at position `i` of the output + output.splice(i++, 0, n); + + } + + return ucs2encode(output); + } + + /** + * Converts a string of Unicode symbols (e.g. a domain name label) to a + * Punycode string of ASCII-only symbols. + * @memberOf punycode + * @param {String} input The string of Unicode symbols. + * @returns {String} The resulting Punycode string of ASCII-only symbols. + */ + function encode(input) { + var n, + delta, + handledCPCount, + basicLength, + bias, + j, + m, + q, + k, + t, + currentValue, + output = [], + /** `inputLength` will hold the number of code points in `input`. */ + inputLength, + /** Cached calculation results */ + handledCPCountPlusOne, + baseMinusT, + qMinusT; + + // Convert the input in UCS-2 to Unicode + input = ucs2decode(input); + + // Cache the length + inputLength = input.length; + + // Initialize the state + n = initialN; + delta = 0; + bias = initialBias; + + // Handle the basic code points + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue < 0x80) { + output.push(stringFromCharCode(currentValue)); + } + } + + handledCPCount = basicLength = output.length; + + // `handledCPCount` is the number of code points that have been handled; + // `basicLength` is the number of basic code points. + + // Finish the basic string - if it is not empty - with a delimiter + if (basicLength) { + output.push(delimiter); + } + + // Main encoding loop: + while (handledCPCount < inputLength) { + + // All non-basic code points < n have been handled already. Find the next + // larger one: + for (m = maxInt, j = 0; j < inputLength; ++j) { + currentValue = input[j]; + if (currentValue >= n && currentValue < m) { + m = currentValue; + } + } + + // Increase `delta` enough to advance the decoder's state to , + // but guard against overflow + handledCPCountPlusOne = handledCPCount + 1; + if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { + error('overflow'); + } + + delta += (m - n) * handledCPCountPlusOne; + n = m; + + for (j = 0; j < inputLength; ++j) { + currentValue = input[j]; + + if (currentValue < n && ++delta > maxInt) { + error('overflow'); + } + + if (currentValue == n) { + // Represent delta as a generalized variable-length integer + for (q = delta, k = base; /* no condition */; k += base) { + t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); + if (q < t) { + break; + } + qMinusT = q - t; + baseMinusT = base - t; + output.push( + stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) + ); + q = floor(qMinusT / baseMinusT); + } + + output.push(stringFromCharCode(digitToBasic(q, 0))); + bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); + delta = 0; + ++handledCPCount; + } + } + + ++delta; + ++n; + + } + return output.join(''); + } + + /** + * Converts a Punycode string representing a domain name or an email address + * to Unicode. Only the Punycoded parts of the input will be converted, i.e. + * it doesn't matter if you call it on a string that has already been + * converted to Unicode. + * @memberOf punycode + * @param {String} input The Punycoded domain name or email address to + * convert to Unicode. + * @returns {String} The Unicode representation of the given Punycode + * string. + */ + function toUnicode(input) { + return mapDomain(input, function(string) { + return regexPunycode.test(string) + ? decode(string.slice(4).toLowerCase()) + : string; + }); + } + + /** + * Converts a Unicode string representing a domain name or an email address to + * Punycode. Only the non-ASCII parts of the domain name will be converted, + * i.e. it doesn't matter if you call it with a domain that's already in + * ASCII. + * @memberOf punycode + * @param {String} input The domain name or email address to convert, as a + * Unicode string. + * @returns {String} The Punycode representation of the given domain name or + * email address. + */ + function toASCII(input) { + return mapDomain(input, function(string) { + return regexNonASCII.test(string) + ? 'xn--' + encode(string) + : string; + }); + } + + /*--------------------------------------------------------------------------*/ + + /** Define the public API */ + punycode = { + /** + * A string representing the current Punycode.js version number. + * @memberOf punycode + * @type String + */ + 'version': '1.3.1', + /** + * An object of methods to convert from JavaScript's internal character + * representation (UCS-2) to Unicode code points, and back. + * @see + * @memberOf punycode + * @type Object + */ + 'ucs2': { + 'decode': ucs2decode, + 'encode': ucs2encode + }, + 'decode': decode, + 'encode': encode, + 'toASCII': toASCII, + 'toUnicode': toUnicode + }; + + /** Expose `punycode` */ + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define('punycode', function() { + return punycode; + }); + } else if (freeExports && freeModule) { + if (module.exports == freeExports) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = punycode; + } else { // in Narwhal or RingoJS v0.7.0- + for (key in punycode) { + punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]); + } + } + } else { // in Rhino or a web browser + root.punycode = punycode; + } + +}(this)); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json new file mode 100644 index 0000000..f4ede66 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json @@ -0,0 +1,67 @@ +{ + "author": { + "name": "GoInstant Inc., a salesforce.com company" + }, + "license": "MIT", + "name": "tough-cookie", + "description": "RFC6265 Cookies and Cookie Jar for node.js", + "keywords": [ + "HTTP", + "cookie", + "cookies", + "set-cookie", + "cookiejar", + "jar", + "RFC6265", + "RFC2965" + ], + "version": "0.12.1", + "homepage": "https://github.com/goinstant/tough-cookie", + "repository": { + "type": "git", + "url": "git://github.com/goinstant/tough-cookie.git" + }, + "bugs": { + "url": "https://github.com/goinstant/tough-cookie/issues" + }, + "main": "./lib/cookie", + "scripts": { + "test": "vows test.js" + }, + "engines": { + "node": ">=0.4.12" + }, + "dependencies": { + "punycode": ">=0.2.0" + }, + "devDependencies": { + "vows": "0.7.0", + "async": ">=0.1.12" + }, + "readme": "[RFC6265](http://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js\n\n![Tough Cookie](http://www.goinstant.com.s3.amazonaws.com/tough-cookie.jpg)\n\n[![Build Status](https://travis-ci.org/goinstant/node-cookie.png?branch=master)](https://travis-ci.org/goinstant/node-cookie)\n\n[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie)\n![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9)\n\n# Synopsis\n\n``` javascript\nvar tough = require('tough-cookie'); // note: not 'cookie', 'cookies' or 'node-cookie'\nvar Cookie = tough.Cookie;\nvar cookie = Cookie.parse(header);\ncookie.value = 'somethingdifferent';\nheader = cookie.toString();\n\nvar cookiejar = new tough.CookieJar();\ncookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb);\n// ...\ncookiejar.getCookies('http://example.com/otherpath',function(err,cookies) {\n res.headers['cookie'] = cookies.join('; ');\n});\n```\n\n# Installation\n\nIt's _so_ easy!\n\n`npm install tough-cookie`\n\nRequires `punycode`, which should get installed automatically for you. Note that node.js v0.6.2+ bundles punycode by default.\n\nWhy the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken.\n\n# API\n\ntough\n=====\n\nFunctions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be \"bound\".\n\nparseDate(string[,strict])\n-----------------\n\nParse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`. If strict is set to true then leading/trailing non-seperator characters around the time part will cause the parsing to fail (e.g. \"Thu, 01 Jan 1970 00:00:010 GMT\" has an extra trailing zero but Chrome, an assumedly RFC-compliant browser, treats this as valid).\n\nformatDate(date)\n----------------\n\nFormat a Date into a RFC1123 string (the RFC6265-recommended format).\n\ncanonicalDomain(str)\n--------------------\n\nTransforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects).\n\ndomainMatch(str,domStr[,canonicalize=true])\n-------------------------------------------\n\nAnswers \"does this real domain match the domain in a cookie?\". The `str` is the \"current\" domain-name and the `domStr` is the \"cookie\" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a \"suffix match\".\n\nThe `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not.\n\ndefaultPath(path)\n-----------------\n\nGiven a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the \"directory\" of a \"file\" in the path, but is specified by Section 5.1.4 of the RFC.\n\nThe `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output.\n\npathMatch(reqPath,cookiePath)\n-----------------------------\n\nAnswers \"does the request-path path-match a given cookie-path?\" as per RFC6265 Section 5.1.4. Returns a boolean.\n\nThis is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.\n\nparse(header[,strict=false])\n----------------------------\n\nalias for `Cookie.parse(header[,strict])`\n\nfromJSON(string)\n----------------\n\nalias for `Cookie.fromJSON(string)`\n\ngetPublicSuffix(hostname)\n-------------------------\n\nReturns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it.\n\nFor example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`.\n\nFor further information, see http://publicsuffix.org/. This module derives its list from that site.\n\ncookieCompare(a,b)\n------------------\n\nFor use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). Longest `.path`s go first, then sorted oldest to youngest.\n\n``` javascript\nvar cookies = [ /* unsorted array of Cookie objects */ ];\ncookies = cookies.sort(cookieCompare);\n```\n\npermuteDomain(domain)\n---------------------\n\nGenerates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores.\n\n\npermutePath(path)\n-----------------\n\nGenerates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores.\n\nCookie\n======\n\nCookie.parse(header[,strict=false])\n-----------------------------------\n\nParses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed. If in strict mode, returns `undefined` if the cookie doesn't follow the guidelines in section 4 of RFC6265. Generally speaking, strict mode can be used to validate your own generated Set-Cookie headers, but acting as a client you want to be lenient and leave strict mode off.\n\nHere's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:\n\n``` javascript\nif (res.headers['set-cookie'] instanceof Array)\n cookies = res.headers['set-cookie'].map(function (c) { return (Cookie.parse(c)); });\nelse\n cookies = [Cookie.parse(res.headers['set-cookie'])];\n```\n\nCookie.fromJSON(string)\n-----------------------\n\nConvert a JSON string to a `Cookie` object. Does a `JSON.parse()` and converts the `.created`, `.lastAccessed` and `.expires` properties into `Date` objects.\n\nProperties\n==========\n\n * _key_ - string - the name or key of the cookie (default \"\")\n * _value_ - string - the value of the cookie (default \"\")\n * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `\"Infinity\"`). See `setExpires()`\n * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `\"Infinity\"` and `\"-Infinity\"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()`\n * _domain_ - string - the `Domain=` attribute of the cookie\n * _path_ - string - the `Path=` of the cookie\n * _secure_ - boolean - the `Secure` cookie flag\n * _httpOnly_ - boolean - the `HttpOnly` cookie flag\n * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside)\n\nAfter a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes:\n\n * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied)\n * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one.\n * _created_ - `Date` - when this cookie was added to the jar\n * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute.\n\nConstruction([{options}])\n------------\n\nReceives an options object that can contain any Cookie properties, uses the default for unspecified properties.\n\n.toString()\n-----------\n\nencode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`.\n\n.cookieString()\n---------------\n\nencode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '=').\n\n.setExpires(String)\n-------------------\n\nsets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `\"Infinity\"` (a string) is set.\n\n.setMaxAge(number)\n-------------------\n\nsets the maxAge in seconds. Coerces `-Infinity` to `\"-Infinity\"` and `Infinity` to `\"Infinity\"` so it JSON serializes correctly.\n\n.expiryTime([now=Date.now()])\n-----------------------------\n\n.expiryDate([now=Date.now()])\n-----------------------------\n\nexpiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds.\n\nMax-Age takes precedence over Expires (as per the RFC). The `.created` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute.\n\nIf Expires (`.expires`) is set, that's returned.\n\nOtherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for \"Tue, 19 Jan 2038 03:14:07 GMT\" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents).\n\n.TTL([now=Date.now()])\n---------\n\ncompute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply.\n\nThe \"number\" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned.\n\n.canonicalizedDoman()\n---------------------\n\n.cdomain()\n----------\n\nreturn the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters.\n\n.validate()\n-----------\n\nStatus: *IN PROGRESS*. Works for a few things, but is by no means comprehensive.\n\nvalidates cookie attributes for semantic correctness. Useful for \"lint\" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct:\n\n``` javascript\nif (cookie.validate() === true) {\n // it's tasty\n} else {\n // yuck!\n}\n```\n\nCookieJar\n=========\n\nConstruction([store = new MemoryCookieStore()][, rejectPublicSuffixes])\n------------\n\nSimply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used.\n\n\nAttributes\n----------\n\n * _rejectPublicSuffixes_ - boolean - reject cookies with domains like \"com\" and \"co.uk\" (default: `true`)\n\nSince eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods.\n\n.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))\n-------------------------------------------------------------------\n\nAttempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.created`, `.lastAccessed` and `.hostOnly` properties.\n\nThe `options` object can be omitted and can have the following properties:\n\n * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies.\n * _secure_ - boolean - autodetect from url - indicates if this is a \"Secure\" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.\n * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies\n * _strict_ - boolean - default `false` - perform extra checks\n * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. CookieStore errors aren't ignored by this option.\n\nAs per the RFC, the `.hostOnly` property is set if there was no \"Domain=\" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual).\n\n.setCookieSync(cookieOrString, currentUrl, [{options}])\n-------------------------------------------------------\n\nSynchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.storeCookie(cookie, [{options},] cb(err,cookie))\n-------------------------------------------------\n\n__REMOVED__ removed in lieu of the CookieStore API below\n\n.getCookies(currentUrl, [{options},] cb(err,cookies))\n-----------------------------------------------------\n\nRetrieve the list of cookies that can be sent in a Cookie header for the current url.\n\nIf an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given.\n\nThe `options` object can be omitted and can have the following properties:\n\n * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies.\n * _secure_ - boolean - autodetect from url - indicates if this is a \"Secure\" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.\n * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies\n * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially).\n * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the CookieStore `fetchCookies` function (the default MemoryCookieStore supports it).\n\nThe `.lastAccessed` property of the returned cookies will have been updated.\n\n.getCookiesSync(currentUrl, [{options}])\n----------------------------------------\n\nSynchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.getCookieString(...)\n---------------------\n\nAccepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`.\n\n.getCookieStringSync(...)\n-------------------------\n\nSynchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\n.getSetCookieStrings(...)\n-------------------------\n\nReturns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`.\n\n.getSetCookieStringsSync(...)\n-----------------------------\n\nSynchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).\n\nStore\n=====\n\nBase class for CookieJar stores.\n\n# CookieStore API\n\nThe storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores.\n\nStores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`. Stores are asynchronous by default, but if `store.synchronous` is set, then the `*Sync` methods on the CookieJar can be used.\n\nAll `domain` parameters will have been normalized before calling.\n\nThe Cookie store must have all of the following methods.\n\nstore.findCookie(domain, path, key, cb(err,cookie))\n---------------------------------------------------\n\nRetrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned.\n\nCallback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error).\n\nstore.findCookies(domain, path, cb(err,cookies))\n------------------------------------------------\n\nLocates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above.\n\nIf no cookies are found, the callback MUST be passed an empty array.\n\nThe resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done.\n\nAs of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only).\n\nstore.putCookie(cookie, cb(err))\n--------------------------------\n\nAdds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur.\n\nThe `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties.\n\nPass an error if the cookie cannot be stored.\n\nstore.updateCookie(oldCookie, newCookie, cb(err))\n-------------------------------------------------\n\nUpdate an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store.\n\nThe `.lastAccessed` property will always be different between the two objects and `.created` will always be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are sorted (or selected for deletion).\n\nStores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object.\n\nThe `newCookie` and `oldCookie` objects MUST NOT be modified.\n\nPass an error if the newCookie cannot be stored.\n\nstore.removeCookie(domain, path, key, cb(err))\n----------------------------------------------\n\nRemove a cookie from the store (see notes on `findCookie` about the uniqueness constraint).\n\nThe implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie.\n\nstore.removeCookies(domain, path, cb(err))\n------------------------------------------\n\nRemoves matching cookies from the store. The `path` paramter is optional, and if missing means all paths in a domain should be removed.\n\nPass an error ONLY if removing any existing cookies failed.\n\n# TODO\n\n * _full_ RFC5890/RFC5891 canonicalization for domains in `cdomain()`\n * the optional `punycode` requirement implements RFC3492, but RFC6265 requires RFC5891\n * better tests for `validate()`?\n\n# Copyright and License\n\n(tl;dr: MIT with some MPL/1.1)\n\nCopyright 2012- GoInstant, Inc. and other contributors. All rights reserved.\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies 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\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n\nPortions may be licensed under different licenses (in particular public-suffix.txt is MPL/1.1); please read the LICENSE file for full details.\n", + "readmeFilename": "README.md", + "_id": "tough-cookie@0.12.1", + "dist": { + "shasum": "8220c7e21abd5b13d96804254bd5a81ebf2c7d62", + "tarball": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz" + }, + "_from": "tough-cookie@>=0.12.0", + "_npmVersion": "1.3.11", + "_npmUser": { + "name": "goinstant", + "email": "support@goinstant.com" + }, + "maintainers": [ + { + "name": "jstash", + "email": "jeremy@goinstant.com" + }, + { + "name": "goinstant", + "email": "services@goinstant.com" + } + ], + "directories": {}, + "_shasum": "8220c7e21abd5b13d96804254bd5a81ebf2c7d62", + "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/public-suffix.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/public-suffix.txt new file mode 100644 index 0000000..2c20131 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/public-suffix.txt @@ -0,0 +1,5229 @@ +// ***** BEGIN LICENSE BLOCK ***** +// Version: MPL 1.1/GPL 2.0/LGPL 2.1 +// +// The contents of this file are subject to the Mozilla Public License Version +// 1.1 (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// http://www.mozilla.org/MPL/ +// +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the +// License. +// +// The Original Code is the Public Suffix List. +// +// The Initial Developer of the Original Code is +// Jo Hermans . +// Portions created by the Initial Developer are Copyright (C) 2007 +// the Initial Developer. All Rights Reserved. +// +// Contributor(s): +// Ruben Arakelyan +// Gervase Markham +// Pamela Greene +// David Triendl +// Jothan Frakes +// The kind representatives of many TLD registries +// +// Alternatively, the contents of this file may be used under the terms of +// either the GNU General Public License Version 2 or later (the "GPL"), or +// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +// in which case the provisions of the GPL or the LGPL are applicable instead +// of those above. If you wish to allow use of your version of this file only +// under the terms of either the GPL or the LGPL, and not to allow others to +// use your version of this file under the terms of the MPL, indicate your +// decision by deleting the provisions above and replace them with the notice +// and other provisions required by the GPL or the LGPL. If you do not delete +// the provisions above, a recipient may use your version of this file under +// the terms of any one of the MPL, the GPL or the LGPL. +// +// ***** END LICENSE BLOCK ***** + +// ===BEGIN ICANN DOMAINS=== + +// ac : http://en.wikipedia.org/wiki/.ac +ac +com.ac +edu.ac +gov.ac +net.ac +mil.ac +org.ac + +// ad : http://en.wikipedia.org/wiki/.ad +ad +nom.ad + +// ae : http://en.wikipedia.org/wiki/.ae +// see also: "Domain Name Eligibility Policy" at http://www.aeda.ae/eng/aepolicy.php +ae +co.ae +net.ae +org.ae +sch.ae +ac.ae +gov.ae +mil.ae + +// aero : see http://www.information.aero/index.php?id=66 +aero +accident-investigation.aero +accident-prevention.aero +aerobatic.aero +aeroclub.aero +aerodrome.aero +agents.aero +aircraft.aero +airline.aero +airport.aero +air-surveillance.aero +airtraffic.aero +air-traffic-control.aero +ambulance.aero +amusement.aero +association.aero +author.aero +ballooning.aero +broker.aero +caa.aero +cargo.aero +catering.aero +certification.aero +championship.aero +charter.aero +civilaviation.aero +club.aero +conference.aero +consultant.aero +consulting.aero +control.aero +council.aero +crew.aero +design.aero +dgca.aero +educator.aero +emergency.aero +engine.aero +engineer.aero +entertainment.aero +equipment.aero +exchange.aero +express.aero +federation.aero +flight.aero +freight.aero +fuel.aero +gliding.aero +government.aero +groundhandling.aero +group.aero +hanggliding.aero +homebuilt.aero +insurance.aero +journal.aero +journalist.aero +leasing.aero +logistics.aero +magazine.aero +maintenance.aero +marketplace.aero +media.aero +microlight.aero +modelling.aero +navigation.aero +parachuting.aero +paragliding.aero +passenger-association.aero +pilot.aero +press.aero +production.aero +recreation.aero +repbody.aero +res.aero +research.aero +rotorcraft.aero +safety.aero +scientist.aero +services.aero +show.aero +skydiving.aero +software.aero +student.aero +taxi.aero +trader.aero +trading.aero +trainer.aero +union.aero +workinggroup.aero +works.aero + +// af : http://www.nic.af/help.jsp +af +gov.af +com.af +org.af +net.af +edu.af + +// ag : http://www.nic.ag/prices.htm +ag +com.ag +org.ag +net.ag +co.ag +nom.ag + +// ai : http://nic.com.ai/ +ai +off.ai +com.ai +net.ai +org.ai + +// al : http://www.ert.gov.al/ert_alb/faq_det.html?Id=31 +al +com.al +edu.al +gov.al +mil.al +net.al +org.al + +// am : http://en.wikipedia.org/wiki/.am +am + +// an : http://www.una.an/an_domreg/default.asp +an +com.an +net.an +org.an +edu.an + +// ao : http://en.wikipedia.org/wiki/.ao +// http://www.dns.ao/REGISTR.DOC +ao +ed.ao +gv.ao +og.ao +co.ao +pb.ao +it.ao + +// aq : http://en.wikipedia.org/wiki/.aq +aq + +// ar : http://en.wikipedia.org/wiki/.ar +*.ar +!congresodelalengua3.ar +!educ.ar +!gobiernoelectronico.ar +!mecon.ar +!nacion.ar +!nic.ar +!promocion.ar +!retina.ar +!uba.ar + +// arpa : http://en.wikipedia.org/wiki/.arpa +// Confirmed by registry 2008-06-18 +e164.arpa +in-addr.arpa +ip6.arpa +iris.arpa +uri.arpa +urn.arpa + +// as : http://en.wikipedia.org/wiki/.as +as +gov.as + +// asia : http://en.wikipedia.org/wiki/.asia +asia + +// at : http://en.wikipedia.org/wiki/.at +// Confirmed by registry 2008-06-17 +at +ac.at +co.at +gv.at +or.at + +// au : http://en.wikipedia.org/wiki/.au +// http://www.auda.org.au/ +// 2LDs +com.au +net.au +org.au +edu.au +gov.au +csiro.au +asn.au +id.au +// Historic 2LDs (closed to new registration, but sites still exist) +info.au +conf.au +oz.au +// CGDNs - http://www.cgdn.org.au/ +act.au +nsw.au +nt.au +qld.au +sa.au +tas.au +vic.au +wa.au +// 3LDs +act.edu.au +nsw.edu.au +nt.edu.au +qld.edu.au +sa.edu.au +tas.edu.au +vic.edu.au +wa.edu.au +act.gov.au +// Removed at request of Shae.Donelan@services.nsw.gov.au, 2010-03-04 +// nsw.gov.au +nt.gov.au +qld.gov.au +sa.gov.au +tas.gov.au +vic.gov.au +wa.gov.au + +// aw : http://en.wikipedia.org/wiki/.aw +aw +com.aw + +// ax : http://en.wikipedia.org/wiki/.ax +ax + +// az : http://en.wikipedia.org/wiki/.az +az +com.az +net.az +int.az +gov.az +org.az +edu.az +info.az +pp.az +mil.az +name.az +pro.az +biz.az + +// ba : http://en.wikipedia.org/wiki/.ba +ba +org.ba +net.ba +edu.ba +gov.ba +mil.ba +unsa.ba +unbi.ba +co.ba +com.ba +rs.ba + +// bb : http://en.wikipedia.org/wiki/.bb +bb +biz.bb +com.bb +edu.bb +gov.bb +info.bb +net.bb +org.bb +store.bb + +// bd : http://en.wikipedia.org/wiki/.bd +*.bd + +// be : http://en.wikipedia.org/wiki/.be +// Confirmed by registry 2008-06-08 +be +ac.be + +// bf : http://en.wikipedia.org/wiki/.bf +bf +gov.bf + +// bg : http://en.wikipedia.org/wiki/.bg +// https://www.register.bg/user/static/rules/en/index.html +bg +a.bg +b.bg +c.bg +d.bg +e.bg +f.bg +g.bg +h.bg +i.bg +j.bg +k.bg +l.bg +m.bg +n.bg +o.bg +p.bg +q.bg +r.bg +s.bg +t.bg +u.bg +v.bg +w.bg +x.bg +y.bg +z.bg +0.bg +1.bg +2.bg +3.bg +4.bg +5.bg +6.bg +7.bg +8.bg +9.bg + +// bh : http://en.wikipedia.org/wiki/.bh +bh +com.bh +edu.bh +net.bh +org.bh +gov.bh + +// bi : http://en.wikipedia.org/wiki/.bi +// http://whois.nic.bi/ +bi +co.bi +com.bi +edu.bi +or.bi +org.bi + +// biz : http://en.wikipedia.org/wiki/.biz +biz + +// bj : http://en.wikipedia.org/wiki/.bj +bj +asso.bj +barreau.bj +gouv.bj + +// bm : http://www.bermudanic.bm/dnr-text.txt +bm +com.bm +edu.bm +gov.bm +net.bm +org.bm + +// bn : http://en.wikipedia.org/wiki/.bn +*.bn + +// bo : http://www.nic.bo/ +bo +com.bo +edu.bo +gov.bo +gob.bo +int.bo +org.bo +net.bo +mil.bo +tv.bo + +// br : http://registro.br/dominio/dpn.html +// Updated by registry 2011-03-01 +br +adm.br +adv.br +agr.br +am.br +arq.br +art.br +ato.br +b.br +bio.br +blog.br +bmd.br +can.br +cim.br +cng.br +cnt.br +com.br +coop.br +ecn.br +edu.br +emp.br +eng.br +esp.br +etc.br +eti.br +far.br +flog.br +fm.br +fnd.br +fot.br +fst.br +g12.br +ggf.br +gov.br +imb.br +ind.br +inf.br +jor.br +jus.br +lel.br +mat.br +med.br +mil.br +mus.br +net.br +nom.br +not.br +ntr.br +odo.br +org.br +ppg.br +pro.br +psc.br +psi.br +qsl.br +radio.br +rec.br +slg.br +srv.br +taxi.br +teo.br +tmp.br +trd.br +tur.br +tv.br +vet.br +vlog.br +wiki.br +zlg.br + +// bs : http://www.nic.bs/rules.html +bs +com.bs +net.bs +org.bs +edu.bs +gov.bs + +// bt : http://en.wikipedia.org/wiki/.bt +bt +com.bt +edu.bt +gov.bt +net.bt +org.bt + +// bv : No registrations at this time. +// Submitted by registry 2006-06-16 + +// bw : http://en.wikipedia.org/wiki/.bw +// http://www.gobin.info/domainname/bw.doc +// list of other 2nd level tlds ? +bw +co.bw +org.bw + +// by : http://en.wikipedia.org/wiki/.by +// http://tld.by/rules_2006_en.html +// list of other 2nd level tlds ? +by +gov.by +mil.by +// Official information does not indicate that com.by is a reserved +// second-level domain, but it's being used as one (see www.google.com.by and +// www.yahoo.com.by, for example), so we list it here for safety's sake. +com.by + +// http://hoster.by/ +of.by + +// bz : http://en.wikipedia.org/wiki/.bz +// http://www.belizenic.bz/ +bz +com.bz +net.bz +org.bz +edu.bz +gov.bz + +// ca : http://en.wikipedia.org/wiki/.ca +ca +// ca geographical names +ab.ca +bc.ca +mb.ca +nb.ca +nf.ca +nl.ca +ns.ca +nt.ca +nu.ca +on.ca +pe.ca +qc.ca +sk.ca +yk.ca +// gc.ca: http://en.wikipedia.org/wiki/.gc.ca +// see also: http://registry.gc.ca/en/SubdomainFAQ +gc.ca + +// cat : http://en.wikipedia.org/wiki/.cat +cat + +// cc : http://en.wikipedia.org/wiki/.cc +cc + +// cd : http://en.wikipedia.org/wiki/.cd +// see also: https://www.nic.cd/domain/insertDomain_2.jsp?act=1 +cd +gov.cd + +// cf : http://en.wikipedia.org/wiki/.cf +cf + +// cg : http://en.wikipedia.org/wiki/.cg +cg + +// ch : http://en.wikipedia.org/wiki/.ch +ch + +// ci : http://en.wikipedia.org/wiki/.ci +// http://www.nic.ci/index.php?page=charte +ci +org.ci +or.ci +com.ci +co.ci +edu.ci +ed.ci +ac.ci +net.ci +go.ci +asso.ci +aéroport.ci +int.ci +presse.ci +md.ci +gouv.ci + +// ck : http://en.wikipedia.org/wiki/.ck +*.ck +!www.ck + +// cl : http://en.wikipedia.org/wiki/.cl +cl +gov.cl +gob.cl +co.cl +mil.cl + +// cm : http://en.wikipedia.org/wiki/.cm +cm +gov.cm + +// cn : http://en.wikipedia.org/wiki/.cn +// Submitted by registry 2008-06-11 +cn +ac.cn +com.cn +edu.cn +gov.cn +net.cn +org.cn +mil.cn +公司.cn +网络.cn +網絡.cn +// cn geographic names +ah.cn +bj.cn +cq.cn +fj.cn +gd.cn +gs.cn +gz.cn +gx.cn +ha.cn +hb.cn +he.cn +hi.cn +hl.cn +hn.cn +jl.cn +js.cn +jx.cn +ln.cn +nm.cn +nx.cn +qh.cn +sc.cn +sd.cn +sh.cn +sn.cn +sx.cn +tj.cn +xj.cn +xz.cn +yn.cn +zj.cn +hk.cn +mo.cn +tw.cn + +// co : http://en.wikipedia.org/wiki/.co +// Submitted by registry 2008-06-11 +co +arts.co +com.co +edu.co +firm.co +gov.co +info.co +int.co +mil.co +net.co +nom.co +org.co +rec.co +web.co + +// com : http://en.wikipedia.org/wiki/.com +com + +// coop : http://en.wikipedia.org/wiki/.coop +coop + +// cr : http://www.nic.cr/niccr_publico/showRegistroDominiosScreen.do +cr +ac.cr +co.cr +ed.cr +fi.cr +go.cr +or.cr +sa.cr + +// cu : http://en.wikipedia.org/wiki/.cu +cu +com.cu +edu.cu +org.cu +net.cu +gov.cu +inf.cu + +// cv : http://en.wikipedia.org/wiki/.cv +cv + +// cx : http://en.wikipedia.org/wiki/.cx +// list of other 2nd level tlds ? +cx +gov.cx + +// cy : http://en.wikipedia.org/wiki/.cy +*.cy + +// cz : http://en.wikipedia.org/wiki/.cz +cz + +// de : http://en.wikipedia.org/wiki/.de +// Confirmed by registry (with technical +// reservations) 2008-07-01 +de + +// dj : http://en.wikipedia.org/wiki/.dj +dj + +// dk : http://en.wikipedia.org/wiki/.dk +// Confirmed by registry 2008-06-17 +dk + +// dm : http://en.wikipedia.org/wiki/.dm +dm +com.dm +net.dm +org.dm +edu.dm +gov.dm + +// do : http://en.wikipedia.org/wiki/.do +do +art.do +com.do +edu.do +gob.do +gov.do +mil.do +net.do +org.do +sld.do +web.do + +// dz : http://en.wikipedia.org/wiki/.dz +dz +com.dz +org.dz +net.dz +gov.dz +edu.dz +asso.dz +pol.dz +art.dz + +// ec : http://www.nic.ec/reg/paso1.asp +// Submitted by registry 2008-07-04 +ec +com.ec +info.ec +net.ec +fin.ec +k12.ec +med.ec +pro.ec +org.ec +edu.ec +gov.ec +gob.ec +mil.ec + +// edu : http://en.wikipedia.org/wiki/.edu +edu + +// ee : http://www.eenet.ee/EENet/dom_reeglid.html#lisa_B +ee +edu.ee +gov.ee +riik.ee +lib.ee +med.ee +com.ee +pri.ee +aip.ee +org.ee +fie.ee + +// eg : http://en.wikipedia.org/wiki/.eg +eg +com.eg +edu.eg +eun.eg +gov.eg +mil.eg +name.eg +net.eg +org.eg +sci.eg + +// er : http://en.wikipedia.org/wiki/.er +*.er + +// es : https://www.nic.es/site_ingles/ingles/dominios/index.html +es +com.es +nom.es +org.es +gob.es +edu.es + +// et : http://en.wikipedia.org/wiki/.et +*.et + +// eu : http://en.wikipedia.org/wiki/.eu +eu + +// fi : http://en.wikipedia.org/wiki/.fi +fi +// aland.fi : http://en.wikipedia.org/wiki/.ax +// This domain is being phased out in favor of .ax. As there are still many +// domains under aland.fi, we still keep it on the list until aland.fi is +// completely removed. +// TODO: Check for updates (expected to be phased out around Q1/2009) +aland.fi + +// fj : http://en.wikipedia.org/wiki/.fj +*.fj + +// fk : http://en.wikipedia.org/wiki/.fk +*.fk + +// fm : http://en.wikipedia.org/wiki/.fm +fm + +// fo : http://en.wikipedia.org/wiki/.fo +fo + +// fr : http://www.afnic.fr/ +// domaines descriptifs : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-descriptifs +fr +com.fr +asso.fr +nom.fr +prd.fr +presse.fr +tm.fr +// domaines sectoriels : http://www.afnic.fr/obtenir/chartes/nommage-fr/annexe-sectoriels +aeroport.fr +assedic.fr +avocat.fr +avoues.fr +cci.fr +chambagri.fr +chirurgiens-dentistes.fr +experts-comptables.fr +geometre-expert.fr +gouv.fr +greta.fr +huissier-justice.fr +medecin.fr +notaires.fr +pharmacien.fr +port.fr +veterinaire.fr + +// ga : http://en.wikipedia.org/wiki/.ga +ga + +// gb : This registry is effectively dormant +// Submitted by registry 2008-06-12 + +// gd : http://en.wikipedia.org/wiki/.gd +gd + +// ge : http://www.nic.net.ge/policy_en.pdf +ge +com.ge +edu.ge +gov.ge +org.ge +mil.ge +net.ge +pvt.ge + +// gf : http://en.wikipedia.org/wiki/.gf +gf + +// gg : http://www.channelisles.net/applic/avextn.shtml +gg +co.gg +org.gg +net.gg +sch.gg +gov.gg + +// gh : http://en.wikipedia.org/wiki/.gh +// see also: http://www.nic.gh/reg_now.php +// Although domains directly at second level are not possible at the moment, +// they have been possible for some time and may come back. +gh +com.gh +edu.gh +gov.gh +org.gh +mil.gh + +// gi : http://www.nic.gi/rules.html +gi +com.gi +ltd.gi +gov.gi +mod.gi +edu.gi +org.gi + +// gl : http://en.wikipedia.org/wiki/.gl +// http://nic.gl +gl + +// gm : http://www.nic.gm/htmlpages%5Cgm-policy.htm +gm + +// gn : http://psg.com/dns/gn/gn.txt +// Submitted by registry 2008-06-17 +ac.gn +com.gn +edu.gn +gov.gn +org.gn +net.gn + +// gov : http://en.wikipedia.org/wiki/.gov +gov + +// gp : http://www.nic.gp/index.php?lang=en +gp +com.gp +net.gp +mobi.gp +edu.gp +org.gp +asso.gp + +// gq : http://en.wikipedia.org/wiki/.gq +gq + +// gr : https://grweb.ics.forth.gr/english/1617-B-2005.html +// Submitted by registry 2008-06-09 +gr +com.gr +edu.gr +net.gr +org.gr +gov.gr + +// gs : http://en.wikipedia.org/wiki/.gs +gs + +// gt : http://www.gt/politicas.html +*.gt +!www.gt + +// gu : http://gadao.gov.gu/registration.txt +*.gu + +// gw : http://en.wikipedia.org/wiki/.gw +gw + +// gy : http://en.wikipedia.org/wiki/.gy +// http://registry.gy/ +gy +co.gy +com.gy +net.gy + +// hk : https://www.hkdnr.hk +// Submitted by registry 2008-06-11 +hk +com.hk +edu.hk +gov.hk +idv.hk +net.hk +org.hk +公司.hk +教育.hk +敎育.hk +政府.hk +個人.hk +个人.hk +箇人.hk +網络.hk +网络.hk +组織.hk +網絡.hk +网絡.hk +组织.hk +組織.hk +組织.hk + +// hm : http://en.wikipedia.org/wiki/.hm +hm + +// hn : http://www.nic.hn/politicas/ps02,,05.html +hn +com.hn +edu.hn +org.hn +net.hn +mil.hn +gob.hn + +// hr : http://www.dns.hr/documents/pdf/HRTLD-regulations.pdf +hr +iz.hr +from.hr +name.hr +com.hr + +// ht : http://www.nic.ht/info/charte.cfm +ht +com.ht +shop.ht +firm.ht +info.ht +adult.ht +net.ht +pro.ht +org.ht +med.ht +art.ht +coop.ht +pol.ht +asso.ht +edu.ht +rel.ht +gouv.ht +perso.ht + +// hu : http://www.domain.hu/domain/English/sld.html +// Confirmed by registry 2008-06-12 +hu +co.hu +info.hu +org.hu +priv.hu +sport.hu +tm.hu +2000.hu +agrar.hu +bolt.hu +casino.hu +city.hu +erotica.hu +erotika.hu +film.hu +forum.hu +games.hu +hotel.hu +ingatlan.hu +jogasz.hu +konyvelo.hu +lakas.hu +media.hu +news.hu +reklam.hu +sex.hu +shop.hu +suli.hu +szex.hu +tozsde.hu +utazas.hu +video.hu + +// id : http://en.wikipedia.org/wiki/.id +// see also: https://register.pandi.or.id/ +id +ac.id +co.id +go.id +mil.id +net.id +or.id +sch.id +web.id + +// ie : http://en.wikipedia.org/wiki/.ie +ie +gov.ie + +// il : http://en.wikipedia.org/wiki/.il +*.il + +// im : https://www.nic.im/pdfs/imfaqs.pdf +im +co.im +ltd.co.im +plc.co.im +net.im +gov.im +org.im +nic.im +ac.im + +// in : http://en.wikipedia.org/wiki/.in +// see also: http://www.inregistry.in/policies/ +// Please note, that nic.in is not an offical eTLD, but used by most +// government institutions. +in +co.in +firm.in +net.in +org.in +gen.in +ind.in +nic.in +ac.in +edu.in +res.in +gov.in +mil.in + +// info : http://en.wikipedia.org/wiki/.info +info + +// int : http://en.wikipedia.org/wiki/.int +// Confirmed by registry 2008-06-18 +int +eu.int + +// io : http://www.nic.io/rules.html +// list of other 2nd level tlds ? +io +com.io + +// iq : http://www.cmc.iq/english/iq/iqregister1.htm +iq +gov.iq +edu.iq +mil.iq +com.iq +org.iq +net.iq + +// ir : http://www.nic.ir/Terms_and_Conditions_ir,_Appendix_1_Domain_Rules +// Also see http://www.nic.ir/Internationalized_Domain_Names +// Two .ir entries added at request of , 2010-04-16 +ir +ac.ir +co.ir +gov.ir +id.ir +net.ir +org.ir +sch.ir +// xn--mgba3a4f16a.ir (.ir, Persian YEH) +ایران.ir +// xn--mgba3a4fra.ir (.ir, Arabic YEH) +ايران.ir + +// is : http://www.isnic.is/domain/rules.php +// Confirmed by registry 2008-12-06 +is +net.is +com.is +edu.is +gov.is +org.is +int.is + +// it : http://en.wikipedia.org/wiki/.it +it +gov.it +edu.it +// list of reserved geo-names : +// http://www.nic.it/documenti/regolamenti-e-linee-guida/regolamento-assegnazione-versione-6.0.pdf +// (There is also a list of reserved geo-names corresponding to Italian +// municipalities : http://www.nic.it/documenti/appendice-c.pdf , but it is +// not included here.) +agrigento.it +ag.it +alessandria.it +al.it +ancona.it +an.it +aosta.it +aoste.it +ao.it +arezzo.it +ar.it +ascoli-piceno.it +ascolipiceno.it +ap.it +asti.it +at.it +avellino.it +av.it +bari.it +ba.it +andria-barletta-trani.it +andriabarlettatrani.it +trani-barletta-andria.it +tranibarlettaandria.it +barletta-trani-andria.it +barlettatraniandria.it +andria-trani-barletta.it +andriatranibarletta.it +trani-andria-barletta.it +traniandriabarletta.it +bt.it +belluno.it +bl.it +benevento.it +bn.it +bergamo.it +bg.it +biella.it +bi.it +bologna.it +bo.it +bolzano.it +bozen.it +balsan.it +alto-adige.it +altoadige.it +suedtirol.it +bz.it +brescia.it +bs.it +brindisi.it +br.it +cagliari.it +ca.it +caltanissetta.it +cl.it +campobasso.it +cb.it +carboniaiglesias.it +carbonia-iglesias.it +iglesias-carbonia.it +iglesiascarbonia.it +ci.it +caserta.it +ce.it +catania.it +ct.it +catanzaro.it +cz.it +chieti.it +ch.it +como.it +co.it +cosenza.it +cs.it +cremona.it +cr.it +crotone.it +kr.it +cuneo.it +cn.it +dell-ogliastra.it +dellogliastra.it +ogliastra.it +og.it +enna.it +en.it +ferrara.it +fe.it +fermo.it +fm.it +firenze.it +florence.it +fi.it +foggia.it +fg.it +forli-cesena.it +forlicesena.it +cesena-forli.it +cesenaforli.it +fc.it +frosinone.it +fr.it +genova.it +genoa.it +ge.it +gorizia.it +go.it +grosseto.it +gr.it +imperia.it +im.it +isernia.it +is.it +laquila.it +aquila.it +aq.it +la-spezia.it +laspezia.it +sp.it +latina.it +lt.it +lecce.it +le.it +lecco.it +lc.it +livorno.it +li.it +lodi.it +lo.it +lucca.it +lu.it +macerata.it +mc.it +mantova.it +mn.it +massa-carrara.it +massacarrara.it +carrara-massa.it +carraramassa.it +ms.it +matera.it +mt.it +medio-campidano.it +mediocampidano.it +campidano-medio.it +campidanomedio.it +vs.it +messina.it +me.it +milano.it +milan.it +mi.it +modena.it +mo.it +monza.it +monza-brianza.it +monzabrianza.it +monzaebrianza.it +monzaedellabrianza.it +monza-e-della-brianza.it +mb.it +napoli.it +naples.it +na.it +novara.it +no.it +nuoro.it +nu.it +oristano.it +or.it +padova.it +padua.it +pd.it +palermo.it +pa.it +parma.it +pr.it +pavia.it +pv.it +perugia.it +pg.it +pescara.it +pe.it +pesaro-urbino.it +pesarourbino.it +urbino-pesaro.it +urbinopesaro.it +pu.it +piacenza.it +pc.it +pisa.it +pi.it +pistoia.it +pt.it +pordenone.it +pn.it +potenza.it +pz.it +prato.it +po.it +ragusa.it +rg.it +ravenna.it +ra.it +reggio-calabria.it +reggiocalabria.it +rc.it +reggio-emilia.it +reggioemilia.it +re.it +rieti.it +ri.it +rimini.it +rn.it +roma.it +rome.it +rm.it +rovigo.it +ro.it +salerno.it +sa.it +sassari.it +ss.it +savona.it +sv.it +siena.it +si.it +siracusa.it +sr.it +sondrio.it +so.it +taranto.it +ta.it +tempio-olbia.it +tempioolbia.it +olbia-tempio.it +olbiatempio.it +ot.it +teramo.it +te.it +terni.it +tr.it +torino.it +turin.it +to.it +trapani.it +tp.it +trento.it +trentino.it +tn.it +treviso.it +tv.it +trieste.it +ts.it +udine.it +ud.it +varese.it +va.it +venezia.it +venice.it +ve.it +verbania.it +vb.it +vercelli.it +vc.it +verona.it +vr.it +vibo-valentia.it +vibovalentia.it +vv.it +vicenza.it +vi.it +viterbo.it +vt.it + +// je : http://www.channelisles.net/applic/avextn.shtml +je +co.je +org.je +net.je +sch.je +gov.je + +// jm : http://www.com.jm/register.html +*.jm + +// jo : http://www.dns.jo/Registration_policy.aspx +jo +com.jo +org.jo +net.jo +edu.jo +sch.jo +gov.jo +mil.jo +name.jo + +// jobs : http://en.wikipedia.org/wiki/.jobs +jobs + +// jp : http://en.wikipedia.org/wiki/.jp +// http://jprs.co.jp/en/jpdomain.html +// Submitted by registry 2008-06-11 +// Updated by registry 2008-12-04 +jp +// jp organizational type names +ac.jp +ad.jp +co.jp +ed.jp +go.jp +gr.jp +lg.jp +ne.jp +or.jp +// jp geographic type names +// http://jprs.jp/doc/rule/saisoku-1.html +*.aichi.jp +*.akita.jp +*.aomori.jp +*.chiba.jp +*.ehime.jp +*.fukui.jp +*.fukuoka.jp +*.fukushima.jp +*.gifu.jp +*.gunma.jp +*.hiroshima.jp +*.hokkaido.jp +*.hyogo.jp +*.ibaraki.jp +*.ishikawa.jp +*.iwate.jp +*.kagawa.jp +*.kagoshima.jp +*.kanagawa.jp +*.kawasaki.jp +*.kitakyushu.jp +*.kobe.jp +*.kochi.jp +*.kumamoto.jp +*.kyoto.jp +*.mie.jp +*.miyagi.jp +*.miyazaki.jp +*.nagano.jp +*.nagasaki.jp +*.nagoya.jp +*.nara.jp +*.niigata.jp +*.oita.jp +*.okayama.jp +*.okinawa.jp +*.osaka.jp +*.saga.jp +*.saitama.jp +*.sapporo.jp +*.sendai.jp +*.shiga.jp +*.shimane.jp +*.shizuoka.jp +*.tochigi.jp +*.tokushima.jp +*.tokyo.jp +*.tottori.jp +*.toyama.jp +*.wakayama.jp +*.yamagata.jp +*.yamaguchi.jp +*.yamanashi.jp +*.yokohama.jp +!metro.tokyo.jp +!pref.aichi.jp +!pref.akita.jp +!pref.aomori.jp +!pref.chiba.jp +!pref.ehime.jp +!pref.fukui.jp +!pref.fukuoka.jp +!pref.fukushima.jp +!pref.gifu.jp +!pref.gunma.jp +!pref.hiroshima.jp +!pref.hokkaido.jp +!pref.hyogo.jp +!pref.ibaraki.jp +!pref.ishikawa.jp +!pref.iwate.jp +!pref.kagawa.jp +!pref.kagoshima.jp +!pref.kanagawa.jp +!pref.kochi.jp +!pref.kumamoto.jp +!pref.kyoto.jp +!pref.mie.jp +!pref.miyagi.jp +!pref.miyazaki.jp +!pref.nagano.jp +!pref.nagasaki.jp +!pref.nara.jp +!pref.niigata.jp +!pref.oita.jp +!pref.okayama.jp +!pref.okinawa.jp +!pref.osaka.jp +!pref.saga.jp +!pref.saitama.jp +!pref.shiga.jp +!pref.shimane.jp +!pref.shizuoka.jp +!pref.tochigi.jp +!pref.tokushima.jp +!pref.tottori.jp +!pref.toyama.jp +!pref.wakayama.jp +!pref.yamagata.jp +!pref.yamaguchi.jp +!pref.yamanashi.jp +!city.chiba.jp +!city.fukuoka.jp +!city.hiroshima.jp +!city.kawasaki.jp +!city.kitakyushu.jp +!city.kobe.jp +!city.kyoto.jp +!city.nagoya.jp +!city.niigata.jp +!city.okayama.jp +!city.osaka.jp +!city.saitama.jp +!city.sapporo.jp +!city.sendai.jp +!city.shizuoka.jp +!city.yokohama.jp + +// ke : http://www.kenic.or.ke/index.php?option=com_content&task=view&id=117&Itemid=145 +*.ke + +// kg : http://www.domain.kg/dmn_n.html +kg +org.kg +net.kg +com.kg +edu.kg +gov.kg +mil.kg + +// kh : http://www.mptc.gov.kh/dns_registration.htm +*.kh + +// ki : http://www.ki/dns/index.html +ki +edu.ki +biz.ki +net.ki +org.ki +gov.ki +info.ki +com.ki + +// km : http://en.wikipedia.org/wiki/.km +// http://www.domaine.km/documents/charte.doc +km +org.km +nom.km +gov.km +prd.km +tm.km +edu.km +mil.km +ass.km +com.km +// These are only mentioned as proposed suggestions at domaine.km, but +// http://en.wikipedia.org/wiki/.km says they're available for registration: +coop.km +asso.km +presse.km +medecin.km +notaires.km +pharmaciens.km +veterinaire.km +gouv.km + +// kn : http://en.wikipedia.org/wiki/.kn +// http://www.dot.kn/domainRules.html +kn +net.kn +org.kn +edu.kn +gov.kn + +// kp : http://www.kcce.kp/en_index.php +com.kp +edu.kp +gov.kp +org.kp +rep.kp +tra.kp + +// kr : http://en.wikipedia.org/wiki/.kr +// see also: http://domain.nida.or.kr/eng/registration.jsp +kr +ac.kr +co.kr +es.kr +go.kr +hs.kr +kg.kr +mil.kr +ms.kr +ne.kr +or.kr +pe.kr +re.kr +sc.kr +// kr geographical names +busan.kr +chungbuk.kr +chungnam.kr +daegu.kr +daejeon.kr +gangwon.kr +gwangju.kr +gyeongbuk.kr +gyeonggi.kr +gyeongnam.kr +incheon.kr +jeju.kr +jeonbuk.kr +jeonnam.kr +seoul.kr +ulsan.kr + +// kw : http://en.wikipedia.org/wiki/.kw +*.kw + +// ky : http://www.icta.ky/da_ky_reg_dom.php +// Confirmed by registry 2008-06-17 +ky +edu.ky +gov.ky +com.ky +org.ky +net.ky + +// kz : http://en.wikipedia.org/wiki/.kz +// see also: http://www.nic.kz/rules/index.jsp +kz +org.kz +edu.kz +net.kz +gov.kz +mil.kz +com.kz + +// la : http://en.wikipedia.org/wiki/.la +// Submitted by registry 2008-06-10 +la +int.la +net.la +info.la +edu.la +gov.la +per.la +com.la +org.la + +// lb : http://en.wikipedia.org/wiki/.lb +// Submitted by registry 2008-06-17 +com.lb +edu.lb +gov.lb +net.lb +org.lb + +// lc : http://en.wikipedia.org/wiki/.lc +// see also: http://www.nic.lc/rules.htm +lc +com.lc +net.lc +co.lc +org.lc +edu.lc +gov.lc + +// li : http://en.wikipedia.org/wiki/.li +li + +// lk : http://www.nic.lk/seclevpr.html +lk +gov.lk +sch.lk +net.lk +int.lk +com.lk +org.lk +edu.lk +ngo.lk +soc.lk +web.lk +ltd.lk +assn.lk +grp.lk +hotel.lk + +// lr : http://psg.com/dns/lr/lr.txt +// Submitted by registry 2008-06-17 +com.lr +edu.lr +gov.lr +org.lr +net.lr + +// ls : http://en.wikipedia.org/wiki/.ls +ls +co.ls +org.ls + +// lt : http://en.wikipedia.org/wiki/.lt +lt +// gov.lt : http://www.gov.lt/index_en.php +gov.lt + +// lu : http://www.dns.lu/en/ +lu + +// lv : http://www.nic.lv/DNS/En/generic.php +lv +com.lv +edu.lv +gov.lv +org.lv +mil.lv +id.lv +net.lv +asn.lv +conf.lv + +// ly : http://www.nic.ly/regulations.php +ly +com.ly +net.ly +gov.ly +plc.ly +edu.ly +sch.ly +med.ly +org.ly +id.ly + +// ma : http://en.wikipedia.org/wiki/.ma +// http://www.anrt.ma/fr/admin/download/upload/file_fr782.pdf +ma +co.ma +net.ma +gov.ma +org.ma +ac.ma +press.ma + +// mc : http://www.nic.mc/ +mc +tm.mc +asso.mc + +// md : http://en.wikipedia.org/wiki/.md +md + +// me : http://en.wikipedia.org/wiki/.me +me +co.me +net.me +org.me +edu.me +ac.me +gov.me +its.me +priv.me + +// mg : http://www.nic.mg/tarif.htm +mg +org.mg +nom.mg +gov.mg +prd.mg +tm.mg +edu.mg +mil.mg +com.mg + +// mh : http://en.wikipedia.org/wiki/.mh +mh + +// mil : http://en.wikipedia.org/wiki/.mil +mil + +// mk : http://en.wikipedia.org/wiki/.mk +// see also: http://dns.marnet.net.mk/postapka.php +mk +com.mk +org.mk +net.mk +edu.mk +gov.mk +inf.mk +name.mk + +// ml : http://www.gobin.info/domainname/ml-template.doc +// see also: http://en.wikipedia.org/wiki/.ml +ml +com.ml +edu.ml +gouv.ml +gov.ml +net.ml +org.ml +presse.ml + +// mm : http://en.wikipedia.org/wiki/.mm +*.mm + +// mn : http://en.wikipedia.org/wiki/.mn +mn +gov.mn +edu.mn +org.mn + +// mo : http://www.monic.net.mo/ +mo +com.mo +net.mo +org.mo +edu.mo +gov.mo + +// mobi : http://en.wikipedia.org/wiki/.mobi +mobi + +// mp : http://www.dot.mp/ +// Confirmed by registry 2008-06-17 +mp + +// mq : http://en.wikipedia.org/wiki/.mq +mq + +// mr : http://en.wikipedia.org/wiki/.mr +mr +gov.mr + +// ms : http://en.wikipedia.org/wiki/.ms +ms + +// mt : https://www.nic.org.mt/dotmt/ +*.mt + +// mu : http://en.wikipedia.org/wiki/.mu +mu +com.mu +net.mu +org.mu +gov.mu +ac.mu +co.mu +or.mu + +// museum : http://about.museum/naming/ +// http://index.museum/ +museum +academy.museum +agriculture.museum +air.museum +airguard.museum +alabama.museum +alaska.museum +amber.museum +ambulance.museum +american.museum +americana.museum +americanantiques.museum +americanart.museum +amsterdam.museum +and.museum +annefrank.museum +anthro.museum +anthropology.museum +antiques.museum +aquarium.museum +arboretum.museum +archaeological.museum +archaeology.museum +architecture.museum +art.museum +artanddesign.museum +artcenter.museum +artdeco.museum +arteducation.museum +artgallery.museum +arts.museum +artsandcrafts.museum +asmatart.museum +assassination.museum +assisi.museum +association.museum +astronomy.museum +atlanta.museum +austin.museum +australia.museum +automotive.museum +aviation.museum +axis.museum +badajoz.museum +baghdad.museum +bahn.museum +bale.museum +baltimore.museum +barcelona.museum +baseball.museum +basel.museum +baths.museum +bauern.museum +beauxarts.museum +beeldengeluid.museum +bellevue.museum +bergbau.museum +berkeley.museum +berlin.museum +bern.museum +bible.museum +bilbao.museum +bill.museum +birdart.museum +birthplace.museum +bonn.museum +boston.museum +botanical.museum +botanicalgarden.museum +botanicgarden.museum +botany.museum +brandywinevalley.museum +brasil.museum +bristol.museum +british.museum +britishcolumbia.museum +broadcast.museum +brunel.museum +brussel.museum +brussels.museum +bruxelles.museum +building.museum +burghof.museum +bus.museum +bushey.museum +cadaques.museum +california.museum +cambridge.museum +can.museum +canada.museum +capebreton.museum +carrier.museum +cartoonart.museum +casadelamoneda.museum +castle.museum +castres.museum +celtic.museum +center.museum +chattanooga.museum +cheltenham.museum +chesapeakebay.museum +chicago.museum +children.museum +childrens.museum +childrensgarden.museum +chiropractic.museum +chocolate.museum +christiansburg.museum +cincinnati.museum +cinema.museum +circus.museum +civilisation.museum +civilization.museum +civilwar.museum +clinton.museum +clock.museum +coal.museum +coastaldefence.museum +cody.museum +coldwar.museum +collection.museum +colonialwilliamsburg.museum +coloradoplateau.museum +columbia.museum +columbus.museum +communication.museum +communications.museum +community.museum +computer.museum +computerhistory.museum +comunicações.museum +contemporary.museum +contemporaryart.museum +convent.museum +copenhagen.museum +corporation.museum +correios-e-telecomunicações.museum +corvette.museum +costume.museum +countryestate.museum +county.museum +crafts.museum +cranbrook.museum +creation.museum +cultural.museum +culturalcenter.museum +culture.museum +cyber.museum +cymru.museum +dali.museum +dallas.museum +database.museum +ddr.museum +decorativearts.museum +delaware.museum +delmenhorst.museum +denmark.museum +depot.museum +design.museum +detroit.museum +dinosaur.museum +discovery.museum +dolls.museum +donostia.museum +durham.museum +eastafrica.museum +eastcoast.museum +education.museum +educational.museum +egyptian.museum +eisenbahn.museum +elburg.museum +elvendrell.museum +embroidery.museum +encyclopedic.museum +england.museum +entomology.museum +environment.museum +environmentalconservation.museum +epilepsy.museum +essex.museum +estate.museum +ethnology.museum +exeter.museum +exhibition.museum +family.museum +farm.museum +farmequipment.museum +farmers.museum +farmstead.museum +field.museum +figueres.museum +filatelia.museum +film.museum +fineart.museum +finearts.museum +finland.museum +flanders.museum +florida.museum +force.museum +fortmissoula.museum +fortworth.museum +foundation.museum +francaise.museum +frankfurt.museum +franziskaner.museum +freemasonry.museum +freiburg.museum +fribourg.museum +frog.museum +fundacio.museum +furniture.museum +gallery.museum +garden.museum +gateway.museum +geelvinck.museum +gemological.museum +geology.museum +georgia.museum +giessen.museum +glas.museum +glass.museum +gorge.museum +grandrapids.museum +graz.museum +guernsey.museum +halloffame.museum +hamburg.museum +handson.museum +harvestcelebration.museum +hawaii.museum +health.museum +heimatunduhren.museum +hellas.museum +helsinki.museum +hembygdsforbund.museum +heritage.museum +histoire.museum +historical.museum +historicalsociety.museum +historichouses.museum +historisch.museum +historisches.museum +history.museum +historyofscience.museum +horology.museum +house.museum +humanities.museum +illustration.museum +imageandsound.museum +indian.museum +indiana.museum +indianapolis.museum +indianmarket.museum +intelligence.museum +interactive.museum +iraq.museum +iron.museum +isleofman.museum +jamison.museum +jefferson.museum +jerusalem.museum +jewelry.museum +jewish.museum +jewishart.museum +jfk.museum +journalism.museum +judaica.museum +judygarland.museum +juedisches.museum +juif.museum +karate.museum +karikatur.museum +kids.museum +koebenhavn.museum +koeln.museum +kunst.museum +kunstsammlung.museum +kunstunddesign.museum +labor.museum +labour.museum +lajolla.museum +lancashire.museum +landes.museum +lans.museum +läns.museum +larsson.museum +lewismiller.museum +lincoln.museum +linz.museum +living.museum +livinghistory.museum +localhistory.museum +london.museum +losangeles.museum +louvre.museum +loyalist.museum +lucerne.museum +luxembourg.museum +luzern.museum +mad.museum +madrid.museum +mallorca.museum +manchester.museum +mansion.museum +mansions.museum +manx.museum +marburg.museum +maritime.museum +maritimo.museum +maryland.museum +marylhurst.museum +media.museum +medical.museum +medizinhistorisches.museum +meeres.museum +memorial.museum +mesaverde.museum +michigan.museum +midatlantic.museum +military.museum +mill.museum +miners.museum +mining.museum +minnesota.museum +missile.museum +missoula.museum +modern.museum +moma.museum +money.museum +monmouth.museum +monticello.museum +montreal.museum +moscow.museum +motorcycle.museum +muenchen.museum +muenster.museum +mulhouse.museum +muncie.museum +museet.museum +museumcenter.museum +museumvereniging.museum +music.museum +national.museum +nationalfirearms.museum +nationalheritage.museum +nativeamerican.museum +naturalhistory.museum +naturalhistorymuseum.museum +naturalsciences.museum +nature.museum +naturhistorisches.museum +natuurwetenschappen.museum +naumburg.museum +naval.museum +nebraska.museum +neues.museum +newhampshire.museum +newjersey.museum +newmexico.museum +newport.museum +newspaper.museum +newyork.museum +niepce.museum +norfolk.museum +north.museum +nrw.museum +nuernberg.museum +nuremberg.museum +nyc.museum +nyny.museum +oceanographic.museum +oceanographique.museum +omaha.museum +online.museum +ontario.museum +openair.museum +oregon.museum +oregontrail.museum +otago.museum +oxford.museum +pacific.museum +paderborn.museum +palace.museum +paleo.museum +palmsprings.museum +panama.museum +paris.museum +pasadena.museum +pharmacy.museum +philadelphia.museum +philadelphiaarea.museum +philately.museum +phoenix.museum +photography.museum +pilots.museum +pittsburgh.museum +planetarium.museum +plantation.museum +plants.museum +plaza.museum +portal.museum +portland.museum +portlligat.museum +posts-and-telecommunications.museum +preservation.museum +presidio.museum +press.museum +project.museum +public.museum +pubol.museum +quebec.museum +railroad.museum +railway.museum +research.museum +resistance.museum +riodejaneiro.museum +rochester.museum +rockart.museum +roma.museum +russia.museum +saintlouis.museum +salem.museum +salvadordali.museum +salzburg.museum +sandiego.museum +sanfrancisco.museum +santabarbara.museum +santacruz.museum +santafe.museum +saskatchewan.museum +satx.museum +savannahga.museum +schlesisches.museum +schoenbrunn.museum +schokoladen.museum +school.museum +schweiz.museum +science.museum +scienceandhistory.museum +scienceandindustry.museum +sciencecenter.museum +sciencecenters.museum +science-fiction.museum +sciencehistory.museum +sciences.museum +sciencesnaturelles.museum +scotland.museum +seaport.museum +settlement.museum +settlers.museum +shell.museum +sherbrooke.museum +sibenik.museum +silk.museum +ski.museum +skole.museum +society.museum +sologne.museum +soundandvision.museum +southcarolina.museum +southwest.museum +space.museum +spy.museum +square.museum +stadt.museum +stalbans.museum +starnberg.museum +state.museum +stateofdelaware.museum +station.museum +steam.museum +steiermark.museum +stjohn.museum +stockholm.museum +stpetersburg.museum +stuttgart.museum +suisse.museum +surgeonshall.museum +surrey.museum +svizzera.museum +sweden.museum +sydney.museum +tank.museum +tcm.museum +technology.museum +telekommunikation.museum +television.museum +texas.museum +textile.museum +theater.museum +time.museum +timekeeping.museum +topology.museum +torino.museum +touch.museum +town.museum +transport.museum +tree.museum +trolley.museum +trust.museum +trustee.museum +uhren.museum +ulm.museum +undersea.museum +university.museum +usa.museum +usantiques.museum +usarts.museum +uscountryestate.museum +usculture.museum +usdecorativearts.museum +usgarden.museum +ushistory.museum +ushuaia.museum +uslivinghistory.museum +utah.museum +uvic.museum +valley.museum +vantaa.museum +versailles.museum +viking.museum +village.museum +virginia.museum +virtual.museum +virtuel.museum +vlaanderen.museum +volkenkunde.museum +wales.museum +wallonie.museum +war.museum +washingtondc.museum +watchandclock.museum +watch-and-clock.museum +western.museum +westfalen.museum +whaling.museum +wildlife.museum +williamsburg.museum +windmill.museum +workshop.museum +york.museum +yorkshire.museum +yosemite.museum +youth.museum +zoological.museum +zoology.museum +ירושלים.museum +иком.museum + +// mv : http://en.wikipedia.org/wiki/.mv +// "mv" included because, contra Wikipedia, google.mv exists. +mv +aero.mv +biz.mv +com.mv +coop.mv +edu.mv +gov.mv +info.mv +int.mv +mil.mv +museum.mv +name.mv +net.mv +org.mv +pro.mv + +// mw : http://www.registrar.mw/ +mw +ac.mw +biz.mw +co.mw +com.mw +coop.mw +edu.mw +gov.mw +int.mw +museum.mw +net.mw +org.mw + +// mx : http://www.nic.mx/ +// Submitted by registry 2008-06-19 +mx +com.mx +org.mx +gob.mx +edu.mx +net.mx + +// my : http://www.mynic.net.my/ +my +com.my +net.my +org.my +gov.my +edu.my +mil.my +name.my + +// mz : http://www.gobin.info/domainname/mz-template.doc +*.mz + +// na : http://www.na-nic.com.na/ +// http://www.info.na/domain/ +na +info.na +pro.na +name.na +school.na +or.na +dr.na +us.na +mx.na +ca.na +in.na +cc.na +tv.na +ws.na +mobi.na +co.na +com.na +org.na + +// name : has 2nd-level tlds, but there's no list of them +name + +// nc : http://www.cctld.nc/ +nc +asso.nc + +// ne : http://en.wikipedia.org/wiki/.ne +ne + +// net : http://en.wikipedia.org/wiki/.net +net + +// nf : http://en.wikipedia.org/wiki/.nf +nf +com.nf +net.nf +per.nf +rec.nf +web.nf +arts.nf +firm.nf +info.nf +other.nf +store.nf + +// ng : http://psg.com/dns/ng/ +// Submitted by registry 2008-06-17 +ac.ng +com.ng +edu.ng +gov.ng +net.ng +org.ng + +// ni : http://www.nic.ni/dominios.htm +*.ni + +// nl : http://www.domain-registry.nl/ace.php/c,728,122,,,,Home.html +// Confirmed by registry (with technical +// reservations) 2008-06-08 +nl + +// BV.nl will be a registry for dutch BV's (besloten vennootschap) +bv.nl + +// no : http://www.norid.no/regelverk/index.en.html +// The Norwegian registry has declined to notify us of updates. The web pages +// referenced below are the official source of the data. There is also an +// announce mailing list: +// https://postlister.uninett.no/sympa/info/norid-diskusjon +no +// Norid generic domains : http://www.norid.no/regelverk/vedlegg-c.en.html +fhs.no +vgs.no +fylkesbibl.no +folkebibl.no +museum.no +idrett.no +priv.no +// Non-Norid generic domains : http://www.norid.no/regelverk/vedlegg-d.en.html +mil.no +stat.no +dep.no +kommune.no +herad.no +// no geographical names : http://www.norid.no/regelverk/vedlegg-b.en.html +// counties +aa.no +ah.no +bu.no +fm.no +hl.no +hm.no +jan-mayen.no +mr.no +nl.no +nt.no +of.no +ol.no +oslo.no +rl.no +sf.no +st.no +svalbard.no +tm.no +tr.no +va.no +vf.no +// primary and lower secondary schools per county +gs.aa.no +gs.ah.no +gs.bu.no +gs.fm.no +gs.hl.no +gs.hm.no +gs.jan-mayen.no +gs.mr.no +gs.nl.no +gs.nt.no +gs.of.no +gs.ol.no +gs.oslo.no +gs.rl.no +gs.sf.no +gs.st.no +gs.svalbard.no +gs.tm.no +gs.tr.no +gs.va.no +gs.vf.no +// cities +akrehamn.no +åkrehamn.no +algard.no +ålgård.no +arna.no +brumunddal.no +bryne.no +bronnoysund.no +brønnøysund.no +drobak.no +drøbak.no +egersund.no +fetsund.no +floro.no +florø.no +fredrikstad.no +hokksund.no +honefoss.no +hønefoss.no +jessheim.no +jorpeland.no +jørpeland.no +kirkenes.no +kopervik.no +krokstadelva.no +langevag.no +langevåg.no +leirvik.no +mjondalen.no +mjøndalen.no +mo-i-rana.no +mosjoen.no +mosjøen.no +nesoddtangen.no +orkanger.no +osoyro.no +osøyro.no +raholt.no +råholt.no +sandnessjoen.no +sandnessjøen.no +skedsmokorset.no +slattum.no +spjelkavik.no +stathelle.no +stavern.no +stjordalshalsen.no +stjørdalshalsen.no +tananger.no +tranby.no +vossevangen.no +// communities +afjord.no +åfjord.no +agdenes.no +al.no +ål.no +alesund.no +ålesund.no +alstahaug.no +alta.no +áltá.no +alaheadju.no +álaheadju.no +alvdal.no +amli.no +åmli.no +amot.no +åmot.no +andebu.no +andoy.no +andøy.no +andasuolo.no +ardal.no +årdal.no +aremark.no +arendal.no +ås.no +aseral.no +åseral.no +asker.no +askim.no +askvoll.no +askoy.no +askøy.no +asnes.no +åsnes.no +audnedaln.no +aukra.no +aure.no +aurland.no +aurskog-holand.no +aurskog-høland.no +austevoll.no +austrheim.no +averoy.no +averøy.no +balestrand.no +ballangen.no +balat.no +bálát.no +balsfjord.no +bahccavuotna.no +báhccavuotna.no +bamble.no +bardu.no +beardu.no +beiarn.no +bajddar.no +bájddar.no +baidar.no +báidár.no +berg.no +bergen.no +berlevag.no +berlevåg.no +bearalvahki.no +bearalváhki.no +bindal.no +birkenes.no +bjarkoy.no +bjarkøy.no +bjerkreim.no +bjugn.no +bodo.no +bodø.no +badaddja.no +bådåddjå.no +budejju.no +bokn.no +bremanger.no +bronnoy.no +brønnøy.no +bygland.no +bykle.no +barum.no +bærum.no +bo.telemark.no +bø.telemark.no +bo.nordland.no +bø.nordland.no +bievat.no +bievát.no +bomlo.no +bømlo.no +batsfjord.no +båtsfjord.no +bahcavuotna.no +báhcavuotna.no +dovre.no +drammen.no +drangedal.no +dyroy.no +dyrøy.no +donna.no +dønna.no +eid.no +eidfjord.no +eidsberg.no +eidskog.no +eidsvoll.no +eigersund.no +elverum.no +enebakk.no +engerdal.no +etne.no +etnedal.no +evenes.no +evenassi.no +evenášši.no +evje-og-hornnes.no +farsund.no +fauske.no +fuossko.no +fuoisku.no +fedje.no +fet.no +finnoy.no +finnøy.no +fitjar.no +fjaler.no +fjell.no +flakstad.no +flatanger.no +flekkefjord.no +flesberg.no +flora.no +fla.no +flå.no +folldal.no +forsand.no +fosnes.no +frei.no +frogn.no +froland.no +frosta.no +frana.no +fræna.no +froya.no +frøya.no +fusa.no +fyresdal.no +forde.no +førde.no +gamvik.no +gangaviika.no +gáŋgaviika.no +gaular.no +gausdal.no +gildeskal.no +gildeskål.no +giske.no +gjemnes.no +gjerdrum.no +gjerstad.no +gjesdal.no +gjovik.no +gjøvik.no +gloppen.no +gol.no +gran.no +grane.no +granvin.no +gratangen.no +grimstad.no +grong.no +kraanghke.no +kråanghke.no +grue.no +gulen.no +hadsel.no +halden.no +halsa.no +hamar.no +hamaroy.no +habmer.no +hábmer.no +hapmir.no +hápmir.no +hammerfest.no +hammarfeasta.no +hámmárfeasta.no +haram.no +hareid.no +harstad.no +hasvik.no +aknoluokta.no +ákŋoluokta.no +hattfjelldal.no +aarborte.no +haugesund.no +hemne.no +hemnes.no +hemsedal.no +heroy.more-og-romsdal.no +herøy.møre-og-romsdal.no +heroy.nordland.no +herøy.nordland.no +hitra.no +hjartdal.no +hjelmeland.no +hobol.no +hobøl.no +hof.no +hol.no +hole.no +holmestrand.no +holtalen.no +holtålen.no +hornindal.no +horten.no +hurdal.no +hurum.no +hvaler.no +hyllestad.no +hagebostad.no +hægebostad.no +hoyanger.no +høyanger.no +hoylandet.no +høylandet.no +ha.no +hå.no +ibestad.no +inderoy.no +inderøy.no +iveland.no +jevnaker.no +jondal.no +jolster.no +jølster.no +karasjok.no +karasjohka.no +kárášjohka.no +karlsoy.no +galsa.no +gálsá.no +karmoy.no +karmøy.no +kautokeino.no +guovdageaidnu.no +klepp.no +klabu.no +klæbu.no +kongsberg.no +kongsvinger.no +kragero.no +kragerø.no +kristiansand.no +kristiansund.no +krodsherad.no +krødsherad.no +kvalsund.no +rahkkeravju.no +ráhkkerávju.no +kvam.no +kvinesdal.no +kvinnherad.no +kviteseid.no +kvitsoy.no +kvitsøy.no +kvafjord.no +kvæfjord.no +giehtavuoatna.no +kvanangen.no +kvænangen.no +navuotna.no +návuotna.no +kafjord.no +kåfjord.no +gaivuotna.no +gáivuotna.no +larvik.no +lavangen.no +lavagis.no +loabat.no +loabát.no +lebesby.no +davvesiida.no +leikanger.no +leirfjord.no +leka.no +leksvik.no +lenvik.no +leangaviika.no +leaŋgaviika.no +lesja.no +levanger.no +lier.no +lierne.no +lillehammer.no +lillesand.no +lindesnes.no +lindas.no +lindås.no +lom.no +loppa.no +lahppi.no +láhppi.no +lund.no +lunner.no +luroy.no +lurøy.no +luster.no +lyngdal.no +lyngen.no +ivgu.no +lardal.no +lerdal.no +lærdal.no +lodingen.no +lødingen.no +lorenskog.no +lørenskog.no +loten.no +løten.no +malvik.no +masoy.no +måsøy.no +muosat.no +muosát.no +mandal.no +marker.no +marnardal.no +masfjorden.no +meland.no +meldal.no +melhus.no +meloy.no +meløy.no +meraker.no +meråker.no +moareke.no +moåreke.no +midsund.no +midtre-gauldal.no +modalen.no +modum.no +molde.no +moskenes.no +moss.no +mosvik.no +malselv.no +målselv.no +malatvuopmi.no +málatvuopmi.no +namdalseid.no +aejrie.no +namsos.no +namsskogan.no +naamesjevuemie.no +nååmesjevuemie.no +laakesvuemie.no +nannestad.no +narvik.no +narviika.no +naustdal.no +nedre-eiker.no +nes.akershus.no +nes.buskerud.no +nesna.no +nesodden.no +nesseby.no +unjarga.no +unjárga.no +nesset.no +nissedal.no +nittedal.no +nord-aurdal.no +nord-fron.no +nord-odal.no +norddal.no +nordkapp.no +davvenjarga.no +davvenjárga.no +nordre-land.no +nordreisa.no +raisa.no +ráisa.no +nore-og-uvdal.no +notodden.no +naroy.no +nærøy.no +notteroy.no +nøtterøy.no +odda.no +oksnes.no +øksnes.no +oppdal.no +oppegard.no +oppegård.no +orkdal.no +orland.no +ørland.no +orskog.no +ørskog.no +orsta.no +ørsta.no +os.hedmark.no +os.hordaland.no +osen.no +osteroy.no +osterøy.no +ostre-toten.no +østre-toten.no +overhalla.no +ovre-eiker.no +øvre-eiker.no +oyer.no +øyer.no +oygarden.no +øygarden.no +oystre-slidre.no +øystre-slidre.no +porsanger.no +porsangu.no +porsáŋgu.no +porsgrunn.no +radoy.no +radøy.no +rakkestad.no +rana.no +ruovat.no +randaberg.no +rauma.no +rendalen.no +rennebu.no +rennesoy.no +rennesøy.no +rindal.no +ringebu.no +ringerike.no +ringsaker.no +rissa.no +risor.no +risør.no +roan.no +rollag.no +rygge.no +ralingen.no +rælingen.no +rodoy.no +rødøy.no +romskog.no +rømskog.no +roros.no +røros.no +rost.no +røst.no +royken.no +røyken.no +royrvik.no +røyrvik.no +rade.no +råde.no +salangen.no +siellak.no +saltdal.no +salat.no +sálát.no +sálat.no +samnanger.no +sande.more-og-romsdal.no +sande.møre-og-romsdal.no +sande.vestfold.no +sandefjord.no +sandnes.no +sandoy.no +sandøy.no +sarpsborg.no +sauda.no +sauherad.no +sel.no +selbu.no +selje.no +seljord.no +sigdal.no +siljan.no +sirdal.no +skaun.no +skedsmo.no +ski.no +skien.no +skiptvet.no +skjervoy.no +skjervøy.no +skierva.no +skiervá.no +skjak.no +skjåk.no +skodje.no +skanland.no +skånland.no +skanit.no +skánit.no +smola.no +smøla.no +snillfjord.no +snasa.no +snåsa.no +snoasa.no +snaase.no +snåase.no +sogndal.no +sokndal.no +sola.no +solund.no +songdalen.no +sortland.no +spydeberg.no +stange.no +stavanger.no +steigen.no +steinkjer.no +stjordal.no +stjørdal.no +stokke.no +stor-elvdal.no +stord.no +stordal.no +storfjord.no +omasvuotna.no +strand.no +stranda.no +stryn.no +sula.no +suldal.no +sund.no +sunndal.no +surnadal.no +sveio.no +svelvik.no +sykkylven.no +sogne.no +søgne.no +somna.no +sømna.no +sondre-land.no +søndre-land.no +sor-aurdal.no +sør-aurdal.no +sor-fron.no +sør-fron.no +sor-odal.no +sør-odal.no +sor-varanger.no +sør-varanger.no +matta-varjjat.no +mátta-várjjat.no +sorfold.no +sørfold.no +sorreisa.no +sørreisa.no +sorum.no +sørum.no +tana.no +deatnu.no +time.no +tingvoll.no +tinn.no +tjeldsund.no +dielddanuorri.no +tjome.no +tjøme.no +tokke.no +tolga.no +torsken.no +tranoy.no +tranøy.no +tromso.no +tromsø.no +tromsa.no +romsa.no +trondheim.no +troandin.no +trysil.no +trana.no +træna.no +trogstad.no +trøgstad.no +tvedestrand.no +tydal.no +tynset.no +tysfjord.no +divtasvuodna.no +divttasvuotna.no +tysnes.no +tysvar.no +tysvær.no +tonsberg.no +tønsberg.no +ullensaker.no +ullensvang.no +ulvik.no +utsira.no +vadso.no +vadsø.no +cahcesuolo.no +čáhcesuolo.no +vaksdal.no +valle.no +vang.no +vanylven.no +vardo.no +vardø.no +varggat.no +várggát.no +vefsn.no +vaapste.no +vega.no +vegarshei.no +vegårshei.no +vennesla.no +verdal.no +verran.no +vestby.no +vestnes.no +vestre-slidre.no +vestre-toten.no +vestvagoy.no +vestvågøy.no +vevelstad.no +vik.no +vikna.no +vindafjord.no +volda.no +voss.no +varoy.no +værøy.no +vagan.no +vågan.no +voagat.no +vagsoy.no +vågsøy.no +vaga.no +vågå.no +valer.ostfold.no +våler.østfold.no +valer.hedmark.no +våler.hedmark.no + +// np : http://www.mos.com.np/register.html +*.np + +// nr : http://cenpac.net.nr/dns/index.html +// Confirmed by registry 2008-06-17 +nr +biz.nr +info.nr +gov.nr +edu.nr +org.nr +net.nr +com.nr + +// nu : http://en.wikipedia.org/wiki/.nu +nu + +// nz : http://en.wikipedia.org/wiki/.nz +*.nz + +// om : http://en.wikipedia.org/wiki/.om +*.om +!mediaphone.om +!nawrastelecom.om +!nawras.om +!omanmobile.om +!omanpost.om +!omantel.om +!rakpetroleum.om +!siemens.om +!songfest.om +!statecouncil.om + +// org : http://en.wikipedia.org/wiki/.org +org + +// pa : http://www.nic.pa/ +// Some additional second level "domains" resolve directly as hostnames, such as +// pannet.pa, so we add a rule for "pa". +pa +ac.pa +gob.pa +com.pa +org.pa +sld.pa +edu.pa +net.pa +ing.pa +abo.pa +med.pa +nom.pa + +// pe : https://www.nic.pe/InformeFinalComision.pdf +pe +edu.pe +gob.pe +nom.pe +mil.pe +org.pe +com.pe +net.pe + +// pf : http://www.gobin.info/domainname/formulaire-pf.pdf +pf +com.pf +org.pf +edu.pf + +// pg : http://en.wikipedia.org/wiki/.pg +*.pg + +// ph : http://www.domains.ph/FAQ2.asp +// Submitted by registry 2008-06-13 +ph +com.ph +net.ph +org.ph +gov.ph +edu.ph +ngo.ph +mil.ph +i.ph + +// pk : http://pk5.pknic.net.pk/pk5/msgNamepk.PK +pk +com.pk +net.pk +edu.pk +org.pk +fam.pk +biz.pk +web.pk +gov.pk +gob.pk +gok.pk +gon.pk +gop.pk +gos.pk +info.pk + +// pl : http://www.dns.pl/english/ +pl +// NASK functional domains (nask.pl / dns.pl) : http://www.dns.pl/english/dns-funk.html +aid.pl +agro.pl +atm.pl +auto.pl +biz.pl +com.pl +edu.pl +gmina.pl +gsm.pl +info.pl +mail.pl +miasta.pl +media.pl +mil.pl +net.pl +nieruchomosci.pl +nom.pl +org.pl +pc.pl +powiat.pl +priv.pl +realestate.pl +rel.pl +sex.pl +shop.pl +sklep.pl +sos.pl +szkola.pl +targi.pl +tm.pl +tourism.pl +travel.pl +turystyka.pl +// ICM functional domains (icm.edu.pl) +6bone.pl +art.pl +mbone.pl +// Government domains (administred by ippt.gov.pl) +gov.pl +uw.gov.pl +um.gov.pl +ug.gov.pl +upow.gov.pl +starostwo.gov.pl +so.gov.pl +sr.gov.pl +po.gov.pl +pa.gov.pl +// other functional domains +ngo.pl +irc.pl +usenet.pl +// NASK geographical domains : http://www.dns.pl/english/dns-regiony.html +augustow.pl +babia-gora.pl +bedzin.pl +beskidy.pl +bialowieza.pl +bialystok.pl +bielawa.pl +bieszczady.pl +boleslawiec.pl +bydgoszcz.pl +bytom.pl +cieszyn.pl +czeladz.pl +czest.pl +dlugoleka.pl +elblag.pl +elk.pl +glogow.pl +gniezno.pl +gorlice.pl +grajewo.pl +ilawa.pl +jaworzno.pl +jelenia-gora.pl +jgora.pl +kalisz.pl +kazimierz-dolny.pl +karpacz.pl +kartuzy.pl +kaszuby.pl +katowice.pl +kepno.pl +ketrzyn.pl +klodzko.pl +kobierzyce.pl +kolobrzeg.pl +konin.pl +konskowola.pl +kutno.pl +lapy.pl +lebork.pl +legnica.pl +lezajsk.pl +limanowa.pl +lomza.pl +lowicz.pl +lubin.pl +lukow.pl +malbork.pl +malopolska.pl +mazowsze.pl +mazury.pl +mielec.pl +mielno.pl +mragowo.pl +naklo.pl +nowaruda.pl +nysa.pl +olawa.pl +olecko.pl +olkusz.pl +olsztyn.pl +opoczno.pl +opole.pl +ostroda.pl +ostroleka.pl +ostrowiec.pl +ostrowwlkp.pl +pila.pl +pisz.pl +podhale.pl +podlasie.pl +polkowice.pl +pomorze.pl +pomorskie.pl +prochowice.pl +pruszkow.pl +przeworsk.pl +pulawy.pl +radom.pl +rawa-maz.pl +rybnik.pl +rzeszow.pl +sanok.pl +sejny.pl +siedlce.pl +slask.pl +slupsk.pl +sosnowiec.pl +stalowa-wola.pl +skoczow.pl +starachowice.pl +stargard.pl +suwalki.pl +swidnica.pl +swiebodzin.pl +swinoujscie.pl +szczecin.pl +szczytno.pl +tarnobrzeg.pl +tgory.pl +turek.pl +tychy.pl +ustka.pl +walbrzych.pl +warmia.pl +warszawa.pl +waw.pl +wegrow.pl +wielun.pl +wlocl.pl +wloclawek.pl +wodzislaw.pl +wolomin.pl +wroclaw.pl +zachpomor.pl +zagan.pl +zarow.pl +zgora.pl +zgorzelec.pl +// TASK geographical domains (www.task.gda.pl/uslugi/dns) +gda.pl +gdansk.pl +gdynia.pl +med.pl +sopot.pl +// other geographical domains +gliwice.pl +krakow.pl +poznan.pl +wroc.pl +zakopane.pl + +// pm : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +pm + +// pn : http://www.government.pn/PnRegistry/policies.htm +pn +gov.pn +co.pn +org.pn +edu.pn +net.pn + +// pr : http://www.nic.pr/index.asp?f=1 +pr +com.pr +net.pr +org.pr +gov.pr +edu.pr +isla.pr +pro.pr +biz.pr +info.pr +name.pr +// these aren't mentioned on nic.pr, but on http://en.wikipedia.org/wiki/.pr +est.pr +prof.pr +ac.pr + +// pro : http://www.nic.pro/support_faq.htm +pro +aca.pro +bar.pro +cpa.pro +jur.pro +law.pro +med.pro +eng.pro + +// ps : http://en.wikipedia.org/wiki/.ps +// http://www.nic.ps/registration/policy.html#reg +ps +edu.ps +gov.ps +sec.ps +plo.ps +com.ps +org.ps +net.ps + +// pt : http://online.dns.pt/dns/start_dns +pt +net.pt +gov.pt +org.pt +edu.pt +int.pt +publ.pt +com.pt +nome.pt + +// pw : http://en.wikipedia.org/wiki/.pw +pw +co.pw +ne.pw +or.pw +ed.pw +go.pw +belau.pw + +// py : http://www.nic.py/faq_a.html#faq_b +*.py + +// qa : http://domains.qa/en/ +qa +com.qa +edu.qa +gov.qa +mil.qa +name.qa +net.qa +org.qa +sch.qa + +// re : http://www.afnic.re/obtenir/chartes/nommage-re/annexe-descriptifs +re +com.re +asso.re +nom.re + +// ro : http://www.rotld.ro/ +ro +com.ro +org.ro +tm.ro +nt.ro +nom.ro +info.ro +rec.ro +arts.ro +firm.ro +store.ro +www.ro + +// rs : http://en.wikipedia.org/wiki/.rs +rs +co.rs +org.rs +edu.rs +ac.rs +gov.rs +in.rs + +// ru : http://www.cctld.ru/ru/docs/aktiv_8.php +// Industry domains +ru +ac.ru +com.ru +edu.ru +int.ru +net.ru +org.ru +pp.ru +// Geographical domains +adygeya.ru +altai.ru +amur.ru +arkhangelsk.ru +astrakhan.ru +bashkiria.ru +belgorod.ru +bir.ru +bryansk.ru +buryatia.ru +cbg.ru +chel.ru +chelyabinsk.ru +chita.ru +chukotka.ru +chuvashia.ru +dagestan.ru +dudinka.ru +e-burg.ru +grozny.ru +irkutsk.ru +ivanovo.ru +izhevsk.ru +jar.ru +joshkar-ola.ru +kalmykia.ru +kaluga.ru +kamchatka.ru +karelia.ru +kazan.ru +kchr.ru +kemerovo.ru +khabarovsk.ru +khakassia.ru +khv.ru +kirov.ru +koenig.ru +komi.ru +kostroma.ru +krasnoyarsk.ru +kuban.ru +kurgan.ru +kursk.ru +lipetsk.ru +magadan.ru +mari.ru +mari-el.ru +marine.ru +mordovia.ru +mosreg.ru +msk.ru +murmansk.ru +nalchik.ru +nnov.ru +nov.ru +novosibirsk.ru +nsk.ru +omsk.ru +orenburg.ru +oryol.ru +palana.ru +penza.ru +perm.ru +pskov.ru +ptz.ru +rnd.ru +ryazan.ru +sakhalin.ru +samara.ru +saratov.ru +simbirsk.ru +smolensk.ru +spb.ru +stavropol.ru +stv.ru +surgut.ru +tambov.ru +tatarstan.ru +tom.ru +tomsk.ru +tsaritsyn.ru +tsk.ru +tula.ru +tuva.ru +tver.ru +tyumen.ru +udm.ru +udmurtia.ru +ulan-ude.ru +vladikavkaz.ru +vladimir.ru +vladivostok.ru +volgograd.ru +vologda.ru +voronezh.ru +vrn.ru +vyatka.ru +yakutia.ru +yamal.ru +yaroslavl.ru +yekaterinburg.ru +yuzhno-sakhalinsk.ru +// More geographical domains +amursk.ru +baikal.ru +cmw.ru +fareast.ru +jamal.ru +kms.ru +k-uralsk.ru +kustanai.ru +kuzbass.ru +magnitka.ru +mytis.ru +nakhodka.ru +nkz.ru +norilsk.ru +oskol.ru +pyatigorsk.ru +rubtsovsk.ru +snz.ru +syzran.ru +vdonsk.ru +zgrad.ru +// State domains +gov.ru +mil.ru +// Technical domains +test.ru + +// rw : http://www.nic.rw/cgi-bin/policy.pl +rw +gov.rw +net.rw +edu.rw +ac.rw +com.rw +co.rw +int.rw +mil.rw +gouv.rw + +// sa : http://www.nic.net.sa/ +sa +com.sa +net.sa +org.sa +gov.sa +med.sa +pub.sa +edu.sa +sch.sa + +// sb : http://www.sbnic.net.sb/ +// Submitted by registry 2008-06-08 +sb +com.sb +edu.sb +gov.sb +net.sb +org.sb + +// sc : http://www.nic.sc/ +sc +com.sc +gov.sc +net.sc +org.sc +edu.sc + +// sd : http://www.isoc.sd/sudanic.isoc.sd/billing_pricing.htm +// Submitted by registry 2008-06-17 +sd +com.sd +net.sd +org.sd +edu.sd +med.sd +gov.sd +info.sd + +// se : http://en.wikipedia.org/wiki/.se +// Submitted by registry 2008-06-24 +se +a.se +ac.se +b.se +bd.se +brand.se +c.se +d.se +e.se +f.se +fh.se +fhsk.se +fhv.se +g.se +h.se +i.se +k.se +komforb.se +kommunalforbund.se +komvux.se +l.se +lanbib.se +m.se +n.se +naturbruksgymn.se +o.se +org.se +p.se +parti.se +pp.se +press.se +r.se +s.se +sshn.se +t.se +tm.se +u.se +w.se +x.se +y.se +z.se + +// sg : http://www.nic.net.sg/sub_policies_agreement/2ld.html +sg +com.sg +net.sg +org.sg +gov.sg +edu.sg +per.sg + +// sh : http://www.nic.sh/rules.html +// list of 2nd level domains ? +sh + +// si : http://en.wikipedia.org/wiki/.si +si + +// sj : No registrations at this time. +// Submitted by registry 2008-06-16 + +// sk : http://en.wikipedia.org/wiki/.sk +// list of 2nd level domains ? +sk + +// sl : http://www.nic.sl +// Submitted by registry 2008-06-12 +sl +com.sl +net.sl +edu.sl +gov.sl +org.sl + +// sm : http://en.wikipedia.org/wiki/.sm +sm + +// sn : http://en.wikipedia.org/wiki/.sn +sn +art.sn +com.sn +edu.sn +gouv.sn +org.sn +perso.sn +univ.sn + +// so : http://www.soregistry.com/ +so +com.so +net.so +org.so + +// sr : http://en.wikipedia.org/wiki/.sr +sr + +// st : http://www.nic.st/html/policyrules/ +st +co.st +com.st +consulado.st +edu.st +embaixada.st +gov.st +mil.st +net.st +org.st +principe.st +saotome.st +store.st + +// su : http://en.wikipedia.org/wiki/.su +su + +// sv : http://www.svnet.org.sv/svpolicy.html +*.sv + +// sy : http://en.wikipedia.org/wiki/.sy +// see also: http://www.gobin.info/domainname/sy.doc +sy +edu.sy +gov.sy +net.sy +mil.sy +com.sy +org.sy + +// sz : http://en.wikipedia.org/wiki/.sz +// http://www.sispa.org.sz/ +sz +co.sz +ac.sz +org.sz + +// tc : http://en.wikipedia.org/wiki/.tc +tc + +// td : http://en.wikipedia.org/wiki/.td +td + +// tel: http://en.wikipedia.org/wiki/.tel +// http://www.telnic.org/ +tel + +// tf : http://en.wikipedia.org/wiki/.tf +tf + +// tg : http://en.wikipedia.org/wiki/.tg +// http://www.nic.tg/nictg/index.php implies no reserved 2nd-level domains, +// although this contradicts wikipedia. +tg + +// th : http://en.wikipedia.org/wiki/.th +// Submitted by registry 2008-06-17 +th +ac.th +co.th +go.th +in.th +mi.th +net.th +or.th + +// tj : http://www.nic.tj/policy.htm +tj +ac.tj +biz.tj +co.tj +com.tj +edu.tj +go.tj +gov.tj +int.tj +mil.tj +name.tj +net.tj +nic.tj +org.tj +test.tj +web.tj + +// tk : http://en.wikipedia.org/wiki/.tk +tk + +// tl : http://en.wikipedia.org/wiki/.tl +tl +gov.tl + +// tm : http://www.nic.tm/rules.html +// list of 2nd level tlds ? +tm + +// tn : http://en.wikipedia.org/wiki/.tn +// http://whois.ati.tn/ +tn +com.tn +ens.tn +fin.tn +gov.tn +ind.tn +intl.tn +nat.tn +net.tn +org.tn +info.tn +perso.tn +tourism.tn +edunet.tn +rnrt.tn +rns.tn +rnu.tn +mincom.tn +agrinet.tn +defense.tn +turen.tn + +// to : http://en.wikipedia.org/wiki/.to +// Submitted by registry 2008-06-17 +to +com.to +gov.to +net.to +org.to +edu.to +mil.to + +// tr : http://en.wikipedia.org/wiki/.tr +*.tr +!nic.tr +// Used by government in the TRNC +// http://en.wikipedia.org/wiki/.nc.tr +gov.nc.tr + +// travel : http://en.wikipedia.org/wiki/.travel +travel + +// tt : http://www.nic.tt/ +tt +co.tt +com.tt +org.tt +net.tt +biz.tt +info.tt +pro.tt +int.tt +coop.tt +jobs.tt +mobi.tt +travel.tt +museum.tt +aero.tt +name.tt +gov.tt +edu.tt + +// tv : http://en.wikipedia.org/wiki/.tv +// Not listing any 2LDs as reserved since none seem to exist in practice, +// Wikipedia notwithstanding. +tv + +// tw : http://en.wikipedia.org/wiki/.tw +tw +edu.tw +gov.tw +mil.tw +com.tw +net.tw +org.tw +idv.tw +game.tw +ebiz.tw +club.tw +網路.tw +組織.tw +商業.tw + +// tz : http://en.wikipedia.org/wiki/.tz +// Submitted by registry 2008-06-17 +// Updated from http://www.tznic.or.tz/index.php/domains.html 2010-10-25 +ac.tz +co.tz +go.tz +mil.tz +ne.tz +or.tz +sc.tz + +// ua : http://www.nic.net.ua/ +ua +com.ua +edu.ua +gov.ua +in.ua +net.ua +org.ua +// ua geo-names +cherkassy.ua +chernigov.ua +chernovtsy.ua +ck.ua +cn.ua +crimea.ua +cv.ua +dn.ua +dnepropetrovsk.ua +donetsk.ua +dp.ua +if.ua +ivano-frankivsk.ua +kh.ua +kharkov.ua +kherson.ua +khmelnitskiy.ua +kiev.ua +kirovograd.ua +km.ua +kr.ua +ks.ua +kv.ua +lg.ua +lugansk.ua +lutsk.ua +lviv.ua +mk.ua +nikolaev.ua +od.ua +odessa.ua +pl.ua +poltava.ua +rovno.ua +rv.ua +sebastopol.ua +sumy.ua +te.ua +ternopil.ua +uzhgorod.ua +vinnica.ua +vn.ua +zaporizhzhe.ua +zp.ua +zhitomir.ua +zt.ua + +// Private registries in .ua +co.ua +pp.ua + +// ug : http://www.registry.co.ug/ +ug +co.ug +ac.ug +sc.ug +go.ug +ne.ug +or.ug + +// uk : http://en.wikipedia.org/wiki/.uk +*.uk +*.sch.uk +!bl.uk +!british-library.uk +!icnet.uk +!jet.uk +!mod.uk +!nel.uk +!nhs.uk +!nic.uk +!nls.uk +!national-library-scotland.uk +!parliament.uk +!police.uk + +// us : http://en.wikipedia.org/wiki/.us +us +dni.us +fed.us +isa.us +kids.us +nsn.us +// us geographic names +ak.us +al.us +ar.us +as.us +az.us +ca.us +co.us +ct.us +dc.us +de.us +fl.us +ga.us +gu.us +hi.us +ia.us +id.us +il.us +in.us +ks.us +ky.us +la.us +ma.us +md.us +me.us +mi.us +mn.us +mo.us +ms.us +mt.us +nc.us +nd.us +ne.us +nh.us +nj.us +nm.us +nv.us +ny.us +oh.us +ok.us +or.us +pa.us +pr.us +ri.us +sc.us +sd.us +tn.us +tx.us +ut.us +vi.us +vt.us +va.us +wa.us +wi.us +wv.us +wy.us +// The registrar notes several more specific domains available in each state, +// such as state.*.us, dst.*.us, etc., but resolution of these is somewhat +// haphazard; in some states these domains resolve as addresses, while in others +// only subdomains are available, or even nothing at all. We include the +// most common ones where it's clear that different sites are different +// entities. +k12.ak.us +k12.al.us +k12.ar.us +k12.as.us +k12.az.us +k12.ca.us +k12.co.us +k12.ct.us +k12.dc.us +k12.de.us +k12.fl.us +k12.ga.us +k12.gu.us +// k12.hi.us Hawaii has a state-wide DOE login: bug 614565 +k12.ia.us +k12.id.us +k12.il.us +k12.in.us +k12.ks.us +k12.ky.us +k12.la.us +k12.ma.us +k12.md.us +k12.me.us +k12.mi.us +k12.mn.us +k12.mo.us +k12.ms.us +k12.mt.us +k12.nc.us +k12.nd.us +k12.ne.us +k12.nh.us +k12.nj.us +k12.nm.us +k12.nv.us +k12.ny.us +k12.oh.us +k12.ok.us +k12.or.us +k12.pa.us +k12.pr.us +k12.ri.us +k12.sc.us +k12.sd.us +k12.tn.us +k12.tx.us +k12.ut.us +k12.vi.us +k12.vt.us +k12.va.us +k12.wa.us +k12.wi.us +k12.wv.us +k12.wy.us + +cc.ak.us +cc.al.us +cc.ar.us +cc.as.us +cc.az.us +cc.ca.us +cc.co.us +cc.ct.us +cc.dc.us +cc.de.us +cc.fl.us +cc.ga.us +cc.gu.us +cc.hi.us +cc.ia.us +cc.id.us +cc.il.us +cc.in.us +cc.ks.us +cc.ky.us +cc.la.us +cc.ma.us +cc.md.us +cc.me.us +cc.mi.us +cc.mn.us +cc.mo.us +cc.ms.us +cc.mt.us +cc.nc.us +cc.nd.us +cc.ne.us +cc.nh.us +cc.nj.us +cc.nm.us +cc.nv.us +cc.ny.us +cc.oh.us +cc.ok.us +cc.or.us +cc.pa.us +cc.pr.us +cc.ri.us +cc.sc.us +cc.sd.us +cc.tn.us +cc.tx.us +cc.ut.us +cc.vi.us +cc.vt.us +cc.va.us +cc.wa.us +cc.wi.us +cc.wv.us +cc.wy.us + +lib.ak.us +lib.al.us +lib.ar.us +lib.as.us +lib.az.us +lib.ca.us +lib.co.us +lib.ct.us +lib.dc.us +lib.de.us +lib.fl.us +lib.ga.us +lib.gu.us +lib.hi.us +lib.ia.us +lib.id.us +lib.il.us +lib.in.us +lib.ks.us +lib.ky.us +lib.la.us +lib.ma.us +lib.md.us +lib.me.us +lib.mi.us +lib.mn.us +lib.mo.us +lib.ms.us +lib.mt.us +lib.nc.us +lib.nd.us +lib.ne.us +lib.nh.us +lib.nj.us +lib.nm.us +lib.nv.us +lib.ny.us +lib.oh.us +lib.ok.us +lib.or.us +lib.pa.us +lib.pr.us +lib.ri.us +lib.sc.us +lib.sd.us +lib.tn.us +lib.tx.us +lib.ut.us +lib.vi.us +lib.vt.us +lib.va.us +lib.wa.us +lib.wi.us +lib.wv.us +lib.wy.us + +// k12.ma.us contains school districts in Massachusetts. The 4LDs are +// managed indepedently except for private (PVT), charter (CHTR) and +// parochial (PAROCH) schools. Those are delegated dorectly to the +// 5LD operators. +pvt.k12.ma.us +chtr.k12.ma.us +paroch.k12.ma.us + +// uy : http://www.antel.com.uy/ +*.uy + +// uz : http://www.reg.uz/registerr.html +// are there other 2nd level tlds ? +uz +com.uz +co.uz + +// va : http://en.wikipedia.org/wiki/.va +va + +// vc : http://en.wikipedia.org/wiki/.vc +// Submitted by registry 2008-06-13 +vc +com.vc +net.vc +org.vc +gov.vc +mil.vc +edu.vc + +// ve : http://registro.nic.ve/nicve/registro/index.html +*.ve + +// vg : http://en.wikipedia.org/wiki/.vg +vg + +// vi : http://www.nic.vi/newdomainform.htm +// http://www.nic.vi/Domain_Rules/body_domain_rules.html indicates some other +// TLDs are "reserved", such as edu.vi and gov.vi, but doesn't actually say they +// are available for registration (which they do not seem to be). +vi +co.vi +com.vi +k12.vi +net.vi +org.vi + +// vn : https://www.dot.vn/vnnic/vnnic/domainregistration.jsp +vn +com.vn +net.vn +org.vn +edu.vn +gov.vn +int.vn +ac.vn +biz.vn +info.vn +name.vn +pro.vn +health.vn + +// vu : http://en.wikipedia.org/wiki/.vu +// list of 2nd level tlds ? +vu + +// wf : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +wf + +// ws : http://en.wikipedia.org/wiki/.ws +// http://samoanic.ws/index.dhtml +ws +com.ws +net.ws +org.ws +gov.ws +edu.ws + +// yt : http://www.afnic.fr/medias/documents/AFNIC-naming-policy2012.pdf +yt + +// IDN ccTLDs +// Please sort by ISO 3166 ccTLD, then punicode string +// when submitting patches and follow this format: +// ("" ) : +// [optional sponsoring org] +// + +// xn--mgbaam7a8h ("Emerat" Arabic) : AE +//http://nic.ae/english/arabicdomain/rules.jsp +امارات + +// xn--54b7fta0cc ("Bangla" Bangla) : BD +বাংলা + +// xn--fiqs8s ("China" Chinese-Han-Simplified <.Zhonggou>) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中国 + +// xn--fiqz9s ("China" Chinese-Han-Traditional <.Zhonggou>) : CN +// CNNIC +// http://cnnic.cn/html/Dir/2005/10/11/3218.htm +中國 + +// xn--lgbbat1ad8j ("Algeria / Al Jazair" Arabic) : DZ +الجزائر + +// xn--wgbh1c ("Egypt" Arabic .masr) : EG +// http://www.dotmasr.eg/ +مصر + +// xn--node ("ge" Georgian (Mkhedruli)) : GE +გე + +// xn--j6w193g ("Hong Kong" Chinese-Han) : HK +// https://www2.hkirc.hk/register/rules.jsp +香港 + +// xn--h2brj9c ("Bharat" Devanagari) : IN +// India +भारत + +// xn--mgbbh1a71e ("Bharat" Arabic) : IN +// India +بھارت + +// xn--fpcrj9c3d ("Bharat" Telugu) : IN +// India +భారత్ + +// xn--gecrj9c ("Bharat" Gujarati) : IN +// India +ભારત + +// xn--s9brj9c ("Bharat" Gurmukhi) : IN +// India +ਭਾਰਤ + +// xn--45brj9c ("Bharat" Bengali) : IN +// India +ভারত + +// xn--xkc2dl3a5ee0h ("India" Tamil) : IN +// India +இந்தியா + +// xn--mgba3a4f16a ("Iran" Persian) : IR +ایران + +// xn--mgba3a4fra ("Iran" Arabic) : IR +ايران + +//xn--mgbayh7gpa ("al-Ordon" Arabic) JO +//National Information Technology Center (NITC) +//Royal Scientific Society, Al-Jubeiha +الاردن + +// xn--3e0b707e ("Republic of Korea" Hangul) : KR +한국 + +// xn--fzc2c9e2c ("Lanka" Sinhalese-Sinhala) : LK +// http://nic.lk +ලංකා + +// xn--xkc2al3hye2a ("Ilangai" Tamil) : LK +// http://nic.lk +இலங்கை + +// xn--mgbc0a9azcg ("Morocco / al-Maghrib" Arabic) : MA +المغرب + +// xn--mgb9awbf ("Oman" Arabic) : OM +عمان + +// xn--ygbi2ammx ("Falasteen" Arabic) : PS +// The Palestinian National Internet Naming Authority (PNINA) +// http://www.pnina.ps +فلسطين + +// xn--90a3ac ("srb" Cyrillic) : RS +срб + +// xn--p1ai ("rf" Russian-Cyrillic) : RU +// http://www.cctld.ru/en/docs/rulesrf.php +рф + +// xn--wgbl6a ("Qatar" Arabic) : QA +// http://www.ict.gov.qa/ +قطر + +// xn--mgberp4a5d4ar ("AlSaudiah" Arabic) : SA +// http://www.nic.net.sa/ +السعودية + +// xn--mgberp4a5d4a87g ("AlSaudiah" Arabic) variant : SA +السعودیة + +// xn--mgbqly7c0a67fbc ("AlSaudiah" Arabic) variant : SA +السعودیۃ + +// xn--mgbqly7cvafr ("AlSaudiah" Arabic) variant : SA +السعوديه + +// xn--ogbpf8fl ("Syria" Arabic) : SY +سورية + +// xn--mgbtf8fl ("Syria" Arabic) variant : SY +سوريا + +// xn--yfro4i67o Singapore ("Singapore" Chinese-Han) : SG +新加坡 + +// xn--clchc0ea0b2g2a9gcd ("Singapore" Tamil) : SG +சிங்கப்பூர் + +// xn--o3cw4h ("Thai" Thai) : TH +// http://www.thnic.co.th +ไทย + +// xn--pgbs0dh ("Tunis") : TN +// http://nic.tn +تونس + +// xn--kpry57d ("Taiwan" Chinese-Han-Traditional) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台灣 + +// xn--kprw13d ("Taiwan" Chinese-Han-Simplified) : TW +// http://www.twnic.net/english/dn/dn_07a.htm +台湾 + +// xn--nnx388a ("Taiwan") variant : TW +臺灣 + +// xn--j1amh ("ukr" Cyrillic) : UA +укр + +// xn--mgb2ddes ("AlYemen" Arabic) : YE +اليمن + +// xxx : http://icmregistry.com +xxx + +// ye : http://www.y.net.ye/services/domain_name.htm +*.ye + +// za : http://www.zadna.org.za/slds.html +*.za + +// zm : http://en.wikipedia.org/wiki/.zm +*.zm + +// zw : http://en.wikipedia.org/wiki/.zw +*.zw + +// ===END ICANN DOMAINS=== +// ===BEGIN PRIVATE DOMAINS=== + +// info.at : http://www.info.at/ +biz.at +info.at + +// priv.at : http://www.nic.priv.at/ +// Submitted by registry 2008-06-09 +priv.at + +// co.ca : http://registry.co.ca +co.ca + +// CentralNic : http://www.centralnic.com/names/domains +// Confirmed by registry 2008-06-09 +ar.com +br.com +cn.com +de.com +eu.com +gb.com +gr.com +hu.com +jpn.com +kr.com +no.com +qc.com +ru.com +sa.com +se.com +uk.com +us.com +uy.com +za.com +gb.net +jp.net +se.net +uk.net +ae.org +us.org +com.de + +// Opera Software, A.S.A. +// Requested by Yngve Pettersen 2009-11-26 +operaunite.com + +// Google, Inc. +// Requested by Eduardo Vela 2010-09-06 +appspot.com + +// iki.fi : Submitted by Hannu Aronsson 2009-11-05 +iki.fi + +// c.la : http://www.c.la/ +c.la + +// ZaNiC : http://www.za.net/ +// Confirmed by registry 2009-10-03 +za.net +za.org + +// CoDNS B.V. +// Added 2010-05-23. +co.nl +co.no + +// Mainseek Sp. z o.o. : http://www.co.pl/ +co.pl + +// DynDNS.com : http://www.dyndns.com/services/dns/dyndns/ +dyndns-at-home.com +dyndns-at-work.com +dyndns-blog.com +dyndns-free.com +dyndns-home.com +dyndns-ip.com +dyndns-mail.com +dyndns-office.com +dyndns-pics.com +dyndns-remote.com +dyndns-server.com +dyndns-web.com +dyndns-wiki.com +dyndns-work.com +dyndns.biz +dyndns.info +dyndns.org +dyndns.tv +at-band-camp.net +ath.cx +barrel-of-knowledge.info +barrell-of-knowledge.info +better-than.tv +blogdns.com +blogdns.net +blogdns.org +blogsite.org +boldlygoingnowhere.org +broke-it.net +buyshouses.net +cechire.com +dnsalias.com +dnsalias.net +dnsalias.org +dnsdojo.com +dnsdojo.net +dnsdojo.org +does-it.net +doesntexist.com +doesntexist.org +dontexist.com +dontexist.net +dontexist.org +doomdns.com +doomdns.org +dvrdns.org +dyn-o-saur.com +dynalias.com +dynalias.net +dynalias.org +dynathome.net +dyndns.ws +endofinternet.net +endofinternet.org +endoftheinternet.org +est-a-la-maison.com +est-a-la-masion.com +est-le-patron.com +est-mon-blogueur.com +for-better.biz +for-more.biz +for-our.info +for-some.biz +for-the.biz +forgot.her.name +forgot.his.name +from-ak.com +from-al.com +from-ar.com +from-az.net +from-ca.com +from-co.net +from-ct.com +from-dc.com +from-de.com +from-fl.com +from-ga.com +from-hi.com +from-ia.com +from-id.com +from-il.com +from-in.com +from-ks.com +from-ky.com +from-la.net +from-ma.com +from-md.com +from-me.org +from-mi.com +from-mn.com +from-mo.com +from-ms.com +from-mt.com +from-nc.com +from-nd.com +from-ne.com +from-nh.com +from-nj.com +from-nm.com +from-nv.com +from-ny.net +from-oh.com +from-ok.com +from-or.com +from-pa.com +from-pr.com +from-ri.com +from-sc.com +from-sd.com +from-tn.com +from-tx.com +from-ut.com +from-va.com +from-vt.com +from-wa.com +from-wi.com +from-wv.com +from-wy.com +ftpaccess.cc +fuettertdasnetz.de +game-host.org +game-server.cc +getmyip.com +gets-it.net +go.dyndns.org +gotdns.com +gotdns.org +groks-the.info +groks-this.info +ham-radio-op.net +here-for-more.info +hobby-site.com +hobby-site.org +home.dyndns.org +homedns.org +homeftp.net +homeftp.org +homeip.net +homelinux.com +homelinux.net +homelinux.org +homeunix.com +homeunix.net +homeunix.org +iamallama.com +in-the-band.net +is-a-anarchist.com +is-a-blogger.com +is-a-bookkeeper.com +is-a-bruinsfan.org +is-a-bulls-fan.com +is-a-candidate.org +is-a-caterer.com +is-a-celticsfan.org +is-a-chef.com +is-a-chef.net +is-a-chef.org +is-a-conservative.com +is-a-cpa.com +is-a-cubicle-slave.com +is-a-democrat.com +is-a-designer.com +is-a-doctor.com +is-a-financialadvisor.com +is-a-geek.com +is-a-geek.net +is-a-geek.org +is-a-green.com +is-a-guru.com +is-a-hard-worker.com +is-a-hunter.com +is-a-knight.org +is-a-landscaper.com +is-a-lawyer.com +is-a-liberal.com +is-a-libertarian.com +is-a-linux-user.org +is-a-llama.com +is-a-musician.com +is-a-nascarfan.com +is-a-nurse.com +is-a-painter.com +is-a-patsfan.org +is-a-personaltrainer.com +is-a-photographer.com +is-a-player.com +is-a-republican.com +is-a-rockstar.com +is-a-socialist.com +is-a-soxfan.org +is-a-student.com +is-a-teacher.com +is-a-techie.com +is-a-therapist.com +is-an-accountant.com +is-an-actor.com +is-an-actress.com +is-an-anarchist.com +is-an-artist.com +is-an-engineer.com +is-an-entertainer.com +is-by.us +is-certified.com +is-found.org +is-gone.com +is-into-anime.com +is-into-cars.com +is-into-cartoons.com +is-into-games.com +is-leet.com +is-lost.org +is-not-certified.com +is-saved.org +is-slick.com +is-uberleet.com +is-very-bad.org +is-very-evil.org +is-very-good.org +is-very-nice.org +is-very-sweet.org +is-with-theband.com +isa-geek.com +isa-geek.net +isa-geek.org +isa-hockeynut.com +issmarterthanyou.com +isteingeek.de +istmein.de +kicks-ass.net +kicks-ass.org +knowsitall.info +land-4-sale.us +lebtimnetz.de +leitungsen.de +likes-pie.com +likescandy.com +merseine.nu +mine.nu +misconfused.org +mypets.ws +myphotos.cc +neat-url.com +office-on-the.net +on-the-web.tv +podzone.net +podzone.org +readmyblog.org +saves-the-whales.com +scrapper-site.net +scrapping.cc +selfip.biz +selfip.com +selfip.info +selfip.net +selfip.org +sells-for-less.com +sells-for-u.com +sells-it.net +sellsyourhome.org +servebbs.com +servebbs.net +servebbs.org +serveftp.net +serveftp.org +servegame.org +shacknet.nu +simple-url.com +space-to-rent.com +stuff-4-sale.org +stuff-4-sale.us +teaches-yoga.com +thruhere.net +traeumtgerade.de +webhop.biz +webhop.info +webhop.net +webhop.org +worse-than.tv +writesthisblog.com + +// ===END PRIVATE DOMAINS=== diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/test.js new file mode 100644 index 0000000..5cbf536 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/test.js @@ -0,0 +1,1625 @@ +/* + * Copyright GoInstant, Inc. and other contributors. All rights reserved. + * 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. + */ +'use strict'; +var vows = require('vows'); +var assert = require('assert'); +var async = require('async'); + +// NOTE use require("tough-cookie") in your own code: +var tough = require('./lib/cookie'); +var Cookie = tough.Cookie; +var CookieJar = tough.CookieJar; + + +function dateVows(table) { + var theVows = { }; + Object.keys(table).forEach(function(date) { + var expect = table[date]; + theVows[date] = function() { + var got = tough.parseDate(date) ? 'valid' : 'invalid'; + assert.equal(got, expect ? 'valid' : 'invalid'); + }; + }); + return { "date parsing": theVows }; +} + +function matchVows(func,table) { + var theVows = {}; + table.forEach(function(item) { + var str = item[0]; + var dom = item[1]; + var expect = item[2]; + var label = str+(expect?" matches ":" doesn't match ")+dom; + theVows[label] = function() { + assert.equal(func(str,dom),expect); + }; + }); + return theVows; +} + +function defaultPathVows(table) { + var theVows = {}; + table.forEach(function(item) { + var str = item[0]; + var expect = item[1]; + var label = str+" gives "+expect; + theVows[label] = function() { + assert.equal(tough.defaultPath(str),expect); + }; + }); + return theVows; +} + +var atNow = Date.now(); +function at(offset) { return {now: new Date(atNow+offset)}; } + +vows.describe('Cookie Jar') +.addBatch({ + "all defined": function() { + assert.ok(Cookie); + assert.ok(CookieJar); + }, +}) +.addBatch( + dateVows({ + "Wed, 09 Jun 2021 10:18:14 GMT": true, + "Wed, 09 Jun 2021 22:18:14 GMT": true, + "Tue, 18 Oct 2011 07:42:42.123 GMT": true, + "18 Oct 2011 07:42:42 GMT": true, + "8 Oct 2011 7:42:42 GMT": true, + "8 Oct 2011 7:2:42 GMT": false, + "Oct 18 2011 07:42:42 GMT": true, + "Tue Oct 18 2011 07:05:03 GMT+0000 (GMT)": true, + "09 Jun 2021 10:18:14 GMT": true, + "99 Jix 3038 48:86:72 ZMT": false, + '01 Jan 1970 00:00:00 GMT': true, + '01 Jan 1600 00:00:00 GMT': false, // before 1601 + '01 Jan 1601 00:00:00 GMT': true, + '10 Feb 81 13:00:00 GMT': true, // implicit year + 'Thu, 01 Jan 1970 00:00:010 GMT': true, // strange time, non-strict OK + 'Thu, 17-Apr-2014 02:12:29 GMT': true, // dashes + 'Thu, 17-Apr-2014 02:12:29 UTC': true, // dashes and UTC + }) +) +.addBatch({ + "strict date parse of Thu, 01 Jan 1970 00:00:010 GMT": { + topic: function() { + return tough.parseDate('Thu, 01 Jan 1970 00:00:010 GMT', true) ? true : false; + }, + "invalid": function(date) { + assert.equal(date,false); + }, + } +}) +.addBatch({ + "formatting": { + "a simple cookie": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'b'; + return c; + }, + "validates": function(c) { + assert.ok(c.validate()); + }, + "to string": function(c) { + assert.equal(c.toString(), 'a=b'); + }, + }, + "a cookie with spaces in the value": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'beta gamma'; + return c; + }, + "doesn't validate": function(c) { + assert.ok(!c.validate()); + }, + "'garbage in, garbage out'": function(c) { + assert.equal(c.toString(), 'a=beta gamma'); + }, + }, + "with an empty value and HttpOnly": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.httpOnly = true; + return c; + }, + "to string": function(c) { + assert.equal(c.toString(), 'a=; HttpOnly'); + } + }, + "with an expiry": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'b'; + c.setExpires("Oct 18 2011 07:05:03 GMT"); + return c; + }, + "validates": function(c) { + assert.ok(c.validate()); + }, + "to string": function(c) { + assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT'); + }, + "to short string": function(c) { + assert.equal(c.cookieString(), 'a=b'); + }, + }, + "with a max-age": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'b'; + c.setExpires("Oct 18 2011 07:05:03 GMT"); + c.maxAge = 12345; + return c; + }, + "validates": function(c) { + assert.ok(c.validate()); // mabe this one *shouldn't*? + }, + "to string": function(c) { + assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345'); + }, + }, + "with a bunch of things": function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'b'; + c.setExpires("Oct 18 2011 07:05:03 GMT"); + c.maxAge = 12345; + c.domain = 'example.com'; + c.path = '/foo'; + c.secure = true; + c.httpOnly = true; + c.extensions = ['MyExtension']; + assert.equal(c.toString(), 'a=b; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Max-Age=12345; Domain=example.com; Path=/foo; Secure; HttpOnly; MyExtension'); + }, + "a host-only cookie": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'b'; + c.hostOnly = true; + c.domain = 'shouldnt-stringify.example.com'; + c.path = '/should-stringify'; + return c; + }, + "validates": function(c) { + assert.ok(c.validate()); + }, + "to string": function(c) { + assert.equal(c.toString(), 'a=b; Path=/should-stringify'); + }, + }, + "minutes are '10'": { + topic: function() { + var c = new Cookie(); + c.key = 'a'; + c.value = 'b'; + c.expires = new Date(1284113410000); + return c; + }, + "validates": function(c) { + assert.ok(c.validate()); + }, + "to string": function(c) { + var str = c.toString(); + assert.notEqual(str, 'a=b; Expires=Fri, 010 Sep 2010 010:010:010 GMT'); + assert.equal(str, 'a=b; Expires=Fri, 10 Sep 2010 10:10:10 GMT'); + }, + } + } +}) +.addBatch({ + "TTL with max-age": function() { + var c = new Cookie(); + c.maxAge = 123; + assert.equal(c.TTL(), 123000); + assert.equal(c.expiryTime(new Date(9000000)), 9123000); + }, + "TTL with zero max-age": function() { + var c = new Cookie(); + c.key = 'a'; c.value = 'b'; + c.maxAge = 0; // should be treated as "earliest representable" + assert.equal(c.TTL(), 0); + assert.equal(c.expiryTime(new Date(9000000)), -Infinity); + assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT + }, + "TTL with negative max-age": function() { + var c = new Cookie(); + c.key = 'a'; c.value = 'b'; + c.maxAge = -1; // should be treated as "earliest representable" + assert.equal(c.TTL(), 0); + assert.equal(c.expiryTime(new Date(9000000)), -Infinity); + assert.ok(!c.validate()); // not valid, really: non-zero-digit *DIGIT + }, + "TTL with max-age and expires": function() { + var c = new Cookie(); + c.maxAge = 123; + c.expires = new Date(Date.now()+9000); + assert.equal(c.TTL(), 123000); + assert.ok(c.isPersistent()); + }, + "TTL with expires": function() { + var c = new Cookie(); + var now = Date.now(); + c.expires = new Date(now+9000); + assert.equal(c.TTL(now), 9000); + assert.equal(c.expiryTime(), c.expires.getTime()); + }, + "TTL with old expires": function() { + var c = new Cookie(); + c.setExpires('17 Oct 2010 00:00:00 GMT'); + assert.ok(c.TTL() < 0); + assert.ok(c.isPersistent()); + }, + "default TTL": { + topic: function() { return new Cookie(); }, + "is Infinite-future": function(c) { assert.equal(c.TTL(), Infinity) }, + "is a 'session' cookie": function(c) { assert.ok(!c.isPersistent()) }, + }, +}).addBatch({ + "Parsing": { + "simple": { + topic: function() { + return Cookie.parse('a=bcd',true) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'a') }, + "value": function(c) { assert.equal(c.value, 'bcd') }, + "no path": function(c) { assert.equal(c.path, null) }, + "no domain": function(c) { assert.equal(c.domain, null) }, + "no extensions": function(c) { assert.ok(!c.extensions) }, + }, + "with expiry": { + topic: function() { + return Cookie.parse('a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT',true) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'a') }, + "value": function(c) { assert.equal(c.value, 'bcd') }, + "has expires": function(c) { + assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be'); + assert.equal(c.expires.getTime(), 1318921503000); + }, + }, + "with expiry and path": { + topic: function() { + return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc',true) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'abc') }, + "value": function(c) { assert.equal(c.value, 'xyzzy!') }, + "has expires": function(c) { + assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be'); + assert.equal(c.expires.getTime(), 1318921503000); + }, + "has path": function(c) { assert.equal(c.path, '/aBc'); }, + "no httponly or secure": function(c) { + assert.ok(!c.httpOnly); + assert.ok(!c.secure); + }, + }, + "with everything": { + topic: function() { + return Cookie.parse('abc="xyzzy!"; Expires=Tue, 18 Oct 2011 07:05:03 GMT; Path=/aBc; Domain=example.com; Secure; HTTPOnly; Max-Age=1234; Foo=Bar; Baz', true) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'abc') }, + "value": function(c) { assert.equal(c.value, 'xyzzy!') }, + "has expires": function(c) { + assert.ok(c.expires !== Infinity, 'expiry is infinite when it shouldn\'t be'); + assert.equal(c.expires.getTime(), 1318921503000); + }, + "has path": function(c) { assert.equal(c.path, '/aBc'); }, + "has domain": function(c) { assert.equal(c.domain, 'example.com'); }, + "has httponly": function(c) { assert.equal(c.httpOnly, true); }, + "has secure": function(c) { assert.equal(c.secure, true); }, + "has max-age": function(c) { assert.equal(c.maxAge, 1234); }, + "has extensions": function(c) { + assert.ok(c.extensions); + assert.equal(c.extensions[0], 'Foo=Bar'); + assert.equal(c.extensions[1], 'Baz'); + }, + }, + "invalid expires": { + "strict": function() { assert.ok(!Cookie.parse("a=b; Expires=xyzzy", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; Expires=xyzzy"); + assert.ok(c); + assert.equal(c.expires, Infinity); + }, + }, + "zero max-age": { + "strict": function() { assert.ok(!Cookie.parse("a=b; Max-Age=0", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; Max-Age=0"); + assert.ok(c); + assert.equal(c.maxAge, 0); + }, + }, + "negative max-age": { + "strict": function() { assert.ok(!Cookie.parse("a=b; Max-Age=-1", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; Max-Age=-1"); + assert.ok(c); + assert.equal(c.maxAge, -1); + }, + }, + "empty domain": { + "strict": function() { assert.ok(!Cookie.parse("a=b; domain=", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; domain="); + assert.ok(c); + assert.equal(c.domain, null); + }, + }, + "dot domain": { + "strict": function() { assert.ok(!Cookie.parse("a=b; domain=.", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; domain=."); + assert.ok(c); + assert.equal(c.domain, null); + }, + }, + "uppercase domain": { + "strict lowercases": function() { + var c = Cookie.parse("a=b; domain=EXAMPLE.COM"); + assert.ok(c); + assert.equal(c.domain, 'example.com'); + }, + "non-strict lowercases": function() { + var c = Cookie.parse("a=b; domain=EXAMPLE.COM"); + assert.ok(c); + assert.equal(c.domain, 'example.com'); + }, + }, + "trailing dot in domain": { + topic: function() { + return Cookie.parse("a=b; Domain=example.com.", true) || null; + }, + "has the domain": function(c) { assert.equal(c.domain,"example.com.") }, + "but doesn't validate": function(c) { assert.equal(c.validate(),false) }, + }, + "empty path": { + "strict": function() { assert.ok(!Cookie.parse("a=b; path=", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; path="); + assert.ok(c); + assert.equal(c.path, null); + }, + }, + "no-slash path": { + "strict": function() { assert.ok(!Cookie.parse("a=b; path=xyzzy", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; path=xyzzy"); + assert.ok(c); + assert.equal(c.path, null); + }, + }, + "trailing semi-colons after path": { + topic: function () { + return [ + "a=b; path=/;", + "c=d;;;;" + ]; + }, + "strict": function (t) { + assert.ok(!Cookie.parse(t[0], true)); + assert.ok(!Cookie.parse(t[1], true)); + }, + "non-strict": function (t) { + var c1 = Cookie.parse(t[0]); + var c2 = Cookie.parse(t[1]); + assert.ok(c1); + assert.ok(c2); + assert.equal(c1.path, '/'); + } + }, + "secure-with-value": { + "strict": function() { assert.ok(!Cookie.parse("a=b; Secure=xyzzy", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; Secure=xyzzy"); + assert.ok(c); + assert.equal(c.secure, true); + }, + }, + "httponly-with-value": { + "strict": function() { assert.ok(!Cookie.parse("a=b; HttpOnly=xyzzy", true)) }, + "non-strict": function() { + var c = Cookie.parse("a=b; HttpOnly=xyzzy"); + assert.ok(c); + assert.equal(c.httpOnly, true); + }, + }, + "garbage": { + topic: function() { + return Cookie.parse("\x08", true) || null; + }, + "doesn't parse": function(c) { assert.equal(c,null) }, + }, + "public suffix domain": { + topic: function() { + return Cookie.parse("a=b; domain=kyoto.jp", true) || null; + }, + "parses fine": function(c) { + assert.ok(c); + assert.equal(c.domain, 'kyoto.jp'); + }, + "but fails validation": function(c) { + assert.ok(c); + assert.ok(!c.validate()); + }, + }, + "Ironically, Google 'GAPS' cookie has very little whitespace": { + topic: function() { + return Cookie.parse("GAPS=1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-;Path=/;Expires=Thu, 17-Apr-2014 02:12:29 GMT;Secure;HttpOnly"); + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'GAPS') }, + "value": function(c) { assert.equal(c.value, '1:A1aaaaAaAAa1aaAaAaaAAAaaa1a11a:aaaAaAaAa-aaaA1-') }, + "path": function(c) { + assert.notEqual(c.path, '/;Expires'); // BUG + assert.equal(c.path, '/'); + }, + "expires": function(c) { + assert.notEqual(c.expires, Infinity); + assert.equal(c.expires.getTime(), 1397700749000); + }, + "secure": function(c) { assert.ok(c.secure) }, + "httponly": function(c) { assert.ok(c.httpOnly) }, + }, + "lots of equal signs": { + topic: function() { + return Cookie.parse("queryPref=b=c&d=e; Path=/f=g; Expires=Thu, 17 Apr 2014 02:12:29 GMT; HttpOnly"); + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'queryPref') }, + "value": function(c) { assert.equal(c.value, 'b=c&d=e') }, + "path": function(c) { + assert.equal(c.path, '/f=g'); + }, + "expires": function(c) { + assert.notEqual(c.expires, Infinity); + assert.equal(c.expires.getTime(), 1397700749000); + }, + "httponly": function(c) { assert.ok(c.httpOnly) }, + }, + "spaces in value": { + "strict": { + topic: function() { + return Cookie.parse('a=one two three',true) || null; + }, + "did not parse": function(c) { assert.isNull(c) }, + }, + "non-strict": { + topic: function() { + return Cookie.parse('a=one two three',false) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'a') }, + "value": function(c) { assert.equal(c.value, 'one two three') }, + "no path": function(c) { assert.equal(c.path, null) }, + "no domain": function(c) { assert.equal(c.domain, null) }, + "no extensions": function(c) { assert.ok(!c.extensions) }, + }, + }, + "quoted spaces in value": { + "strict": { + topic: function() { + return Cookie.parse('a="one two three"',true) || null; + }, + "did not parse": function(c) { assert.isNull(c) }, + }, + "non-strict": { + topic: function() { + return Cookie.parse('a="one two three"',false) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'a') }, + "value": function(c) { assert.equal(c.value, 'one two three') }, + "no path": function(c) { assert.equal(c.path, null) }, + "no domain": function(c) { assert.equal(c.domain, null) }, + "no extensions": function(c) { assert.ok(!c.extensions) }, + } + }, + "non-ASCII in value": { + "strict": { + topic: function() { + return Cookie.parse('farbe=weiß',true) || null; + }, + "did not parse": function(c) { assert.isNull(c) }, + }, + "non-strict": { + topic: function() { + return Cookie.parse('farbe=weiß',false) || null; + }, + "parsed": function(c) { assert.ok(c) }, + "key": function(c) { assert.equal(c.key, 'farbe') }, + "value": function(c) { assert.equal(c.value, 'weiß') }, + "no path": function(c) { assert.equal(c.path, null) }, + "no domain": function(c) { assert.equal(c.domain, null) }, + "no extensions": function(c) { assert.ok(!c.extensions) }, + }, + }, + } +}) +.addBatch({ + "domain normalization": { + "simple": function() { + var c = new Cookie(); + c.domain = "EXAMPLE.com"; + assert.equal(c.canonicalizedDomain(), "example.com"); + }, + "extra dots": function() { + var c = new Cookie(); + c.domain = ".EXAMPLE.com"; + assert.equal(c.cdomain(), "example.com"); + }, + "weird trailing dot": function() { + var c = new Cookie(); + c.domain = "EXAMPLE.ca."; + assert.equal(c.canonicalizedDomain(), "example.ca."); + }, + "weird internal dots": function() { + var c = new Cookie(); + c.domain = "EXAMPLE...ca."; + assert.equal(c.canonicalizedDomain(), "example...ca."); + }, + "IDN": function() { + var c = new Cookie(); + c.domain = "δοκιμή.δοκιμή"; // "test.test" in greek + assert.equal(c.canonicalizedDomain(), "xn--jxalpdlp.xn--jxalpdlp"); + } + } +}) +.addBatch({ + "Domain Match":matchVows(tough.domainMatch, [ + // str, dom, expect + ["example.com", "example.com", true], + ["eXaMpLe.cOm", "ExAmPlE.CoM", true], + ["no.ca", "yes.ca", false], + ["wwwexample.com", "example.com", false], + ["www.example.com", "example.com", true], + ["example.com", "www.example.com", false], + ["www.subdom.example.com", "example.com", true], + ["www.subdom.example.com", "subdom.example.com", true], + ["example.com", "example.com.", false], // RFC6265 S4.1.2.3 + ["192.168.0.1", "168.0.1", false], // S5.1.3 "The string is a host name" + [null, "example.com", null], + ["example.com", null, null], + [null, null, null], + [undefined, undefined, null], + ]) +}) +.addBatch({ + "default-path": defaultPathVows([ + [null,"/"], + ["/","/"], + ["/file","/"], + ["/dir/file","/dir"], + ["noslash","/"], + ]) +}) +.addBatch({ + "Path-Match": matchVows(tough.pathMatch, [ + // request, cookie, match + ["/","/",true], + ["/dir","/",true], + ["/","/dir",false], + ["/dir/","/dir/", true], + ["/dir/file","/dir/",true], + ["/dir/file","/dir",true], + ["/directory","/dir",false], + ]) +}) +.addBatch({ + "Cookie Sorting": { + topic: function() { + var cookies = []; + var now = Date.now(); + cookies.push(Cookie.parse("a=0; Domain=example.com")); + cookies.push(Cookie.parse("b=1; Domain=www.example.com")); + cookies.push(Cookie.parse("c=2; Domain=example.com; Path=/pathA")); + cookies.push(Cookie.parse("d=3; Domain=www.example.com; Path=/pathA")); + cookies.push(Cookie.parse("e=4; Domain=example.com; Path=/pathA/pathB")); + cookies.push(Cookie.parse("f=5; Domain=www.example.com; Path=/pathA/pathB")); + + // force a stable creation time consistent with the order above since + // some may have been created at now + 1ms. + var i = cookies.length; + cookies.forEach(function(cookie) { + cookie.creation = new Date(now - 100*(i--)); + }); + + // weak shuffle: + cookies = cookies.sort(function(){return Math.random()-0.5}); + + cookies = cookies.sort(tough.cookieCompare); + return cookies; + }, + "got": function(cookies) { + assert.lengthOf(cookies, 6); + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['e','f','c','d','a','b']); + }, + } +}) +.addBatch({ + "CookieJar": { + "Setting a basic cookie": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=example.com; Path=/"); + assert.strictEqual(c.hostOnly, null); + assert.instanceOf(c.creation, Date); + assert.strictEqual(c.lastAccessed, null); + c.creation = new Date(Date.now()-10000); + cj.setCookie(c, 'http://example.com/index.html', this.callback); + }, + "works": function(c) { assert.instanceOf(c,Cookie) }, // C is for Cookie, good enough for me + "gets timestamped": function(c) { + assert.ok(c.creation); + assert.ok(Date.now() - c.creation.getTime() < 5000); // recently stamped + assert.ok(c.lastAccessed); + assert.equal(c.creation, c.lastAccessed); + assert.equal(c.TTL(), Infinity); + assert.ok(!c.isPersistent()); + }, + }, + "Setting a no-path cookie": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=example.com"); + assert.strictEqual(c.hostOnly, null); + assert.instanceOf(c.creation, Date); + assert.strictEqual(c.lastAccessed, null); + c.creation = new Date(Date.now()-10000); + cj.setCookie(c, 'http://example.com/index.html', this.callback); + }, + "domain": function(c) { assert.equal(c.domain, 'example.com') }, + "path is /": function(c) { assert.equal(c.path, '/') }, + "path was derived": function(c) { assert.strictEqual(c.pathIsDefault, true) }, + }, + "Setting a cookie already marked as host-only": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=example.com"); + assert.strictEqual(c.hostOnly, null); + assert.instanceOf(c.creation, Date); + assert.strictEqual(c.lastAccessed, null); + c.creation = new Date(Date.now()-10000); + c.hostOnly = true; + cj.setCookie(c, 'http://example.com/index.html', this.callback); + }, + "domain": function(c) { assert.equal(c.domain, 'example.com') }, + "still hostOnly": function(c) { assert.strictEqual(c.hostOnly, true) }, + }, + "Setting a session cookie": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b"); + assert.strictEqual(c.path, null); + cj.setCookie(c, 'http://www.example.com/dir/index.html', this.callback); + }, + "works": function(c) { assert.instanceOf(c,Cookie) }, + "gets the domain": function(c) { assert.equal(c.domain, 'www.example.com') }, + "gets the default path": function(c) { assert.equal(c.path, '/dir') }, + "is 'hostOnly'": function(c) { assert.ok(c.hostOnly) }, + }, + "Setting wrong domain cookie": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=fooxample.com; Path=/"); + cj.setCookie(c, 'http://example.com/index.html', this.callback); + }, + "fails": function(err,c) { + assert.ok(err.message.match(/domain/i)); + assert.ok(!c); + }, + }, + "Setting sub-domain cookie": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=www.example.com; Path=/"); + cj.setCookie(c, 'http://example.com/index.html', this.callback); + }, + "fails": function(err,c) { + assert.ok(err.message.match(/domain/i)); + assert.ok(!c); + }, + }, + "Setting super-domain cookie": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=example.com; Path=/"); + cj.setCookie(c, 'http://www.app.example.com/index.html', this.callback); + }, + "success": function(err,c) { + assert.ok(!err); + assert.equal(c.domain, 'example.com'); + }, + }, + "Setting a sub-path cookie on a super-domain": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=example.com; Path=/subpath"); + assert.strictEqual(c.hostOnly, null); + assert.instanceOf(c.creation, Date); + assert.strictEqual(c.lastAccessed, null); + c.creation = new Date(Date.now()-10000); + cj.setCookie(c, 'http://www.example.com/index.html', this.callback); + }, + "domain is super-domain": function(c) { assert.equal(c.domain, 'example.com') }, + "path is /subpath": function(c) { assert.equal(c.path, '/subpath') }, + "path was NOT derived": function(c) { assert.strictEqual(c.pathIsDefault, null) }, + }, + "Setting HttpOnly cookie over non-HTTP API": { + topic: function() { + var cj = new CookieJar(); + var c = Cookie.parse("a=b; Domain=example.com; Path=/; HttpOnly"); + cj.setCookie(c, 'http://example.com/index.html', {http:false}, this.callback); + }, + "fails": function(err,c) { + assert.match(err.message, /HttpOnly/i); + assert.ok(!c); + }, + }, + }, + "Cookie Jar store eight cookies": { + topic: function() { + var cj = new CookieJar(); + var ex = 'http://example.com/index.html'; + var tasks = []; + tasks.push(function(next) { + cj.setCookie('a=1; Domain=example.com; Path=/',ex,at(0),next); + }); + tasks.push(function(next) { + cj.setCookie('b=2; Domain=example.com; Path=/; HttpOnly',ex,at(1000),next); + }); + tasks.push(function(next) { + cj.setCookie('c=3; Domain=example.com; Path=/; Secure',ex,at(2000),next); + }); + tasks.push(function(next) { // path + cj.setCookie('d=4; Domain=example.com; Path=/foo',ex,at(3000),next); + }); + tasks.push(function(next) { // host only + cj.setCookie('e=5',ex,at(4000),next); + }); + tasks.push(function(next) { // other domain + cj.setCookie('f=6; Domain=nodejs.org; Path=/','http://nodejs.org',at(5000),next); + }); + tasks.push(function(next) { // expired + cj.setCookie('g=7; Domain=example.com; Path=/; Expires=Tue, 18 Oct 2011 00:00:00 GMT',ex,at(6000),next); + }); + tasks.push(function(next) { // expired via Max-Age + cj.setCookie('h=8; Domain=example.com; Path=/; Max-Age=1',ex,next); + }); + var cb = this.callback; + async.parallel(tasks, function(err,results){ + setTimeout(function() { + cb(err,cj,results); + }, 2000); // so that 'h=8' expires + }); + }, + "setup ok": function(err,cj,results) { + assert.ok(!err); + assert.ok(cj); + assert.ok(results); + }, + "then retrieving for http://nodejs.org": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('http://nodejs.org',this.callback); + }, + "get a nodejs cookie": function(cookies) { + assert.lengthOf(cookies, 1); + var cookie = cookies[0]; + assert.equal(cookie.domain, 'nodejs.org'); + }, + }, + "then retrieving for https://example.com": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('https://example.com',{secure:true},this.callback); + }, + "get a secure example cookie with others": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['a','b','c','e']); + }, + }, + "then retrieving for https://example.com (missing options)": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('https://example.com',this.callback); + }, + "get a secure example cookie with others": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['a','b','c','e']); + }, + }, + "then retrieving for http://example.com": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('http://example.com',this.callback); + }, + "get a bunch of cookies": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['a','b','e']); + }, + }, + "then retrieving for http://EXAMPlE.com": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('http://EXAMPlE.com',this.callback); + }, + "get a bunch of cookies": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['a','b','e']); + }, + }, + "then retrieving for http://example.com, non-HTTP": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('http://example.com',{http:false},this.callback); + }, + "get a bunch of cookies": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['a','e']); + }, + }, + "then retrieving for http://example.com/foo/bar": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('http://example.com/foo/bar',this.callback); + }, + "get a bunch of cookies": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['d','a','b','e']); + }, + }, + "then retrieving for http://example.com as a string": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookieString('http://example.com',this.callback); + }, + "get a single string": function(cookieHeader) { + assert.equal(cookieHeader, "a=1; b=2; e=5"); + }, + }, + "then retrieving for http://example.com as a set-cookie header": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getSetCookieStrings('http://example.com',this.callback); + }, + "get a single string": function(cookieHeaders) { + assert.lengthOf(cookieHeaders, 3); + assert.equal(cookieHeaders[0], "a=1; Domain=example.com; Path=/"); + assert.equal(cookieHeaders[1], "b=2; Domain=example.com; Path=/; HttpOnly"); + assert.equal(cookieHeaders[2], "e=5; Path=/"); + }, + }, + "then retrieving for http://www.example.com/": { + topic: function(cj,oldResults) { + assert.ok(oldResults); + cj.getCookies('http://www.example.com/foo/bar',this.callback); + }, + "get a bunch of cookies": function(cookies) { + var names = cookies.map(function(c) {return c.key}); + assert.deepEqual(names, ['d','a','b']); // note lack of 'e' + }, + }, + }, + "Repeated names": { + topic: function() { + var cb = this.callback; + var cj = new CookieJar(); + var ex = 'http://www.example.com/'; + var sc = cj.setCookie; + var tasks = []; + var now = Date.now(); + tasks.push(sc.bind(cj,'aaaa=xxxx',ex,at(0))); + tasks.push(sc.bind(cj,'aaaa=1111; Domain=www.example.com',ex,at(1000))); + tasks.push(sc.bind(cj,'aaaa=2222; Domain=example.com',ex,at(2000))); + tasks.push(sc.bind(cj,'aaaa=3333; Domain=www.example.com; Path=/pathA',ex,at(3000))); + async.series(tasks,function(err,results) { + results = results.filter(function(e) {return e !== undefined}); + cb(err,{cj:cj, cookies:results, now:now}); + }); + }, + "all got set": function(err,t) { + assert.lengthOf(t.cookies,4); + }, + "then getting 'em back": { + topic: function(t) { + var cj = t.cj; + cj.getCookies('http://www.example.com/pathA',this.callback); + }, + "there's just three": function (err,cookies) { + var vals = cookies.map(function(c) {return c.value}); + // may break with sorting; sorting should put 3333 first due to longest path: + assert.deepEqual(vals, ['3333','1111','2222']); + } + }, + }, + "CookieJar setCookie errors": { + "public-suffix domain": { + topic: function() { + var cj = new CookieJar(); + cj.setCookie('i=9; Domain=kyoto.jp; Path=/','kyoto.jp',this.callback); + }, + "errors": function(err,cookie) { + assert.ok(err); + assert.ok(!cookie); + assert.match(err.message, /public suffix/i); + }, + }, + "wrong domain": { + topic: function() { + var cj = new CookieJar(); + cj.setCookie('j=10; Domain=google.com; Path=/','google.ca',this.callback); + }, + "errors": function(err,cookie) { + assert.ok(err); + assert.ok(!cookie); + assert.match(err.message, /not in this host's domain/i); + }, + }, + "old cookie is HttpOnly": { + topic: function() { + var cb = this.callback; + var next = function (err,c) { + c = null; + return cb(err,cj); + }; + var cj = new CookieJar(); + cj.setCookie('k=11; Domain=example.ca; Path=/; HttpOnly','http://example.ca',{http:true},next); + }, + "initial cookie is set": function(err,cj) { + assert.ok(!err); + assert.ok(cj); + }, + "but when trying to overwrite": { + topic: function(cj) { + var cb = this.callback; + var next = function(err,c) { + c = null; + cb(null,err); + }; + cj.setCookie('k=12; Domain=example.ca; Path=/','http://example.ca',{http:false},next); + }, + "it's an error": function(err) { + assert.ok(err); + }, + "then, checking the original": { + topic: function(ignored,cj) { + assert.ok(cj instanceof CookieJar); + cj.getCookies('http://example.ca',{http:true},this.callback); + }, + "cookie has original value": function(err,cookies) { + assert.equal(err,null); + assert.lengthOf(cookies, 1); + assert.equal(cookies[0].value,11); + }, + }, + }, + }, + }, +}) +.addBatch({ + "JSON": { + "serialization": { + topic: function() { + var c = Cookie.parse('alpha=beta; Domain=example.com; Path=/foo; Expires=Tue, 19 Jan 2038 03:14:07 GMT; HttpOnly'); + return JSON.stringify(c); + }, + "gives a string": function(str) { + assert.equal(typeof str, "string"); + }, + "date is in ISO format": function(str) { + assert.match(str, /"expires":"2038-01-19T03:14:07\.000Z"/, 'expires is in ISO format'); + }, + }, + "deserialization": { + topic: function() { + var json = '{"key":"alpha","value":"beta","domain":"example.com","path":"/foo","expires":"2038-01-19T03:14:07.000Z","httpOnly":true,"lastAccessed":2000000000123}'; + return Cookie.fromJSON(json); + }, + "works": function(c) { + assert.ok(c); + }, + "key": function(c) { assert.equal(c.key, "alpha") }, + "value": function(c) { assert.equal(c.value, "beta") }, + "domain": function(c) { assert.equal(c.domain, "example.com") }, + "path": function(c) { assert.equal(c.path, "/foo") }, + "httpOnly": function(c) { assert.strictEqual(c.httpOnly, true) }, + "secure": function(c) { assert.strictEqual(c.secure, false) }, + "hostOnly": function(c) { assert.strictEqual(c.hostOnly, null) }, + "expires is a date object": function(c) { + assert.equal(c.expires.getTime(), 2147483647000); + }, + "lastAccessed is a date object": function(c) { + assert.equal(c.lastAccessed.getTime(), 2000000000123); + }, + "creation defaulted": function(c) { + assert.ok(c.creation.getTime()); + } + }, + "null deserialization": { + topic: function() { + return Cookie.fromJSON(null); + }, + "is null": function(cookie) { + assert.equal(cookie,null); + }, + }, + }, + "expiry deserialization": { + "Infinity": { + topic: Cookie.fromJSON.bind(null, '{"expires":"Infinity"}'), + "is infinite": function(c) { + assert.strictEqual(c.expires, "Infinity"); + assert.equal(c.expires, Infinity); + }, + }, + }, + "maxAge serialization": { + topic: function() { + return function(toSet) { + var c = new Cookie(); + c.key = 'foo'; c.value = 'bar'; + c.setMaxAge(toSet); + return JSON.stringify(c); + }; + }, + "zero": { + topic: function(f) { return f(0) }, + "looks good": function(str) { + assert.match(str, /"maxAge":0/); + }, + }, + "Infinity": { + topic: function(f) { return f(Infinity) }, + "looks good": function(str) { + assert.match(str, /"maxAge":"Infinity"/); + }, + }, + "-Infinity": { + topic: function(f) { return f(-Infinity) }, + "looks good": function(str) { + assert.match(str, /"maxAge":"-Infinity"/); + }, + }, + "null": { + topic: function(f) { return f(null) }, + "looks good": function(str) { + assert.match(str, /"maxAge":null/); + }, + }, + }, + "maxAge deserialization": { + "number": { + topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":123}'), + "is the number": function(c) { + assert.strictEqual(c.maxAge, 123); + }, + }, + "null": { + topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":null}'), + "is null": function(c) { + assert.strictEqual(c.maxAge, null); + }, + }, + "less than zero": { + topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":-123}'), + "is -123": function(c) { + assert.strictEqual(c.maxAge, -123); + }, + }, + "Infinity": { + topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"Infinity"}'), + "is inf-as-string": function(c) { + assert.strictEqual(c.maxAge, "Infinity"); + }, + }, + "-Infinity": { + topic: Cookie.fromJSON.bind(null,'{"key":"foo","value":"bar","maxAge":"-Infinity"}'), + "is inf-as-string": function(c) { + assert.strictEqual(c.maxAge, "-Infinity"); + }, + }, + } +}) +.addBatch({ + "permuteDomain": { + "base case": { + topic: tough.permuteDomain.bind(null,'example.com'), + "got the domain": function(list) { + assert.deepEqual(list, ['example.com']); + }, + }, + "two levels": { + topic: tough.permuteDomain.bind(null,'foo.bar.example.com'), + "got three things": function(list) { + assert.deepEqual(list, ['example.com','bar.example.com','foo.bar.example.com']); + }, + }, + "invalid domain": { + topic: tough.permuteDomain.bind(null,'foo.bar.example.localduhmain'), + "got three things": function(list) { + assert.equal(list, null); + }, + }, + }, + "permutePath": { + "base case": { + topic: tough.permutePath.bind(null,'/'), + "just slash": function(list) { + assert.deepEqual(list,['/']); + }, + }, + "single case": { + topic: tough.permutePath.bind(null,'/foo'), + "two things": function(list) { + assert.deepEqual(list,['/foo','/']); + }, + "path matching": function(list) { + list.forEach(function(e) { + assert.ok(tough.pathMatch('/foo',e)); + }); + }, + }, + "double case": { + topic: tough.permutePath.bind(null,'/foo/bar'), + "four things": function(list) { + assert.deepEqual(list,['/foo/bar','/foo','/']); + }, + "path matching": function(list) { + list.forEach(function(e) { + assert.ok(tough.pathMatch('/foo/bar',e)); + }); + }, + }, + "trailing slash": { + topic: tough.permutePath.bind(null,'/foo/bar/'), + "three things": function(list) { + assert.deepEqual(list,['/foo/bar','/foo','/']); + }, + "path matching": function(list) { + list.forEach(function(e) { + assert.ok(tough.pathMatch('/foo/bar/',e)); + }); + }, + }, + } +}) +.addBatch({ + "Issue 1": { + topic: function() { + var cj = new CookieJar(); + cj.setCookie('hello=world; path=/some/path/', 'http://domain/some/path/file', function(err,cookie) { + this.callback(err,{cj:cj, cookie:cookie}); + }.bind(this)); + }, + "stored a cookie": function(t) { + assert.ok(t.cookie); + }, + "cookie's path was modified to remove unnecessary slash": function(t) { + assert.equal(t.cookie.path, '/some/path'); + }, + "getting it back": { + topic: function(t) { + t.cj.getCookies('http://domain/some/path/file', function(err,cookies) { + this.callback(err, {cj:t.cj, cookies:cookies||[]}); + }.bind(this)); + }, + "got one cookie": function(t) { + assert.lengthOf(t.cookies, 1); + }, + "it's the right one": function(t) { + var c = t.cookies[0]; + assert.equal(c.key, 'hello'); + assert.equal(c.value, 'world'); + }, + } + } +}) +.addBatch({ + "expiry option": { + topic: function() { + var cb = this.callback; + var cj = new CookieJar(); + cj.setCookie('near=expiry; Domain=example.com; Path=/; Max-Age=1','http://www.example.com',at(-1), function(err,cookie) { + + cb(err, {cj:cj, cookie:cookie}); + }); + }, + "set the cookie": function(t) { + assert.ok(t.cookie, "didn't set?!"); + assert.equal(t.cookie.key, 'near'); + }, + "then, retrieving": { + topic: function(t) { + var cb = this.callback; + setTimeout(function() { + t.cj.getCookies('http://www.example.com', {http:true, expire:false}, function(err,cookies) { + t.cookies = cookies; + cb(err,t); + }); + },2000); + }, + "got the cookie": function(t) { + assert.lengthOf(t.cookies, 1); + assert.equal(t.cookies[0].key, 'near'); + }, + } + } +}) +.addBatch({ + "trailing semi-colon set into cj": { + topic: function () { + var cb = this.callback; + var cj = new CookieJar(); + var ex = 'http://www.example.com'; + var tasks = []; + tasks.push(function(next) { + cj.setCookie('broken_path=testme; path=/;',ex,at(-1),next); + }); + tasks.push(function(next) { + cj.setCookie('b=2; Path=/;;;;',ex,at(-1),next); + }); + async.parallel(tasks, function (err, cookies) { + cb(null, { + cj: cj, + cookies: cookies + }); + }); + }, + "check number of cookies": function (t) { + assert.lengthOf(t.cookies, 2, "didn't set"); + }, + "check *broken_path* was set properly": function (t) { + assert.equal(t.cookies[0].key, "broken_path"); + assert.equal(t.cookies[0].value, "testme"); + assert.equal(t.cookies[0].path, "/"); + }, + "check *b* was set properly": function (t) { + assert.equal(t.cookies[1].key, "b"); + assert.equal(t.cookies[1].value, "2"); + assert.equal(t.cookies[1].path, "/"); + }, + "retrieve the cookie": { + topic: function (t) { + var cb = this.callback; + t.cj.getCookies('http://www.example.com', {}, function (err, cookies) { + t.cookies = cookies; + cb(err, t); + }); + }, + "get the cookie": function(t) { + assert.lengthOf(t.cookies, 2); + assert.equal(t.cookies[0].key, 'broken_path'); + assert.equal(t.cookies[0].value, 'testme'); + assert.equal(t.cookies[1].key, "b"); + assert.equal(t.cookies[1].value, "2"); + assert.equal(t.cookies[1].path, "/"); + }, + }, + } +}) +.addBatch({ + "Constructor":{ + topic: function () { + return new Cookie({ + key: 'test', + value: 'b', + maxAge: 60 + }); + }, + 'check for key property': function (c) { + assert.ok(c); + assert.equal(c.key, 'test'); + }, + 'check for value property': function (c) { + assert.equal(c.value, 'b'); + }, + 'check for maxAge': function (c) { + assert.equal(c.maxAge, 60); + }, + 'check for default values for unspecified properties': function (c) { + assert.equal(c.expires, "Infinity"); + assert.equal(c.secure, false); + assert.equal(c.httpOnly, false); + } + } +}) +.addBatch({ + "allPaths option": { + topic: function() { + var cj = new CookieJar(); + var tasks = []; + tasks.push(cj.setCookie.bind(cj, 'nopath_dom=qq; Path=/; Domain=example.com', 'http://example.com', {})); + tasks.push(cj.setCookie.bind(cj, 'path_dom=qq; Path=/foo; Domain=example.com', 'http://example.com', {})); + tasks.push(cj.setCookie.bind(cj, 'nopath_host=qq; Path=/', 'http://www.example.com', {})); + tasks.push(cj.setCookie.bind(cj, 'path_host=qq; Path=/foo', 'http://www.example.com', {})); + tasks.push(cj.setCookie.bind(cj, 'other=qq; Path=/', 'http://other.example.com/', {})); + tasks.push(cj.setCookie.bind(cj, 'other2=qq; Path=/foo', 'http://other.example.com/foo', {})); + var cb = this.callback; + async.parallel(tasks, function(err,results) { + cb(err, {cj:cj, cookies: results}); + }); + }, + "all set": function(t) { + assert.equal(t.cookies.length, 6); + assert.ok(t.cookies.every(function(c) { return !!c })); + }, + "getting without allPaths": { + topic: function(t) { + var cb = this.callback; + var cj = t.cj; + cj.getCookies('http://www.example.com/', {}, function(err,cookies) { + cb(err, {cj:cj, cookies:cookies}); + }); + }, + "found just two cookies": function(t) { + assert.equal(t.cookies.length, 2); + }, + "all are path=/": function(t) { + assert.ok(t.cookies.every(function(c) { return c.path === '/' })); + }, + "no 'other' cookies": function(t) { + assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) })); + }, + }, + "getting without allPaths for /foo": { + topic: function(t) { + var cb = this.callback; + var cj = t.cj; + cj.getCookies('http://www.example.com/foo', {}, function(err,cookies) { + cb(err, {cj:cj, cookies:cookies}); + }); + }, + "found four cookies": function(t) { + assert.equal(t.cookies.length, 4); + }, + "no 'other' cookies": function(t) { + assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) })); + }, + }, + "getting with allPaths:true": { + topic: function(t) { + var cb = this.callback; + var cj = t.cj; + cj.getCookies('http://www.example.com/', {allPaths:true}, function(err,cookies) { + cb(err, {cj:cj, cookies:cookies}); + }); + }, + "found four cookies": function(t) { + assert.equal(t.cookies.length, 4); + }, + "no 'other' cookies": function(t) { + assert.ok(!t.cookies.some(function(c) { return (/^other/).test(c.name) })); + }, + }, + } +}) +.addBatch({ + "remove cookies": { + topic: function() { + var jar = new CookieJar(); + var cookie = Cookie.parse("a=b; Domain=example.com; Path=/"); + var cookie2 = Cookie.parse("a=b; Domain=foo.com; Path=/"); + var cookie3 = Cookie.parse("foo=bar; Domain=foo.com; Path=/"); + jar.setCookie(cookie, 'http://example.com/index.html', function(){}); + jar.setCookie(cookie2, 'http://foo.com/index.html', function(){}); + jar.setCookie(cookie3, 'http://foo.com/index.html', function(){}); + return jar; + }, + "all from matching domain": function(jar){ + jar.store.removeCookies('example.com',null, function(err) { + assert(err == null); + + jar.store.findCookies('example.com', null, function(err, cookies){ + assert(err == null); + assert(cookies != null); + assert(cookies.length === 0, 'cookie was not removed'); + }); + + jar.store.findCookies('foo.com', null, function(err, cookies){ + assert(err == null); + assert(cookies != null); + assert(cookies.length === 2, 'cookies should not have been removed'); + }); + }); + }, + "from cookie store matching domain and key": function(jar){ + jar.store.removeCookie('foo.com', '/', 'foo', function(err) { + assert(err == null); + + jar.store.findCookies('foo.com', null, function(err, cookies){ + assert(err == null); + assert(cookies != null); + assert(cookies.length === 1, 'cookie was not removed correctly'); + assert(cookies[0].key === 'a', 'wrong cookie was removed'); + }); + }); + } + } +}) +.addBatch({ + "Synchronous CookieJar": { + "setCookieSync": { + topic: function() { + var jar = new CookieJar(); + var cookie = Cookie.parse("a=b; Domain=example.com; Path=/"); + cookie = jar.setCookieSync(cookie, 'http://example.com/index.html'); + return cookie; + }, + "returns a copy of the cookie": function(cookie) { + assert.instanceOf(cookie, Cookie); + } + }, + + "setCookieSync strict parse error": { + topic: function() { + var jar = new CookieJar(); + var opts = { strict: true }; + try { + jar.setCookieSync("farbe=weiß", 'http://example.com/index.html', opts); + return false; + } catch (e) { + return e; + } + }, + "throws the error": function(err) { + assert.instanceOf(err, Error); + assert.equal(err.message, "Cookie failed to parse"); + } + }, + + "getCookiesSync": { + topic: function() { + var jar = new CookieJar(); + var url = 'http://example.com/index.html'; + jar.setCookieSync("a=b; Domain=example.com; Path=/", url); + jar.setCookieSync("c=d; Domain=example.com; Path=/", url); + return jar.getCookiesSync(url); + }, + "returns the cookie array": function(err, cookies) { + assert.ok(!err); + assert.ok(Array.isArray(cookies)); + assert.lengthOf(cookies, 2); + cookies.forEach(function(cookie) { + assert.instanceOf(cookie, Cookie); + }); + } + }, + + "getCookieStringSync": { + topic: function() { + var jar = new CookieJar(); + var url = 'http://example.com/index.html'; + jar.setCookieSync("a=b; Domain=example.com; Path=/", url); + jar.setCookieSync("c=d; Domain=example.com; Path=/", url); + return jar.getCookieStringSync(url); + }, + "returns the cookie header string": function(err, str) { + assert.ok(!err); + assert.typeOf(str, 'string'); + } + }, + + "getSetCookieStringsSync": { + topic: function() { + var jar = new CookieJar(); + var url = 'http://example.com/index.html'; + jar.setCookieSync("a=b; Domain=example.com; Path=/", url); + jar.setCookieSync("c=d; Domain=example.com; Path=/", url); + return jar.getSetCookieStringsSync(url); + }, + "returns the cookie header string": function(err, headers) { + assert.ok(!err); + assert.ok(Array.isArray(headers)); + assert.lengthOf(headers, 2); + headers.forEach(function(header) { + assert.typeOf(header, 'string'); + }); + } + }, + } +}) +.addBatch({ + "Synchronous API on async CookieJar": { + topic: function() { + return new tough.Store(); + }, + "setCookieSync": { + topic: function(store) { + var jar = new CookieJar(store); + try { + jar.setCookieSync("a=b", 'http://example.com/index.html'); + return false; + } catch(e) { + return e; + } + }, + "fails": function(err) { + assert.instanceOf(err, Error); + assert.equal(err.message, + 'CookieJar store is not synchronous; use async API instead.'); + } + }, + "getCookiesSync": { + topic: function(store) { + var jar = new CookieJar(store); + try { + jar.getCookiesSync('http://example.com/index.html'); + return false; + } catch(e) { + return e; + } + }, + "fails": function(err) { + assert.instanceOf(err, Error); + assert.equal(err.message, + 'CookieJar store is not synchronous; use async API instead.'); + } + }, + "getCookieStringSync": { + topic: function(store) { + var jar = new CookieJar(store); + try { + jar.getCookieStringSync('http://example.com/index.html'); + return false; + } catch(e) { + return e; + } + }, + "fails": function(err) { + assert.instanceOf(err, Error); + assert.equal(err.message, + 'CookieJar store is not synchronous; use async API instead.'); + } + }, + "getSetCookieStringsSync": { + topic: function(store) { + var jar = new CookieJar(store); + try { + jar.getSetCookieStringsSync('http://example.com/index.html'); + return false; + } catch(e) { + return e; + } + }, + "fails": function(err) { + assert.instanceOf(err, Error); + assert.equal(err.message, + 'CookieJar store is not synchronous; use async API instead.'); + } + }, + } +}) +.export(module); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/.jshintrc b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/.jshintrc new file mode 100644 index 0000000..4c1c8d4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/.jshintrc @@ -0,0 +1,5 @@ +{ + "node": true, + "asi": true, + "laxcomma": true +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE new file mode 100644 index 0000000..a4a9aee --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE @@ -0,0 +1,55 @@ +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md new file mode 100644 index 0000000..bb533d5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md @@ -0,0 +1,4 @@ +tunnel-agent +============ + +HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js new file mode 100644 index 0000000..13c0427 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js @@ -0,0 +1,236 @@ +'use strict' + +var net = require('net') + , tls = require('tls') + , http = require('http') + , https = require('https') + , events = require('events') + , assert = require('assert') + , util = require('util') + ; + +exports.httpOverHttp = httpOverHttp +exports.httpsOverHttp = httpsOverHttp +exports.httpOverHttps = httpOverHttps +exports.httpsOverHttps = httpsOverHttps + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + return agent +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options) + agent.request = http.request + agent.createSocket = createSecureSocket + return agent +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + return agent +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options) + agent.request = https.request + agent.createSocket = createSecureSocket + return agent +} + + +function TunnelingAgent(options) { + var self = this + self.options = options || {} + self.proxyOptions = self.options.proxy || {} + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets + self.requests = [] + self.sockets = [] + + self.on('free', function onFree(socket, host, port) { + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i] + if (pending.host === host && pending.port === port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1) + pending.request.onSocket(socket) + return + } + } + socket.destroy() + self.removeSocket(socket) + }) +} +util.inherits(TunnelingAgent, events.EventEmitter) + +TunnelingAgent.prototype.addRequest = function addRequest(req, options) { + var self = this + + // Legacy API: addRequest(req, host, port, path) + if (typeof options === 'string') { + options = { + host: options, + port: arguments[2], + path: arguments[3] + }; + } + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push({host: host, port: port, request: req}) + return + } + + // If we are under maxSockets create a new one. + self.createSocket({host: options.host, port: options.port, request: req}, function(socket) { + socket.on('free', onFree) + socket.on('close', onCloseOrRemove) + socket.on('agentRemove', onCloseOrRemove) + req.onSocket(socket) + + function onFree() { + self.emit('free', socket, options.host, options.port) + } + + function onCloseOrRemove(err) { + self.removeSocket() + socket.removeListener('free', onFree) + socket.removeListener('close', onCloseOrRemove) + socket.removeListener('agentRemove', onCloseOrRemove) + } + }) +} + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this + var placeholder = {} + self.sockets.push(placeholder) + + var connectOptions = mergeOptions({}, self.proxyOptions, + { method: 'CONNECT' + , path: options.host + ':' + options.port + , agent: false + } + ) + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {} + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64') + } + + debug('making CONNECT request') + var connectReq = self.request(connectOptions) + connectReq.useChunkedEncodingByDefault = false // for v0.6 + connectReq.once('response', onResponse) // for v0.6 + connectReq.once('upgrade', onUpgrade) // for v0.6 + connectReq.once('connect', onConnect) // for v0.7 or later + connectReq.once('error', onError) + connectReq.end() + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head) + }) + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners() + socket.removeAllListeners() + + if (res.statusCode === 200) { + assert.equal(head.length, 0) + debug('tunneling connection has established') + self.sockets[self.sockets.indexOf(placeholder)] = socket + cb(socket) + } else { + debug('tunneling socket could not be established, statusCode=%d', res.statusCode) + var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } + } + + function onError(cause) { + connectReq.removeAllListeners() + + debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) + var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) + error.code = 'ECONNRESET' + options.request.emit('error', error) + self.removeSocket(placeholder) + } +} + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) return + + this.sockets.splice(pos, 1) + + var pending = this.requests.shift() + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket) + }) + } +} + +function createSecureSocket(options, cb) { + var self = this + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, mergeOptions({}, self.options, + { servername: options.host + , socket: socket + } + )) + cb(secureSocket) + }) +} + + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i] + if (typeof overrides === 'object') { + var keys = Object.keys(overrides) + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j] + if (overrides[k] !== undefined) { + target[k] = overrides[k] + } + } + } + } + return target +} + + +var debug +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments) + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0] + } else { + args.unshift('TUNNEL:') + } + console.error.apply(console, args) + } +} else { + debug = function() {} +} +exports.debug = debug // for test diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json new file mode 100644 index 0000000..0b00d7e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json @@ -0,0 +1,46 @@ +{ + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com", + "url": "http://www.futurealoof.com" + }, + "name": "tunnel-agent", + "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.", + "version": "0.4.0", + "repository": { + "url": "https://github.com/mikeal/tunnel-agent" + }, + "main": "index.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "bugs": { + "url": "https://github.com/mikeal/tunnel-agent/issues" + }, + "homepage": "https://github.com/mikeal/tunnel-agent", + "_id": "tunnel-agent@0.4.0", + "dist": { + "shasum": "b1184e312ffbcf70b3b4c78e8c219de7ebb1c550", + "tarball": "http://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz" + }, + "_from": "tunnel-agent@~0.4.0", + "_npmVersion": "1.3.21", + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "maintainers": [ + { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + } + ], + "directories": {}, + "_shasum": "b1184e312ffbcf70b3b4c78e8c219de7ebb1c550", + "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz", + "readme": "ERROR: No README data found!", + "scripts": {} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/package.json new file mode 100755 index 0000000..b87944b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/package.json @@ -0,0 +1,80 @@ +{ + "name": "request", + "description": "Simplified HTTP request client.", + "tags": [ + "http", + "simple", + "util", + "utility" + ], + "version": "2.44.0", + "author": { + "name": "Mikeal Rogers", + "email": "mikeal.rogers@gmail.com" + }, + "repository": { + "type": "git", + "url": "https://github.com/mikeal/request.git" + }, + "bugs": { + "url": "http://github.com/mikeal/request/issues" + }, + "license": "Apache-2.0", + "engines": [ + "node >= 0.8.0" + ], + "main": "index.js", + "dependencies": { + "bl": "~0.9.0", + "caseless": "~0.6.0", + "forever-agent": "~0.5.0", + "qs": "~1.2.0", + "json-stringify-safe": "~5.0.0", + "mime-types": "~1.0.1", + "node-uuid": "~1.4.0", + "tunnel-agent": "~0.4.0", + "tough-cookie": ">=0.12.0", + "form-data": "~0.1.0", + "http-signature": "~0.10.0", + "oauth-sign": "~0.4.0", + "hawk": "1.1.1", + "aws-sign2": "~0.5.0", + "stringstream": "~0.0.4" + }, + "optionalDependencies": { + "tough-cookie": ">=0.12.0", + "form-data": "~0.1.0", + "http-signature": "~0.10.0", + "oauth-sign": "~0.4.0", + "hawk": "1.1.1", + "aws-sign2": "~0.5.0", + "stringstream": "~0.0.4" + }, + "scripts": { + "test": "node tests/run.js" + }, + "devDependencies": { + "rimraf": "~2.2.8" + }, + "homepage": "https://github.com/mikeal/request", + "_id": "request@2.44.0", + "_shasum": "78d62454d68853cadfb07ad31f58b9ec98072ea8", + "_from": "request@2.x", + "_npmVersion": "1.4.9", + "_npmUser": { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + }, + "maintainers": [ + { + "name": "mikeal", + "email": "mikeal.rogers@gmail.com" + } + ], + "dist": { + "shasum": "78d62454d68853cadfb07ad31f58b9ec98072ea8", + "tarball": "http://registry.npmjs.org/request/-/request-2.44.0.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/request/-/request-2.44.0.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/request.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/request.js new file mode 100644 index 0000000..8a29c35 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/request/request.js @@ -0,0 +1,1497 @@ +var optional = require('./lib/optional') + , http = require('http') + , https = optional('https') + , tls = optional('tls') + , url = require('url') + , util = require('util') + , stream = require('stream') + , qs = require('qs') + , querystring = require('querystring') + , crypto = require('crypto') + , zlib = require('zlib') + + , bl = require('bl') + , oauth = optional('oauth-sign') + , hawk = optional('hawk') + , aws = optional('aws-sign2') + , httpSignature = optional('http-signature') + , uuid = require('node-uuid') + , mime = require('mime-types') + , tunnel = require('tunnel-agent') + , _safeStringify = require('json-stringify-safe') + , stringstream = optional('stringstream') + , caseless = require('caseless') + + , ForeverAgent = require('forever-agent') + , FormData = optional('form-data') + + , cookies = require('./lib/cookies') + , globalCookieJar = cookies.jar() + + , copy = require('./lib/copy') + , debug = require('./lib/debug') + , net = require('net') + ; + +function safeStringify (obj) { + var ret + try { ret = JSON.stringify(obj) } + catch (e) { ret = _safeStringify(obj) } + return ret +} + +var globalPool = {} +var isUrl = /^https?:|^unix:/ + +var defaultProxyHeaderWhiteList = [ + 'accept', + 'accept-charset', + 'accept-encoding', + 'accept-language', + 'accept-ranges', + 'cache-control', + 'content-encoding', + 'content-language', + 'content-length', + 'content-location', + 'content-md5', + 'content-range', + 'content-type', + 'connection', + 'date', + 'expect', + 'max-forwards', + 'pragma', + 'proxy-authorization', + 'referer', + 'te', + 'transfer-encoding', + 'user-agent', + 'via' +] + +function isReadStream (rs) { + return rs.readable && rs.path && rs.mode; +} + +function toBase64 (str) { + return (new Buffer(str || "", "ascii")).toString("base64") +} + +function md5 (str) { + return crypto.createHash('md5').update(str).digest('hex') +} + +// Return a simpler request object to allow serialization +function requestToJSON() { + return { + uri: this.uri, + method: this.method, + headers: this.headers + } +} + +// Return a simpler response object to allow serialization +function responseToJSON() { + return { + statusCode: this.statusCode, + body: this.body, + headers: this.headers, + request: requestToJSON.call(this.request) + } +} + +function Request (options) { + stream.Stream.call(this) + this.readable = true + this.writable = true + + if (typeof options === 'string') { + options = {uri:options} + } + + var reserved = Object.keys(Request.prototype) + for (var i in options) { + if (reserved.indexOf(i) === -1) { + this[i] = options[i] + } else { + if (typeof options[i] === 'function') { + delete options[i] + } + } + } + + if (options.method) { + this.explicitMethod = true + } + + // Assume that we're not going to tunnel unless we need to + if (typeof options.tunnel === 'undefined') options.tunnel = false + + this.init(options) +} +util.inherits(Request, stream.Stream) + + +// Set up the tunneling agent if necessary +Request.prototype.setupTunnel = function () { + var self = this + if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) + + if (!self.proxy) return false + + // Don't need to use a tunneling proxy + if (!self.tunnel && self.uri.protocol !== 'https:') + return + + // do the HTTP CONNECT dance using koichik/node-tunnel + + // The host to tell the proxy to CONNECT to + var proxyHost = self.uri.hostname + ':' + if (self.uri.port) + proxyHost += self.uri.port + else if (self.uri.protocol === 'https:') + proxyHost += '443' + else + proxyHost += '80' + + if (!self.proxyHeaderWhiteList) + self.proxyHeaderWhiteList = defaultProxyHeaderWhiteList + + // Only send the proxy the whitelisted header names. + var proxyHeaders = Object.keys(self.headers).filter(function (h) { + return self.proxyHeaderWhiteList.indexOf(h.toLowerCase()) !== -1 + }).reduce(function (set, h) { + set[h] = self.headers[h] + return set + }, {}) + + proxyHeaders.host = proxyHost + + var tunnelFnName = + (self.uri.protocol === 'https:' ? 'https' : 'http') + + 'Over' + + (self.proxy.protocol === 'https:' ? 'Https' : 'Http') + + var tunnelFn = tunnel[tunnelFnName] + + var proxyAuth + if (self.proxy.auth) + proxyAuth = self.proxy.auth + else if (self.proxyAuthorization) + proxyHeaders['Proxy-Authorization'] = self.proxyAuthorization + + var tunnelOptions = { proxy: { host: self.proxy.hostname + , port: +self.proxy.port + , proxyAuth: proxyAuth + , headers: proxyHeaders } + , rejectUnauthorized: self.rejectUnauthorized + , headers: self.headers + , ca: self.ca + , cert: self.cert + , key: self.key} + + self.agent = tunnelFn(tunnelOptions) + + // At this point, we know that the proxy will support tunneling + // (or fail miserably), so we're going to tunnel all proxied requests + // from here on out. + self.tunnel = true + + return true +} + + + + +Request.prototype.init = function (options) { + // init() contains all the code to setup the request object. + // the actual outgoing request is not started until start() is called + // this function is called from both the constructor and on redirect. + var self = this + if (!options) options = {} + self.headers = self.headers ? copy(self.headers) : {} + + caseless.httpify(self, self.headers) + + // Never send proxy-auth to the endpoint! + if (self.hasHeader('proxy-authorization')) { + self.proxyAuthorization = self.getHeader('proxy-authorization') + self.removeHeader('proxy-authorization') + } + + if (!self.method) self.method = options.method || 'GET' + self.localAddress = options.localAddress + + debug(options) + if (!self.pool && self.pool !== false) self.pool = globalPool + self.dests = self.dests || [] + self.__isRequestRequest = true + + // Protect against double callback + if (!self._callback && self.callback) { + self._callback = self.callback + self.callback = function () { + if (self._callbackCalled) return // Print a warning maybe? + self._callbackCalled = true + self._callback.apply(self, arguments) + } + self.on('error', self.callback.bind()) + self.on('complete', self.callback.bind(self, null)) + } + + if (self.url && !self.uri) { + // People use this property instead all the time so why not just support it. + self.uri = self.url + delete self.url + } + + if (!self.uri) { + // this will throw if unhandled but is handleable when in a redirect + return self.emit('error', new Error("options.uri is a required argument")) + } else { + if (typeof self.uri == "string") self.uri = url.parse(self.uri) + } + + if (self.strictSSL === false) { + self.rejectUnauthorized = false + } + + if(!self.hasOwnProperty('proxy')) { + // check for HTTP(S)_PROXY environment variables + if(self.uri.protocol == "http:") { + self.proxy = process.env.HTTP_PROXY || process.env.http_proxy || null; + } else if(self.uri.protocol == "https:") { + self.proxy = process.env.HTTPS_PROXY || process.env.https_proxy || + process.env.HTTP_PROXY || process.env.http_proxy || null; + } + } + + // Pass in `tunnel:true` to *always* tunnel through proxies + self.tunnel = !!options.tunnel + if (self.proxy) { + self.setupTunnel() + } + + if (!self.uri.pathname) {self.uri.pathname = '/'} + + if (!self.uri.host && !self.protocol=='unix:') { + // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar + // Detect and reject it as soon as possible + var faultyUri = url.format(self.uri) + var message = 'Invalid URI "' + faultyUri + '"' + if (Object.keys(options).length === 0) { + // No option ? This can be the sign of a redirect + // As this is a case where the user cannot do anything (they didn't call request directly with this URL) + // they should be warned that it can be caused by a redirection (can save some hair) + message += '. This can be caused by a crappy redirection.' + } + self.emit('error', new Error(message)) + return // This error was fatal + } + + self._redirectsFollowed = self._redirectsFollowed || 0 + self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 + self.allowRedirect = (typeof self.followRedirect === 'function') ? self.followRedirect : function(response) { + return true; + }; + self.followRedirect = (self.followRedirect !== undefined) ? !!self.followRedirect : true + self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false + if (self.followRedirect || self.followAllRedirects) + self.redirects = self.redirects || [] + + self.setHost = false + if (!self.hasHeader('host')) { + self.setHeader('host', self.uri.hostname) + if (self.uri.port) { + if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && + !(self.uri.port === 443 && self.uri.protocol === 'https:') ) + self.setHeader('host', self.getHeader('host') + (':'+self.uri.port) ) + } + self.setHost = true + } + + self.jar(self._jar || options.jar) + + if (!self.uri.port) { + if (self.uri.protocol == 'http:') {self.uri.port = 80} + else if (self.uri.protocol == 'https:') {self.uri.port = 443} + } + + if (self.proxy && !self.tunnel) { + self.port = self.proxy.port + self.host = self.proxy.hostname + } else { + self.port = self.uri.port + self.host = self.uri.hostname + } + + self.clientErrorHandler = function (error) { + if (self._aborted) return + if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' + && self.agent.addRequestNoreuse) { + self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } + self.start() + self.req.end() + return + } + if (self.timeout && self.timeoutTimer) { + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + } + self.emit('error', error) + } + + self._parserErrorHandler = function (error) { + if (this.res) { + if (this.res.request) { + this.res.request.emit('error', error) + } else { + this.res.emit('error', error) + } + } else { + this._httpMessage.emit('error', error) + } + } + + self._buildRequest = function(){ + var self = this; + + if (options.form) { + self.form(options.form) + } + + if (options.qs) self.qs(options.qs) + + if (self.uri.path) { + self.path = self.uri.path + } else { + self.path = self.uri.pathname + (self.uri.search || "") + } + + if (self.path.length === 0) self.path = '/' + + + // Auth must happen last in case signing is dependent on other headers + if (options.oauth) { + self.oauth(options.oauth) + } + + if (options.aws) { + self.aws(options.aws) + } + + if (options.hawk) { + self.hawk(options.hawk) + } + + if (options.httpSignature) { + self.httpSignature(options.httpSignature) + } + + if (options.auth) { + if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) options.auth.user = options.auth.username + if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) options.auth.pass = options.auth.password + + self.auth( + options.auth.user, + options.auth.pass, + options.auth.sendImmediately, + options.auth.bearer + ) + } + + if (self.gzip && !self.hasHeader('accept-encoding')) { + self.setHeader('accept-encoding', 'gzip') + } + + if (self.uri.auth && !self.hasHeader('authorization')) { + var authPieces = self.uri.auth.split(':').map(function(item){ return querystring.unescape(item) }) + self.auth(authPieces[0], authPieces.slice(1).join(':'), true) + } + + if (self.proxy && !self.tunnel) { + if (self.proxy.auth && !self.proxyAuthorization) { + var authPieces = self.proxy.auth.split(':').map(function(item){ + return querystring.unescape(item) + }) + var authHeader = 'Basic ' + toBase64(authPieces.join(':')) + self.proxyAuthorization = authHeader + } + if (self.proxyAuthorization) + self.setHeader('proxy-authorization', self.proxyAuthorization) + } + + if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) + + if (options.json) { + self.json(options.json) + } else if (options.multipart) { + self.boundary = uuid() + self.multipart(options.multipart) + } + + if (self.body) { + var length = 0 + if (!Buffer.isBuffer(self.body)) { + if (Array.isArray(self.body)) { + for (var i = 0; i < self.body.length; i++) { + length += self.body[i].length + } + } else { + self.body = new Buffer(self.body) + length = self.body.length + } + } else { + length = self.body.length + } + if (length) { + if (!self.hasHeader('content-length')) self.setHeader('content-length', length) + } else { + throw new Error('Argument error, options.body.') + } + } + + var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol + , defaultModules = {'http:':http, 'https:':https, 'unix:':http} + , httpModules = self.httpModules || {} + ; + self.httpModule = httpModules[protocol] || defaultModules[protocol] + + if (!self.httpModule) return this.emit('error', new Error("Invalid protocol: " + protocol)) + + if (options.ca) self.ca = options.ca + + if (!self.agent) { + if (options.agentOptions) self.agentOptions = options.agentOptions + + if (options.agentClass) { + self.agentClass = options.agentClass + } else if (options.forever) { + self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL + } else { + self.agentClass = self.httpModule.Agent + } + } + + if (self.pool === false) { + self.agent = false + } else { + self.agent = self.agent || self.getAgent() + if (self.maxSockets) { + // Don't use our pooling if node has the refactored client + self.agent.maxSockets = self.maxSockets + } + if (self.pool.maxSockets) { + // Don't use our pooling if node has the refactored client + self.agent.maxSockets = self.pool.maxSockets + } + } + + self.on('pipe', function (src) { + if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.") + self.src = src + if (isReadStream(src)) { + if (!self.hasHeader('content-type')) self.setHeader('content-type', mime.lookup(src.path)) + } else { + if (src.headers) { + for (var i in src.headers) { + if (!self.hasHeader(i)) { + self.setHeader(i, src.headers[i]) + } + } + } + if (self._json && !self.hasHeader('content-type')) + self.setHeader('content-type', 'application/json') + if (src.method && !self.explicitMethod) { + self.method = src.method + } + } + + // self.on('pipe', function () { + // console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") + // }) + }) + + process.nextTick(function () { + if (self._aborted) return + + var end = function () { + if (self._form) { + self._form.pipe(self) + } + if (self.body) { + if (Array.isArray(self.body)) { + self.body.forEach(function (part) { + self.write(part) + }) + } else { + self.write(self.body) + } + self.end() + } else if (self.requestBodyStream) { + console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") + self.requestBodyStream.pipe(self) + } else if (!self.src) { + if (self.method !== 'GET' && typeof self.method !== 'undefined') { + self.setHeader('content-length', 0) + } + self.end() + } + } + + if (self._form && !self.hasHeader('content-length')) { + // Before ending the request, we had to compute the length of the whole form, asyncly + self.setHeader(self._form.getHeaders()) + self._form.getLength(function (err, length) { + if (!err) { + self.setHeader('content-length', length) + } + end() + }) + } else { + end() + } + + self.ntick = true + }) + + } // End _buildRequest + + self._handleUnixSocketURI = function(self){ + // Parse URI and extract a socket path (tested as a valid socket using net.connect), and a http style path suffix + // Thus http requests can be made to a socket using the uri unix://tmp/my.socket/urlpath + // and a request for '/urlpath' will be sent to the unix socket at /tmp/my.socket + + self.unixsocket = true; + + var full_path = self.uri.href.replace(self.uri.protocol+'/', ''); + + var lookup = full_path.split('/'); + var error_connecting = true; + + var lookup_table = {}; + do { lookup_table[lookup.join('/')]={} } while(lookup.pop()) + for (r in lookup_table){ + try_next(r); + } + + function try_next(table_row){ + var client = net.connect( table_row ); + client.path = table_row + client.on('error', function(){ lookup_table[this.path].error_connecting=true; this.end(); }); + client.on('connect', function(){ lookup_table[this.path].error_connecting=false; this.end(); }); + table_row.client = client; + } + + wait_for_socket_response(); + + response_counter = 0; + + function wait_for_socket_response(){ + var detach; + if('undefined' == typeof setImmediate ) detach = process.nextTick + else detach = setImmediate; + detach(function(){ + // counter to prevent infinite blocking waiting for an open socket to be found. + response_counter++; + var trying = false; + for (r in lookup_table){ + if('undefined' == typeof lookup_table[r].error_connecting) + trying = true; + } + if(trying && response_counter<1000) + wait_for_socket_response() + else + set_socket_properties(); + }) + } + + function set_socket_properties(){ + var host; + for (r in lookup_table){ + if(lookup_table[r].error_connecting === false){ + host = r + } + } + if(!host){ + self.emit('error', new Error("Failed to connect to any socket in "+full_path)) + } + var path = full_path.replace(host, '') + + self.socketPath = host + self.uri.pathname = path + self.uri.href = path + self.uri.path = path + self.host = '' + self.hostname = '' + delete self.host + delete self.hostname + self._buildRequest(); + } + } + + // Intercept UNIX protocol requests to change properties to match socket + if(/^unix:/.test(self.uri.protocol)){ + self._handleUnixSocketURI(self); + } else { + self._buildRequest(); + } + +} + +// Must call this when following a redirect from https to http or vice versa +// Attempts to keep everything as identical as possible, but update the +// httpModule, Tunneling agent, and/or Forever Agent in use. +Request.prototype._updateProtocol = function () { + var self = this + var protocol = self.uri.protocol + + if (protocol === 'https:' || self.tunnel) { + // previously was doing http, now doing https + // if it's https, then we might need to tunnel now. + if (self.proxy) { + if (self.setupTunnel()) return + } + + self.httpModule = https + switch (self.agentClass) { + case ForeverAgent: + self.agentClass = ForeverAgent.SSL + break + case http.Agent: + self.agentClass = https.Agent + break + default: + // nothing we can do. Just hope for the best. + return + } + + // if there's an agent, we need to get a new one. + if (self.agent) self.agent = self.getAgent() + + } else { + // previously was doing https, now doing http + self.httpModule = http + switch (self.agentClass) { + case ForeverAgent.SSL: + self.agentClass = ForeverAgent + break + case https.Agent: + self.agentClass = http.Agent + break + default: + // nothing we can do. just hope for the best + return + } + + // if there's an agent, then get a new one. + if (self.agent) { + self.agent = null + self.agent = self.getAgent() + } + } +} + +Request.prototype.getAgent = function () { + var Agent = this.agentClass + var options = {} + if (this.agentOptions) { + for (var i in this.agentOptions) { + options[i] = this.agentOptions[i] + } + } + if (this.ca) options.ca = this.ca + if (this.ciphers) options.ciphers = this.ciphers + if (this.secureProtocol) options.secureProtocol = this.secureProtocol + if (this.secureOptions) options.secureOptions = this.secureOptions + if (typeof this.rejectUnauthorized !== 'undefined') options.rejectUnauthorized = this.rejectUnauthorized + + if (this.cert && this.key) { + options.key = this.key + options.cert = this.cert + } + + var poolKey = '' + + // different types of agents are in different pools + if (Agent !== this.httpModule.Agent) { + poolKey += Agent.name + } + + if (!this.httpModule.globalAgent) { + // node 0.4.x + options.host = this.host + options.port = this.port + if (poolKey) poolKey += ':' + poolKey += this.host + ':' + this.port + } + + // ca option is only relevant if proxy or destination are https + var proxy = this.proxy + if (typeof proxy === 'string') proxy = url.parse(proxy) + var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' + if (isHttps) { + if (options.ca) { + if (poolKey) poolKey += ':' + poolKey += options.ca + } + + if (typeof options.rejectUnauthorized !== 'undefined') { + if (poolKey) poolKey += ':' + poolKey += options.rejectUnauthorized + } + + if (options.cert) + poolKey += options.cert.toString('ascii') + options.key.toString('ascii') + + if (options.ciphers) { + if (poolKey) poolKey += ':' + poolKey += options.ciphers + } + + if (options.secureProtocol) { + if (poolKey) poolKey += ':' + poolKey += options.secureProtocol + } + + if (options.secureOptions) { + if (poolKey) poolKey += ':' + poolKey += options.secureOptions + } + } + + if (this.pool === globalPool && !poolKey && Object.keys(options).length === 0 && this.httpModule.globalAgent) { + // not doing anything special. Use the globalAgent + return this.httpModule.globalAgent + } + + // we're using a stored agent. Make sure it's protocol-specific + poolKey = this.uri.protocol + poolKey + + // already generated an agent for this setting + if (this.pool[poolKey]) return this.pool[poolKey] + + return this.pool[poolKey] = new Agent(options) +} + +Request.prototype.start = function () { + // start() is called once we are ready to send the outgoing HTTP request. + // this is usually called on the first write(), end() or on nextTick() + var self = this + + if (self._aborted) return + + self._started = true + self.method = self.method || 'GET' + self.href = self.uri.href + + if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) { + self.setHeader('content-length', self.src.stat.size) + } + if (self._aws) { + self.aws(self._aws, true) + } + + // We have a method named auth, which is completely different from the http.request + // auth option. If we don't remove it, we're gonna have a bad time. + var reqOptions = copy(self) + delete reqOptions.auth + + debug('make request', self.uri.href) + self.req = self.httpModule.request(reqOptions, self.onResponse.bind(self)) + + if (self.timeout && !self.timeoutTimer) { + self.timeoutTimer = setTimeout(function () { + self.req.abort() + var e = new Error("ETIMEDOUT") + e.code = "ETIMEDOUT" + self.emit("error", e) + }, self.timeout) + + // Set additional timeout on socket - in case if remote + // server freeze after sending headers + if (self.req.setTimeout) { // only works on node 0.6+ + self.req.setTimeout(self.timeout, function () { + if (self.req) { + self.req.abort() + var e = new Error("ESOCKETTIMEDOUT") + e.code = "ESOCKETTIMEDOUT" + self.emit("error", e) + } + }) + } + } + + self.req.on('error', self.clientErrorHandler) + self.req.on('drain', function() { + self.emit('drain') + }) + self.on('end', function() { + if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler) + }) + self.emit('request', self.req) +} +Request.prototype.onResponse = function (response) { + var self = this + debug('onResponse', self.uri.href, response.statusCode, response.headers) + response.on('end', function() { + debug('response end', self.uri.href, response.statusCode, response.headers) + }); + + // The check on response.connection is a workaround for browserify. + if (response.connection && response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { + response.connection.setMaxListeners(0) + response.connection.once('error', self._parserErrorHandler) + } + if (self._aborted) { + debug('aborted', self.uri.href) + response.resume() + return + } + if (self._paused) response.pause() + // Check that response.resume is defined. Workaround for browserify. + else response.resume && response.resume() + + self.response = response + response.request = self + response.toJSON = responseToJSON + + // XXX This is different on 0.10, because SSL is strict by default + if (self.httpModule === https && + self.strictSSL && (!response.hasOwnProperty('client') || + !response.client.authorized)) { + debug('strict ssl error', self.uri.href) + var sslErr = response.hasOwnProperty('client') ? response.client.authorizationError : self.uri.href + " does not support SSL"; + self.emit('error', new Error('SSL Error: '+ sslErr)) + return + } + + if (self.setHost) self.removeHeader('host') + if (self.timeout && self.timeoutTimer) { + clearTimeout(self.timeoutTimer) + self.timeoutTimer = null + } + + var targetCookieJar = (self._jar && self._jar.setCookieSync)?self._jar:globalCookieJar; + var addCookie = function (cookie) { + //set the cookie if it's domain in the href's domain. + try { + targetCookieJar.setCookieSync(cookie, self.uri.href, {ignoreError: true}); + } catch (e) { + self.emit('error', e); + } + } + + response.caseless = caseless(response.headers) + + if (response.caseless.has('set-cookie') && (!self._disableCookies)) { + var headerName = response.caseless.has('set-cookie') + if (Array.isArray(response.headers[headerName])) response.headers[headerName].forEach(addCookie) + else addCookie(response.headers[headerName]) + } + + var redirectTo = null + if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) { + var location = response.caseless.get('location') + debug('redirect', location) + + if (self.followAllRedirects) { + redirectTo = location + } else if (self.followRedirect) { + switch (self.method) { + case 'PATCH': + case 'PUT': + case 'POST': + case 'DELETE': + // Do not follow redirects + break + default: + redirectTo = location + 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]) { + //ignore + } else 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 + } + } + + if (redirectTo && self.allowRedirect.call(self, response)) { + debug('redirect to', redirectTo) + + // ignore any potential response body. it cannot possibly be useful + // to us at this point. + if (self._paused) response.resume() + + if (self._redirectsFollowed >= self.maxRedirects) { + self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href)) + return + } + self._redirectsFollowed += 1 + + if (!isUrl.test(redirectTo)) { + redirectTo = url.resolve(self.uri.href, redirectTo) + } + + var uriPrev = self.uri + self.uri = url.parse(redirectTo) + + // handle the case where we change protocol from https to http or vice versa + if (self.uri.protocol !== uriPrev.protocol) { + self._updateProtocol() + } + + self.redirects.push( + { statusCode : response.statusCode + , redirectUri: redirectTo + } + ) + if (self.followAllRedirects && response.statusCode != 401 && response.statusCode != 307) self.method = 'GET' + // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 + delete self.src + delete self.req + delete self.agent + delete self._started + if (response.statusCode != 401 && response.statusCode != 307) { + // Remove parameters from the previous response, unless this is the second request + // for a server that requires digest authentication. + delete self.body + delete self._form + if (self.headers) { + self.removeHeader('host') + self.removeHeader('content-type') + self.removeHeader('content-length') + } + } + + self.emit('redirect'); + + self.init() + return // Ignore the rest of the response + } else { + self._redirectsFollowed = self._redirectsFollowed || 0 + // Be a good stream and emit end when the response is finished. + // Hack to emit end on close because of a core bug that never fires end + response.on('close', function () { + if (!self._ended) self.response.emit('end') + }) + + response.on('end', function () { + self._ended = true + }) + + var dataStream + if (self.gzip) { + var contentEncoding = response.headers["content-encoding"] || "identity" + contentEncoding = contentEncoding.trim().toLowerCase() + + if (contentEncoding === "gzip") { + dataStream = zlib.createGunzip() + response.pipe(dataStream) + } else { + // Since previous versions didn't check for Content-Encoding header, + // ignore any invalid values to preserve backwards-compatibility + if (contentEncoding !== "identity") { + debug("ignoring unrecognized Content-Encoding " + contentEncoding) + } + dataStream = response + } + } else { + dataStream = response + } + + if (self.encoding) { + if (self.dests.length !== 0) { + console.error("Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") + } else if (dataStream.setEncoding) { + dataStream.setEncoding(self.encoding) + } else { + // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with + // zlib streams. + // If/When support for 0.9.4 is dropped, this should be unnecessary. + dataStream = dataStream.pipe(stringstream(self.encoding)) + } + } + + self.emit('response', response) + + self.dests.forEach(function (dest) { + self.pipeDest(dest) + }) + + dataStream.on("data", function (chunk) { + self._destdata = true + self.emit("data", chunk) + }) + dataStream.on("end", function (chunk) { + self.emit("end", chunk) + }) + dataStream.on("error", function (error) { + self.emit("error", error) + }) + dataStream.on("close", function () {self.emit("close")}) + + if (self.callback) { + var buffer = bl() + , strings = [] + ; + self.on("data", function (chunk) { + if (Buffer.isBuffer(chunk)) buffer.append(chunk) + else strings.push(chunk) + }) + self.on("end", function () { + debug('end event', self.uri.href) + if (self._aborted) { + debug('aborted', self.uri.href) + return + } + + if (buffer.length) { + debug('has body', self.uri.href, buffer.length) + if (self.encoding === null) { + // response.body = buffer + // can't move to this until https://github.com/rvagg/bl/issues/13 + response.body = buffer.slice() + } else { + response.body = buffer.toString(self.encoding) + } + } else if (strings.length) { + // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation. + // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse(). + if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === "\uFEFF") { + strings[0] = strings[0].substring(1) + } + response.body = strings.join('') + } + + if (self._json) { + try { + response.body = JSON.parse(response.body) + } catch (e) {} + } + debug('emitting complete', self.uri.href) + if(response.body == undefined && !self._json) { + response.body = ""; + } + self.emit('complete', response, response.body) + }) + } + //if no callback + else{ + self.on("end", function () { + if (self._aborted) { + debug('aborted', self.uri.href) + return + } + self.emit('complete', response); + }); + } + } + debug('finish init function', self.uri.href) +} + +Request.prototype.abort = function () { + this._aborted = true + + if (this.req) { + this.req.abort() + } + else if (this.response) { + this.response.abort() + } + + this.emit("abort") +} + +Request.prototype.pipeDest = function (dest) { + var response = this.response + // Called after the response is received + if (dest.headers && !dest.headersSent) { + if (response.caseless.has('content-type')) { + var ctname = response.caseless.has('content-type') + if (dest.setHeader) dest.setHeader(ctname, response.headers[ctname]) + else dest.headers[ctname] = response.headers[ctname] + } + + if (response.caseless.has('content-length')) { + var clname = response.caseless.has('content-length') + if (dest.setHeader) dest.setHeader(clname, response.headers[clname]) + else dest.headers[clname] = response.headers[clname] + } + } + if (dest.setHeader && !dest.headersSent) { + for (var i in response.headers) { + // If the response content is being decoded, the Content-Encoding header + // of the response doesn't represent the piped content, so don't pass it. + if (!this.gzip || i !== 'content-encoding') { + dest.setHeader(i, response.headers[i]) + } + } + dest.statusCode = response.statusCode + } + if (this.pipefilter) this.pipefilter(response, dest) +} + +Request.prototype.qs = function (q, clobber) { + var base + if (!clobber && this.uri.query) base = qs.parse(this.uri.query) + else base = {} + + for (var i in q) { + base[i] = q[i] + } + + if (qs.stringify(base) === ''){ + return this + } + + this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base)) + this.url = this.uri + this.path = this.uri.path + + return this +} +Request.prototype.form = function (form) { + if (form) { + this.setHeader('content-type', 'application/x-www-form-urlencoded; charset=utf-8') + this.body = (typeof form === 'string') ? form.toString('utf8') : qs.stringify(form).toString('utf8') + return this + } + // create form-data object + this._form = new FormData() + return this._form +} +Request.prototype.multipart = function (multipart) { + var self = this + self.body = [] + + if (!self.hasHeader('content-type')) { + self.setHeader('content-type', 'multipart/related; boundary=' + self.boundary) + } else { + var headerName = self.hasHeader('content-type'); + self.setHeader(headerName, self.headers[headerName].split(';')[0] + '; boundary=' + self.boundary) + } + + if (!multipart.forEach) throw new Error('Argument error, options.multipart.') + + if (self.preambleCRLF) { + self.body.push(new Buffer('\r\n')) + } + + multipart.forEach(function (part) { + var body = part.body + if(body == null) throw Error('Body attribute missing in multipart.') + delete part.body + var preamble = '--' + self.boundary + '\r\n' + Object.keys(part).forEach(function (key) { + preamble += key + ': ' + part[key] + '\r\n' + }) + preamble += '\r\n' + self.body.push(new Buffer(preamble)) + self.body.push(new Buffer(body)) + self.body.push(new Buffer('\r\n')) + }) + self.body.push(new Buffer('--' + self.boundary + '--')) + return self +} +Request.prototype.json = function (val) { + var self = this + + if (!self.hasHeader('accept')) self.setHeader('accept', 'application/json') + + this._json = true + if (typeof val === 'boolean') { + if (typeof this.body === 'object') { + this.body = safeStringify(this.body) + if (!self.hasHeader('content-type')) + self.setHeader('content-type', 'application/json') + } + } else { + this.body = safeStringify(val) + if (!self.hasHeader('content-type')) + self.setHeader('content-type', 'application/json') + } + + return this +} +Request.prototype.getHeader = function (name, headers) { + var result, re, match + if (!headers) headers = this.headers + Object.keys(headers).forEach(function (key) { + if (key.length !== name.length) return + re = new RegExp(name, 'i') + match = key.match(re) + if (match) result = headers[key] + }) + return result +} +var getHeader = Request.prototype.getHeader + +Request.prototype.auth = function (user, pass, sendImmediately, bearer) { + if (bearer !== undefined) { + this._bearer = bearer + this._hasAuth = true + if (sendImmediately || typeof sendImmediately == 'undefined') { + if (typeof bearer === 'function') { + bearer = bearer() + } + this.setHeader('authorization', 'Bearer ' + bearer) + this._sentAuth = true + } + return this + } + if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) { + throw new Error('auth() received invalid user or password') + } + this._user = user + this._pass = pass + this._hasAuth = true + var header = typeof pass !== 'undefined' ? user + ':' + pass : user + if (sendImmediately || typeof sendImmediately == 'undefined') { + this.setHeader('authorization', 'Basic ' + toBase64(header)) + this._sentAuth = true + } + return this +} + +Request.prototype.aws = function (opts, now) { + if (!now) { + this._aws = opts + return this + } + var date = new Date() + this.setHeader('date', date.toUTCString()) + var auth = + { key: opts.key + , secret: opts.secret + , verb: this.method.toUpperCase() + , date: date + , contentType: this.getHeader('content-type') || '' + , md5: this.getHeader('content-md5') || '' + , amazonHeaders: aws.canonicalizeHeaders(this.headers) + } + var path = this.uri.path; + if (opts.bucket && path) { + auth.resource = '/' + opts.bucket + path + } else if (opts.bucket && !path) { + auth.resource = '/' + opts.bucket + } else if (!opts.bucket && path) { + auth.resource = path + } else if (!opts.bucket && !path) { + auth.resource = '/' + } + auth.resource = aws.canonicalizeResource(auth.resource) + this.setHeader('authorization', aws.authorization(auth)) + + return this +} +Request.prototype.httpSignature = function (opts) { + var req = this + httpSignature.signRequest({ + getHeader: function(header) { + return getHeader(header, req.headers) + }, + setHeader: function(header, value) { + req.setHeader(header, value) + }, + method: this.method, + path: this.path + }, opts) + debug('httpSignature authorization', this.getHeader('authorization')) + + return this +} + +Request.prototype.hawk = function (opts) { + this.setHeader('Authorization', hawk.client.header(this.uri, this.method, opts).field) +} + +Request.prototype.oauth = function (_oauth) { + var form, query + if (this.hasHeader('content-type') && + this.getHeader('content-type').slice(0, 'application/x-www-form-urlencoded'.length) === + 'application/x-www-form-urlencoded' + ) { + form = this.body + } + if (this.uri.query) { + query = this.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() + if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') + + oa.oauth_signature_method = 'HMAC-SHA1' + + var consumer_secret = oa.oauth_consumer_secret + delete oa.oauth_consumer_secret + var token_secret = oa.oauth_token_secret + delete oa.oauth_token_secret + + var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname + var params = qs.parse([].concat(query, form, qs.stringify(oa)).join('&')) + var signature = oauth.hmacsign(this.method, baseurl, params, consumer_secret, 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) + '"' + this.setHeader('Authorization', authHeader) + return this +} +Request.prototype.jar = function (jar) { + var cookies + + if (this._redirectsFollowed === 0) { + this.originalCookieHeader = this.getHeader('cookie') + } + + if (!jar) { + // disable cookies + cookies = false + this._disableCookies = true + } else { + var targetCookieJar = (jar && jar.getCookieStringSync)?jar:globalCookieJar; + var urihref = this.uri.href + //fetch cookie in the Specified host + if (targetCookieJar) { + cookies = targetCookieJar.getCookieStringSync(urihref); + } + } + + //if need cookie and cookie is not empty + if (cookies && cookies.length) { + if (this.originalCookieHeader) { + // Don't overwrite existing Cookie header + this.setHeader('cookie', this.originalCookieHeader + '; ' + cookies) + } else { + this.setHeader('cookie', cookies) + } + } + this._jar = jar + return this +} + + +// Stream API +Request.prototype.pipe = function (dest, opts) { + if (this.response) { + if (this._destdata) { + throw new Error("You cannot pipe after data has been emitted from the response.") + } else if (this._ended) { + throw new Error("You cannot pipe after the response has been ended.") + } else { + stream.Stream.prototype.pipe.call(this, dest, opts) + this.pipeDest(dest) + return dest + } + } else { + this.dests.push(dest) + stream.Stream.prototype.pipe.call(this, dest, opts) + return dest + } +} +Request.prototype.write = function () { + if (!this._started) this.start() + return this.req.write.apply(this.req, arguments) +} +Request.prototype.end = function (chunk) { + if (chunk) this.write(chunk) + if (!this._started) this.start() + this.req.end() +} +Request.prototype.pause = function () { + if (!this.response) this._paused = true + else this.response.pause.apply(this.response, arguments) +} +Request.prototype.resume = function () { + if (!this.response) this._paused = false + else this.response.resume.apply(this.response, arguments) +} +Request.prototype.destroy = function () { + if (!this._ended) this.end() + else if (this.response) this.response.destroy() +} + +Request.prototype.toJSON = requestToJSON + +Request.defaultProxyHeaderWhiteList = + defaultProxyHeaderWhiteList.slice() + + +module.exports = Request diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/AUTHORS b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/AUTHORS new file mode 100644 index 0000000..247b754 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/AUTHORS @@ -0,0 +1,6 @@ +# Authors sorted by whether or not they're me. +Isaac Z. Schlueter (http://blog.izs.me) +Wayne Larsen (http://github.com/wvl) +ritch +Marcel Laverdet +Yosef Dinerstein diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/README.md new file mode 100644 index 0000000..cd123b6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/README.md @@ -0,0 +1,30 @@ +`rm -rf` for node. + +Install with `npm install rimraf`, or just drop rimraf.js somewhere. + +## API + +`rimraf(f, callback)` + +The callback will be called with an error if there is one. Certain +errors are handled for you: + +* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of + `opts.maxBusyTries` times before giving up. +* `ENOENT` - If the file doesn't exist, rimraf will return + successfully, since your desired outcome is already the case. + +## rimraf.sync + +It can remove stuff synchronously, too. But that's not so good. Use +the async API. It's better. + +## CLI + +If installed with `npm install rimraf -g` it can be used as a global +command `rimraf ` which is useful for cross platform support. + +## mkdirp + +If you need to create a directory recursively, check out +[mkdirp](https://github.com/substack/node-mkdirp). diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/bin.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/bin.js new file mode 100755 index 0000000..29bfa8a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/bin.js @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +var rimraf = require('./') + +var help = false +var dashdash = false +var args = process.argv.slice(2).filter(function(arg) { + if (dashdash) + return !!arg + else if (arg === '--') + dashdash = true + else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/)) + help = true + else + return !!arg +}); + +if (help || args.length === 0) { + // If they didn't ask for help, then this is not a "success" + var log = help ? console.log : console.error + log('Usage: rimraf ') + log('') + log(' Deletes all files and folders at "path" recursively.') + log('') + log('Options:') + log('') + log(' -h, --help Display this usage info') + process.exit(help ? 0 : 1) +} else { + args.forEach(function(arg) { + rimraf.sync(arg) + }) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/package.json new file mode 100644 index 0000000..4f629ca --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/package.json @@ -0,0 +1,73 @@ +{ + "name": "rimraf", + "version": "2.2.8", + "main": "rimraf.js", + "description": "A deep deletion module for node (like `rm -rf`)", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": { + "type": "MIT", + "url": "https://github.com/isaacs/rimraf/raw/master/LICENSE" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/rimraf.git" + }, + "scripts": { + "test": "cd test && bash run.sh" + }, + "bin": { + "rimraf": "./bin.js" + }, + "contributors": [ + { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + { + "name": "Wayne Larsen", + "email": "wayne@larsen.st", + "url": "http://github.com/wvl" + }, + { + "name": "ritch", + "email": "skawful@gmail.com" + }, + { + "name": "Marcel Laverdet" + }, + { + "name": "Yosef Dinerstein", + "email": "yosefd@microsoft.com" + } + ], + "bugs": { + "url": "https://github.com/isaacs/rimraf/issues" + }, + "homepage": "https://github.com/isaacs/rimraf", + "_id": "rimraf@2.2.8", + "_shasum": "e439be2aaee327321952730f99a8929e4fc50582", + "_from": "rimraf@~2.2.8", + "_npmVersion": "1.4.10", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "e439be2aaee327321952730f99a8929e4fc50582", + "tarball": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js new file mode 100644 index 0000000..eb96c46 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js @@ -0,0 +1,248 @@ +module.exports = rimraf +rimraf.sync = rimrafSync + +var assert = require("assert") +var path = require("path") +var fs = require("fs") + +// for EMFILE handling +var timeout = 0 +exports.EMFILE_MAX = 1000 +exports.BUSYTRIES_MAX = 3 + +var isWindows = (process.platform === "win32") + +function defaults (options) { + var methods = [ + 'unlink', + 'chmod', + 'stat', + 'rmdir', + 'readdir' + ] + methods.forEach(function(m) { + options[m] = options[m] || fs[m] + m = m + 'Sync' + options[m] = options[m] || fs[m] + }) +} + +function rimraf (p, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } + assert(p) + assert(options) + assert(typeof cb === 'function') + + defaults(options) + + if (!cb) throw new Error("No callback passed to rimraf()") + + var busyTries = 0 + rimraf_(p, options, function CB (er) { + if (er) { + if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY") && + busyTries < exports.BUSYTRIES_MAX) { + busyTries ++ + var time = busyTries * 100 + // try again, with the same exact callback as this one. + return setTimeout(function () { + rimraf_(p, options, CB) + }, time) + } + + // this one won't happen if graceful-fs is used. + if (er.code === "EMFILE" && timeout < exports.EMFILE_MAX) { + return setTimeout(function () { + rimraf_(p, options, CB) + }, timeout ++) + } + + // already gone + if (er.code === "ENOENT") er = null + } + + timeout = 0 + cb(er) + }) +} + +// Two possible strategies. +// 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR +// 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR +// +// Both result in an extra syscall when you guess wrong. However, there +// are likely far more normal files in the world than directories. This +// is based on the assumption that a the average number of files per +// directory is >= 1. +// +// If anyone ever complains about this, then I guess the strategy could +// be made configurable somehow. But until then, YAGNI. +function rimraf_ (p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + options.unlink(p, function (er) { + if (er) { + if (er.code === "ENOENT") + return cb(null) + if (er.code === "EPERM") + return (isWindows) + ? fixWinEPERM(p, options, er, cb) + : rmdir(p, options, er, cb) + if (er.code === "EISDIR") + return rmdir(p, options, er, cb) + } + return cb(er) + }) +} + +function fixWinEPERM (p, options, er, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + if (er) + assert(er instanceof Error) + + options.chmod(p, 666, function (er2) { + if (er2) + cb(er2.code === "ENOENT" ? null : er) + else + options.stat(p, function(er3, stats) { + if (er3) + cb(er3.code === "ENOENT" ? null : er) + else if (stats.isDirectory()) + rmdir(p, options, er, cb) + else + options.unlink(p, cb) + }) + }) +} + +function fixWinEPERMSync (p, options, er) { + assert(p) + assert(options) + if (er) + assert(er instanceof Error) + + try { + options.chmodSync(p, 666) + } catch (er2) { + if (er2.code === "ENOENT") + return + else + throw er + } + + try { + var stats = options.statSync(p) + } catch (er3) { + if (er3.code === "ENOENT") + return + else + throw er + } + + if (stats.isDirectory()) + rmdirSync(p, options, er) + else + options.unlinkSync(p) +} + +function rmdir (p, options, originalEr, cb) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + assert(typeof cb === 'function') + + // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS) + // if we guessed wrong, and it's not a directory, then + // raise the original error. + options.rmdir(p, function (er) { + if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")) + rmkids(p, options, cb) + else if (er && er.code === "ENOTDIR") + cb(originalEr) + else + cb(er) + }) +} + +function rmkids(p, options, cb) { + assert(p) + assert(options) + assert(typeof cb === 'function') + + options.readdir(p, function (er, files) { + if (er) + return cb(er) + var n = files.length + if (n === 0) + return options.rmdir(p, cb) + var errState + files.forEach(function (f) { + rimraf(path.join(p, f), options, function (er) { + if (errState) + return + if (er) + return cb(errState = er) + if (--n === 0) + options.rmdir(p, cb) + }) + }) + }) +} + +// this looks simpler, and is strictly *faster*, but will +// tie up the JavaScript thread and fail on excessively +// deep directory trees. +function rimrafSync (p, options) { + options = options || {} + defaults(options) + + assert(p) + assert(options) + + try { + options.unlinkSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "EPERM") + return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er) + if (er.code !== "EISDIR") + throw er + rmdirSync(p, options, er) + } +} + +function rmdirSync (p, options, originalEr) { + assert(p) + assert(options) + if (originalEr) + assert(originalEr instanceof Error) + + try { + options.rmdirSync(p) + } catch (er) { + if (er.code === "ENOENT") + return + if (er.code === "ENOTDIR") + throw originalEr + if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM") + rmkidsSync(p, options) + } +} + +function rmkidsSync (p, options) { + assert(p) + assert(options) + options.readdirSync(p).forEach(function (f) { + rimrafSync(path.join(p, f), options) + }) + options.rmdirSync(p, options) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/run.sh b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/run.sh new file mode 100644 index 0000000..653ff9b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/run.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e +code=0 +for i in test-*.js; do + echo -n $i ... + bash setup.sh + node $i + if [ -d target ]; then + echo "fail" + code=1 + else + echo "pass" + fi +done +rm -rf target +exit $code diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/setup.sh b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/setup.sh new file mode 100644 index 0000000..2602e63 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/setup.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +set -e + +files=10 +folders=2 +depth=4 +target="$PWD/target" + +rm -rf target + +fill () { + local depth=$1 + local files=$2 + local folders=$3 + local target=$4 + + if ! [ -d $target ]; then + mkdir -p $target + fi + + local f + + f=$files + while [ $f -gt 0 ]; do + touch "$target/f-$depth-$f" + let f-- + done + + let depth-- + + if [ $depth -le 0 ]; then + return 0 + fi + + f=$folders + while [ $f -gt 0 ]; do + mkdir "$target/folder-$depth-$f" + fill $depth $files $folders "$target/d-$depth-$f" + let f-- + done +} + +fill $depth $files $folders $target + +# sanity assert +[ -d $target ] diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-async.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-async.js new file mode 100644 index 0000000..9c2e0b7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-async.js @@ -0,0 +1,5 @@ +var rimraf = require("../rimraf") + , path = require("path") +rimraf(path.join(__dirname, "target"), function (er) { + if (er) throw er +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-sync.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-sync.js new file mode 100644 index 0000000..eb71f10 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/rimraf/test/test-sync.js @@ -0,0 +1,3 @@ +var rimraf = require("../rimraf") + , path = require("path") +rimraf.sync(path.join(__dirname, "target")) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/.npmignore new file mode 100644 index 0000000..7300fbc --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/.npmignore @@ -0,0 +1 @@ +# nada diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/Makefile b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/Makefile new file mode 100644 index 0000000..5717ccf --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/Makefile @@ -0,0 +1,24 @@ +files = semver.browser.js \ + semver.min.js \ + semver.browser.js.gz \ + semver.min.js.gz + +all: $(files) + +clean: + rm -f $(files) + +semver.browser.js: head.js semver.js foot.js + ( cat head.js; \ + cat semver.js | \ + egrep -v '^ *\/\* nomin \*\/' | \ + perl -pi -e 's/debug\([^\)]+\)//g'; \ + cat foot.js ) > semver.browser.js + +semver.min.js: semver.browser.js + uglifyjs -m semver.min.js + +%.gz: % + gzip --stdout -9 <$< >$@ + +.PHONY: all clean diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/README.md new file mode 100644 index 0000000..2ca8d80 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/README.md @@ -0,0 +1,158 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Usage + + $ npm install semver + + semver.valid('1.2.3') // '1.2.3' + semver.valid('a.b.c') // null + semver.clean(' =v1.2.3 ') // '1.2.3' + semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true + semver.gt('1.2.3', '9.8.7') // false + semver.lt('1.2.3', '9.8.7') // true + +As a command-line utility: + + $ semver -h + + Usage: semver [ [...]] [-r | -i | -d ] + Test if version(s) satisfy the supplied range(s), and sort them. + + Multiple versions or ranges may be supplied, unless increment + or decrement options are specified. In that case, only a single + version may be used, and it is incremented by the specified level + + Program exits successfully if any valid version satisfies + all supplied ranges, and prints all satisfying versions. + + If no versions are valid, or ranges are not satisfied, + then exits failure. + + Versions are printed in ascending order, so supplying + multiple versions to the utility will just sort them. + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +The following range styles are supported: + +* `1.2.3` A specific version. When nothing else will do. Must be a full + version number, with major, minor, and patch versions specified. + Note that build metadata is still ignored, so `1.2.3+build2012` will + satisfy this range. +* `>1.2.3` Greater than a specific version. +* `<1.2.3` Less than a specific version. If there is no prerelease + tag on the version range, then no prerelease version will be allowed + either, even though these are technically "less than". +* `>=1.2.3` Greater than or equal to. Note that prerelease versions + are NOT equal to their "normal" equivalents, so `1.2.3-beta` will + not satisfy this range, but `2.3.0-beta` will. +* `<=1.2.3` Less than or equal to. In this case, prerelease versions + ARE allowed, so `1.2.3-beta` would satisfy. +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` +* `~1.2.3` := `>=1.2.3-0 <1.3.0-0` "Reasonably close to `1.2.3`". When + using tilde operators, prerelease versions are supported as well, + but a prerelease of the next significant digit will NOT be + satisfactory, so `1.3.0-beta` will not satisfy `~1.2.3`. +* `^1.2.3` := `>=1.2.3-0 <2.0.0-0` "Compatible with `1.2.3`". When + using caret operators, anything from the specified version (including + prerelease) will be supported up to, but not including, the next + major version (or its prereleases). `1.5.1` will satisfy `^1.2.3`, + while `1.2.2` and `2.0.0-beta` will not. +* `^0.1.3` := `0.1.3` "Compatible with `0.1.3`". `0.x.x` versions are + special: since the semver spec specifies that `0.x.x` versions make + no stability guarantees, only the version specified is considered + valid. +* `^0.0.2` := `0.0.2` "Only the version `0.0.2` is considered compatible" +* `~1.2` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`" +* `^1.2` := `>=1.2.0-0 <2.0.0-0` "Any version compatible with `1.2`" +* `1.2.x` := `>=1.2.0-0 <1.3.0-0` "Any version starting with `1.2`" +* `1.2.*` Same as `1.2.x`. +* `1.2` Same as `1.2.x`. +* `~1` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`" +* `^1` := `>=1.0.0-0 <2.0.0-0` "Any version compatible with `1`" +* `1.x` := `>=1.0.0-0 <2.0.0-0` "Any version starting with `1`" +* `1.*` Same as `1.x`. +* `1` Same as `1.x`. +* `*` Any version whatsoever. +* `x` Same as `*`. +* `""` (just an empty string) Same as `*`. + + +Ranges can be joined with either a space (which implies "and") or a +`||` (which implies "or"). + +## Functions + +All methods and classes take a final `loose` boolean argument that, if +true, will be more forgiving about not-quite-valid semver strings. +The resulting output will always be 100% strict, of course. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release)`: Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, the `prerelease` will work the + same as `prepatch`. It increments the patch version, then makes a + prerelease. If the input version is already a prerelease it simply + increments it. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the exact same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of compare. Sorts an array of versions + in descending order when passed to `Array.sort()`. + + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `gtr(version, range)`: Return `true` if version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so the version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/bin/semver b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/bin/semver new file mode 100755 index 0000000..41c148f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/bin/semver @@ -0,0 +1,125 @@ +#!/usr/bin/env node +// Standalone semver comparison program. +// Exits successfully and prints matching version(s) if +// any supplied version is valid and passes all tests. + +var argv = process.argv.slice(2) + , versions = [] + , range = [] + , gt = [] + , lt = [] + , eq = [] + , inc = null + , version = require("../package.json").version + , loose = false + , semver = require("../semver") + , reverse = false + +main() + +function main () { + if (!argv.length) return help() + while (argv.length) { + var a = argv.shift() + var i = a.indexOf('=') + if (i !== -1) { + a = a.slice(0, i) + argv.unshift(a.slice(i + 1)) + } + switch (a) { + case "-rv": case "-rev": case "--rev": case "--reverse": + reverse = true + break + case "-l": case "--loose": + loose = true + break + case "-v": case "--version": + versions.push(argv.shift()) + break + case "-i": case "--inc": case "--increment": + switch (argv[0]) { + case "major": case "minor": case "patch": case "prerelease": + case "premajor": case "preminor": case "prepatch": + inc = argv.shift() + break + default: + inc = "patch" + break + } + break + case "-r": case "--range": + range.push(argv.shift()) + break + case "-h": case "--help": case "-?": + return help() + default: + versions.push(a) + break + } + } + + versions = versions.filter(function (v) { + return semver.valid(v, loose) + }) + if (!versions.length) return fail() + if (inc && (versions.length !== 1 || range.length)) + return failInc() + + for (var i = 0, l = range.length; i < l ; i ++) { + versions = versions.filter(function (v) { + return semver.satisfies(v, range[i], loose) + }) + if (!versions.length) return fail() + } + return success(versions) +} + +function failInc () { + console.error("--inc can only be used on a single version with no range") + fail() +} + +function fail () { process.exit(1) } + +function success () { + var compare = reverse ? "rcompare" : "compare" + versions.sort(function (a, b) { + return semver[compare](a, b, loose) + }).map(function (v) { + return semver.clean(v, loose) + }).map(function (v) { + return inc ? semver.inc(v, inc, loose) : v + }).forEach(function (v,i,_) { console.log(v) }) +} + +function help () { + console.log(["SemVer " + version + ,"" + ,"A JavaScript implementation of the http://semver.org/ specification" + ,"Copyright Isaac Z. Schlueter" + ,"" + ,"Usage: semver [options] [ [...]]" + ,"Prints valid versions sorted by SemVer precedence" + ,"" + ,"Options:" + ,"-r --range " + ," Print versions that match the specified range." + ,"" + ,"-i --increment []" + ," Increment a version by the specified level. Level can" + ," be one of: major, minor, patch, premajor, preminor," + ," prepatch, or prerelease. Default level is 'patch'." + ," Only one version may be specified." + ,"" + ,"-l --loose" + ," Interpret versions and ranges loosely" + ,"" + ,"Program exits successfully if any valid version satisfies" + ,"all supplied ranges, and prints all satisfying versions." + ,"" + ,"If no satisfying versions are found, then exits failure." + ,"" + ,"Versions are printed in ascending order, so supplying" + ,"multiple versions to the utility will just sort them." + ].join("\n")) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/foot.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/foot.js new file mode 100644 index 0000000..8f83c20 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/foot.js @@ -0,0 +1,6 @@ + +})( + typeof exports === 'object' ? exports : + typeof define === 'function' && define.amd ? {} : + semver = {} +); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/head.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/head.js new file mode 100644 index 0000000..6536865 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/head.js @@ -0,0 +1,2 @@ +;(function(exports) { + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/package.json new file mode 100644 index 0000000..43bc8cd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/package.json @@ -0,0 +1,50 @@ +{ + "name": "semver", + "version": "3.0.1", + "description": "The semantic version parser used by npm.", + "main": "semver.js", + "browser": "semver.browser.js", + "min": "semver.min.js", + "scripts": { + "test": "tap test/*.js", + "prepublish": "make" + }, + "devDependencies": { + "tap": "0.x >=0.0.4", + "uglify-js": "~2.3.6" + }, + "license": "BSD", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-semver.git" + }, + "bin": { + "semver": "./bin/semver" + }, + "gitHead": "4b24aeb54dd23560f53b0df01e64e5f229e6172f", + "bugs": { + "url": "https://github.com/isaacs/node-semver/issues" + }, + "homepage": "https://github.com/isaacs/node-semver", + "_id": "semver@3.0.1", + "_shasum": "720ac012515a252f91fb0dd2e99a56a70d6cf078", + "_from": "semver@~3.0.1", + "_npmVersion": "2.0.0-alpha-5", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "720ac012515a252f91fb0dd2e99a56a70d6cf078", + "tarball": "http://registry.npmjs.org/semver/-/semver-3.0.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/semver/-/semver-3.0.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js new file mode 100644 index 0000000..c335720 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js @@ -0,0 +1,1035 @@ +;(function(exports) { + +// export the class if we are in a Node-like system. +if (typeof module === 'object' && module.exports === exports) + exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:(' + src[PRERELEASE] + ')' + + ')?)?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:(' + src[PRERELEASELOOSE] + ')' + + ')?)?)?'; + +// >=2.x, for example, means >=2.0.0-0 +// <1.x would be the same as "<1.0.0-0", though. +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + ; + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + var r = loose ? re[LOOSE] : re[FULL]; + return (r.test(version)) ? new SemVer(version, loose) : null; +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ""), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + ; + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + return (/^[0-9]+$/.test(id)) ? +id : id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.inspect = function() { + return ''; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + ; + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + ; + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release) { + switch (release) { + case 'premajor': + this.inc('major'); + this.inc('pre'); + break; + case 'preminor': + this.inc('minor'); + this.inc('pre'); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch'); + this.inc('pre'); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch'); + this.inc('pre'); + break; + case 'major': + this.major++; + this.minor = -1; + case 'minor': + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publically. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + return this; +}; + +exports.inc = inc; +function inc(version, release, loose) { + try { + return new SemVer(version, loose).inc(release).version; + } catch (er) { + return null; + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(b); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': ret = a === b; break; + case '!==': ret = a !== b; break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + ; + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else { + this.semver = new SemVer(m[2], this.loose); + + // <1.2.3-rc DOES allow 1.2.3-beta (has prerelease) + // >=1.2.3 DOES NOT allow 1.2.3-beta + // <=1.2.3 DOES allow 1.2.3-beta + // However, <1.2.3 does NOT allow 1.2.3-beta, + // even though `1.2.3-beta < 1.2.3` + // The assumption is that the 1.2.3 version has something you + // *don't* want, so we push the prerelease down to the minimum. + if (this.operator === '<' && !this.semver.prerelease.length) { + this.semver.prerelease = ['0']; + this.semver.format(); + } + } +}; + +Comparator.prototype.inspect = function() { + return ''; +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + ; + return (this.semver === ANY) ? true : + cmp(version, this.operator, this.semver, this.loose); +}; + + +exports.Range = Range; +function Range(range, loose) { + if ((range instanceof Range) && range.loose === loose) + return range; + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.inspect = function() { + return ''; +}; + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + ; + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + ; + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + ; + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + ; + comp = replaceCarets(comp, loose); + ; + comp = replaceTildes(comp, loose); + ; + comp = replaceXRanges(comp, loose); + ; + comp = replaceStars(comp, loose); + ; + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + ; + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + else if (isX(p)) + // ~1.2 == >=1.2.0- <1.3.0- + ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + else if (pr) { + ; + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0-0'; + } else + // ~1.2.3 == >=1.2.3-0 <1.3.0-0 + ret = '>=' + M + '.' + m + '.' + p + '-0' + + ' <' + M + '.' + (+m + 1) + '.0-0'; + + ; + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + ; + var ret; + if (pr) { + if (pr.charAt(0) !== '-') + pr = '-' + pr; + } else + pr = ''; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + else + ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0'; + } else if (M === '0') + ret = '=' + M + '.' + m + '.' + p + pr; + else if (pr) + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0-0'; + else + ret = '>=' + M + '.' + m + '.' + p + '-0' + + ' <' + (+M + 1) + '.0.0-0'; + + ; + return ret; + }); +} + +function replaceXRanges(comp, loose) { + ; + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + ; + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (gtlt && anyX) { + // replace X with 0, and then append the -0 min-prerelease + if (xM) + M = 0; + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0-0 + // >1.2 => >=1.3.0-0 + // >1.2.3 => >= 1.2.4-0 + gtlt = '>='; + if (xM) { + // no change + } else if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } + + + ret = gtlt + M + '.' + m + '.' + p + '-0'; + } else if (xM) { + // allow any + ret = '*'; + } else if (xm) { + // append '-0' onto the version, otherwise + // '1.x.x' matches '2.0.0-beta', since the tag + // *lowers* the version value + ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + } + + ; + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + ; + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0-0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0-0 <3.5.0-0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0-0 <3.5.0-0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0-0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0-0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0-0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0-0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + return versions.filter(function(version) { + return satisfies(version, range, loose); + }).sort(function(a, b) { + return rcompare(a, b, loose); + })[0] || null; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +// Use the define() function if we're in AMD land +if (typeof define === 'function' && define.amd) + define(exports); + +})( + typeof exports === 'object' ? exports : + typeof define === 'function' && define.amd ? {} : + semver = {} +); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js.gz b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.browser.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..4ff42fe9b0ef3b4fe0ae2323b38fe5ca0173dc23 GIT binary patch literal 7247 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 literal 0 HcmV?d00001 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.js new file mode 100644 index 0000000..a3413d7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.js @@ -0,0 +1,1039 @@ +// export the class if we are in a Node-like system. +if (typeof module === 'object' && module.exports === exports) + exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. +/* nomin */ var debug; +/* nomin */ if (typeof process === 'object' && + /* nomin */ process.env && + /* nomin */ process.env.NODE_DEBUG && + /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) + /* nomin */ debug = function() { + /* nomin */ var args = Array.prototype.slice.call(arguments, 0); + /* nomin */ args.unshift('SEMVER'); + /* nomin */ console.log.apply(console, args); + /* nomin */ }; +/* nomin */ else + /* nomin */ debug = function() {}; + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:(' + src[PRERELEASE] + ')' + + ')?)?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:(' + src[PRERELEASELOOSE] + ')' + + ')?)?)?'; + +// >=2.x, for example, means >=2.0.0-0 +// <1.x would be the same as "<1.0.0-0", though. +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + var r = loose ? re[LOOSE] : re[FULL]; + return (r.test(version)) ? new SemVer(version, loose) : null; +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ""), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + debug('SemVer', version, loose); + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + return (/^[0-9]+$/.test(id)) ? +id : id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.inspect = function() { + return ''; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + debug('SemVer.compare', this.version, this.loose, other); + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release) { + switch (release) { + case 'premajor': + this.inc('major'); + this.inc('pre'); + break; + case 'preminor': + this.inc('minor'); + this.inc('pre'); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch'); + this.inc('pre'); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch'); + this.inc('pre'); + break; + case 'major': + this.major++; + this.minor = -1; + case 'minor': + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publically. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + return this; +}; + +exports.inc = inc; +function inc(version, release, loose) { + try { + return new SemVer(version, loose).inc(release).version; + } catch (er) { + return null; + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(b); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': ret = a === b; break; + case '!==': ret = a !== b; break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + debug('comparator', comp, loose); + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else { + this.semver = new SemVer(m[2], this.loose); + + // <1.2.3-rc DOES allow 1.2.3-beta (has prerelease) + // >=1.2.3 DOES NOT allow 1.2.3-beta + // <=1.2.3 DOES allow 1.2.3-beta + // However, <1.2.3 does NOT allow 1.2.3-beta, + // even though `1.2.3-beta < 1.2.3` + // The assumption is that the 1.2.3 version has something you + // *don't* want, so we push the prerelease down to the minimum. + if (this.operator === '<' && !this.semver.prerelease.length) { + this.semver.prerelease = ['0']; + this.semver.format(); + } + } +}; + +Comparator.prototype.inspect = function() { + return ''; +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + debug('Comparator.test', version, this.loose); + return (this.semver === ANY) ? true : + cmp(version, this.operator, this.semver, this.loose); +}; + + +exports.Range = Range; +function Range(range, loose) { + if ((range instanceof Range) && range.loose === loose) + return range; + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.inspect = function() { + return ''; +}; + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + debug('range', range, loose); + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, re[COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + debug('comp', comp); + comp = replaceCarets(comp, loose); + debug('caret', comp); + comp = replaceTildes(comp, loose); + debug('tildes', comp); + comp = replaceXRanges(comp, loose); + debug('xrange', comp); + comp = replaceStars(comp, loose); + debug('stars', comp); + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + else if (isX(p)) + // ~1.2 == >=1.2.0- <1.3.0- + ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + else if (pr) { + debug('replaceTilde pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0-0'; + } else + // ~1.2.3 == >=1.2.3-0 <1.3.0-0 + ret = '>=' + M + '.' + m + '.' + p + '-0' + + ' <' + M + '.' + (+m + 1) + '.0-0'; + + debug('tilde return', ret); + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; + if (pr) { + if (pr.charAt(0) !== '-') + pr = '-' + pr; + } else + pr = ''; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + else + ret = '>=' + M + '.' + m + '.0-0 <' + (+M + 1) + '.0.0-0'; + } else if (M === '0') + ret = '=' + M + '.' + m + '.' + p + pr; + else if (pr) + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0-0'; + else + ret = '>=' + M + '.' + m + '.' + p + '-0' + + ' <' + (+M + 1) + '.0.0-0'; + + debug('caret return', ret); + return ret; + }); +} + +function replaceXRanges(comp, loose) { + debug('replaceXRanges', comp, loose); + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (gtlt && anyX) { + // replace X with 0, and then append the -0 min-prerelease + if (xM) + M = 0; + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0-0 + // >1.2 => >=1.3.0-0 + // >1.2.3 => >= 1.2.4-0 + gtlt = '>='; + if (xM) { + // no change + } else if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } + + + ret = gtlt + M + '.' + m + '.' + p + '-0'; + } else if (xM) { + // allow any + ret = '*'; + } else if (xm) { + // append '-0' onto the version, otherwise + // '1.x.x' matches '2.0.0-beta', since the tag + // *lowers* the version value + ret = '>=' + M + '.0.0-0 <' + (+M + 1) + '.0.0-0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0-0 <' + M + '.' + (+m + 1) + '.0-0'; + } + + debug('xRange return', ret); + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + debug('replaceStars', comp, loose); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0-0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0-0 <3.5.0-0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0-0 <3.5.0-0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0-0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0-0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0-0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0-0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + return versions.filter(function(version) { + return satisfies(version, range, loose); + }).sort(function(a, b) { + return rcompare(a, b, loose); + })[0] || null; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +// Use the define() function if we're in AMD land +if (typeof define === 'function' && define.amd) + define(exports); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.min.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.min.js new file mode 100644 index 0000000..04e4abb --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/semver.min.js @@ -0,0 +1 @@ +(function(e){if(typeof module==="object"&&module.exports===e)e=module.exports=H;e.SEMVER_SPEC_VERSION="2.0.0";var r=e.re=[];var t=e.src=[];var n=0;var i=n++;t[i]="0|[1-9]\\d*";var s=n++;t[s]="[0-9]+";var a=n++;t[a]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var o=n++;t[o]="("+t[i]+")\\."+"("+t[i]+")\\."+"("+t[i]+")";var f=n++;t[f]="("+t[s]+")\\."+"("+t[s]+")\\."+"("+t[s]+")";var u=n++;t[u]="(?:"+t[i]+"|"+t[a]+")";var c=n++;t[c]="(?:"+t[s]+"|"+t[a]+")";var l=n++;t[l]="(?:-("+t[u]+"(?:\\."+t[u]+")*))";var p=n++;t[p]="(?:-?("+t[c]+"(?:\\."+t[c]+")*))";var h=n++;t[h]="[0-9A-Za-z-]+";var v=n++;t[v]="(?:\\+("+t[h]+"(?:\\."+t[h]+")*))";var m=n++;var g="v?"+t[o]+t[l]+"?"+t[v]+"?";t[m]="^"+g+"$";var w="[v=\\s]*"+t[f]+t[p]+"?"+t[v]+"?";var d=n++;t[d]="^"+w+"$";var y=n++;t[y]="((?:<|>)?=?)";var b=n++;t[b]=t[s]+"|x|X|\\*";var $=n++;t[$]=t[i]+"|x|X|\\*";var j=n++;t[j]="[v=\\s]*("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:\\.("+t[$]+")"+"(?:("+t[l]+")"+")?)?)?";var k=n++;t[k]="[v=\\s]*("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:\\.("+t[b]+")"+"(?:("+t[p]+")"+")?)?)?";var E=n++;t[E]="^"+t[y]+"\\s*"+t[j]+"$";var x=n++;t[x]="^"+t[y]+"\\s*"+t[k]+"$";var R=n++;t[R]="(?:~>?)";var S=n++;t[S]="(\\s*)"+t[R]+"\\s+";r[S]=new RegExp(t[S],"g");var V="$1~";var I=n++;t[I]="^"+t[R]+t[j]+"$";var T=n++;t[T]="^"+t[R]+t[k]+"$";var A=n++;t[A]="(?:\\^)";var C=n++;t[C]="(\\s*)"+t[A]+"\\s+";r[C]=new RegExp(t[C],"g");var M="$1^";var z=n++;t[z]="^"+t[A]+t[j]+"$";var P=n++;t[P]="^"+t[A]+t[k]+"$";var Z=n++;t[Z]="^"+t[y]+"\\s*("+w+")$|^$";var q=n++;t[q]="^"+t[y]+"\\s*("+g+")$|^$";var L=n++;t[L]="(\\s*)"+t[y]+"\\s*("+w+"|"+t[j]+")";r[L]=new RegExp(t[L],"g");var X="$1$2$3";var _=n++;t[_]="^\\s*("+t[j]+")"+"\\s+-\\s+"+"("+t[j]+")"+"\\s*$";var N=n++;t[N]="^\\s*("+t[k]+")"+"\\s+-\\s+"+"("+t[k]+")"+"\\s*$";var O=n++;t[O]="(<|>)?=?\\s*\\*";for(var B=0;B'};H.prototype.toString=function(){return this.version};H.prototype.compare=function(e){if(!(e instanceof H))e=new H(e,this.loose);return this.compareMain(e)||this.comparePre(e)};H.prototype.compareMain=function(e){if(!(e instanceof H))e=new H(e,this.loose);return Q(this.major,e.major)||Q(this.minor,e.minor)||Q(this.patch,e.patch)};H.prototype.comparePre=function(e){if(!(e instanceof H))e=new H(e,this.loose);if(this.prerelease.length&&!e.prerelease.length)return-1;else if(!this.prerelease.length&&e.prerelease.length)return 1;else if(!this.prerelease.length&&!e.prerelease.length)return 0;var r=0;do{var t=this.prerelease[r];var n=e.prerelease[r];if(t===undefined&&n===undefined)return 0;else if(n===undefined)return 1;else if(t===undefined)return-1;else if(t===n)continue;else return Q(t,n)}while(++r)};H.prototype.inc=function(e){switch(e){case"premajor":this.inc("major");this.inc("pre");break;case"preminor":this.inc("minor");this.inc("pre");break;case"prepatch":this.prerelease.length=0;this.inc("patch");this.inc("pre");break;case"prerelease":if(this.prerelease.length===0)this.inc("patch");this.inc("pre");break;case"major":this.major++;this.minor=-1;case"minor":this.minor++;this.patch=0;this.prerelease=[];break;case"patch":if(this.prerelease.length===0)this.patch++;this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{var r=this.prerelease.length;while(--r>=0){if(typeof this.prerelease[r]==="number"){this.prerelease[r]++;r=-2}}if(r===-1)this.prerelease.push(0)}break;default:throw new Error("invalid increment argument: "+e)}this.format();return this};e.inc=J;function J(e,r,t){try{return new H(e,t).inc(r).version}catch(n){return null}}e.compareIdentifiers=Q;var K=/^[0-9]+$/;function Q(e,r){var t=K.test(e);var n=K.test(r);if(t&&n){e=+e;r=+r}return t&&!n?-1:n&&!t?1:er?1:0}e.rcompareIdentifiers=U;function U(e,r){return Q(r,e)}e.compare=W;function W(e,r,t){return new H(e,t).compare(r)}e.compareLoose=Y;function Y(e,r){return W(e,r,true)}e.rcompare=er;function er(e,r,t){return W(r,e,t)}e.sort=rr;function rr(r,t){return r.sort(function(r,n){return e.compare(r,n,t)})}e.rsort=tr;function tr(r,t){return r.sort(function(r,n){return e.rcompare(r,n,t)})}e.gt=nr;function nr(e,r,t){return W(e,r,t)>0}e.lt=ir;function ir(e,r,t){return W(e,r,t)<0}e.eq=sr;function sr(e,r,t){return W(e,r,t)===0}e.neq=ar;function ar(e,r,t){return W(e,r,t)!==0}e.gte=or;function or(e,r,t){return W(e,r,t)>=0}e.lte=fr;function fr(e,r,t){return W(e,r,t)<=0}e.cmp=ur;function ur(e,r,t,n){var i;switch(r){case"===":i=e===t;break;case"!==":i=e!==t;break;case"":case"=":case"==":i=sr(e,t,n);break;case"!=":i=ar(e,t,n);break;case">":i=nr(e,t,n);break;case">=":i=or(e,t,n);break;case"<":i=ir(e,t,n);break;case"<=":i=fr(e,t,n);break;default:throw new TypeError("Invalid operator: "+r)}return i}e.Comparator=cr;function cr(e,r){if(e instanceof cr){if(e.loose===r)return e;else e=e.value}if(!(this instanceof cr))return new cr(e,r);this.loose=r;this.parse(e);if(this.semver===lr)this.value="";else this.value=this.operator+this.semver.version}var lr={};cr.prototype.parse=function(e){var t=this.loose?r[Z]:r[q];var n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1];if(this.operator==="=")this.operator="";if(!n[2])this.semver=lr;else{this.semver=new H(n[2],this.loose);if(this.operator==="<"&&!this.semver.prerelease.length){this.semver.prerelease=["0"];this.semver.format()}}};cr.prototype.inspect=function(){return''};cr.prototype.toString=function(){return this.value};cr.prototype.test=function(e){return this.semver===lr?true:ur(e,this.operator,this.semver,this.loose)};e.Range=pr;function pr(e,r){if(e instanceof pr&&e.loose===r)return e;if(!(this instanceof pr))return new pr(e,r);this.loose=r;this.raw=e;this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length});if(!this.set.length){throw new TypeError("Invalid SemVer Range: "+e)}this.format()}pr.prototype.inspect=function(){return''};pr.prototype.format=function(){this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim();return this.range};pr.prototype.toString=function(){return this.range};pr.prototype.parseRange=function(e){var t=this.loose;e=e.trim();var n=t?r[N]:r[_];e=e.replace(n,kr);e=e.replace(r[L],X);e=e.replace(r[S],V);e=e.replace(r[C],M);e=e.split(/\s+/).join(" ");var i=t?r[Z]:r[q];var s=e.split(" ").map(function(e){return vr(e,t)}).join(" ").split(/\s+/);if(this.loose){s=s.filter(function(e){return!!e.match(i)})}s=s.map(function(e){return new cr(e,t)});return s};e.toComparators=hr;function hr(e,r){return new pr(e,r).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})}function vr(e,r){e=dr(e,r);e=gr(e,r);e=br(e,r);e=jr(e,r);return e}function mr(e){return!e||e.toLowerCase()==="x"||e==="*"}function gr(e,r){return e.trim().split(/\s+/).map(function(e){return wr(e,r)}).join(" ")}function wr(e,t){var n=t?r[T]:r[I];return e.replace(n,function(e,r,t,n,i){var s;if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n))s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else if(i){if(i.charAt(0)!=="-")i="-"+i;s=">="+r+"."+t+"."+n+i+" <"+r+"."+(+t+1)+".0-0"}else s=">="+r+"."+t+"."+n+"-0"+" <"+r+"."+(+t+1)+".0-0";return s})}function dr(e,r){return e.trim().split(/\s+/).map(function(e){return yr(e,r)}).join(" ")}function yr(e,t){var n=t?r[P]:r[z];return e.replace(n,function(e,r,t,n,i){var s;if(i){if(i.charAt(0)!=="-")i="-"+i}else i="";if(mr(r))s="";else if(mr(t))s=">="+r+".0.0-0 <"+(+r+1)+".0.0-0";else if(mr(n)){if(r==="0")s=">="+r+"."+t+".0-0 <"+r+"."+(+t+1)+".0-0";else s=">="+r+"."+t+".0-0 <"+(+r+1)+".0.0-0"}else if(r==="0")s="="+r+"."+t+"."+n+i;else if(i)s=">="+r+"."+t+"."+n+i+" <"+(+r+1)+".0.0-0";else s=">="+r+"."+t+"."+n+"-0"+" <"+(+r+1)+".0.0-0";return s})}function br(e,r){return e.split(/\s+/).map(function(e){return $r(e,r)}).join(" ")}function $r(e,t){e=e.trim();var n=t?r[x]:r[E];return e.replace(n,function(e,r,t,n,i,s){var a=mr(t);var o=a||mr(n);var f=o||mr(i);var u=f;if(r==="="&&u)r="";if(r&&u){if(a)t=0;if(o)n=0;if(f)i=0;if(r===">"){r=">=";if(a){}else if(o){t=+t+1;n=0;i=0}else if(f){n=+n+1;i=0}}e=r+t+"."+n+"."+i+"-0"}else if(a){e="*"}else if(o){e=">="+t+".0.0-0 <"+(+t+1)+".0.0-0"}else if(f){e=">="+t+"."+n+".0-0 <"+t+"."+(+n+1)+".0-0"}return e})}function jr(e,t){return e.trim().replace(r[O],"")}function kr(e,r,t,n,i,s,a,o,f,u,c,l,p){if(mr(t))r="";else if(mr(n))r=">="+t+".0.0-0";else if(mr(i))r=">="+t+"."+n+".0-0";else r=">="+r;if(mr(f))o="";else if(mr(u))o="<"+(+f+1)+".0.0-0";else if(mr(c))o="<"+f+"."+(+u+1)+".0-0";else if(l)o="<="+f+"."+u+"."+c+"-"+l;else o="<="+o;return(r+" "+o).trim()}pr.prototype.test=function(e){if(!e)return false;for(var r=0;r",t)}e.outside=Tr;function Tr(e,r,t,n){e=new H(e,n);r=new pr(r,n);var i,s,a,o,f;switch(t){case">":i=nr;s=fr;a=ir;o=">";f=">=";break;case"<":i=ir;s=or;a=nr;o="<";f="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(xr(e,r,n)){return false}for(var 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 AAOHXW literal 0 HcmV?d00001 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/amd.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/amd.js new file mode 100644 index 0000000..a604134 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/amd.js @@ -0,0 +1,15 @@ +var tap = require('tap'); +var test = tap.test; + +test('amd', function(t) { + global.define = define; + define.amd = true; + var defined = null; + function define(stuff) { + defined = stuff; + } + var fromRequire = require('../'); + t.ok(defined, 'amd function called'); + t.equal(fromRequire, defined, 'amd stuff same as require stuff'); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/clean.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/clean.js new file mode 100644 index 0000000..1ab13e4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/clean.js @@ -0,0 +1,25 @@ +var tap = require('tap'); +var test = tap.test; +var semver = require('../semver.js'); +var clean = semver.clean; + +test('\nclean tests', function(t) { + // [range, version] + // Version should be detectable despite extra characters + [ + ['1.2.3', '1.2.3'], + [' 1.2.3 ', '1.2.3'], + [' 1.2.3-4 ', '1.2.3-4'], + [' 1.2.3-pre ', '1.2.3-pre'], + [' =v1.2.3 ', '1.2.3'], + ['v1.2.3', '1.2.3'], + [' v1.2.3 ', '1.2.3'], + ['\t1.2.3', '1.2.3'] + ].forEach(function(tuple) { + var range = tuple[0]; + var version = tuple[1]; + var msg = 'clean(' + range + ') = ' + version; + t.equal(clean(range), version, msg); + }); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/gtr.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/gtr.js new file mode 100644 index 0000000..cb6199e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/gtr.js @@ -0,0 +1,173 @@ +var tap = require('tap'); +var test = tap.test; +var semver = require('../semver.js'); +var gtr = semver.gtr; + +test('\ngtr tests', function(t) { + // [range, version, loose] + // Version should be greater than range + [ + ['~1.2.2', '1.3.0'], + ['~0.6.1-1', '0.7.1-1'], + ['1.0.0 - 2.0.0', '2.0.1'], + ['1.0.0', '1.0.1-beta1'], + ['1.0.0', '2.0.0'], + ['<=2.0.0', '2.1.1'], + ['<=2.0.0', '3.2.9'], + ['<2.0.0', '2.0.0'], + ['0.1.20 || 1.2.4', '1.2.5'], + ['2.x.x', '3.0.0'], + ['1.2.x', '1.3.0'], + ['1.2.x || 2.x', '3.0.0'], + ['2.*.*', '5.0.1'], + ['1.2.*', '1.3.3'], + ['1.2.* || 2.*', '4.0.0'], + ['2', '3.0.0'], + ['2.3', '2.4.2'], + ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0 + ['~2.4', '2.5.5'], + ['~>3.2.1', '3.3.0'], // >=3.2.1 <3.3.0 + ['~1', '2.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '2.2.4'], + ['~> 1', '3.2.3'], + ['~1.0', '1.1.2'], // >=1.0.0 <1.1.0 + ['~ 1.0', '1.1.0'], + ['<1.2', '1.2.0'], + ['< 1.2', '1.2.1'], + ['1', '2.0.0beta', true], + ['~v0.5.4-pre', '0.6.0'], + ['~v0.5.4-pre', '0.6.1-pre'], + ['=0.7.x', '0.8.0'], + ['=0.7.x', '0.8.0-asdf'], + ['<=0.7.x', '0.7.0'], + ['~1.2.2', '1.3.0'], + ['1.0.0 - 2.0.0', '2.2.3'], + ['1.0.0', '1.0.1'], + ['<=2.0.0', '3.0.0'], + ['<=2.0.0', '2.9999.9999'], + ['<=2.0.0', '2.2.9'], + ['<2.0.0', '2.9999.9999'], + ['<2.0.0', '2.2.9'], + ['2.x.x', '3.1.3'], + ['1.2.x', '1.3.3'], + ['1.2.x || 2.x', '3.1.3'], + ['2.*.*', '3.1.3'], + ['1.2.*', '1.3.3'], + ['1.2.* || 2.*', '3.1.3'], + ['2', '3.1.2'], + ['2.3', '2.4.1'], + ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0 + ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0 + ['~1', '2.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '2.2.3'], + ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0 + ['<1', '1.0.0'], + ['1', '2.0.0beta', true], + ['<1', '1.0.0beta', true], + ['< 1', '1.0.0beta', true], + ['=0.7.x', '0.8.2'], + ['<=0.7.x', '0.7.2'] + ].forEach(function(tuple) { + var range = tuple[0]; + var version = tuple[1]; + var loose = tuple[2] || false; + var msg = 'gtr(' + version + ', ' + range + ', ' + loose + ')'; + t.ok(gtr(version, range, loose), msg); + }); + t.end(); +}); + +test('\nnegative gtr tests', function(t) { + // [range, version, loose] + // Version should NOT be greater than range + [ + ['~0.6.1-1', '0.6.1-1'], + ['1.0.0 - 2.0.0', '1.2.3'], + ['1.0.0 - 2.0.0', '0.9.9'], + ['1.0.0', '1.0.0'], + ['>=*', '0.2.4'], + ['', '1.0.0', true], + ['*', '1.2.3'], + ['*', 'v1.2.3-foo'], + ['>=1.0.0', '1.0.0'], + ['>=1.0.0', '1.0.1'], + ['>=1.0.0', '1.1.0'], + ['>1.0.0', '1.0.1'], + ['>1.0.0', '1.1.0'], + ['<=2.0.0', '2.0.0'], + ['<=2.0.0', '1.9999.9999'], + ['<=2.0.0', '0.2.9'], + ['<2.0.0', '1.9999.9999'], + ['<2.0.0', '0.2.9'], + ['>= 1.0.0', '1.0.0'], + ['>= 1.0.0', '1.0.1'], + ['>= 1.0.0', '1.1.0'], + ['> 1.0.0', '1.0.1'], + ['> 1.0.0', '1.1.0'], + ['<= 2.0.0', '2.0.0'], + ['<= 2.0.0', '1.9999.9999'], + ['<= 2.0.0', '0.2.9'], + ['< 2.0.0', '1.9999.9999'], + ['<\t2.0.0', '0.2.9'], + ['>=0.1.97', 'v0.1.97'], + ['>=0.1.97', '0.1.97'], + ['0.1.20 || 1.2.4', '1.2.4'], + ['0.1.20 || >1.2.4', '1.2.4'], + ['0.1.20 || 1.2.4', '1.2.3'], + ['0.1.20 || 1.2.4', '0.1.20'], + ['>=0.2.3 || <0.0.1', '0.0.0'], + ['>=0.2.3 || <0.0.1', '0.2.3'], + ['>=0.2.3 || <0.0.1', '0.2.4'], + ['||', '1.3.4'], + ['2.x.x', '2.1.3'], + ['1.2.x', '1.2.3'], + ['1.2.x || 2.x', '2.1.3'], + ['1.2.x || 2.x', '1.2.3'], + ['x', '1.2.3'], + ['2.*.*', '2.1.3'], + ['1.2.*', '1.2.3'], + ['1.2.* || 2.*', '2.1.3'], + ['1.2.* || 2.*', '1.2.3'], + ['1.2.* || 2.*', '1.2.3'], + ['*', '1.2.3'], + ['2', '2.1.2'], + ['2.3', '2.3.1'], + ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0 + ['~2.4', '2.4.5'], + ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0 + ['~1', '1.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '1.2.3'], + ['~> 1', '1.2.3'], + ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0 + ['~ 1.0', '1.0.2'], + ['>=1', '1.0.0'], + ['>= 1', '1.0.0'], + ['<1.2', '1.1.1'], + ['< 1.2', '1.1.1'], + ['1', '1.0.0beta', true], + ['~v0.5.4-pre', '0.5.5'], + ['~v0.5.4-pre', '0.5.4'], + ['=0.7.x', '0.7.2'], + ['>=0.7.x', '0.7.2'], + ['=0.7.x', '0.7.0-asdf'], + ['>=0.7.x', '0.7.0-asdf'], + ['<=0.7.x', '0.6.2'], + ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'], + ['>=0.2.3 <=0.2.4', '0.2.4'], + ['1.0.0 - 2.0.0', '2.0.0'], + ['^1', '0.0.0-0'], + ['^3.0.0', '2.0.0'], + ['^1.0.0 || ~2.0.1', '2.0.0'], + ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'], + ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true], + ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true], + ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0'] + ].forEach(function(tuple) { + var range = tuple[0]; + var version = tuple[1]; + var loose = tuple[2] || false; + var msg = '!gtr(' + version + ', ' + range + ', ' + loose + ')'; + t.notOk(gtr(version, range, loose), msg); + }); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/index.js new file mode 100644 index 0000000..abd9713 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/index.js @@ -0,0 +1,588 @@ +'use strict'; + +var tap = require('tap'); +var test = tap.test; +var semver = require('../semver.js'); +var eq = semver.eq; +var gt = semver.gt; +var lt = semver.lt; +var neq = semver.neq; +var cmp = semver.cmp; +var gte = semver.gte; +var lte = semver.lte; +var satisfies = semver.satisfies; +var validRange = semver.validRange; +var inc = semver.inc; +var replaceStars = semver.replaceStars; +var toComparators = semver.toComparators; +var SemVer = semver.SemVer; +var Range = semver.Range; + +test('\ncomparison tests', function(t) { + // [version1, version2] + // version1 should be greater than version2 + [['0.0.0', '0.0.0-foo'], + ['0.0.1', '0.0.0'], + ['1.0.0', '0.9.9'], + ['0.10.0', '0.9.0'], + ['0.99.0', '0.10.0'], + ['2.0.0', '1.2.3'], + ['v0.0.0', '0.0.0-foo', true], + ['v0.0.1', '0.0.0', true], + ['v1.0.0', '0.9.9', true], + ['v0.10.0', '0.9.0', true], + ['v0.99.0', '0.10.0', true], + ['v2.0.0', '1.2.3', true], + ['0.0.0', 'v0.0.0-foo', true], + ['0.0.1', 'v0.0.0', true], + ['1.0.0', 'v0.9.9', true], + ['0.10.0', 'v0.9.0', true], + ['0.99.0', 'v0.10.0', true], + ['2.0.0', 'v1.2.3', true], + ['1.2.3', '1.2.3-asdf'], + ['1.2.3', '1.2.3-4'], + ['1.2.3', '1.2.3-4-foo'], + ['1.2.3-5-foo', '1.2.3-5'], + ['1.2.3-5', '1.2.3-4'], + ['1.2.3-5-foo', '1.2.3-5-Foo'], + ['3.0.0', '2.7.2+asdf'], + ['1.2.3-a.10', '1.2.3-a.5'], + ['1.2.3-a.b', '1.2.3-a.5'], + ['1.2.3-a.b', '1.2.3-a'], + ['1.2.3-a.b.c.10.d.5', '1.2.3-a.b.c.5.d.100'] + ].forEach(function(v) { + var v0 = v[0]; + var v1 = v[1]; + var loose = v[2]; + t.ok(gt(v0, v1, loose), "gt('" + v0 + "', '" + v1 + "')"); + t.ok(lt(v1, v0, loose), "lt('" + v1 + "', '" + v0 + "')"); + t.ok(!gt(v1, v0, loose), "!gt('" + v1 + "', '" + v0 + "')"); + t.ok(!lt(v0, v1, loose), "!lt('" + v0 + "', '" + v1 + "')"); + t.ok(eq(v0, v0, loose), "eq('" + v0 + "', '" + v0 + "')"); + t.ok(eq(v1, v1, loose), "eq('" + v1 + "', '" + v1 + "')"); + t.ok(neq(v0, v1, loose), "neq('" + v0 + "', '" + v1 + "')"); + t.ok(cmp(v1, '==', v1, loose), "cmp('" + v1 + "' == '" + v1 + "')"); + t.ok(cmp(v0, '>=', v1, loose), "cmp('" + v0 + "' >= '" + v1 + "')"); + t.ok(cmp(v1, '<=', v0, loose), "cmp('" + v1 + "' <= '" + v0 + "')"); + t.ok(cmp(v0, '!=', v1, loose), "cmp('" + v0 + "' != '" + v1 + "')"); + }); + t.end(); +}); + +test('\nequality tests', function(t) { + // [version1, version2] + // version1 should be equivalent to version2 + [['1.2.3', 'v1.2.3', true], + ['1.2.3', '=1.2.3', true], + ['1.2.3', 'v 1.2.3', true], + ['1.2.3', '= 1.2.3', true], + ['1.2.3', ' v1.2.3', true], + ['1.2.3', ' =1.2.3', true], + ['1.2.3', ' v 1.2.3', true], + ['1.2.3', ' = 1.2.3', true], + ['1.2.3-0', 'v1.2.3-0', true], + ['1.2.3-0', '=1.2.3-0', true], + ['1.2.3-0', 'v 1.2.3-0', true], + ['1.2.3-0', '= 1.2.3-0', true], + ['1.2.3-0', ' v1.2.3-0', true], + ['1.2.3-0', ' =1.2.3-0', true], + ['1.2.3-0', ' v 1.2.3-0', true], + ['1.2.3-0', ' = 1.2.3-0', true], + ['1.2.3-1', 'v1.2.3-1', true], + ['1.2.3-1', '=1.2.3-1', true], + ['1.2.3-1', 'v 1.2.3-1', true], + ['1.2.3-1', '= 1.2.3-1', true], + ['1.2.3-1', ' v1.2.3-1', true], + ['1.2.3-1', ' =1.2.3-1', true], + ['1.2.3-1', ' v 1.2.3-1', true], + ['1.2.3-1', ' = 1.2.3-1', true], + ['1.2.3-beta', 'v1.2.3-beta', true], + ['1.2.3-beta', '=1.2.3-beta', true], + ['1.2.3-beta', 'v 1.2.3-beta', true], + ['1.2.3-beta', '= 1.2.3-beta', true], + ['1.2.3-beta', ' v1.2.3-beta', true], + ['1.2.3-beta', ' =1.2.3-beta', true], + ['1.2.3-beta', ' v 1.2.3-beta', true], + ['1.2.3-beta', ' = 1.2.3-beta', true], + ['1.2.3-beta+build', ' = 1.2.3-beta+otherbuild', true], + ['1.2.3+build', ' = 1.2.3+otherbuild', true], + ['1.2.3-beta+build', '1.2.3-beta+otherbuild'], + ['1.2.3+build', '1.2.3+otherbuild'], + [' v1.2.3+build', '1.2.3+otherbuild'] + ].forEach(function(v) { + var v0 = v[0]; + var v1 = v[1]; + var loose = v[2]; + t.ok(eq(v0, v1, loose), "eq('" + v0 + "', '" + v1 + "')"); + t.ok(!neq(v0, v1, loose), "!neq('" + v0 + "', '" + v1 + "')"); + t.ok(cmp(v0, '==', v1, loose), 'cmp(' + v0 + '==' + v1 + ')'); + t.ok(!cmp(v0, '!=', v1, loose), '!cmp(' + v0 + '!=' + v1 + ')'); + t.ok(!cmp(v0, '===', v1, loose), '!cmp(' + v0 + '===' + v1 + ')'); + t.ok(cmp(v0, '!==', v1, loose), 'cmp(' + v0 + '!==' + v1 + ')'); + t.ok(!gt(v0, v1, loose), "!gt('" + v0 + "', '" + v1 + "')"); + t.ok(gte(v0, v1, loose), "gte('" + v0 + "', '" + v1 + "')"); + t.ok(!lt(v0, v1, loose), "!lt('" + v0 + "', '" + v1 + "')"); + t.ok(lte(v0, v1, loose), "lte('" + v0 + "', '" + v1 + "')"); + }); + t.end(); +}); + + +test('\nrange tests', function(t) { + // [range, version] + // version should be included by range + [['1.0.0 - 2.0.0', '1.2.3'], + ['1.0.0', '1.0.0'], + ['>=*', '0.2.4'], + ['', '1.0.0'], + ['*', '1.2.3'], + ['*', 'v1.2.3-foo', true], + ['>=1.0.0', '1.0.0'], + ['>=1.0.0', '1.0.1'], + ['>=1.0.0', '1.1.0'], + ['>1.0.0', '1.0.1'], + ['>1.0.0', '1.1.0'], + ['<=2.0.0', '2.0.0'], + ['<=2.0.0', '1.9999.9999'], + ['<=2.0.0', '0.2.9'], + ['<2.0.0', '1.9999.9999'], + ['<2.0.0', '0.2.9'], + ['>= 1.0.0', '1.0.0'], + ['>= 1.0.0', '1.0.1'], + ['>= 1.0.0', '1.1.0'], + ['> 1.0.0', '1.0.1'], + ['> 1.0.0', '1.1.0'], + ['<= 2.0.0', '2.0.0'], + ['<= 2.0.0', '1.9999.9999'], + ['<= 2.0.0', '0.2.9'], + ['< 2.0.0', '1.9999.9999'], + ['<\t2.0.0', '0.2.9'], + ['>=0.1.97', 'v0.1.97', true], + ['>=0.1.97', '0.1.97'], + ['0.1.20 || 1.2.4', '1.2.4'], + ['>=0.2.3 || <0.0.1', '0.0.0'], + ['>=0.2.3 || <0.0.1', '0.2.3'], + ['>=0.2.3 || <0.0.1', '0.2.4'], + ['||', '1.3.4'], + ['2.x.x', '2.1.3'], + ['1.2.x', '1.2.3'], + ['1.2.x || 2.x', '2.1.3'], + ['1.2.x || 2.x', '1.2.3'], + ['x', '1.2.3'], + ['2.*.*', '2.1.3'], + ['1.2.*', '1.2.3'], + ['1.2.* || 2.*', '2.1.3'], + ['1.2.* || 2.*', '1.2.3'], + ['*', '1.2.3'], + ['2', '2.1.2'], + ['2.3', '2.3.1'], + ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0 + ['~2.4', '2.4.5'], + ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0, + ['~1', '1.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '1.2.3'], + ['~> 1', '1.2.3'], + ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0, + ['~ 1.0', '1.0.2'], + ['~ 1.0.3', '1.0.12'], + ['>=1', '1.0.0'], + ['>= 1', '1.0.0'], + ['<1.2', '1.1.1'], + ['< 1.2', '1.1.1'], + ['1', '1.0.0beta', true], + ['~v0.5.4-pre', '0.5.5'], + ['~v0.5.4-pre', '0.5.4'], + ['=0.7.x', '0.7.2'], + ['>=0.7.x', '0.7.2'], + ['=0.7.x', '0.7.0-asdf'], + ['>=0.7.x', '0.7.0-asdf'], + ['<=0.7.x', '0.6.2'], + ['~1.2.1 >=1.2.3', '1.2.3'], + ['~1.2.1 =1.2.3', '1.2.3'], + ['~1.2.1 1.2.3', '1.2.3'], + ['~1.2.1 >=1.2.3 1.2.3', '1.2.3'], + ['~1.2.1 1.2.3 >=1.2.3', '1.2.3'], + ['~1.2.1 1.2.3', '1.2.3'], + ['>=1.2.1 1.2.3', '1.2.3'], + ['1.2.3 >=1.2.1', '1.2.3'], + ['>=1.2.3 >=1.2.1', '1.2.3'], + ['>=1.2.1 >=1.2.3', '1.2.3'], + ['<=1.2.3', '1.2.3-beta'], + ['>1.2', '1.3.0-beta'], + ['>=1.2', '1.2.8'], + ['^1.2.3', '1.8.1'], + ['^1.2.3', '1.2.3-beta'], + ['^0.1.2', '0.1.2'], + ['^0.1', '0.1.2'], + ['^1.2', '1.4.2'], + ['^1.2 ^1', '1.4.2'], + ['^1.2', '1.2.0-pre'], + ['^1.2.3', '1.2.3-pre'] + ].forEach(function(v) { + var range = v[0]; + var ver = v[1]; + var loose = v[2]; + t.ok(satisfies(ver, range, loose), range + ' satisfied by ' + ver); + }); + t.end(); +}); + +test('\nnegative range tests', function(t) { + // [range, version] + // version should not be included by range + [['1.0.0 - 2.0.0', '2.2.3'], + ['1.0.0', '1.0.1'], + ['>=1.0.0', '0.0.0'], + ['>=1.0.0', '0.0.1'], + ['>=1.0.0', '0.1.0'], + ['>1.0.0', '0.0.1'], + ['>1.0.0', '0.1.0'], + ['<=2.0.0', '3.0.0'], + ['<=2.0.0', '2.9999.9999'], + ['<=2.0.0', '2.2.9'], + ['<2.0.0', '2.9999.9999'], + ['<2.0.0', '2.2.9'], + ['>=0.1.97', 'v0.1.93', true], + ['>=0.1.97', '0.1.93'], + ['0.1.20 || 1.2.4', '1.2.3'], + ['>=0.2.3 || <0.0.1', '0.0.3'], + ['>=0.2.3 || <0.0.1', '0.2.2'], + ['2.x.x', '1.1.3'], + ['2.x.x', '3.1.3'], + ['1.2.x', '1.3.3'], + ['1.2.x || 2.x', '3.1.3'], + ['1.2.x || 2.x', '1.1.3'], + ['2.*.*', '1.1.3'], + ['2.*.*', '3.1.3'], + ['1.2.*', '1.3.3'], + ['1.2.* || 2.*', '3.1.3'], + ['1.2.* || 2.*', '1.1.3'], + ['2', '1.1.2'], + ['2.3', '2.4.1'], + ['~2.4', '2.5.0'], // >=2.4.0 <2.5.0 + ['~2.4', '2.3.9'], + ['~>3.2.1', '3.3.2'], // >=3.2.1 <3.3.0 + ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0 + ['~1', '0.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '2.2.3'], + ['~1.0', '1.1.0'], // >=1.0.0 <1.1.0 + ['<1', '1.0.0'], + ['>=1.2', '1.1.1'], + ['1', '2.0.0beta', true], + ['~v0.5.4-beta', '0.5.4-alpha'], + ['<1', '1.0.0beta', true], + ['< 1', '1.0.0beta', true], + ['=0.7.x', '0.8.2'], + ['>=0.7.x', '0.6.2'], + ['<=0.7.x', '0.7.2'], + ['<1.2.3', '1.2.3-beta'], + ['=1.2.3', '1.2.3-beta'], + ['>1.2', '1.2.8'], + ['^1.2.3', '2.0.0-alpha'], + ['^1.2.3', '1.2.2'], + ['^1.2', '1.1.9'], + // invalid ranges never satisfied! + ['blerg', '1.2.3'], + ['git+https://user:password0123@github.com/foo', '123.0.0', true], + ['^1.2.3', '2.0.0-pre'] + ].forEach(function(v) { + var range = v[0]; + var ver = v[1]; + var loose = v[2]; + var found = satisfies(ver, range, loose); + t.ok(!found, ver + ' not satisfied by ' + range); + }); + t.end(); +}); + +test('\nincrement versions test', function(t) { + // [version, inc, result] + // inc(version, inc) -> result + [['1.2.3', 'major', '2.0.0'], + ['1.2.3', 'minor', '1.3.0'], + ['1.2.3', 'patch', '1.2.4'], + ['1.2.3tag', 'major', '2.0.0', true], + ['1.2.3-tag', 'major', '2.0.0'], + ['1.2.3', 'fake', null], + ['1.2.0-0', 'patch', '1.2.0'], + ['fake', 'major', null], + ['1.2.3-4', 'major', '2.0.0'], + ['1.2.3-4', 'minor', '1.3.0'], + ['1.2.3-4', 'patch', '1.2.3'], + ['1.2.3-alpha.0.beta', 'major', '2.0.0'], + ['1.2.3-alpha.0.beta', 'minor', '1.3.0'], + ['1.2.3-alpha.0.beta', 'patch', '1.2.3'], + ['1.2.4', 'prerelease', '1.2.5-0'], + ['1.2.3-0', 'prerelease', '1.2.3-1'], + ['1.2.3-alpha.0', 'prerelease', '1.2.3-alpha.1'], + ['1.2.3-alpha.1', 'prerelease', '1.2.3-alpha.2'], + ['1.2.3-alpha.2', 'prerelease', '1.2.3-alpha.3'], + ['1.2.3-alpha.0.beta', 'prerelease', '1.2.3-alpha.1.beta'], + ['1.2.3-alpha.1.beta', 'prerelease', '1.2.3-alpha.2.beta'], + ['1.2.3-alpha.2.beta', 'prerelease', '1.2.3-alpha.3.beta'], + ['1.2.3-alpha.10.0.beta', 'prerelease', '1.2.3-alpha.10.1.beta'], + ['1.2.3-alpha.10.1.beta', 'prerelease', '1.2.3-alpha.10.2.beta'], + ['1.2.3-alpha.10.2.beta', 'prerelease', '1.2.3-alpha.10.3.beta'], + ['1.2.3-alpha.10.beta.0', 'prerelease', '1.2.3-alpha.10.beta.1'], + ['1.2.3-alpha.10.beta.1', 'prerelease', '1.2.3-alpha.10.beta.2'], + ['1.2.3-alpha.10.beta.2', 'prerelease', '1.2.3-alpha.10.beta.3'], + ['1.2.3-alpha.9.beta', 'prerelease', '1.2.3-alpha.10.beta'], + ['1.2.3-alpha.10.beta', 'prerelease', '1.2.3-alpha.11.beta'], + ['1.2.3-alpha.11.beta', 'prerelease', '1.2.3-alpha.12.beta'], + ['1.2.0', 'prepatch', '1.2.1-0'], + ['1.2.0-1', 'prepatch', '1.2.1-0'], + ['1.2.0', 'preminor', '1.3.0-0'], + ['1.2.0-1', 'preminor', '1.3.0-0'], + ['1.2.0', 'premajor', '2.0.0-0'], + ['1.2.0-1', 'premajor', '2.0.0-0'] + + + ].forEach(function(v) { + var pre = v[0]; + var what = v[1]; + var wanted = v[2]; + var loose = v[3]; + var found = inc(pre, what, loose); + t.equal(found, wanted, 'inc(' + pre + ', ' + what + ') === ' + wanted); + }); + + t.end(); +}); + +test('\nvalid range test', function(t) { + // [range, result] + // validRange(range) -> result + // translate ranges into their canonical form + [['1.0.0 - 2.0.0', '>=1.0.0 <=2.0.0'], + ['1.0.0', '1.0.0'], + ['>=*', '>=0.0.0-0'], + ['', '*'], + ['*', '*'], + ['*', '*'], + ['>=1.0.0', '>=1.0.0'], + ['>1.0.0', '>1.0.0'], + ['<=2.0.0', '<=2.0.0'], + ['1', '>=1.0.0-0 <2.0.0-0'], + ['<=2.0.0', '<=2.0.0'], + ['<=2.0.0', '<=2.0.0'], + ['<2.0.0', '<2.0.0-0'], + ['<2.0.0', '<2.0.0-0'], + ['>= 1.0.0', '>=1.0.0'], + ['>= 1.0.0', '>=1.0.0'], + ['>= 1.0.0', '>=1.0.0'], + ['> 1.0.0', '>1.0.0'], + ['> 1.0.0', '>1.0.0'], + ['<= 2.0.0', '<=2.0.0'], + ['<= 2.0.0', '<=2.0.0'], + ['<= 2.0.0', '<=2.0.0'], + ['< 2.0.0', '<2.0.0-0'], + ['< 2.0.0', '<2.0.0-0'], + ['>=0.1.97', '>=0.1.97'], + ['>=0.1.97', '>=0.1.97'], + ['0.1.20 || 1.2.4', '0.1.20||1.2.4'], + ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1-0'], + ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1-0'], + ['>=0.2.3 || <0.0.1', '>=0.2.3||<0.0.1-0'], + ['||', '||'], + ['2.x.x', '>=2.0.0-0 <3.0.0-0'], + ['1.2.x', '>=1.2.0-0 <1.3.0-0'], + ['1.2.x || 2.x', '>=1.2.0-0 <1.3.0-0||>=2.0.0-0 <3.0.0-0'], + ['1.2.x || 2.x', '>=1.2.0-0 <1.3.0-0||>=2.0.0-0 <3.0.0-0'], + ['x', '*'], + ['2.*.*', '>=2.0.0-0 <3.0.0-0'], + ['1.2.*', '>=1.2.0-0 <1.3.0-0'], + ['1.2.* || 2.*', '>=1.2.0-0 <1.3.0-0||>=2.0.0-0 <3.0.0-0'], + ['*', '*'], + ['2', '>=2.0.0-0 <3.0.0-0'], + ['2.3', '>=2.3.0-0 <2.4.0-0'], + ['~2.4', '>=2.4.0-0 <2.5.0-0'], + ['~2.4', '>=2.4.0-0 <2.5.0-0'], + ['~>3.2.1', '>=3.2.1-0 <3.3.0-0'], + ['~1', '>=1.0.0-0 <2.0.0-0'], + ['~>1', '>=1.0.0-0 <2.0.0-0'], + ['~> 1', '>=1.0.0-0 <2.0.0-0'], + ['~1.0', '>=1.0.0-0 <1.1.0-0'], + ['~ 1.0', '>=1.0.0-0 <1.1.0-0'], + ['^0', '>=0.0.0-0 <1.0.0-0'], + ['^ 1', '>=1.0.0-0 <2.0.0-0'], + ['^0.1', '>=0.1.0-0 <0.2.0-0'], + ['^1.0', '>=1.0.0-0 <2.0.0-0'], + ['^1.2', '>=1.2.0-0 <2.0.0-0'], + ['^0.0.1', '0.0.1'], + ['^0.0.1-beta', '0.0.1-beta'], + ['^0.1.2', '0.1.2'], + ['^1.2.3', '>=1.2.3-0 <2.0.0-0'], + ['^1.2.3-beta.4', '>=1.2.3-beta.4 <2.0.0-0'], + ['<1', '<1.0.0-0'], + ['< 1', '<1.0.0-0'], + ['>=1', '>=1.0.0-0'], + ['>= 1', '>=1.0.0-0'], + ['<1.2', '<1.2.0-0'], + ['< 1.2', '<1.2.0-0'], + ['1', '>=1.0.0-0 <2.0.0-0'], + ['>01.02.03', '>1.2.3', true], + ['>01.02.03', null], + ['~1.2.3beta', '>=1.2.3-beta <1.3.0-0', true], + ['~1.2.3beta', null], + ['^ 1.2 ^ 1', '>=1.2.0-0 <2.0.0-0 >=1.0.0-0 <2.0.0-0'] + ].forEach(function(v) { + var pre = v[0]; + var wanted = v[1]; + var loose = v[2]; + var found = validRange(pre, loose); + + t.equal(found, wanted, 'validRange(' + pre + ') === ' + wanted); + }); + + t.end(); +}); + +test('\ncomparators test', function(t) { + // [range, comparators] + // turn range into a set of individual comparators + [['1.0.0 - 2.0.0', [['>=1.0.0', '<=2.0.0']]], + ['1.0.0', [['1.0.0']]], + ['>=*', [['>=0.0.0-0']]], + ['', [['']]], + ['*', [['']]], + ['*', [['']]], + ['>=1.0.0', [['>=1.0.0']]], + ['>=1.0.0', [['>=1.0.0']]], + ['>=1.0.0', [['>=1.0.0']]], + ['>1.0.0', [['>1.0.0']]], + ['>1.0.0', [['>1.0.0']]], + ['<=2.0.0', [['<=2.0.0']]], + ['1', [['>=1.0.0-0', '<2.0.0-0']]], + ['<=2.0.0', [['<=2.0.0']]], + ['<=2.0.0', [['<=2.0.0']]], + ['<2.0.0', [['<2.0.0-0']]], + ['<2.0.0', [['<2.0.0-0']]], + ['>= 1.0.0', [['>=1.0.0']]], + ['>= 1.0.0', [['>=1.0.0']]], + ['>= 1.0.0', [['>=1.0.0']]], + ['> 1.0.0', [['>1.0.0']]], + ['> 1.0.0', [['>1.0.0']]], + ['<= 2.0.0', [['<=2.0.0']]], + ['<= 2.0.0', [['<=2.0.0']]], + ['<= 2.0.0', [['<=2.0.0']]], + ['< 2.0.0', [['<2.0.0-0']]], + ['<\t2.0.0', [['<2.0.0-0']]], + ['>=0.1.97', [['>=0.1.97']]], + ['>=0.1.97', [['>=0.1.97']]], + ['0.1.20 || 1.2.4', [['0.1.20'], ['1.2.4']]], + ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1-0']]], + ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1-0']]], + ['>=0.2.3 || <0.0.1', [['>=0.2.3'], ['<0.0.1-0']]], + ['||', [[''], ['']]], + ['2.x.x', [['>=2.0.0-0', '<3.0.0-0']]], + ['1.2.x', [['>=1.2.0-0', '<1.3.0-0']]], + ['1.2.x || 2.x', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], + ['1.2.x || 2.x', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], + ['x', [['']]], + ['2.*.*', [['>=2.0.0-0', '<3.0.0-0']]], + ['1.2.*', [['>=1.2.0-0', '<1.3.0-0']]], + ['1.2.* || 2.*', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], + ['1.2.* || 2.*', [['>=1.2.0-0', '<1.3.0-0'], ['>=2.0.0-0', '<3.0.0-0']]], + ['*', [['']]], + ['2', [['>=2.0.0-0', '<3.0.0-0']]], + ['2.3', [['>=2.3.0-0', '<2.4.0-0']]], + ['~2.4', [['>=2.4.0-0', '<2.5.0-0']]], + ['~2.4', [['>=2.4.0-0', '<2.5.0-0']]], + ['~>3.2.1', [['>=3.2.1-0', '<3.3.0-0']]], + ['~1', [['>=1.0.0-0', '<2.0.0-0']]], + ['~>1', [['>=1.0.0-0', '<2.0.0-0']]], + ['~> 1', [['>=1.0.0-0', '<2.0.0-0']]], + ['~1.0', [['>=1.0.0-0', '<1.1.0-0']]], + ['~ 1.0', [['>=1.0.0-0', '<1.1.0-0']]], + ['~ 1.0.3', [['>=1.0.3-0', '<1.1.0-0']]], + ['~> 1.0.3', [['>=1.0.3-0', '<1.1.0-0']]], + ['<1', [['<1.0.0-0']]], + ['< 1', [['<1.0.0-0']]], + ['>=1', [['>=1.0.0-0']]], + ['>= 1', [['>=1.0.0-0']]], + ['<1.2', [['<1.2.0-0']]], + ['< 1.2', [['<1.2.0-0']]], + ['1', [['>=1.0.0-0', '<2.0.0-0']]], + ['1 2', [['>=1.0.0-0', '<2.0.0-0', '>=2.0.0-0', '<3.0.0-0']]], + ['1.2 - 3.4.5', [['>=1.2.0-0', '<=3.4.5']]], + ['1.2.3 - 3.4', [['>=1.2.3', '<3.5.0-0']]] + ].forEach(function(v) { + var pre = v[0]; + var wanted = v[1]; + var found = toComparators(v[0]); + var jw = JSON.stringify(wanted); + t.equivalent(found, wanted, 'toComparators(' + pre + ') === ' + jw); + }); + + t.end(); +}); + +test('\ninvalid version numbers', function(t) { + ['1.2.3.4', + 'NOT VALID', + 1.2, + null, + 'Infinity.NaN.Infinity' + ].forEach(function(v) { + t.throws(function() { + new SemVer(v); + }, {name:'TypeError', message:'Invalid Version: ' + v}); + }); + + t.end(); +}); + +test('\nstrict vs loose version numbers', function(t) { + [['=1.2.3', '1.2.3'], + ['01.02.03', '1.2.3'], + ['1.2.3-beta.01', '1.2.3-beta.1'], + [' =1.2.3', '1.2.3'], + ['1.2.3foo', '1.2.3-foo'] + ].forEach(function(v) { + var loose = v[0]; + var strict = v[1]; + t.throws(function() { + new SemVer(loose); + }); + var lv = new SemVer(loose, true); + t.equal(lv.version, strict); + t.ok(eq(loose, strict, true)); + t.throws(function() { + eq(loose, strict); + }); + t.throws(function() { + new SemVer(strict).compare(loose); + }); + }); + t.end(); +}); + +test('\nstrict vs loose ranges', function(t) { + [['>=01.02.03', '>=1.2.3'], + ['~1.02.03beta', '>=1.2.3-beta <1.3.0-0'] + ].forEach(function(v) { + var loose = v[0]; + var comps = v[1]; + t.throws(function() { + new Range(loose); + }); + t.equal(new Range(loose, true).range, comps); + }); + t.end(); +}); + +test('\nmax satisfying', function(t) { + [[['1.2.3', '1.2.4'], '1.2', '1.2.4'], + [['1.2.4', '1.2.3'], '1.2', '1.2.4'], + [['1.2.3', '1.2.4', '1.2.5', '1.2.6'], '~1.2.3', '1.2.6'], + [['1.1.0', '1.2.0', '1.2.1', '1.3.0', '2.0.0b1', '2.0.0b2', '2.0.0b3', '2.0.0', '2.1.0'], '~2.0.0', '2.0.0', true] + ].forEach(function(v) { + var versions = v[0]; + var range = v[1]; + var expect = v[2]; + var loose = v[3]; + var actual = semver.maxSatisfying(versions, range, loose); + t.equal(actual, expect); + }); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/ltr.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/ltr.js new file mode 100644 index 0000000..d146137 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/ltr.js @@ -0,0 +1,175 @@ +var tap = require('tap'); +var test = tap.test; +var semver = require('../semver.js'); +var ltr = semver.ltr; + +test('\nltr tests', function(t) { + // [range, version, loose] + // Version should be less than range + [ + ['~1.2.2', '1.2.1'], + ['~0.6.1-1', '0.6.1-0'], + ['1.0.0 - 2.0.0', '0.0.1'], + ['1.0.0-beta.2', '1.0.0-beta.1'], + ['1.0.0', '0.0.0'], + ['>=2.0.0', '1.1.1'], + ['>=2.0.0', '1.2.9'], + ['>2.0.0', '2.0.0'], + ['0.1.20 || 1.2.4', '0.1.5'], + ['2.x.x', '1.0.0'], + ['1.2.x', '1.1.0'], + ['1.2.x || 2.x', '1.0.0'], + ['2.*.*', '1.0.1'], + ['1.2.*', '1.1.3'], + ['1.2.* || 2.*', '1.1.9999'], + ['2', '1.0.0'], + ['2.3', '2.2.2'], + ['~2.4', '2.3.0'], // >=2.4.0 <2.5.0 + ['~2.4', '2.3.5'], + ['~>3.2.1', '3.2.0'], // >=3.2.1 <3.3.0 + ['~1', '0.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '0.2.4'], + ['~> 1', '0.2.3'], + ['~1.0', '0.1.2'], // >=1.0.0 <1.1.0 + ['~ 1.0', '0.1.0'], + ['>1.2', '1.2.0'], + ['> 1.2', '1.2.1'], + ['1', '0.0.0beta', true], + ['~v0.5.4-pre', '0.5.4-alpha'], + ['~v0.5.4-pre', '0.5.4-alpha'], + ['=0.7.x', '0.6.0'], + ['=0.7.x', '0.6.0-asdf'], + ['>=0.7.x', '0.6.0'], + ['~1.2.2', '1.2.1'], + ['1.0.0 - 2.0.0', '0.2.3'], + ['1.0.0', '0.0.1'], + ['>=2.0.0', '1.0.0'], + ['>=2.0.0', '1.9999.9999'], + ['>=2.0.0', '1.2.9'], + ['>2.0.0', '2.0.0'], + ['>2.0.0', '1.2.9'], + ['2.x.x', '1.1.3'], + ['1.2.x', '1.1.3'], + ['1.2.x || 2.x', '1.1.3'], + ['2.*.*', '1.1.3'], + ['1.2.*', '1.1.3'], + ['1.2.* || 2.*', '1.1.3'], + ['2', '1.9999.9999'], + ['2.3', '2.2.1'], + ['~2.4', '2.3.0'], // >=2.4.0 <2.5.0 + ['~>3.2.1', '2.3.2'], // >=3.2.1 <3.3.0 + ['~1', '0.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '0.2.3'], + ['~1.0', '0.0.0'], // >=1.0.0 <1.1.0 + ['>1', '1.0.0'], + ['2', '1.0.0beta', true], + ['>1', '1.0.0beta', true], + ['> 1', '1.0.0beta', true], + ['=0.7.x', '0.6.2'], + ['>=0.7.x', '0.6.2'] + ].forEach(function(tuple) { + var range = tuple[0]; + var version = tuple[1]; + var loose = tuple[2] || false; + var msg = 'ltr(' + version + ', ' + range + ', ' + loose + ')'; + t.ok(ltr(version, range, loose), msg); + }); + t.end(); +}); + +test('\nnegative ltr tests', function(t) { + // [range, version, loose] + // Version should NOT be greater than range + [ + ['~ 1.0', '1.1.0'], + ['~0.6.1-1', '0.6.1-1'], + ['1.0.0 - 2.0.0', '1.2.3'], + ['1.0.0 - 2.0.0', '2.9.9'], + ['1.0.0', '1.0.0'], + ['>=*', '0.2.4'], + ['', '1.0.0', true], + ['*', '1.2.3'], + ['*', 'v1.2.3-foo'], + ['>=1.0.0', '1.0.0'], + ['>=1.0.0', '1.0.1'], + ['>=1.0.0', '1.1.0'], + ['>1.0.0', '1.0.1'], + ['>1.0.0', '1.1.0'], + ['<=2.0.0', '2.0.0'], + ['<=2.0.0', '1.9999.9999'], + ['<=2.0.0', '0.2.9'], + ['<2.0.0', '1.9999.9999'], + ['<2.0.0', '0.2.9'], + ['>= 1.0.0', '1.0.0'], + ['>= 1.0.0', '1.0.1'], + ['>= 1.0.0', '1.1.0'], + ['> 1.0.0', '1.0.1'], + ['> 1.0.0', '1.1.0'], + ['<= 2.0.0', '2.0.0'], + ['<= 2.0.0', '1.9999.9999'], + ['<= 2.0.0', '0.2.9'], + ['< 2.0.0', '1.9999.9999'], + ['<\t2.0.0', '0.2.9'], + ['>=0.1.97', 'v0.1.97'], + ['>=0.1.97', '0.1.97'], + ['0.1.20 || 1.2.4', '1.2.4'], + ['0.1.20 || >1.2.4', '1.2.4'], + ['0.1.20 || 1.2.4', '1.2.3'], + ['0.1.20 || 1.2.4', '0.1.20'], + ['>=0.2.3 || <0.0.1', '0.0.0'], + ['>=0.2.3 || <0.0.1', '0.2.3'], + ['>=0.2.3 || <0.0.1', '0.2.4'], + ['||', '1.3.4'], + ['2.x.x', '2.1.3'], + ['1.2.x', '1.2.3'], + ['1.2.x || 2.x', '2.1.3'], + ['1.2.x || 2.x', '1.2.3'], + ['x', '1.2.3'], + ['2.*.*', '2.1.3'], + ['1.2.*', '1.2.3'], + ['1.2.* || 2.*', '2.1.3'], + ['1.2.* || 2.*', '1.2.3'], + ['1.2.* || 2.*', '1.2.3'], + ['*', '1.2.3'], + ['2', '2.1.2'], + ['2.3', '2.3.1'], + ['~2.4', '2.4.0'], // >=2.4.0 <2.5.0 + ['~2.4', '2.4.5'], + ['~>3.2.1', '3.2.2'], // >=3.2.1 <3.3.0 + ['~1', '1.2.3'], // >=1.0.0 <2.0.0 + ['~>1', '1.2.3'], + ['~> 1', '1.2.3'], + ['~1.0', '1.0.2'], // >=1.0.0 <1.1.0 + ['~ 1.0', '1.0.2'], + ['>=1', '1.0.0'], + ['>= 1', '1.0.0'], + ['<1.2', '1.1.1'], + ['< 1.2', '1.1.1'], + ['1', '1.0.0beta', true], + ['~v0.5.4-pre', '0.5.5'], + ['~v0.5.4-pre', '0.5.4'], + ['=0.7.x', '0.7.2'], + ['>=0.7.x', '0.7.2'], + ['=0.7.x', '0.7.0-asdf'], + ['>=0.7.x', '0.7.0-asdf'], + ['<=0.7.x', '0.6.2'], + ['>0.2.3 >0.2.4 <=0.2.5', '0.2.5'], + ['>=0.2.3 <=0.2.4', '0.2.4'], + ['1.0.0 - 2.0.0', '2.0.0'], + ['^1', '1.0.0-0'], + ['^3.0.0', '4.0.0'], + ['^1.0.0 || ~2.0.1', '2.0.0'], + ['^0.1.0 || ~3.0.1 || 5.0.0', '3.2.0'], + ['^0.1.0 || ~3.0.1 || 5.0.0', '1.0.0beta', true], + ['^0.1.0 || ~3.0.1 || 5.0.0', '5.0.0-0', true], + ['^0.1.0 || ~3.0.1 || >4 <=5.0.0', '3.5.0'], + ['=0.1.0', '1.0.0'] + ].forEach(function(tuple) { + var range = tuple[0]; + var version = tuple[1]; + var loose = tuple[2] || false; + var msg = '!ltr(' + version + ', ' + range + ', ' + loose + ')'; + t.notOk(ltr(version, range, loose), msg); + }); + t.end(); +}); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/no-module.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/no-module.js new file mode 100644 index 0000000..96d1cd1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/semver/test/no-module.js @@ -0,0 +1,19 @@ +var tap = require('tap'); +var test = tap.test; + +test('no module system', function(t) { + var fs = require('fs'); + var vm = require('vm'); + var head = fs.readFileSync(require.resolve('../head.js'), 'utf8'); + var src = fs.readFileSync(require.resolve('../'), 'utf8'); + var foot = fs.readFileSync(require.resolve('../foot.js'), 'utf8'); + vm.runInThisContext(head + src + foot, 'semver.js'); + + // just some basic poking to see if it did some stuff + t.type(global.semver, 'object'); + t.type(global.semver.SemVer, 'function'); + t.type(global.semver.Range, 'function'); + t.ok(global.semver.satisfies('1.2.3', '1.2')); + t.end(); +}); + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore new file mode 100644 index 0000000..080b47e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore @@ -0,0 +1,14 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid + +pids +logs +results + +npm-debug.log +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml new file mode 100644 index 0000000..1d8a1a6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/README.md new file mode 100644 index 0000000..135424b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/README.md @@ -0,0 +1,81 @@ +# Tar Pack + +Package and un-package modules of some sort (in tar/gz bundles). This is mostly useful for package managers. Note that it doesn't check for or touch `package.json` so it can be used even if that's not the way you store your package info. + +[![Build Status](https://travis-ci.org/ForbesLindesay/tar-pack.png?branch=master)](https://travis-ci.org/ForbesLindesay/tar-pack) +[![Dependency Status](https://gemnasium.com/ForbesLindesay/tar-pack.png)](https://gemnasium.com/ForbesLindesay/tar-pack) +[![NPM version](https://badge.fury.io/js/tar-pack.png)](http://badge.fury.io/js/tar-pack) + +## Installation + + $ npm install tar-pack + +## API + +### pack(folder|packer, [options]) + +Pack the folder at `folder` into a gzipped tarball and return the tgz as a stream. Files ignored by `.gitignore` will not be in the package. + +You can optionally pass a `fstream.DirReader` directly, instead of folder. For example, to create an npm package, do: + +```js +pack(require("fstream-npm")(folder), [options]) +``` + +Options: + + - `noProprietary` (defaults to `false`) Set this to `true` to prevent any proprietary attributes being added to the tarball. These attributes are allowed by the spec, but may trip up some poorly written tarball parsers. + - `ignoreFiles` (defaults to `['.gitignore']`) These files can specify files to be excluded from the package using the syntax of `.gitignore`. This option is ignored if you parse a `fstream.DirReader` instead of a string for folder. + - `filter` (defaults to `entry => true`) A function that takes an entry and returns `true` if it should be included in the package and `false` if it should not. Entryies are of the form `{path, basename, dirname, type}` where (type is "Directory" or "File"). This function is ignored if you parse a `fstream.DirReader` instead of a string for folder. + +Example: + +```js +var write = require('fs').createWriteStream +var pack = require('tar-pack').pack +pack(process.cwd()) + .pipe(write(__dirname + '/package.tar.gz')) + .on('error', function (err) { + console.error(err.stack) + }) + .on('close', function () { + console.log('done') + }) +``` + +### unpack(folder, [options,] cb) + +Return a stream that unpacks a tarball into a folder at `folder`. N.B. the output folder will be removed first if it already exists. + +The callback is called with an optional error and, as its second argument, a string which is one of: + + - `'directory'`, indicating that the extracted package was a directory (either `.tar.gz` or `.tar`) + - `'file'`, incating that the extracted package was just a single file (extracted to `defaultName`, see options) + +Basic Options: + + - `defaultName` (defaults to `index.js`) If the package is a single file, rather than a tarball, it will be "extracted" to this file name, set to `false` to disable. + +Advanced Options (you probably don't need any of these): + + - `gid` - (defaults to `null`) the `gid` to use when writing files + - `uid` - (defaults to `null`) the `uid` to use when writing files + - `dmode` - (defaults to `0777`) The mode to use when creating directories + - `fmode` - (defaults to `0666`) The mode to use when creating files + - `unsafe` - (defaults to `false`) (on non win32 OSes it overrides `gid` and `uid` with the current processes IDs) + +Example: + +```js +var read = require('fs').createReadStream +var unpack = require('tar-pack').unpack +read(process.cwd() + '/package.tar.gz') + .pipe(unpack(__dirname + '/package/', function (err) { + if (err) console.error(err.stack) + else console.log('done') + })) +``` + +## License + + BSD \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/index.js new file mode 100644 index 0000000..23b95a9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/index.js @@ -0,0 +1,246 @@ +"use strict" + +var debug = require('debug')('tar-pack') +var uidNumber = require('uid-number') +var rm = require('rimraf') +var tar = require('tar') +var once = require('once') +var fstream = require('fstream') +var packer = require('fstream-ignore') + +var PassThrough = require('stream').PassThrough || require('readable-stream').PassThrough +var zlib = require('zlib') +var path = require('path') +var fs +try { + fs = require('graceful-fs') +} catch (ex) { + fs = require('fs') +} + +var win32 = process.platform === 'win32' +var myUid = process.getuid && process.getuid() +var myGid = process.getgid && process.getgid() + +if (process.env.SUDO_UID && myUid === 0) { + if (!isNaN(process.env.SUDO_UID)) myUid = +process.env.SUDO_UID + if (!isNaN(process.env.SUDO_GID)) myGid = +process.env.SUDO_GID +} + +exports.pack = pack +exports.unpack = unpack + +function pack(folder, options) { + options = options || {} + if (typeof folder === 'string') { + + var filter = options.filter || function (entry) { return true; } + + folder = packer({ + path: folder, + type: 'Directory', + isDirectory: true, + ignoreFiles: options.ignoreFiles || ['.gitignore'], + filter: function (entry) { // {path, basename, dirname, type} (type is "Directory" or "File") + var basename = entry.basename + // some files are *never* allowed under any circumstances + // these files should always be either temporary files or + // version control related files + if (basename === '.git' || basename === '.lock-wscript' || basename.match(/^\.wafpickle-[0-9]+$/) || + basename === 'CVS' || basename === '.svn' || basename === '.hg' || basename.match(/^\..*\.swp$/) || + basename === '.DS_Store' || basename.match(/^\._/)) { + return false + } + //custom excludes + return filter(entry) + } + }) + } + // By default, npm includes some proprietary attributes in the + // package tarball. This is sane, and allowed by the spec. + // However, npm *itself* excludes these from its own package, + // so that it can be more easily bootstrapped using old and + // non-compliant tar implementations. + var tarPack = tar.Pack({ noProprietary: options.noProprietary || false }) + var gzip = zlib.Gzip() + + folder + .on('error', function (er) { + if (er) debug('Error reading folder') + return gzip.emit('error', er) + }) + tarPack + .on('error', function (er) { + if (er) debug('tar creation error') + gzip.emit('error', er) + }) + return folder.pipe(tarPack).pipe(gzip) +} + +function unpack(unpackTarget, options, cb) { + if (typeof options === 'function' && cb === undefined) cb = options, options = undefined + + var tarball = new PassThrough() + if (typeof cb === 'function') { + cb = once(cb) + tarball.on('error', cb) + tarball.on('close', function () { + cb() + }) + } + + var parent = path.dirname(unpackTarget) + var base = path.basename(unpackTarget) + + options = options || {} + var gid = options.gid || null + var uid = options.uid || null + var dMode = options.dmode || 0x0777 //npm.modes.exec + var fMode = options.fmode || 0x0666 //npm.modes.file + var defaultName = options.defaultName || (options.defaultName === false ? false : 'index.js') + + // figure out who we're supposed to be, if we're not pretending + // to be a specific user. + if (options.unsafe && !win32) { + uid = myUid + gid = myGid + } + + var pending = 2 + uidNumber(uid, gid, function (er, uid, gid) { + if (er) { + tarball.emit('error', er) + return tarball.end() + } + if (0 === --pending) next() + }) + rm(unpackTarget, function (er) { + if (er) { + tarball.emit('error', er) + return tarball.end() + } + if (0 === --pending) next() + }) + function next() { + // gzip {tarball} --decompress --stdout \ + // | tar -mvxpf - --strip-components=1 -C {unpackTarget} + gunzTarPerm(tarball, unpackTarget, dMode, fMode, uid, gid, defaultName) + } + return tarball +} + + +function gunzTarPerm(tarball, target, dMode, fMode, uid, gid, defaultName) { + debug('modes %j', [dMode.toString(8), fMode.toString(8)]) + + function fixEntry(entry) { + debug('fixEntry %j', entry.path) + // never create things that are user-unreadable, + // or dirs that are user-un-listable. Only leads to headaches. + var originalMode = entry.mode = entry.mode || entry.props.mode + entry.mode = entry.mode | (entry.type === 'Directory' ? dMode : fMode) + entry.props.mode = entry.mode + if (originalMode !== entry.mode) { + debug('modified mode %j', [entry.path, originalMode, entry.mode]) + } + + // if there's a specific owner uid/gid that we want, then set that + if (!win32 && typeof uid === 'number' && typeof gid === 'number') { + entry.props.uid = entry.uid = uid + entry.props.gid = entry.gid = gid + } + } + + var extractOpts = { type: 'Directory', path: target, strip: 1 } + + if (!win32 && typeof uid === 'number' && typeof gid === 'number') { + extractOpts.uid = uid + extractOpts.gid = gid + } + + extractOpts.filter = function () { + // symbolic links are not allowed in packages. + if (this.type.match(/^.*Link$/)) { + debug('excluding symbolic link: ' + this.path.substr(target.length + 1) + ' -> ' + this.linkpath) + return false + } + return true + } + + + type(tarball, function (err, type) { + if (err) return tarball.emit('error', err) + var strm = tarball + if (type === 'gzip') { + strm = strm.pipe(zlib.Unzip()) + strm.on('error', function (er) { + if (er) debug('unzip error') + tarball.emit('error', er) + }) + type = 'tar' + } + if (type === 'tar') { + strm + .pipe(tar.Extract(extractOpts)) + .on('entry', fixEntry) + .on('error', function (er) { + if (er) debug('untar error') + tarball.emit('error', er) + }) + .on('close', function () { + tarball.emit('close') + }) + return + } + if (type === 'naked-file' && defaultName) { + var jsOpts = { path: path.resolve(target, defaultName) } + + if (!win32 && typeof uid === 'number' && typeof gid === 'number') { + jsOpts.uid = uid + jsOpts.gid = gid + } + + strm + .pipe(fstream.Writer(jsOpts)) + .on('error', function (er) { + if (er) debug('copy error') + tarball.emit('error', er) + }) + .on('close', function () { + tarball.emit('close') + }) + return + } + + return cb(new Error('Unrecognised package type')); + }) +} + +function type(stream, callback) { + stream.on('error', handle) + stream.on('data', parse) + function handle(err) { + stream.removeListener('data', parse) + stream.removeListener('error', handle) + } + function parse(chunk) { + // detect what it is. + // Then, depending on that, we'll figure out whether it's + // a single-file module, gzipped tarball, or naked tarball. + + // gzipped files all start with 1f8b08 + if (chunk[0] === 0x1F && chunk[1] === 0x8B && chunk[2] === 0x08) { + callback(null, 'gzip') + } else if (chunk.toString().match(/^package\/\u0000/)) { + // note, this will only pick up on tarballs with a root directory called package + callback(null, 'tar') + } else { + callback(null, 'naked-file') + } + + // now un-hook, and re-emit the chunk + stream.removeListener('data', parse) + stream.removeListener('error', handle) + stream.unshift(chunk) + } +} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/Readme.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/Readme.md new file mode 100644 index 0000000..c5a34e8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/Readme.md @@ -0,0 +1,115 @@ +# debug + + tiny node.js debugging utility modelled after node core's debugging technique. + +## Installation + +``` +$ npm install debug +``` + +## Usage + + With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility. + +Example _app.js_: + +```js +var debug = require('debug')('http') + , http = require('http') + , name = 'My App'; + +// fake app + +debug('booting %s', name); + +http.createServer(function(req, res){ + debug(req.method + ' ' + req.url); + res.end('hello\n'); +}).listen(3000, function(){ + debug('listening'); +}); + +// fake worker of some kind + +require('./worker'); +``` + +Example _worker.js_: + +```js +var debug = require('debug')('worker'); + +setInterval(function(){ + debug('doing some work'); +}, 1000); +``` + + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples: + + ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png) + + ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png) + +## Millisecond diff + + When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. + + ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png) + + When stderr is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below: + _(NOTE: Debug now uses stderr instead of stdout, so the correct shell command for this example is actually `DEBUG=* node example/worker 2> out &`)_ + + ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png) + +## Conventions + + If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". + +## Wildcards + + The "*" character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. + + You can also exclude specific debuggers by prefixing them with a "-" character. For example, `DEBUG=* -connect:*` would include all debuggers except those starting with "connect:". + +## Browser support + + Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. + +```js +a = debug('worker:a'); +b = debug('worker:b'); + +setInterval(function(){ + a('doing some work'); +}, 1000); + +setInterval(function(){ + a('doing some work'); +}, 1200); +``` + +## License + +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca> + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/debug.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/debug.js new file mode 100644 index 0000000..509dc0d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/debug.js @@ -0,0 +1,137 @@ + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + if (!debug.enabled(name)) return function(){}; + + return function(fmt){ + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (debug[name] || curr); + debug[name] = curr; + + fmt = name + + ' ' + + fmt + + ' +' + debug.humanize(ms); + + // This hackery is required for IE8 + // where `console.log` doesn't have 'apply' + window.console + && console.log + && Function.prototype.apply.call(console.log, console, arguments); + } +} + +/** + * The currently active debug mode names. + */ + +debug.names = []; +debug.skips = []; + +/** + * Enables a debug mode by name. This can include modes + * separated by a colon and wildcards. + * + * @param {String} name + * @api public + */ + +debug.enable = function(name) { + try { + localStorage.debug = name; + } catch(e){} + + var split = (name || '').split(/[\s,]+/) + , len = split.length; + + for (var i = 0; i < len; i++) { + name = split[i].replace('*', '.*?'); + if (name[0] === '-') { + debug.skips.push(new RegExp('^' + name.substr(1) + '$')); + } + else { + debug.names.push(new RegExp('^' + name + '$')); + } + } +}; + +/** + * Disable debug output. + * + * @api public + */ + +debug.disable = function(){ + debug.enable(''); +}; + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +debug.humanize = function(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +}; + +/** + * Returns true if the given mode name is enabled, false otherwise. + * + * @param {String} name + * @return {Boolean} + * @api public + */ + +debug.enabled = function(name) { + for (var i = 0, len = debug.skips.length; i < len; i++) { + if (debug.skips[i].test(name)) { + return false; + } + } + for (var i = 0, len = debug.names.length; i < len; i++) { + if (debug.names[i].test(name)) { + return true; + } + } + return false; +}; + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} + +// persist + +try { + if (window.localStorage) debug.enable(localStorage.debug); +} catch(e){} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/index.js new file mode 100644 index 0000000..e02c13b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/index.js @@ -0,0 +1,5 @@ +if ('undefined' == typeof window) { + module.exports = require('./lib/debug'); +} else { + module.exports = require('./debug'); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/lib/debug.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/lib/debug.js new file mode 100644 index 0000000..3b0a918 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/lib/debug.js @@ -0,0 +1,147 @@ +/** + * Module dependencies. + */ + +var tty = require('tty'); + +/** + * Expose `debug()` as the module. + */ + +module.exports = debug; + +/** + * Enabled debuggers. + */ + +var names = [] + , skips = []; + +(process.env.DEBUG || '') + .split(/[\s,]+/) + .forEach(function(name){ + name = name.replace('*', '.*?'); + if (name[0] === '-') { + skips.push(new RegExp('^' + name.substr(1) + '$')); + } else { + names.push(new RegExp('^' + name + '$')); + } + }); + +/** + * Colors. + */ + +var colors = [6, 2, 3, 4, 5, 1]; + +/** + * Previous debug() call. + */ + +var prev = {}; + +/** + * Previously assigned color. + */ + +var prevColor = 0; + +/** + * Is stdout a TTY? Colored output is disabled when `true`. + */ + +var isatty = tty.isatty(2); + +/** + * Select a color. + * + * @return {Number} + * @api private + */ + +function color() { + return colors[prevColor++ % colors.length]; +} + +/** + * Humanize the given `ms`. + * + * @param {Number} m + * @return {String} + * @api private + */ + +function humanize(ms) { + var sec = 1000 + , min = 60 * 1000 + , hour = 60 * min; + + if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; + if (ms >= min) return (ms / min).toFixed(1) + 'm'; + if (ms >= sec) return (ms / sec | 0) + 's'; + return ms + 'ms'; +} + +/** + * Create a debugger with the given `name`. + * + * @param {String} name + * @return {Type} + * @api public + */ + +function debug(name) { + function disabled(){} + disabled.enabled = false; + + var match = skips.some(function(re){ + return re.test(name); + }); + + if (match) return disabled; + + match = names.some(function(re){ + return re.test(name); + }); + + if (!match) return disabled; + var c = color(); + + function colored(fmt) { + fmt = coerce(fmt); + + var curr = new Date; + var ms = curr - (prev[name] || curr); + prev[name] = curr; + + fmt = ' \u001b[9' + c + 'm' + name + ' ' + + '\u001b[3' + c + 'm\u001b[90m' + + fmt + '\u001b[3' + c + 'm' + + ' +' + humanize(ms) + '\u001b[0m'; + + console.error.apply(this, arguments); + } + + function plain(fmt) { + fmt = coerce(fmt); + + fmt = new Date().toUTCString() + + ' ' + name + ' ' + fmt; + console.error.apply(this, arguments); + } + + colored.enabled = plain.enabled = true; + + return isatty || process.env.DEBUG_COLORS + ? colored + : plain; +} + +/** + * Coerce `val`. + */ + +function coerce(val) { + if (val instanceof Error) return val.stack || val.message; + return val; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/package.json new file mode 100644 index 0000000..59c04cd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/debug/package.json @@ -0,0 +1,62 @@ +{ + "name": "debug", + "version": "0.7.4", + "repository": { + "type": "git", + "url": "git://github.com/visionmedia/debug.git" + }, + "description": "small debugging utility", + "keywords": [ + "debug", + "log", + "debugger" + ], + "author": { + "name": "TJ Holowaychuk", + "email": "tj@vision-media.ca" + }, + "dependencies": {}, + "devDependencies": { + "mocha": "*" + }, + "main": "lib/debug.js", + "browser": "./debug.js", + "engines": { + "node": "*" + }, + "files": [ + "lib/debug.js", + "debug.js", + "index.js" + ], + "component": { + "scripts": { + "debug/index.js": "index.js", + "debug/debug.js": "debug.js" + } + }, + "bugs": { + "url": "https://github.com/visionmedia/debug/issues" + }, + "homepage": "https://github.com/visionmedia/debug", + "_id": "debug@0.7.4", + "dist": { + "shasum": "06e1ea8082c2cb14e39806e22e2f6f757f92af39", + "tarball": "http://registry.npmjs.org/debug/-/debug-0.7.4.tgz" + }, + "_from": "debug@~0.7.2", + "_npmVersion": "1.3.13", + "_npmUser": { + "name": "tjholowaychuk", + "email": "tj@vision-media.ca" + }, + "maintainers": [ + { + "name": "tjholowaychuk", + "email": "tj@vision-media.ca" + } + ], + "directories": {}, + "_shasum": "06e1ea8082c2cb14e39806e22e2f6f757f92af39", + "_resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/.npmignore new file mode 100644 index 0000000..a843dc4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/.npmignore @@ -0,0 +1 @@ +test/fixtures diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md new file mode 100644 index 0000000..31170fe --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md @@ -0,0 +1,22 @@ +# fstream-ignore + +A fstream DirReader that filters out files that match globs in `.ignore` +files throughout the tree, like how git ignores files based on a +`.gitignore` file. + +Here's an example: + +```javascript +var Ignore = require("fstream-ignore") +Ignore({ path: __dirname + , ignoreFiles: [".ignore", ".gitignore"] + }) + .on("child", function (c) { + console.error(c.path.substr(c.root.path.length + 1)) + }) + .pipe(tar.Pack()) + .pipe(fs.createWriteStream("foo.tar")) +``` + +This will tar up the files in __dirname into `foo.tar`, ignoring +anything matched by the globs in any .iginore or .gitignore file. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/example/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/example/basic.js new file mode 100644 index 0000000..ff45342 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/example/basic.js @@ -0,0 +1,13 @@ +var Ignore = require("../") +Ignore({ path: __dirname + , ignoreFiles: [".ignore", ".gitignore"] + }) + .on("child", function (c) { + console.error(c.path.substr(c.root.path.length + 1)) + c.on("ignoreFile", onIgnoreFile) + }) + .on("ignoreFile", onIgnoreFile) + +function onIgnoreFile (e) { + console.error("adding ignore file", e.path) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js new file mode 100644 index 0000000..0728f7c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js @@ -0,0 +1,275 @@ +// Essentially, this is a fstream.DirReader class, but with a +// bit of special logic to read the specified sort of ignore files, +// and a filter that prevents it from picking up anything excluded +// by those files. + +var Minimatch = require("minimatch").Minimatch +, fstream = require("fstream") +, DirReader = fstream.DirReader +, inherits = require("inherits") +, path = require("path") +, fs = require("fs") + +module.exports = IgnoreReader + +inherits(IgnoreReader, DirReader) + +function IgnoreReader (props) { + if (!(this instanceof IgnoreReader)) { + return new IgnoreReader(props) + } + + // must be a Directory type + if (typeof props === "string") { + props = { path: path.resolve(props) } + } + + props.type = "Directory" + props.Directory = true + + if (!props.ignoreFiles) props.ignoreFiles = [".ignore"] + this.ignoreFiles = props.ignoreFiles + + this.ignoreRules = null + + // ensure that .ignore files always show up at the top of the list + // that way, they can be read before proceeding to handle other + // entries in that same folder + if (props.sort) { + this._sort = props.sort === "alpha" ? alphasort : props.sort + props.sort = null + } + + this.on("entries", function () { + // if there are any ignore files in the list, then + // pause and add them. + // then, filter the list based on our ignoreRules + + var hasIg = this.entries.some(this.isIgnoreFile, this) + + if (!hasIg) return this.filterEntries() + + this.addIgnoreFiles() + }) + + // we filter entries before we know what they are. + // however, directories have to be re-tested against + // rules with a "/" appended, because "a/b/" will only + // match if "a/b" is a dir, and not otherwise. + this.on("_entryStat", function (entry, props) { + var t = entry.basename + if (!this.applyIgnores(entry.basename, + entry.type === "Directory", + entry)) { + entry.abort() + } + }.bind(this)) + + DirReader.call(this, props) +} + + +IgnoreReader.prototype.addIgnoreFiles = function () { + if (this._paused) { + this.once("resume", this.addIgnoreFiles) + return + } + if (this._ignoreFilesAdded) return + this._ignoreFilesAdded = true + + var newIg = this.entries.filter(this.isIgnoreFile, this) + , count = newIg.length + , errState = null + + if (!count) return + + this.pause() + + var then = function then (er) { + if (errState) return + if (er) return this.emit("error", errState = er) + if (-- count === 0) { + this.filterEntries() + this.resume() + } + }.bind(this) + + newIg.forEach(function (ig) { + this.addIgnoreFile(ig, then) + }, this) +} + + +IgnoreReader.prototype.isIgnoreFile = function (e) { + return e !== "." && + e !== ".." && + -1 !== this.ignoreFiles.indexOf(e) +} + + +IgnoreReader.prototype.getChildProps = function (stat) { + var props = DirReader.prototype.getChildProps.call(this, stat) + props.ignoreFiles = this.ignoreFiles + + // Directories have to be read as IgnoreReaders + // otherwise fstream.Reader will create a DirReader instead. + if (stat.isDirectory()) { + props.type = this.constructor + } + return props +} + + +IgnoreReader.prototype.addIgnoreFile = function (e, cb) { + // read the file, and then call addIgnoreRules + // if there's an error, then tell the cb about it. + + var ig = path.resolve(this.path, e) + fs.readFile(ig, function (er, data) { + if (er) return cb(er) + + this.emit("ignoreFile", e, data) + var rules = this.readRules(data, e) + this.addIgnoreRules(rules, e) + cb() + }.bind(this)) +} + + +IgnoreReader.prototype.readRules = function (buf, e) { + return buf.toString().split(/\r?\n/) +} + + +// Override this to do fancier things, like read the +// "files" array from a package.json file or something. +IgnoreReader.prototype.addIgnoreRules = function (set, e) { + // filter out anything obvious + set = set.filter(function (s) { + s = s.trim() + return s && !s.match(/^#/) + }) + + // no rules to add! + if (!set.length) return + + // now get a minimatch object for each one of these. + // Note that we need to allow dot files by default, and + // not switch the meaning of their exclusion + var mmopt = { matchBase: true, dot: true, flipNegate: true } + , mm = set.map(function (s) { + var m = new Minimatch(s, mmopt) + m.ignoreFile = e + return m + }) + + if (!this.ignoreRules) this.ignoreRules = [] + this.ignoreRules.push.apply(this.ignoreRules, mm) +} + + +IgnoreReader.prototype.filterEntries = function () { + // this exclusion is at the point where we know the list of + // entries in the dir, but don't know what they are. since + // some of them *might* be directories, we have to run the + // match in dir-mode as well, so that we'll pick up partials + // of files that will be included later. Anything included + // at this point will be checked again later once we know + // what it is. + this.entries = this.entries.filter(function (entry) { + // at this point, we don't know if it's a dir or not. + return this.applyIgnores(entry) || this.applyIgnores(entry, true) + }, this) +} + + +IgnoreReader.prototype.applyIgnores = function (entry, partial, obj) { + var included = true + + // this = /a/b/c + // entry = d + // parent /a/b sees c/d + if (this.parent && this.parent.applyIgnores) { + var pt = this.basename + "/" + entry + included = this.parent.applyIgnores(pt, partial) + } + + // Negated Rules + // Since we're *ignoring* things here, negating means that a file + // is re-included, if it would have been excluded by a previous + // rule. So, negated rules are only relevant if the file + // has been excluded. + // + // Similarly, if a file has been excluded, then there's no point + // trying it against rules that have already been applied + // + // We're using the "flipnegate" flag here, which tells minimatch + // to set the "negate" for our information, but still report + // whether the core pattern was a hit or a miss. + + if (!this.ignoreRules) { + return included + } + + this.ignoreRules.forEach(function (rule) { + // negation means inclusion + if (rule.negate && included || + !rule.negate && !included) { + // unnecessary + return + } + + // first, match against /foo/bar + var match = rule.match("/" + entry) + + if (!match) { + // try with the leading / trimmed off the test + // eg: foo/bar instead of /foo/bar + match = rule.match(entry) + } + + // if the entry is a directory, then it will match + // with a trailing slash. eg: /foo/bar/ or foo/bar/ + if (!match && partial) { + match = rule.match("/" + entry + "/") || + rule.match(entry + "/") + } + + // When including a file with a negated rule, it's + // relevant if a directory partially matches, since + // it may then match a file within it. + // Eg, if you ignore /a, but !/a/b/c + if (!match && rule.negate && partial) { + match = rule.match("/" + entry, true) || + rule.match(entry, true) + } + + if (match) { + included = rule.negate + } + }, this) + + return included +} + + +IgnoreReader.prototype.sort = function (a, b) { + var aig = this.ignoreFiles.indexOf(a) !== -1 + , big = this.ignoreFiles.indexOf(b) !== -1 + + if (aig && !big) return -1 + if (big && !aig) return 1 + return this._sort(a, b) +} + +IgnoreReader.prototype._sort = function (a, b) { + return 0 +} + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json new file mode 100644 index 0000000..754a114 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json @@ -0,0 +1,51 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "_id": "inherits@2.0.1", + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@2", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/.npmignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md new file mode 100644 index 0000000..978268e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md @@ -0,0 +1,218 @@ +# minimatch + +A minimal matching utility. + +[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) + + +This is the matching library used internally by npm. + +Eventually, it will replace the C binding in node-glob. + +It works by converting glob expressions into JavaScript `RegExp` +objects. + +## Usage + +```javascript +var minimatch = require("minimatch") + +minimatch("bar.foo", "*.foo") // true! +minimatch("bar.foo", "*.bar") // false! +minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! +``` + +## Features + +Supports these glob features: + +* Brace Expansion +* Extended glob matching +* "Globstar" `**` matching + +See: + +* `man sh` +* `man bash` +* `man 3 fnmatch` +* `man 5 gitignore` + +## Minimatch Class + +Create a minimatch object by instanting the `minimatch.Minimatch` class. + +```javascript +var Minimatch = require("minimatch").Minimatch +var mm = new Minimatch(pattern, options) +``` + +### Properties + +* `pattern` The original pattern the minimatch object represents. +* `options` The options supplied to the constructor. +* `set` A 2-dimensional array of regexp or string expressions. + Each row in the + array corresponds to a brace-expanded pattern. Each item in the row + corresponds to a single path-part. For example, the pattern + `{a,b/c}/d` would expand to a set of patterns like: + + [ [ a, d ] + , [ b, c, d ] ] + + If a portion of the pattern doesn't have any "magic" in it + (that is, it's something like `"foo"` rather than `fo*o?`), then it + will be left as a string rather than converted to a regular + expression. + +* `regexp` Created by the `makeRe` method. A single regular expression + expressing the entire pattern. This is useful in cases where you wish + to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. +* `negate` True if the pattern is negated. +* `comment` True if the pattern is a comment. +* `empty` True if the pattern is `""`. + +### Methods + +* `makeRe` Generate the `regexp` member if necessary, and return it. + Will return `false` if the pattern is invalid. +* `match(fname)` Return true if the filename matches the pattern, or + false otherwise. +* `matchOne(fileArray, patternArray, partial)` Take a `/`-split + filename, and match it against a single row in the `regExpSet`. This + method is mainly for internal use, but is exposed so that it can be + used by a glob-walker that needs to avoid excessive filesystem calls. + +All other methods are internal, and will be called as necessary. + +## Functions + +The top-level exported function has a `cache` property, which is an LRU +cache set to store 100 items. So, calling these methods repeatedly +with the same pattern and options will use the same Minimatch object, +saving the cost of parsing it multiple times. + +### minimatch(path, pattern, options) + +Main export. Tests a path against the pattern using the options. + +```javascript +var isJS = minimatch(file, "*.js", { matchBase: true }) +``` + +### minimatch.filter(pattern, options) + +Returns a function that tests its +supplied argument, suitable for use with `Array.filter`. Example: + +```javascript +var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) +``` + +### minimatch.match(list, pattern, options) + +Match against the list of +files, in the style of fnmatch or glob. If nothing is matched, and +options.nonull is set, then return a list containing the pattern itself. + +```javascript +var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) +``` + +### minimatch.makeRe(pattern, options) + +Make a regular expression object from the pattern. + +## Options + +All options are `false` by default. + +### debug + +Dump a ton of stuff to stderr. + +### nobrace + +Do not expand `{a,b}` and `{1..3}` brace sets. + +### noglobstar + +Disable `**` matching against multiple folder names. + +### dot + +Allow patterns to match filenames starting with a period, even if +the pattern does not explicitly have a period in that spot. + +Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` +is set. + +### noext + +Disable "extglob" style patterns like `+(a|b)`. + +### nocase + +Perform a case-insensitive match. + +### nonull + +When a match is not found by `minimatch.match`, return a list containing +the pattern itself. When set, an empty list is returned if there are +no matches. + +### matchBase + +If set, then patterns without slashes will be matched +against the basename of the path if it contains slashes. For example, +`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. + +### nocomment + +Suppress the behavior of treating `#` at the start of a pattern as a +comment. + +### nonegate + +Suppress the behavior of treating a leading `!` character as negation. + +### flipNegate + +Returns from negate expressions the same as if they were not negated. +(Ie, true on a hit, false on a miss.) + + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between minimatch and other +implementations, and are intentional. + +If the pattern starts with a `!` character, then it is negated. Set the +`nonegate` flag to suppress this behavior, and treat leading `!` +characters normally. This is perhaps relevant if you wish to start the +pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` +characters at the start of a pattern will negate the pattern multiple +times. + +If a pattern starts with `#`, then it is treated as a comment, and +will not match anything. Use `\#` to match a literal `#` at the +start of a line, or set the `nocomment` flag to suppress this behavior. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.1, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then minimatch.match returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js new file mode 100644 index 0000000..c633f89 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js @@ -0,0 +1,1055 @@ +;(function (require, exports, module, platform) { + +if (module) module.exports = minimatch +else exports.minimatch = minimatch + +if (!require) { + require = function (id) { + switch (id) { + case "sigmund": return function sigmund (obj) { + return JSON.stringify(obj) + } + case "path": return { basename: function (f) { + f = f.split(/[\/\\]/) + var e = f.pop() + if (!e) e = f.pop() + return e + }} + case "lru-cache": return function LRUCache () { + // not quite an LRU, but still space-limited. + var cache = {} + var cnt = 0 + this.set = function (k, v) { + cnt ++ + if (cnt >= 100) cache = {} + cache[k] = v + } + this.get = function (k) { return cache[k] } + } + } + } +} + +minimatch.Minimatch = Minimatch + +var LRU = require("lru-cache") + , cache = minimatch.cache = new LRU({max: 100}) + , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} + , sigmund = require("sigmund") + +var path = require("path") + // any single thing other than / + // don't need to escape / when using new RegExp() + , qmark = "[^/]" + + // * => any number of characters + , star = qmark + "*?" + + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" + + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" + + // characters that need to be escaped in RegExp. + , reSpecials = charSet("().*{}+?[]^$\\!") + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split("").reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + + +function minimatch (p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + return false + } + + // "" only matches "" + if (pattern.trim() === "") return p === "" + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options, cache) + } + + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + pattern = pattern.split("\\").join("/") + } + + // lru storage. + // these things aren't particularly big, but walking down the string + // and turning it into a regexp can get pretty costly. + var cacheKey = pattern + "\n" + sigmund(options) + var cached = minimatch.cache.get(cacheKey) + if (cached) return cached + minimatch.cache.set(cacheKey, this) + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function() {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return -1 === s.indexOf(false) + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + , negate = false + , options = this.options + , negateOffset = 0 + + if (options.nonegate) return + + for ( var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === "!" + ; i ++) { + negate = !negate + negateOffset ++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return new Minimatch(pattern, options).braceExpand() +} + +Minimatch.prototype.braceExpand = braceExpand +function braceExpand (pattern, options) { + options = options || this.options + pattern = typeof pattern === "undefined" + ? this.pattern : pattern + + if (typeof pattern === "undefined") { + throw new Error("undefined pattern") + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + var escaping = false + + // examples and comments refer to this crazy pattern: + // a{b,c{d,e},{f,g}h}x{y,z} + // expected: + // abxy + // abxz + // acdxy + // acdxz + // acexy + // acexz + // afhxy + // afhxz + // aghxy + // aghxz + + // everything before the first \{ is just a prefix. + // So, we pluck that off, and work with the rest, + // and then prepend it to everything we find. + if (pattern.charAt(0) !== "{") { + this.debug(pattern) + var prefix = null + for (var i = 0, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug(i, c) + if (c === "\\") { + escaping = !escaping + } else if (c === "{" && !escaping) { + prefix = pattern.substr(0, i) + break + } + } + + // actually no sets, all { were escaped. + if (prefix === null) { + this.debug("no sets") + return [pattern] + } + + var tail = braceExpand.call(this, pattern.substr(i), options) + return tail.map(function (t) { + return prefix + t + }) + } + + // now we have something like: + // {b,c{d,e},{f,g}h}x{y,z} + // walk through the set, expanding each part, until + // the set ends. then, we'll expand the suffix. + // If the set only has a single member, then'll put the {} back + + // first, handle numeric sets, since they're easier + var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/) + if (numset) { + this.debug("numset", numset[1], numset[2]) + var suf = braceExpand.call(this, pattern.substr(numset[0].length), options) + , start = +numset[1] + , end = +numset[2] + , inc = start > end ? -1 : 1 + , set = [] + for (var i = start; i != (end + inc); i += inc) { + // append all the suffixes + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + set.push(i + suf[ii]) + } + } + return set + } + + // ok, walk through the set + // We hope, somewhat optimistically, that there + // will be a } at the end. + // If the closing brace isn't found, then the pattern is + // interpreted as braceExpand("\\" + pattern) so that + // the leading \{ will be interpreted literally. + var i = 1 // skip the \{ + , depth = 1 + , set = [] + , member = "" + , sawEnd = false + , escaping = false + + function addMember () { + set.push(member) + member = "" + } + + this.debug("Entering for") + FOR: for (i = 1, l = pattern.length; i < l; i ++) { + var c = pattern.charAt(i) + this.debug("", i, c) + + if (escaping) { + escaping = false + member += "\\" + c + } else { + switch (c) { + case "\\": + escaping = true + continue + + case "{": + depth ++ + member += "{" + continue + + case "}": + depth -- + // if this closes the actual set, then we're done + if (depth === 0) { + addMember() + // pluck off the close-brace + i ++ + break FOR + } else { + member += c + continue + } + + case ",": + if (depth === 1) { + addMember() + } else { + member += c + } + continue + + default: + member += c + continue + } // switch + } // else + } // for + + // now we've either finished the set, and the suffix is + // pattern.substr(i), or we have *not* closed the set, + // and need to escape the leading brace + if (depth !== 0) { + this.debug("didn't close", pattern) + return braceExpand.call(this, "\\" + pattern, options) + } + + // x{y,z} -> ["xy", "xz"] + this.debug("set", set) + this.debug("suffix", pattern.substr(i)) + var suf = braceExpand.call(this, pattern.substr(i), options) + // ["b", "c{d,e}","{f,g}h"] -> + // [["b"], ["cd", "ce"], ["fh", "gh"]] + var addBraces = set.length === 1 + this.debug("set pre-expanded", set) + set = set.map(function (p) { + return braceExpand.call(this, p, options) + }, this) + this.debug("set expanded", set) + + + // [["b"], ["cd", "ce"], ["fh", "gh"]] -> + // ["b", "cd", "ce", "fh", "gh"] + set = set.reduce(function (l, r) { + return l.concat(r) + }) + + if (addBraces) { + set = set.map(function (s) { + return "{" + s + "}" + }) + } + + // now attach the suffixes. + var ret = [] + for (var i = 0, l = set.length; i < l; i ++) { + for (var ii = 0, ll = suf.length; ii < ll; ii ++) { + ret.push(set[i] + suf[ii]) + } + } + return ret +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === "**") return GLOBSTAR + if (pattern === "") return "" + + var re = "" + , hasMagic = !!options.nocase + , escaping = false + // ? => one single character + , patternListStack = [] + , plType + , stateChar + , inClass = false + , reClassStart = -1 + , classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + , patternStart = pattern.charAt(0) === "." ? "" // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" + : "(?!\\.)" + , self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case "*": + re += star + hasMagic = true + break + case "?": + re += qmark + hasMagic = true + break + default: + re += "\\"+stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for ( var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i ++ ) { + + this.debug("%s\t%s %s %j", pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += "\\" + c + escaping = false + continue + } + + SWITCH: switch (c) { + case "/": + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case "\\": + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === "!" && i === classStart + 1) c = "^" + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case "(": + if (inClass) { + re += "(" + continue + } + + if (!stateChar) { + re += "\\(" + continue + } + + plType = stateChar + patternListStack.push({ type: plType + , start: i - 1 + , reStart: re.length }) + // negation is (?:(?!js)[^/]*) + re += stateChar === "!" ? "(?:(?!" : "(?:" + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ")": + if (inClass || !patternListStack.length) { + re += "\\)" + continue + } + + clearStateChar() + hasMagic = true + re += ")" + plType = patternListStack.pop().type + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) { + case "!": + re += "[^/]*?)" + break + case "?": + case "+": + case "*": re += plType + case "@": break // the default anyway + } + continue + + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|" + escaping = false + continue + } + + clearStateChar() + re += "|" + continue + + // these are mostly the same in regexp and glob + case "[": + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += "\\" + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case "]": + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += "\\" + c + escaping = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === "^" && inClass)) { + re += "\\" + } + + re += c + + } // switch + } // for + + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + var cs = pattern.substr(classStart + 1) + , sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + "\\[" + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + var pl + while (pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + 3) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = "\\" + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + "|" + }) + + this.debug("tail=%j\n %s", tail, tail) + var t = pl.type === "*" ? star + : pl.type === "?" ? qmark + : "\\" + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + + t + "\\(" + + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += "\\\\" + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case ".": + case "[": + case "(": addPatternStart = true + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== "" && hasMagic) re = "(?=.)" + re + + if (addPatternStart) re = patternStart + re + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [ re, hasMagic ] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? "i" : "" + , regExp = new RegExp("^" + re + "$", flags) + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) return this.regexp = false + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + , flags = options.nocase ? "i" : "" + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === "string") ? regExpEscape(p) + : p._src + }).join("\\\/") + }).join("|") + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = "^(?:" + re + ")$" + + // can match anything, as long as it's not this. + if (this.negate) re = "^(?!" + re + ").*$" + + try { + return this.regexp = new RegExp(re, flags) + } catch (ex) { + return this.regexp = false + } +} + +minimatch.match = function (list, pattern, options) { + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug("match", f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === "" + + if (f === "/" && partial) return true + + var options = this.options + + // windows: need to use /, not \ + // On other platforms, \ is a valid (albeit bad) filename char. + if (platform === "win32") { + f = f.split("\\").join("/") + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, "split", f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, "set", set) + + var splitFile = path.basename(f.join("/")).split("/") + + for (var i = 0, l = set.length; i < l; i ++) { + var pattern = set[i], file = f + if (options.matchBase && pattern.length === 1) { + file = splitFile + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug("matchOne", + { "this": this + , file: file + , pattern: pattern }) + + this.debug("matchOne", file.length, pattern.length) + + for ( var fi = 0 + , pi = 0 + , fl = file.length + , pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi ++, pi ++ ) { + + this.debug("matchOne loop") + var p = pattern[pi] + , f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + , pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for ( ; fi < fl; fi ++) { + if (file[fi] === "." || file[fi] === ".." || + (!options.dot && file[fi].charAt(0) === ".")) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + WHILE: while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', + file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === "." || swallowee === ".." || + (!options.dot && swallowee.charAt(0) === ".")) { + this.debug("dot detected!", file, fr, pattern, pr) + break WHILE + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr ++ + } + } + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug("\n>>> no match, partial?", file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug("string match", p, f, hit) + } else { + hit = f.match(p) + this.debug("pattern match", p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") + return emptyFileEnd + } + + // should be unreachable. + throw new Error("wtf?") +} + + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, "$1") +} + + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") +} + +})( typeof require === "function" ? require : null, + this, + typeof module === "object" ? module : null, + typeof process === "object" ? process.platform : "win32" + ) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/.npmignore new file mode 100644 index 0000000..07e6e47 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/.npmignore @@ -0,0 +1 @@ +/node_modules diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS new file mode 100644 index 0000000..4a0bc50 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS @@ -0,0 +1,14 @@ +# Authors, sorted by whether or not they are me +Isaac Z. Schlueter +Brian Cottingham +Carlos Brito Lage +Jesse Dailey +Kevin O'Hara +Marco Rogers +Mark Cavage +Marko Mikulicic +Nathan Rajlich +Satheesh Natesan +Trent Mick +ashleybrener +n4kz diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/LICENSE new file mode 100644 index 0000000..05a4010 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/LICENSE @@ -0,0 +1,23 @@ +Copyright 2009, 2010, 2011 Isaac Z. Schlueter. +All rights reserved. + +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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/README.md new file mode 100644 index 0000000..03ee0f9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/README.md @@ -0,0 +1,97 @@ +# lru cache + +A cache object that deletes the least-recently-used items. + +## Usage: + +```javascript +var LRU = require("lru-cache") + , options = { max: 500 + , length: function (n) { return n * 2 } + , dispose: function (key, n) { n.close() } + , maxAge: 1000 * 60 * 60 } + , cache = LRU(options) + , otherCache = LRU(50) // sets just the max size + +cache.set("key", "value") +cache.get("key") // "value" + +cache.reset() // empty the cache +``` + +If you put more stuff in it, then items will fall out. + +If you try to put an oversized thing in it, then it'll fall out right +away. + +## Options + +* `max` The maximum size of the cache, checked by applying the length + function to all values in the cache. Not setting this is kind of + silly, since that's the whole purpose of this lib, but it defaults + to `Infinity`. +* `maxAge` Maximum age in ms. Items are not pro-actively pruned out + as they age, but if you try to get an item that is too old, it'll + drop it and return undefined instead of giving it to you. +* `length` Function that is used to calculate the length of stored + items. If you're storing strings or buffers, then you probably want + to do something like `function(n){return n.length}`. The default is + `function(n){return 1}`, which is fine if you want to store `n` + like-sized things. +* `dispose` Function that is called on items when they are dropped + from the cache. This can be handy if you want to close file + descriptors or do other cleanup tasks when items are no longer + accessible. Called with `key, value`. It's called *before* + actually removing the item from the internal cache, so if you want + to immediately put it back in, you'll have to do that in a + `nextTick` or `setTimeout` callback or it won't do anything. +* `stale` By default, if you set a `maxAge`, it'll only actually pull + stale items out of the cache when you `get(key)`. (That is, it's + not pre-emptively doing a `setTimeout` or anything.) If you set + `stale:true`, it'll return the stale value before deleting it. If + you don't set this, then it'll return `undefined` when you try to + get a stale entry, as if it had already been deleted. + +## API + +* `set(key, value)` +* `get(key) => value` + + Both of these will update the "recently used"-ness of the key. + They do what you think. + +* `peek(key)` + + Returns the key value (or `undefined` if not found) without + updating the "recently used"-ness of the key. + + (If you find yourself using this a lot, you *might* be using the + wrong sort of data structure, but there are some use cases where + it's handy.) + +* `del(key)` + + Deletes a key out of the cache. + +* `reset()` + + Clear the cache entirely, throwing away all values. + +* `has(key)` + + Check if a key is in the cache, without updating the recent-ness + or deleting it for being stale. + +* `forEach(function(value,key,cache), [thisp])` + + Just like `Array.prototype.forEach`. Iterates over all the keys + in the cache, in order of recent-ness. (Ie, more recently used + items are iterated over first.) + +* `keys()` + + Return an array of the keys in the cache. + +* `values()` + + Return an array of the values in the cache. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js new file mode 100644 index 0000000..d1d1381 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js @@ -0,0 +1,252 @@ +;(function () { // closure for web browsers + +if (typeof module === 'object' && module.exports) { + module.exports = LRUCache +} else { + // just set the global for non-node platforms. + this.LRUCache = LRUCache +} + +function hOP (obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key) +} + +function naiveLength () { return 1 } + +function LRUCache (options) { + if (!(this instanceof LRUCache)) + return new LRUCache(options) + + if (typeof options === 'number') + options = { max: options } + + if (!options) + options = {} + + this._max = options.max + // Kind of weird to have a default max of Infinity, but oh well. + if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) + this._max = Infinity + + this._lengthCalculator = options.length || naiveLength + if (typeof this._lengthCalculator !== "function") + this._lengthCalculator = naiveLength + + this._allowStale = options.stale || false + this._maxAge = options.maxAge || null + this._dispose = options.dispose + this.reset() +} + +// resize the cache when the max changes. +Object.defineProperty(LRUCache.prototype, "max", + { set : function (mL) { + if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity + this._max = mL + if (this._length > this._max) trim(this) + } + , get : function () { return this._max } + , enumerable : true + }) + +// resize the cache when the lengthCalculator changes. +Object.defineProperty(LRUCache.prototype, "lengthCalculator", + { set : function (lC) { + if (typeof lC !== "function") { + this._lengthCalculator = naiveLength + this._length = this._itemCount + for (var key in this._cache) { + this._cache[key].length = 1 + } + } else { + this._lengthCalculator = lC + this._length = 0 + for (var key in this._cache) { + this._cache[key].length = this._lengthCalculator(this._cache[key].value) + this._length += this._cache[key].length + } + } + + if (this._length > this._max) trim(this) + } + , get : function () { return this._lengthCalculator } + , enumerable : true + }) + +Object.defineProperty(LRUCache.prototype, "length", + { get : function () { return this._length } + , enumerable : true + }) + + +Object.defineProperty(LRUCache.prototype, "itemCount", + { get : function () { return this._itemCount } + , enumerable : true + }) + +LRUCache.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + var i = 0; + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + i++ + var hit = this._lruList[k] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + del(this, hit) + if (!this._allowStale) hit = undefined + } + if (hit) { + fn.call(thisp, hit.value, hit.key, this) + } + } +} + +LRUCache.prototype.keys = function () { + var keys = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + keys[i++] = hit.key + } + return keys +} + +LRUCache.prototype.values = function () { + var values = new Array(this._itemCount) + var i = 0 + for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var hit = this._lruList[k] + values[i++] = hit.value + } + return values +} + +LRUCache.prototype.reset = function () { + if (this._dispose && this._cache) { + for (var k in this._cache) { + this._dispose(k, this._cache[k].value) + } + } + + this._cache = Object.create(null) // hash of items by key + this._lruList = Object.create(null) // list of items in order of use recency + this._mru = 0 // most recently used + this._lru = 0 // least recently used + this._length = 0 // number of items in the list + this._itemCount = 0 +} + +// Provided for debugging/dev purposes only. No promises whatsoever that +// this API stays stable. +LRUCache.prototype.dump = function () { + return this._cache +} + +LRUCache.prototype.dumpLru = function () { + return this._lruList +} + +LRUCache.prototype.set = function (key, value) { + if (hOP(this._cache, key)) { + // dispose of the old one before overwriting + if (this._dispose) this._dispose(key, this._cache[key].value) + if (this._maxAge) this._cache[key].now = Date.now() + this._cache[key].value = value + this.get(key) + return true + } + + var len = this._lengthCalculator(value) + var age = this._maxAge ? Date.now() : 0 + var hit = new Entry(key, value, this._mru++, len, age) + + // oversized objects fall out of cache automatically. + if (hit.length > this._max) { + if (this._dispose) this._dispose(key, value) + return false + } + + this._length += hit.length + this._lruList[hit.lu] = this._cache[key] = hit + this._itemCount ++ + + if (this._length > this._max) trim(this) + return true +} + +LRUCache.prototype.has = function (key) { + if (!hOP(this._cache, key)) return false + var hit = this._cache[key] + if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + return false + } + return true +} + +LRUCache.prototype.get = function (key) { + return get(this, key, true) +} + +LRUCache.prototype.peek = function (key) { + return get(this, key, false) +} + +LRUCache.prototype.pop = function () { + var hit = this._lruList[this._lru] + del(this, hit) + return hit || null +} + +LRUCache.prototype.del = function (key) { + del(this, this._cache[key]) +} + +function get (self, key, doUse) { + var hit = self._cache[key] + if (hit) { + if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { + del(self, hit) + if (!self._allowStale) hit = undefined + } else { + if (doUse) use(self, hit) + } + if (hit) hit = hit.value + } + return hit +} + +function use (self, hit) { + shiftLU(self, hit) + hit.lu = self._mru ++ + self._lruList[hit.lu] = hit +} + +function trim (self) { + while (self._lru < self._mru && self._length > self._max) + del(self, self._lruList[self._lru]) +} + +function shiftLU (self, hit) { + delete self._lruList[ hit.lu ] + while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++ +} + +function del (self, hit) { + if (hit) { + if (self._dispose) self._dispose(hit.key, hit.value) + self._length -= hit.length + self._itemCount -- + delete self._cache[ hit.key ] + shiftLU(self, hit) + } +} + +// classy, since V8 prefers predictable objects. +function Entry (key, value, lu, length, now) { + this.key = key + this.value = value + this.lu = lu + this.length = length + this.now = now +} + +})() diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/package.json new file mode 100644 index 0000000..2474729 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/package.json @@ -0,0 +1,50 @@ +{ + "name": "lru-cache", + "description": "A cache object that deletes the least-recently-used items.", + "version": "2.5.0", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me" + }, + "scripts": { + "test": "tap test --gc" + }, + "main": "lib/lru-cache.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-lru-cache.git" + }, + "devDependencies": { + "tap": "", + "weak": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" + }, + "bugs": { + "url": "https://github.com/isaacs/node-lru-cache/issues" + }, + "homepage": "https://github.com/isaacs/node-lru-cache", + "_id": "lru-cache@2.5.0", + "dist": { + "shasum": "d82388ae9c960becbea0c73bb9eb79b6c6ce9aeb", + "tarball": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz" + }, + "_from": "lru-cache@2", + "_npmVersion": "1.3.15", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "d82388ae9c960becbea0c73bb9eb79b6c6ce9aeb", + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.0.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/basic.js new file mode 100644 index 0000000..f72697c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/basic.js @@ -0,0 +1,369 @@ +var test = require("tap").test + , LRU = require("../") + +test("basic", function (t) { + var cache = new LRU({max: 10}) + cache.set("key", "value") + t.equal(cache.get("key"), "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.length, 1) + t.equal(cache.max, 10) + t.end() +}) + +test("least recently set", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + cache.get("a") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), "A") + t.end() +}) + +test("del", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.del("a") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("max", function (t) { + var cache = new LRU(3) + + // test changing the max, verify that the LRU items get dropped. + cache.max = 100 + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + + // now remove the max restriction, and try again. + cache.max = "hello" + for (var i = 0; i < 100; i ++) cache.set(i, i) + t.equal(cache.length, 100) + for (var i = 0; i < 100; i ++) { + t.equal(cache.get(i), i) + } + // should trigger an immediate resize + cache.max = 3 + t.equal(cache.length, 3) + for (var i = 0; i < 97; i ++) { + t.equal(cache.get(i), undefined) + } + for (var i = 98; i < 100; i ++) { + t.equal(cache.get(i), i) + } + t.end() +}) + +test("reset", function (t) { + var cache = new LRU(10) + cache.set("a", "A") + cache.set("b", "B") + cache.reset() + t.equal(cache.length, 0) + t.equal(cache.max, 10) + t.equal(cache.get("a"), undefined) + t.equal(cache.get("b"), undefined) + t.end() +}) + + +// Note: `.dump()` is a debugging tool only. No guarantees are made +// about the format/layout of the response. +test("dump", function (t) { + var cache = new LRU(10) + var d = cache.dump(); + t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") + cache.set("a", "A") + var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } + t.ok(d.a) + t.equal(d.a.key, "a") + t.equal(d.a.value, "A") + t.equal(d.a.lu, 0) + + cache.set("b", "B") + cache.get("b") + d = cache.dump() + t.ok(d.b) + t.equal(d.b.key, "b") + t.equal(d.b.value, "B") + t.equal(d.b.lu, 2) + + t.end() +}) + + +test("basic with weighed length", function (t) { + var cache = new LRU({ + max: 100, + length: function (item) { return item.size } + }) + cache.set("key", {val: "value", size: 50}) + t.equal(cache.get("key").val, "value") + t.equal(cache.get("nada"), undefined) + t.equal(cache.lengthCalculator(cache.get("key")), 50) + t.equal(cache.length, 50) + t.equal(cache.max, 100) + t.end() +}) + + +test("weighed length item too large", function (t) { + var cache = new LRU({ + max: 10, + length: function (item) { return item.size } + }) + t.equal(cache.max, 10) + + // should fall out immediately + cache.set("key", {val: "value", size: 50}) + + t.equal(cache.length, 0) + t.equal(cache.get("key"), undefined) + t.end() +}) + +test("least recently set with weighed length", function (t) { + var cache = new LRU({ + max:8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.set("d", "DDDD") + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("c"), "CCC") + t.equal(cache.get("b"), undefined) + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("lru recently gotten with weighed length", function (t) { + var cache = new LRU({ + max: 8, + length: function (item) { return item.length } + }) + cache.set("a", "A") + cache.set("b", "BB") + cache.set("c", "CCC") + cache.get("a") + cache.get("b") + cache.set("d", "DDDD") + t.equal(cache.get("c"), undefined) + t.equal(cache.get("d"), "DDDD") + t.equal(cache.get("b"), "BB") + t.equal(cache.get("a"), "A") + t.end() +}) + +test("set returns proper booleans", function(t) { + var cache = new LRU({ + max: 5, + length: function (item) { return item.length } + }) + + t.equal(cache.set("a", "A"), true) + + // should return false for max exceeded + t.equal(cache.set("b", "donuts"), false) + + t.equal(cache.set("b", "B"), true) + t.equal(cache.set("c", "CCCC"), true) + t.end() +}) + +test("drop the old items", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 50 + }) + + cache.set("a", "A") + + setTimeout(function () { + cache.set("b", "b") + t.equal(cache.get("a"), "A") + }, 25) + + setTimeout(function () { + cache.set("c", "C") + // timed out + t.notOk(cache.get("a")) + }, 60) + + setTimeout(function () { + t.notOk(cache.get("b")) + t.equal(cache.get("c"), "C") + }, 90) + + setTimeout(function () { + t.notOk(cache.get("c")) + t.end() + }, 155) +}) + +test("disposal function", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + dispose: function (k, n) { + disposed = n + } + }) + + cache.set(1, 1) + cache.set(2, 2) + t.equal(disposed, 1) + cache.set(3, 3) + t.equal(disposed, 2) + cache.reset() + t.equal(disposed, 3) + t.end() +}) + +test("disposal function on too big of item", function(t) { + var disposed = false + var cache = new LRU({ + max: 1, + length: function (k) { + return k.length + }, + dispose: function (k, n) { + disposed = n + } + }) + var obj = [ 1, 2 ] + + t.equal(disposed, false) + cache.set("obj", obj) + t.equal(disposed, obj) + t.end() +}) + +test("has()", function(t) { + var cache = new LRU({ + max: 1, + maxAge: 10 + }) + + cache.set('foo', 'bar') + t.equal(cache.has('foo'), true) + cache.set('blu', 'baz') + t.equal(cache.has('foo'), false) + t.equal(cache.has('blu'), true) + setTimeout(function() { + t.equal(cache.has('blu'), false) + t.end() + }, 15) +}) + +test("stale", function(t) { + var cache = new LRU({ + maxAge: 10, + stale: true + }) + + cache.set('foo', 'bar') + t.equal(cache.get('foo'), 'bar') + t.equal(cache.has('foo'), true) + setTimeout(function() { + t.equal(cache.has('foo'), false) + t.equal(cache.get('foo'), 'bar') + t.equal(cache.get('foo'), undefined) + t.end() + }, 15) +}) + +test("lru update via set", function(t) { + var cache = LRU({ max: 2 }); + + cache.set('foo', 1); + cache.set('bar', 2); + cache.del('bar'); + cache.set('baz', 3); + cache.set('qux', 4); + + t.equal(cache.get('foo'), undefined) + t.equal(cache.get('bar'), undefined) + t.equal(cache.get('baz'), 3) + t.equal(cache.get('qux'), 4) + t.end() +}) + +test("least recently set w/ peek", function (t) { + var cache = new LRU(2) + cache.set("a", "A") + cache.set("b", "B") + t.equal(cache.peek("a"), "A") + cache.set("c", "C") + t.equal(cache.get("c"), "C") + t.equal(cache.get("b"), "B") + t.equal(cache.get("a"), undefined) + t.end() +}) + +test("pop the least used item", function (t) { + var cache = new LRU(3) + , last + + cache.set("a", "A") + cache.set("b", "B") + cache.set("c", "C") + + t.equal(cache.length, 3) + t.equal(cache.max, 3) + + // Ensure we pop a, c, b + cache.get("b", "B") + + last = cache.pop() + t.equal(last.key, "a") + t.equal(last.value, "A") + t.equal(cache.length, 2) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "c") + t.equal(last.value, "C") + t.equal(cache.length, 1) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last.key, "b") + t.equal(last.value, "B") + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + last = cache.pop() + t.equal(last, null) + t.equal(cache.length, 0) + t.equal(cache.max, 3) + + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/foreach.js new file mode 100644 index 0000000..eefb80d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/foreach.js @@ -0,0 +1,52 @@ +var test = require('tap').test +var LRU = require('../') + +test('forEach', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 9 + l.forEach(function (val, key, cache) { + t.equal(cache, l) + t.equal(key, i.toString()) + t.equal(val, i.toString(2)) + i -= 1 + }) + + // get in order of most recently used + l.get(6) + l.get(8) + + var order = [ 8, 6, 9, 7, 5 ] + var i = 0 + + l.forEach(function (val, key, cache) { + var j = order[i ++] + t.equal(cache, l) + t.equal(key, j.toString()) + t.equal(val, j.toString(2)) + }) + + t.end() +}) + +test('keys() and values()', function (t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + t.similar(l.keys(), ['9', '8', '7', '6', '5']) + t.similar(l.values(), ['1001', '1000', '111', '110', '101']) + + // get in order of most recently used + l.get(6) + l.get(8) + + t.similar(l.keys(), ['8', '6', '9', '7', '5']) + t.similar(l.values(), ['1000', '110', '1001', '111', '101']) + + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js new file mode 100644 index 0000000..7af45b0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node --expose_gc + +var weak = require('weak'); +var test = require('tap').test +var LRU = require('../') +var l = new LRU({ max: 10 }) +var refs = 0 +function X() { + refs ++ + weak(this, deref) +} + +function deref() { + refs -- +} + +test('no leaks', function (t) { + // fill up the cache + for (var i = 0; i < 100; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var start = process.memoryUsage() + + // capture the memory + var startRefs = refs + + // do it again, but more + for (var i = 0; i < 10000; i++) { + l.set(i, new X); + // throw some gets in there, too. + if (i % 2 === 0) + l.get(i / 2) + } + + gc() + + var end = process.memoryUsage() + t.equal(refs, startRefs, 'no leaky refs') + + console.error('start: %j\n' + + 'end: %j', start, end); + t.pass(); + t.end(); +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/README.md new file mode 100644 index 0000000..7e36512 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/README.md @@ -0,0 +1,53 @@ +# sigmund + +Quick and dirty signatures for Objects. + +This is like a much faster `deepEquals` comparison, which returns a +string key suitable for caches and the like. + +## Usage + +```javascript +function doSomething (someObj) { + var key = sigmund(someObj, maxDepth) // max depth defaults to 10 + var cached = cache.get(key) + if (cached) return cached) + + var result = expensiveCalculation(someObj) + cache.set(key, result) + return result +} +``` + +The resulting key will be as unique and reproducible as calling +`JSON.stringify` or `util.inspect` on the object, but is much faster. +In order to achieve this speed, some differences are glossed over. +For example, the object `{0:'foo'}` will be treated identically to the +array `['foo']`. + +Also, just as there is no way to summon the soul from the scribblings +of a cocain-addled psychoanalyst, there is no way to revive the object +from the signature string that sigmund gives you. In fact, it's +barely even readable. + +As with `sys.inspect` and `JSON.stringify`, larger objects will +produce larger signature strings. + +Because sigmund is a bit less strict than the more thorough +alternatives, the strings will be shorter, and also there is a +slightly higher chance for collisions. For example, these objects +have the same signature: + + var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} + var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +Like a good Freudian, sigmund is most effective when you already have +some understanding of what you're looking for. It can help you help +yourself, but you must be willing to do some work as well. + +Cycles are handled, and cyclical objects are silently omitted (though +the key is included in the signature output.) + +The second argument is the maximum depth, which defaults to 10, +because that is the maximum object traversal depth covered by most +insurance carriers. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/bench.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/bench.js new file mode 100644 index 0000000..5acfd6d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/bench.js @@ -0,0 +1,283 @@ +// different ways to id objects +// use a req/res pair, since it's crazy deep and cyclical + +// sparseFE10 and sigmund are usually pretty close, which is to be expected, +// since they are essentially the same algorithm, except that sigmund handles +// regular expression objects properly. + + +var http = require('http') +var util = require('util') +var sigmund = require('./sigmund.js') +var sreq, sres, creq, cres, test + +http.createServer(function (q, s) { + sreq = q + sres = s + sres.end('ok') + this.close(function () { setTimeout(function () { + start() + }, 200) }) +}).listen(1337, function () { + creq = http.get({ port: 1337 }) + creq.on('response', function (s) { cres = s }) +}) + +function start () { + test = [sreq, sres, creq, cres] + // test = sreq + // sreq.sres = sres + // sreq.creq = creq + // sreq.cres = cres + + for (var i in exports.compare) { + console.log(i) + var hash = exports.compare[i]() + console.log(hash) + console.log(hash.length) + console.log('') + } + + require('bench').runMain() +} + +function customWs (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '') + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return customWs(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + customWs(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function custom (obj, md, d) { + d = d || 0 + var to = typeof obj + if (to === 'undefined' || to === 'function' || to === null) return '' + if (d > md || !obj || to !== 'object') return '' + obj + + if (Array.isArray(obj)) { + return obj.map(function (i, _, __) { + return custom(i, md, d + 1) + }).reduce(function (a, b) { return a + b }, '') + } + + var keys = Object.keys(obj) + return keys.map(function (k, _, __) { + return k + ':' + custom(obj[k], md, d + 1) + }).reduce(function (a, b) { return a + b }, '') +} + +function sparseFE2 (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ':' + ch(v[k], depth + 1) + }) + soFar += '}' + } + ch(obj, 0) + return soFar +} + +function sparseFE (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + Object.keys(v).forEach(function (k, _, __) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') return + var to = typeof v[k] + if (to === 'function' || to === 'undefined') return + soFar += k + ch(v[k], depth + 1) + }) + } + ch(obj, 0) + return soFar +} + +function sparse (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ch(v[k], depth + 1) + } + } + ch(obj, 0) + return soFar +} + +function noCommas (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + + +function flatten (obj, maxDepth) { + var seen = [] + var soFar = '' + function ch (v, depth) { + if (depth > maxDepth) return + if (typeof v === 'function' || typeof v === 'undefined') return + if (typeof v !== 'object' || !v) { + soFar += v + return + } + if (seen.indexOf(v) !== -1 || depth === maxDepth) return + seen.push(v) + soFar += '{' + for (var k in v) { + // pseudo-private values. skip those. + if (k.charAt(0) === '_') continue + var to = typeof v[k] + if (to === 'function' || to === 'undefined') continue + soFar += k + ':' + ch(v[k], depth + 1) + soFar += ',' + } + soFar += '}' + } + ch(obj, 0) + return soFar +} + +exports.compare = +{ + // 'custom 2': function () { + // return custom(test, 2, 0) + // }, + // 'customWs 2': function () { + // return customWs(test, 2, 0) + // }, + 'JSON.stringify (guarded)': function () { + var seen = [] + return JSON.stringify(test, function (k, v) { + if (typeof v !== 'object' || !v) return v + if (seen.indexOf(v) !== -1) return undefined + seen.push(v) + return v + }) + }, + + 'flatten 10': function () { + return flatten(test, 10) + }, + + // 'flattenFE 10': function () { + // return flattenFE(test, 10) + // }, + + 'noCommas 10': function () { + return noCommas(test, 10) + }, + + 'sparse 10': function () { + return sparse(test, 10) + }, + + 'sparseFE 10': function () { + return sparseFE(test, 10) + }, + + 'sparseFE2 10': function () { + return sparseFE2(test, 10) + }, + + sigmund: function() { + return sigmund(test, 10) + }, + + + // 'util.inspect 1': function () { + // return util.inspect(test, false, 1, false) + // }, + // 'util.inspect undefined': function () { + // util.inspect(test) + // }, + // 'util.inspect 2': function () { + // util.inspect(test, false, 2, false) + // }, + // 'util.inspect 3': function () { + // util.inspect(test, false, 3, false) + // }, + // 'util.inspect 4': function () { + // util.inspect(test, false, 4, false) + // }, + // 'util.inspect Infinity': function () { + // util.inspect(test, false, Infinity, false) + // } +} + +/** results +**/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/package.json new file mode 100644 index 0000000..a1f755a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/package.json @@ -0,0 +1,58 @@ +{ + "name": "sigmund", + "version": "1.0.0", + "description": "Quick and dirty signatures for Objects.", + "main": "sigmund.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.3.0" + }, + "scripts": { + "test": "tap test/*.js", + "bench": "node bench.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/sigmund" + }, + "keywords": [ + "object", + "signature", + "key", + "data", + "psychoanalysis" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "BSD", + "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", + "_id": "sigmund@1.0.0", + "dist": { + "shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296", + "tarball": "http://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + }, + "_npmVersion": "1.1.48", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296", + "_from": "sigmund@~1.0.0", + "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", + "bugs": { + "url": "https://github.com/isaacs/sigmund/issues" + }, + "homepage": "https://github.com/isaacs/sigmund" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/sigmund.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/sigmund.js new file mode 100644 index 0000000..82c7ab8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/sigmund.js @@ -0,0 +1,39 @@ +module.exports = sigmund +function sigmund (subject, maxSessions) { + maxSessions = maxSessions || 10; + var notes = []; + var analysis = ''; + var RE = RegExp; + + function psychoAnalyze (subject, session) { + if (session > maxSessions) return; + + if (typeof subject === 'function' || + typeof subject === 'undefined') { + return; + } + + if (typeof subject !== 'object' || !subject || + (subject instanceof RE)) { + analysis += subject; + return; + } + + if (notes.indexOf(subject) !== -1 || session === maxSessions) return; + + notes.push(subject); + analysis += '{'; + Object.keys(subject).forEach(function (issue, _, __) { + // pseudo-private values. skip those. + if (issue.charAt(0) === '_') return; + var to = typeof subject[issue]; + if (to === 'function' || to === 'undefined') return; + analysis += issue; + psychoAnalyze(subject[issue], session + 1); + }); + } + psychoAnalyze(subject, 0); + return analysis; +} + +// vim: set softtabstop=4 shiftwidth=4: diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/test/basic.js new file mode 100644 index 0000000..50c53a1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/sigmund/test/basic.js @@ -0,0 +1,24 @@ +var test = require('tap').test +var sigmund = require('../sigmund.js') + + +// occasionally there are duplicates +// that's an acceptable edge-case. JSON.stringify and util.inspect +// have some collision potential as well, though less, and collision +// detection is expensive. +var hash = '{abc/def/g{0h1i2{jkl' +var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} +var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} + +var obj3 = JSON.parse(JSON.stringify(obj1)) +obj3.c = /def/ +obj3.g[2].cycle = obj3 +var cycleHash = '{abc/def/g{0h1i2{jklcycle' + +test('basic', function (t) { + t.equal(sigmund(obj1), hash) + t.equal(sigmund(obj2), hash) + t.equal(sigmund(obj3), cycleHash) + t.end() +}) + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json new file mode 100644 index 0000000..441cdca --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json @@ -0,0 +1,57 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "minimatch", + "description": "a glob matcher in javascript", + "version": "0.2.14", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/minimatch.git" + }, + "main": "minimatch.js", + "scripts": { + "test": "tap test/*.js" + }, + "engines": { + "node": "*" + }, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "devDependencies": { + "tap": "" + }, + "license": { + "type": "MIT", + "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" + }, + "bugs": { + "url": "https://github.com/isaacs/minimatch/issues" + }, + "homepage": "https://github.com/isaacs/minimatch", + "_id": "minimatch@0.2.14", + "dist": { + "shasum": "c74e780574f63c6f9a090e90efbe6ef53a6a756a", + "tarball": "http://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + }, + "_from": "minimatch@~0.2.0", + "_npmVersion": "1.3.17", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "c74e780574f63c6f9a090e90efbe6ef53a6a756a", + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/basic.js new file mode 100644 index 0000000..ae7ac73 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/basic.js @@ -0,0 +1,399 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + + +var patterns = + [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + // https://github.com/isaacs/minimatch/issues/5 + , function () { + files = [ 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' + , 'a/b/.x' + , 'a/b/.x/' + , 'a/.x/b' + , '.x' + , '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b/.x/c' + , '.x/.x' ] + } + , ["**/.x/**", [ '.x/' + , '.x/a' + , '.x/a/b' + , 'a/.x/b' + , 'a/b/.x/' + , 'a/b/.x/c' + , 'a/b/.x/c/d' + , 'a/b/.x/c/d/e' ] ] + + ] + +var regexps = + [ '/^(?:(?=.)a[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:(?=.)X[^/]*?)$/', + '/^(?:\\*)$/', + '/^(?:(?=.)\\*[^/]*?)$/', + '/^(?:\\*\\*)$/', + '/^(?:(?=.)b[^/]*?\\/)$/', + '/^(?:(?=.)c[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/', + '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/', + '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/', + '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/', + '/^(?:(?=.)a[^/]*?[^c])$/', + '/^(?:(?=.)a[X-]b)$/', + '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/', + '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[b]c)$/', + '/^(?:(?=.)a[^/]c)$/', + '/^(?:a\\*c)$/', + 'false', + '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/', + '/^(?:man\\/man1\\/bash\\.1)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[-abc])$/', + '/^(?:(?!\\.)(?=.)[abc-])$/', + '/^(?:\\\\)$/', + '/^(?:(?!\\.)(?=.)[\\\\])$/', + '/^(?:(?!\\.)(?=.)[\\[])$/', + '/^(?:\\[)$/', + '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[\\]])$/', + '/^(?:(?!\\.)(?=.)[\\]-])$/', + '/^(?:(?!\\.)(?=.)[a-z])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', + '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', + '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', + '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', + '/^(?:\\[\\])$/', + '/^(?:\\[abc)$/', + '/^(?:(?=.)XYZ)$/i', + '/^(?:(?=.)ab[^/]*?)$/i', + '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i', + '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', + '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/', + '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', + '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/', + '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/', + '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/', + '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/', + '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/', + '/^(?:(?=.)a[^/]b)$/', + '/^(?:(?=.)#[^/]*?)$/', + '/^(?!^(?:(?=.)a[^/]*?)$).*$/', + '/^(?:(?=.)\\!a[^/]*?)$/', + '/^(?:(?=.)a[^/]*?)$/', + '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/', + '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/', + '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ] +var re = 0; + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + patterns.forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var m = new mm.Minimatch(pattern, options) + var r = m.makeRe() + var expectRe = regexps[re++] + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + + t.equal(tapOpts.re, expectRe, tapOpts) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/brace-expand.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/brace-expand.js new file mode 100644 index 0000000..7ee278a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/brace-expand.js @@ -0,0 +1,33 @@ +var tap = require("tap") + , minimatch = require("../") + +tap.test("brace expansion", function (t) { + // [ pattern, [expanded] ] + ; [ [ "a{b,c{d,e},{f,g}h}x{y,z}" + , [ "abxy" + , "abxz" + , "acdxy" + , "acdxz" + , "acexy" + , "acexz" + , "afhxy" + , "afhxz" + , "aghxy" + , "aghxz" ] ] + , [ "a{1..5}b" + , [ "a1b" + , "a2b" + , "a3b" + , "a4b" + , "a5b" ] ] + , [ "a{b}c", ["a{b}c"] ] + ].forEach(function (tc) { + var p = tc[0] + , expect = tc[1] + t.equivalent(minimatch.braceExpand(p), expect, p) + }) + console.error("ending") + t.end() +}) + + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/caching.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/caching.js new file mode 100644 index 0000000..0fec4b0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/caching.js @@ -0,0 +1,14 @@ +var Minimatch = require("../minimatch.js").Minimatch +var tap = require("tap") +tap.test("cache test", function (t) { + var mm1 = new Minimatch("a?b") + var mm2 = new Minimatch("a?b") + t.equal(mm1, mm2, "should get the same object") + // the lru should drop it after 100 entries + for (var i = 0; i < 100; i ++) { + new Minimatch("a"+i) + } + mm2 = new Minimatch("a?b") + t.notEqual(mm1, mm2, "cache should have dropped") + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/defaults.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/defaults.js new file mode 100644 index 0000000..25f1f60 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/defaults.js @@ -0,0 +1,274 @@ +// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test +// +// TODO: Some of these tests do very bad things with backslashes, and will +// most likely fail badly on windows. They should probably be skipped. + +var tap = require("tap") + , globalBefore = Object.keys(global) + , mm = require("../") + , files = [ "a", "b", "c", "d", "abc" + , "abd", "abe", "bb", "bcd" + , "ca", "cb", "dd", "de" + , "bdir/", "bdir/cfile"] + , next = files.concat([ "a-b", "aXb" + , ".x", ".y" ]) + +tap.test("basic tests", function (t) { + var start = Date.now() + + // [ pattern, [matches], MM opts, files, TAP opts] + ; [ "http://www.bashcookbook.com/bashinfo" + + "/source/bash-1.14.7/tests/glob-test" + , ["a*", ["a", "abc", "abd", "abe"]] + , ["X*", ["X*"], {nonull: true}] + + // allow null glob expansion + , ["X*", []] + + // isaacs: Slightly different than bash/sh/ksh + // \\* is not un-escaped to literal "*" in a failed match, + // but it does make it get treated as a literal star + , ["\\*", ["\\*"], {nonull: true}] + , ["\\**", ["\\**"], {nonull: true}] + , ["\\*\\*", ["\\*\\*"], {nonull: true}] + + , ["b*/", ["bdir/"]] + , ["c*", ["c", "ca", "cb"]] + , ["**", files] + + , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] + , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] + + , "legendary larry crashes bashes" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" + , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] + + , "character classes" + , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] + , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", + "bdir/", "ca", "cb", "dd", "de"]] + , ["a*[^c]", ["abd", "abe"]] + , function () { files.push("a-b", "aXb") } + , ["a[X-]b", ["a-b", "aXb"]] + , function () { files.push(".x", ".y") } + , ["[^a-c]*", ["d", "dd", "de"]] + , function () { files.push("a*b/", "a*b/ooo") } + , ["a\\*b/*", ["a*b/ooo"]] + , ["a\\*?/*", ["a*b/ooo"]] + , ["*\\\\!*", [], {null: true}, ["echo !7"]] + , ["*\\!*", ["echo !7"], null, ["echo !7"]] + , ["*.\\*", ["r.*"], null, ["r.*"]] + , ["a[b]c", ["abc"]] + , ["a[\\b]c", ["abc"]] + , ["a?c", ["abc"]] + , ["a\\*c", [], {null: true}, ["abc"]] + , ["", [""], { null: true }, [""]] + + , "http://www.opensource.apple.com/source/bash/bash-23/" + + "bash/tests/glob-test" + , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } + , ["*/man*/bash.*", ["man/man1/bash.1"]] + , ["man/man1/bash.1", ["man/man1/bash.1"]] + , ["a***c", ["abc"], null, ["abc"]] + , ["a*****?c", ["abc"], null, ["abc"]] + , ["?*****??", ["abc"], null, ["abc"]] + , ["*****??", ["abc"], null, ["abc"]] + , ["?*****?c", ["abc"], null, ["abc"]] + , ["?***?****c", ["abc"], null, ["abc"]] + , ["?***?****?", ["abc"], null, ["abc"]] + , ["?***?****", ["abc"], null, ["abc"]] + , ["*******c", ["abc"], null, ["abc"]] + , ["*******?", ["abc"], null, ["abc"]] + , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] + , ["[-abc]", ["-"], null, ["-"]] + , ["[abc-]", ["-"], null, ["-"]] + , ["\\", ["\\"], null, ["\\"]] + , ["[\\\\]", ["\\"], null, ["\\"]] + , ["[[]", ["["], null, ["["]] + , ["[", ["["], null, ["["]] + , ["[*", ["[abc"], null, ["[abc"]] + , "a right bracket shall lose its special meaning and\n" + + "represent itself in a bracket expression if it occurs\n" + + "first in the list. -- POSIX.2 2.8.3.2" + , ["[]]", ["]"], null, ["]"]] + , ["[]-]", ["]"], null, ["]"]] + , ["[a-\z]", ["p"], null, ["p"]] + , ["??**********?****?", [], { null: true }, ["abc"]] + , ["??**********?****c", [], { null: true }, ["abc"]] + , ["?************c****?****", [], { null: true }, ["abc"]] + , ["*c*?**", [], { null: true }, ["abc"]] + , ["a*****c*?**", [], { null: true }, ["abc"]] + , ["a********???*******", [], { null: true }, ["abc"]] + , ["[]", [], { null: true }, ["a"]] + , ["[abc", [], { null: true }, ["["]] + + , "nocase tests" + , ["XYZ", ["xYz"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["ab*", ["ABC"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } + , ["xYz", "ABC", "IjK"]] + + // [ pattern, [matches], MM opts, files, TAP opts] + , "onestar/twostar" + , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] + , ["{/?,*}", ["/a", "bb"], {null: true} + , ["/a", "/b/b", "/a/b/c", "bb"]] + + , "dots should not match unless requested" + , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + , function () { + files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] + } + , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] + , ["a/*/b", ["a/c/b"], {dot:false}] + , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] + + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + , ["**", ["a/b","a/.d",".a/.d"], { dot: true } + , [ ".a/.d", "a/.d", "a/b"]] + + , "paren sets cannot contain slashes" + , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] + // but we do this instead: + , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] + + // test partial parsing in the presence of comment/negation chars + , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] + , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] + , {} + , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] + + + // crazy nested {,,} and *(||) tests. + , function () { + files = [ "a", "b", "c", "d" + , "ab", "ac", "ad" + , "bc", "cb" + , "bc,d", "c,db", "c,d" + , "d)", "(b|c", "*(b|c" + , "b|c", "b|cc", "cb|c" + , "x(a|b|c)", "x(a|c)" + , "(a|b|c)", "(a|c)"] + } + , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] + , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] + // a + // *(b|c) + // *(b|d) + , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] + , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] + + + // test various flag settings. + , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] + , { noext: true } ] + , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} + , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] + , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] + + + // begin channelling Boole and deMorgan... + , "negation tests" + , function () { + files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] + } + + // anything that is NOT a* matches. + , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] + + // anything that IS !a* matches. + , ["!a*", ["!ab", "!abc"], {nonegate: true}] + + // anything that IS a* matches + , ["!!a*", ["a!b"]] + + // anything that is NOT !a* matches + , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] + + // negation nestled within a pattern + , function () { + files = [ "foo.js" + , "foo.bar" + // can't match this one without negative lookbehind. + , "foo.js.js" + , "blar.js" + , "foo." + , "boo.js.boo" ] + } + , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] + + ].forEach(function (c) { + if (typeof c === "function") return c() + if (typeof c === "string") return t.comment(c) + + var pattern = c[0] + , expect = c[1].sort(alpha) + , options = c[2] || {} + , f = c[3] || files + , tapOpts = c[4] || {} + + // options.debug = true + var Class = mm.defaults(options).Minimatch + var m = new Class(pattern, {}) + var r = m.makeRe() + tapOpts.re = String(r) || JSON.stringify(r) + tapOpts.files = JSON.stringify(f) + tapOpts.pattern = pattern + tapOpts.set = m.set + tapOpts.negated = m.negate + + var actual = mm.match(f, pattern, options) + actual.sort(alpha) + + t.equivalent( actual, expect + , JSON.stringify(pattern) + " " + JSON.stringify(expect) + , tapOpts ) + }) + + t.comment("time=" + (Date.now() - start) + "ms") + t.end() +}) + +tap.test("global leak test", function (t) { + var globalAfter = Object.keys(global) + t.equivalent(globalAfter, globalBefore, "no new globals, please") + t.end() +}) + +function alpha (a, b) { + return a > b ? 1 : -1 +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/extglob-ending-with-state-char.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/extglob-ending-with-state-char.js new file mode 100644 index 0000000..6676e26 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/test/extglob-ending-with-state-char.js @@ -0,0 +1,8 @@ +var test = require('tap').test +var minimatch = require('../') + +test('extglob ending with statechar', function(t) { + t.notOk(minimatch('ax', 'a?(b*)')) + t.ok(minimatch('ax', '?(a*|b)')) + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json new file mode 100644 index 0000000..1deafff --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json @@ -0,0 +1,52 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "fstream-ignore", + "description": "A thing for ignoring files based on globs", + "version": "0.0.7", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/fstream-ignore.git" + }, + "main": "ignore.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "minimatch": "~0.2.0", + "fstream": "~0.1.17", + "inherits": "2" + }, + "devDependencies": { + "tap": "", + "rimraf": "", + "mkdirp": "" + }, + "license": "BSD", + "bugs": { + "url": "https://github.com/isaacs/fstream-ignore/issues" + }, + "_id": "fstream-ignore@0.0.7", + "dist": { + "shasum": "eea3033f0c3728139de7b57ab1b0d6d89c353c63", + "tarball": "http://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz" + }, + "_from": "fstream-ignore@0.0.7", + "_npmVersion": "1.2.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "eea3033f0c3728139de7b57ab1b0d6d89c353c63", + "_resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-0.0.7.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.ignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.ignore new file mode 100644 index 0000000..773679d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.ignore @@ -0,0 +1,2 @@ +.gitignore +.*.swp diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.npmignore new file mode 100644 index 0000000..1b26d0d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/.npmignore @@ -0,0 +1 @@ +*/a diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/00-setup.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/00-setup.js new file mode 100644 index 0000000..7d7e4a1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/00-setup.js @@ -0,0 +1,71 @@ +// The test fixtures work like this: +// These dirs are all created: {a,b,c}/{a,b,c}/{a,b,c}/ +// in each one, these files are created: +// {.,}{a,b,c}{a,b,c}{a,b,c} +// +// So, there'll be a/b/c/abc, a/b/c/aba, etc., and dot-versions of each. +// +// Each test then writes their own ignore file rules for their purposes, +// and is responsible for removing them afterwards. + +var mkdirp = require("mkdirp") +var path = require("path") +var i = 0 +var tap = require("tap") +var fs = require("fs") +var rimraf = require("rimraf") +var fixtures = path.resolve(__dirname, "fixtures") + +var chars = ['a', 'b', 'c'] +var dirs = [] + +for (var i = 0; i < 3; i ++) { + for (var j = 0; j < 3; j ++) { + for (var k = 0; k < 3; k ++) { + dirs.push(chars[i] + '/' + chars[j] + '/' + chars[k]) + } + } +} + +var files = [] + +for (var i = 0; i < 3; i ++) { + for (var j = 0; j < 3; j ++) { + for (var k = 0; k < 3; k ++) { + files.push(chars[i] + chars[j] + chars[k]) + files.push('.' + chars[i] + chars[j] + chars[k]) + } + } +} + +tap.test("remove fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "remove fixtures") + t.end() + }) +}) + +tap.test("create fixtures", function (t) { + dirs.forEach(function (dir) { + dir = path.resolve(fixtures, dir) + t.test("mkdir "+dir, function (t) { + mkdirp(dir, function (er) { + t.ifError(er, "mkdir "+dir) + if (er) return t.end() + + files.forEach(function (file) { + file = path.resolve(dir, file) + t.test("writeFile "+file, function (t) { + fs.writeFile(file, path.basename(file), function (er) { + t.ifError(er, "writing "+file) + t.end() + }) + }) + }) + t.end() + }) + }) + }) + t.end() +}) + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/basic.js new file mode 100644 index 0000000..3718076 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/basic.js @@ -0,0 +1,28 @@ +var IgnoreFile = require("../") + +// set the ignores just for this test +var c = require("./common.js") +c.ignores({ "a/.basic-ignore": ["b/", "aca"] }) + +// the files that we expect to not see +var notAllowed = + [ /^\/a\/b\/.*/ + , /^\/a\/.*\/aca$/ ] + + +require("tap").test("basic ignore rules", function (t) { + t.pass("start") + + IgnoreFile({ path: __dirname + "/fixtures" + , ignoreFiles: [".basic-ignore"] }) + .on("ignoreFile", function (e) { + console.error("ignore file!", e) + }) + .on("child", function (e) { + var p = e.path.substr(e.root.path.length) + notAllowed.forEach(function (na) { + t.dissimilar(p, na) + }) + }) + .on("close", t.end.bind(t)) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/common.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/common.js new file mode 100644 index 0000000..0e6cd98 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/common.js @@ -0,0 +1,40 @@ +if (require.main === module) { + console.log("0..1") + console.log("ok 1 trivial pass") + return +} + +var fs = require("fs") +var path = require("path") +var rimraf = require("rimraf") + +exports.ignores = ignores +exports.writeIgnoreFile = writeIgnoreFile +exports.writeIgnores = writeIgnores +exports.clearIgnores = clearIgnores + +function writeIgnoreFile (file, rules) { + file = path.resolve(__dirname, "fixtures", file) + if (Array.isArray(rules)) { + rules = rules.join("\n") + } + fs.writeFileSync(file, rules) + console.error(file, rules) +} + +function writeIgnores (set) { + Object.keys(set).forEach(function (f) { + writeIgnoreFile(f, set[f]) + }) +} + +function clearIgnores (set) { + Object.keys(set).forEach(function (file) { + fs.unlinkSync(path.resolve(__dirname, "fixtures", file)) + }) +} + +function ignores (set) { + writeIgnores(set) + process.on("exit", clearIgnores.bind(null, set)) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/ignore-most.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/ignore-most.js new file mode 100644 index 0000000..43eec4b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/ignore-most.js @@ -0,0 +1,41 @@ +// ignore most things +var IgnoreFile = require("../") + +// set the ignores just for this test +var c = require("./common.js") +c.ignores({ ".ignore": ["*", "!a/b/c/.abc", "!/c/b/a/cba"] }) + +// the only files we expect to see +var expected = + [ "/a/b/c/.abc" + , "/a" + , "/a/b" + , "/a/b/c" + , "/c/b/a/cba" + , "/c" + , "/c/b" + , "/c/b/a" ] + +require("tap").test("basic ignore rules", function (t) { + t.pass("start") + + IgnoreFile({ path: __dirname + "/fixtures" + , ignoreFiles: [".ignore"] }) + .on("ignoreFile", function (e) { + console.error("ignore file!", e) + }) + .on("child", function (e) { + var p = e.path.substr(e.root.path.length) + var i = expected.indexOf(p) + if (i === -1) { + t.fail("unexpected file found", {file: p}) + } else { + t.pass(p) + expected.splice(i, 1) + } + }) + .on("close", function () { + t.notOk(expected.length, "all expected files should be seen") + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/nested-ignores.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/nested-ignores.js new file mode 100644 index 0000000..a9ede59 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/nested-ignores.js @@ -0,0 +1,51 @@ +// ignore most things +var IgnoreFile = require("../") + +// set the ignores just for this test +var c = require("./common.js") +c.ignores( + { ".ignore": ["*", "a", "c", "!a/b/c/.abc", "!/c/b/a/cba"] + , "a/.ignore": [ "!*", ".ignore" ] // unignore everything + , "a/a/.ignore": [ "*" ] // re-ignore everything + , "a/b/.ignore": [ "*", "!/c/.abc" ] // original unignore + , "a/c/.ignore": [ "*" ] // ignore everything again + , "c/b/a/.ignore": [ "!cba", "!.cba", "!/a{bc,cb}" ] + }) + +// the only files we expect to see +var expected = + [ "/a" + , "/a/a" + , "/a/b" + , "/a/b/c" + , "/a/b/c/.abc" + , "/a/c" + , "/c" + , "/c/b" + , "/c/b/a" + , "/c/b/a/cba" + , "/c/b/a/.cba" + , "/c/b/a/abc" + , "/c/b/a/acb" ] + +require("tap").test("basic ignore rules", function (t) { + t.pass("start") + + IgnoreFile({ path: __dirname + "/fixtures" + , ignoreFiles: [".ignore"] }) + .on("child", function (e) { + var p = e.path.substr(e.root.path.length) + var i = expected.indexOf(p) + if (i === -1) { + console.log("not ok "+p) + t.fail("unexpected file found", {found: p}) + } else { + t.pass(p) + expected.splice(i, 1) + } + }) + .on("close", function () { + t.deepEqual(expected, [], "all expected files should be seen") + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/unignore-child.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/unignore-child.js new file mode 100644 index 0000000..5812354 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/unignore-child.js @@ -0,0 +1,38 @@ +// ignore most things +var IgnoreFile = require("../") + +// set the ignores just for this test +var c = require("./common.js") +c.ignores({ ".ignore": ["*", "a", "c", "!a/b/c/.abc", "!/c/b/a/cba"] }) + +// the only files we expect to see +var expected = + [ "/a/b/c/.abc" + , "/a" + , "/a/b" + , "/a/b/c" + , "/c/b/a/cba" + , "/c" + , "/c/b" + , "/c/b/a" ] + +require("tap").test("basic ignore rules", function (t) { + t.pass("start") + + IgnoreFile({ path: __dirname + "/fixtures" + , ignoreFiles: [".ignore"] }) + .on("child", function (e) { + var p = e.path.substr(e.root.path.length) + var i = expected.indexOf(p) + if (i === -1) { + t.fail("unexpected file found", {f: p}) + } else { + t.pass(p) + expected.splice(i, 1) + } + }) + .on("close", function () { + t.notOk(expected.length, "all expected files should be seen") + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/zz-cleanup.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/zz-cleanup.js new file mode 100644 index 0000000..82f064a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/test/zz-cleanup.js @@ -0,0 +1,10 @@ +var tap = require("tap") +, rimraf = require("rimraf") +, path = require("path") + +tap.test("remove fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "remove fixtures") + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore new file mode 100644 index 0000000..494272a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore @@ -0,0 +1,5 @@ +.*.swp +node_modules/ +examples/deep-copy/ +examples/path/ +examples/filter-copy/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml new file mode 100644 index 0000000..2d26206 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.6 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md new file mode 100644 index 0000000..9d8cb77 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md @@ -0,0 +1,76 @@ +Like FS streams, but with stat on them, and supporting directories and +symbolic links, as well as normal files. Also, you can use this to set +the stats on a file, even if you don't change its contents, or to create +a symlink, etc. + +So, for example, you can "write" a directory, and it'll call `mkdir`. You +can specify a uid and gid, and it'll call `chown`. You can specify a +`mtime` and `atime`, and it'll call `utimes`. You can call it a symlink +and provide a `linkpath` and it'll call `symlink`. + +Note that it won't automatically resolve symbolic links. So, if you +call `fstream.Reader('/some/symlink')` then you'll get an object +that stats and then ends immediately (since it has no data). To follow +symbolic links, do this: `fstream.Reader({path:'/some/symlink', follow: +true })`. + +There are various checks to make sure that the bytes emitted are the +same as the intended size, if the size is set. + +## Examples + +```javascript +fstream + .Writer({ path: "path/to/file" + , mode: 0755 + , size: 6 + }) + .write("hello\n") + .end() +``` + +This will create the directories if they're missing, and then write +`hello\n` into the file, chmod it to 0755, and assert that 6 bytes have +been written when it's done. + +```javascript +fstream + .Writer({ path: "path/to/file" + , mode: 0755 + , size: 6 + , flags: "a" + }) + .write("hello\n") + .end() +``` + +You can pass flags in, if you want to append to a file. + +```javascript +fstream + .Writer({ path: "path/to/symlink" + , linkpath: "./file" + , SymbolicLink: true + , mode: "0755" // octal strings supported + }) + .end() +``` + +If isSymbolicLink is a function, it'll be called, and if it returns +true, then it'll treat it as a symlink. If it's not a function, then +any truish value will make a symlink, or you can set `type: +'SymbolicLink'`, which does the same thing. + +Note that the linkpath is relative to the symbolic link location, not +the parent dir or cwd. + +```javascript +fstream + .Reader("path/to/dir") + .pipe(fstream.Writer("path/to/other/dir")) +``` + +This will do like `cp -Rp path/to/dir path/to/other/dir`. If the other +dir exists and isn't a directory, then it'll emit an error. It'll also +set the uid, gid, mode, etc. to be identical. In this way, it's more +like `rsync -a` than simply a copy. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js new file mode 100644 index 0000000..c6b55b3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js @@ -0,0 +1,131 @@ +var fstream = require("../fstream.js") +var path = require("path") + +var r = fstream.Reader({ path: path.dirname(__dirname) + , filter: function () { + return !this.basename.match(/^\./) && + !this.basename.match(/^node_modules$/) + !this.basename.match(/^deep-copy$/) + !this.basename.match(/^filter-copy$/) + } + }) + +// this writer will only write directories +var w = fstream.Writer({ path: path.resolve(__dirname, "filter-copy") + , type: "Directory" + , filter: function () { + return this.type === "Directory" + } + }) + +var indent = "" +var escape = {} + +r.on("entry", appears) +r.on("ready", function () { + console.error("ready to begin!", r.path) +}) + +function appears (entry) { + console.error(indent + "a %s appears!", entry.type, entry.basename, typeof entry.basename) + if (foggy) { + console.error("FOGGY!") + var p = entry + do { + console.error(p.depth, p.path, p._paused) + } while (p = p.parent) + + throw new Error("\033[mshould not have entries while foggy") + } + indent += "\t" + entry.on("data", missile(entry)) + entry.on("end", runaway(entry)) + entry.on("entry", appears) +} + +var foggy +function missile (entry) { + if (entry.type === "Directory") { + var ended = false + entry.once("end", function () { ended = true }) + return function (c) { + // throw in some pathological pause()/resume() behavior + // just for extra fun. + process.nextTick(function () { + if (!foggy && !ended) { // && Math.random() < 0.3) { + console.error(indent +"%s casts a spell", entry.basename) + console.error("\na slowing fog comes over the battlefield...\n\033[32m") + entry.pause() + entry.once("resume", liftFog) + foggy = setTimeout(liftFog, 1000) + + function liftFog (who) { + if (!foggy) return + if (who) { + console.error("%s breaks the spell!", who && who.path) + } else { + console.error("the spell expires!") + } + console.error("\033[mthe fog lifts!\n") + clearTimeout(foggy) + foggy = null + if (entry._paused) entry.resume() + } + + } + }) + } + } + + return function (c) { + var e = Math.random() < 0.5 + console.error(indent + "%s %s for %d damage!", + entry.basename, + e ? "is struck" : "fires a chunk", + c.length) + } +} + +function runaway (entry) { return function () { + var e = Math.random() < 0.5 + console.error(indent + "%s %s", + entry.basename, + e ? "turns to flee" : "is vanquished!") + indent = indent.slice(0, -1) +}} + + +w.on("entry", attacks) +//w.on("ready", function () { attacks(w) }) +function attacks (entry) { + console.error(indent + "%s %s!", entry.basename, + entry.type === "Directory" ? "calls for backup" : "attacks") + entry.on("entry", attacks) +} + +ended = false +var i = 1 +r.on("end", function () { + if (foggy) clearTimeout(foggy) + console.error("\033[mIT'S OVER!!") + console.error("A WINNAR IS YOU!") + + console.log("ok " + (i ++) + " A WINNAR IS YOU") + ended = true + // now go through and verify that everything in there is a dir. + var p = path.resolve(__dirname, "filter-copy") + var checker = fstream.Reader({ path: p }) + checker.checker = true + checker.on("child", function (e) { + var ok = e.type === "Directory" + console.log((ok ? "" : "not ") + "ok " + (i ++) + + " should be a dir: " + + e.path.substr(checker.path.length + 1)) + }) +}) + +process.on("exit", function () { + console.log((ended ? "" : "not ") + "ok " + (i ++) + " ended") +}) + +r.pipe(w) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js new file mode 100644 index 0000000..648ec84 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js @@ -0,0 +1,115 @@ +var fstream = require("../fstream.js") +var path = require("path") + +var r = fstream.Reader({ path: path.dirname(__dirname) + , filter: function () { + return !this.basename.match(/^\./) && + !this.basename.match(/^node_modules$/) + !this.basename.match(/^deep-copy$/) + } + }) + +var w = fstream.Writer({ path: path.resolve(__dirname, "deep-copy") + , type: "Directory" + }) + +var indent = "" +var escape = {} + +r.on("entry", appears) +r.on("ready", function () { + console.error("ready to begin!", r.path) +}) + +function appears (entry) { + console.error(indent + "a %s appears!", entry.type, entry.basename, typeof entry.basename, entry) + if (foggy) { + console.error("FOGGY!") + var p = entry + do { + console.error(p.depth, p.path, p._paused) + } while (p = p.parent) + + throw new Error("\033[mshould not have entries while foggy") + } + indent += "\t" + entry.on("data", missile(entry)) + entry.on("end", runaway(entry)) + entry.on("entry", appears) +} + +var foggy +function missile (entry) { + if (entry.type === "Directory") { + var ended = false + entry.once("end", function () { ended = true }) + return function (c) { + // throw in some pathological pause()/resume() behavior + // just for extra fun. + process.nextTick(function () { + if (!foggy && !ended) { // && Math.random() < 0.3) { + console.error(indent +"%s casts a spell", entry.basename) + console.error("\na slowing fog comes over the battlefield...\n\033[32m") + entry.pause() + entry.once("resume", liftFog) + foggy = setTimeout(liftFog, 10) + + function liftFog (who) { + if (!foggy) return + if (who) { + console.error("%s breaks the spell!", who && who.path) + } else { + console.error("the spell expires!") + } + console.error("\033[mthe fog lifts!\n") + clearTimeout(foggy) + foggy = null + if (entry._paused) entry.resume() + } + + } + }) + } + } + + return function (c) { + var e = Math.random() < 0.5 + console.error(indent + "%s %s for %d damage!", + entry.basename, + e ? "is struck" : "fires a chunk", + c.length) + } +} + +function runaway (entry) { return function () { + var e = Math.random() < 0.5 + console.error(indent + "%s %s", + entry.basename, + e ? "turns to flee" : "is vanquished!") + indent = indent.slice(0, -1) +}} + + +w.on("entry", attacks) +//w.on("ready", function () { attacks(w) }) +function attacks (entry) { + console.error(indent + "%s %s!", entry.basename, + entry.type === "Directory" ? "calls for backup" : "attacks") + entry.on("entry", attacks) +} + +ended = false +r.on("end", function () { + if (foggy) clearTimeout(foggy) + console.error("\033[mIT'S OVER!!") + console.error("A WINNAR IS YOU!") + + console.log("ok 1 A WINNAR IS YOU") + ended = true +}) + +process.on("exit", function () { + console.log((ended ? "" : "not ") + "ok 2 ended") +}) + +r.pipe(w) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js new file mode 100644 index 0000000..9aa1a95 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js @@ -0,0 +1,54 @@ +var fstream = require("../fstream.js") +var tap = require("tap") +var fs = require("fs") +var path = require("path") +var children = -1 +var dir = path.dirname(__dirname) + +var gotReady = false +var ended = false + +tap.test("reader test", function (t) { + + var r = fstream.Reader({ path: dir + , filter: function () { + // return this.parent === r + return this.parent === r || this === r + } + }) + + r.on("ready", function () { + gotReady = true + children = fs.readdirSync(dir).length + console.error("Setting expected children to "+children) + t.equal(r.type, "Directory", "should be a directory") + }) + + r.on("entry", function (entry) { + children -- + if (!gotReady) { + t.fail("children before ready!") + } + t.equal(entry.dirname, r.path, "basename is parent dir") + }) + + r.on("error", function (er) { + t.fail(er) + t.end() + process.exit(1) + }) + + r.on("end", function () { + t.equal(children, 0, "should have seen all children") + ended = true + }) + + var closed = false + r.on("close", function () { + t.ok(ended, "saw end before close") + t.notOk(closed, "close should only happen once") + closed = true + t.end() + }) + +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js new file mode 100644 index 0000000..d7816d2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js @@ -0,0 +1,24 @@ +var fstream = require("../fstream.js") + , closed = false + +fstream + .Writer({ path: "path/to/symlink" + , linkpath: "./file" + , isSymbolicLink: true + , mode: "0755" // octal strings supported + }) + .on("close", function () { + closed = true + var fs = require("fs") + var s = fs.lstatSync("path/to/symlink") + var isSym = s.isSymbolicLink() + console.log((isSym?"":"not ") +"ok 1 should be symlink") + var t = fs.readlinkSync("path/to/symlink") + var isTarget = t === "./file" + console.log((isTarget?"":"not ") +"ok 2 should link to ./file") + }) + .end() + +process.on("exit", function () { + console.log((closed?"":"not ")+"ok 3 should be closed") +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js new file mode 100644 index 0000000..c66d26f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js @@ -0,0 +1,31 @@ +exports.Abstract = require("./lib/abstract.js") +exports.Reader = require("./lib/reader.js") +exports.Writer = require("./lib/writer.js") + +exports.File = + { Reader: require("./lib/file-reader.js") + , Writer: require("./lib/file-writer.js") } + +exports.Dir = + { Reader : require("./lib/dir-reader.js") + , Writer : require("./lib/dir-writer.js") } + +exports.Link = + { Reader : require("./lib/link-reader.js") + , Writer : require("./lib/link-writer.js") } + +exports.Proxy = + { Reader : require("./lib/proxy-reader.js") + , Writer : require("./lib/proxy-writer.js") } + +exports.Reader.Dir = exports.DirReader = exports.Dir.Reader +exports.Reader.File = exports.FileReader = exports.File.Reader +exports.Reader.Link = exports.LinkReader = exports.Link.Reader +exports.Reader.Proxy = exports.ProxyReader = exports.Proxy.Reader + +exports.Writer.Dir = exports.DirWriter = exports.Dir.Writer +exports.Writer.File = exports.FileWriter = exports.File.Writer +exports.Writer.Link = exports.LinkWriter = exports.Link.Writer +exports.Writer.Proxy = exports.ProxyWriter = exports.Proxy.Writer + +exports.collect = require("./lib/collect.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js new file mode 100644 index 0000000..11ef0e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js @@ -0,0 +1,85 @@ +// the parent class for all fstreams. + +module.exports = Abstract + +var Stream = require("stream").Stream + , inherits = require("inherits") + +function Abstract () { + Stream.call(this) +} + +inherits(Abstract, Stream) + +Abstract.prototype.on = function (ev, fn) { + if (ev === "ready" && this.ready) { + process.nextTick(fn.bind(this)) + } else { + Stream.prototype.on.call(this, ev, fn) + } + return this +} + +Abstract.prototype.abort = function () { + this._aborted = true + this.emit("abort") +} + +Abstract.prototype.destroy = function () {} + +Abstract.prototype.warn = function (msg, code) { + var me = this + , er = decorate(msg, code, me) + if (!me.listeners("warn")) { + console.error("%s %s\n" + + "path = %s\n" + + "syscall = %s\n" + + "fstream_type = %s\n" + + "fstream_path = %s\n" + + "fstream_unc_path = %s\n" + + "fstream_class = %s\n" + + "fstream_stack =\n%s\n", + code || "UNKNOWN", + er.stack, + er.path, + er.syscall, + er.fstream_type, + er.fstream_path, + er.fstream_unc_path, + er.fstream_class, + er.fstream_stack.join("\n")) + } else { + me.emit("warn", er) + } +} + +Abstract.prototype.info = function (msg, code) { + this.emit("info", msg, code) +} + +Abstract.prototype.error = function (msg, code, th) { + var er = decorate(msg, code, this) + if (th) throw er + else this.emit("error", er) +} + +function decorate (er, code, me) { + if (!(er instanceof Error)) er = new Error(er) + er.code = er.code || code + er.path = er.path || me.path + er.fstream_type = er.fstream_type || me.type + er.fstream_path = er.fstream_path || me.path + if (me._path !== me.path) { + er.fstream_unc_path = er.fstream_unc_path || me._path + } + if (me.linkpath) { + er.fstream_linkpath = er.fstream_linkpath || me.linkpath + } + er.fstream_class = er.fstream_class || me.constructor.name + er.fstream_stack = er.fstream_stack || + new Error().stack.split(/\n/).slice(3).map(function (s) { + return s.replace(/^ at /, "") + }) + + return er +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js new file mode 100644 index 0000000..a36f780 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js @@ -0,0 +1,67 @@ +module.exports = collect + +function collect (stream) { + if (stream._collected) return + + stream._collected = true + stream.pause() + + stream.on("data", save) + stream.on("end", save) + var buf = [] + function save (b) { + if (typeof b === "string") b = new Buffer(b) + if (Buffer.isBuffer(b) && !b.length) return + buf.push(b) + } + + stream.on("entry", saveEntry) + var entryBuffer = [] + function saveEntry (e) { + collect(e) + entryBuffer.push(e) + } + + stream.on("proxy", proxyPause) + function proxyPause (p) { + p.pause() + } + + + // replace the pipe method with a new version that will + // unlock the buffered stuff. if you just call .pipe() + // without a destination, then it'll re-play the events. + stream.pipe = (function (orig) { return function (dest) { + // console.error(" === open the pipes", dest && dest.path) + + // let the entries flow through one at a time. + // Once they're all done, then we can resume completely. + var e = 0 + ;(function unblockEntry () { + var entry = entryBuffer[e++] + // console.error(" ==== unblock entry", entry && entry.path) + if (!entry) return resume() + entry.on("end", unblockEntry) + if (dest) dest.add(entry) + else stream.emit("entry", entry) + })() + + function resume () { + stream.removeListener("entry", saveEntry) + stream.removeListener("data", save) + stream.removeListener("end", save) + + stream.pipe = orig + if (dest) stream.pipe(dest) + + buf.forEach(function (b) { + if (b) stream.emit("data", b) + else stream.emit("end") + }) + + stream.resume() + } + + return dest + }})(stream.pipe) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js new file mode 100644 index 0000000..346ac2b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js @@ -0,0 +1,251 @@ +// A thing that emits "entry" events with Reader objects +// Pausing it causes it to stop emitting entry events, and also +// pauses the current entry if there is one. + +module.exports = DirReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , Reader = fstream.Reader + , inherits = require("inherits") + , mkdir = require("mkdirp") + , path = require("path") + , Reader = require("./reader.js") + , assert = require("assert").ok + +inherits(DirReader, Reader) + +function DirReader (props) { + var me = this + if (!(me instanceof DirReader)) throw new Error( + "DirReader must be called as constructor.") + + // should already be established as a Directory type + if (props.type !== "Directory" || !props.Directory) { + throw new Error("Non-directory type "+ props.type) + } + + me.entries = null + me._index = -1 + me._paused = false + me._length = -1 + + if (props.sort) { + this.sort = props.sort + } + + Reader.call(this, props) +} + +DirReader.prototype._getEntries = function () { + var me = this + + // race condition. might pause() before calling _getEntries, + // and then resume, and try to get them a second time. + if (me._gotEntries) return + me._gotEntries = true + + fs.readdir(me._path, function (er, entries) { + if (er) return me.error(er) + + me.entries = entries + + me.emit("entries", entries) + if (me._paused) me.once("resume", processEntries) + else processEntries() + + function processEntries () { + me._length = me.entries.length + if (typeof me.sort === "function") { + me.entries = me.entries.sort(me.sort.bind(me)) + } + me._read() + } + }) +} + +// start walking the dir, and emit an "entry" event for each one. +DirReader.prototype._read = function () { + var me = this + + if (!me.entries) return me._getEntries() + + if (me._paused || me._currentEntry || me._aborted) { + // console.error("DR paused=%j, current=%j, aborted=%j", me._paused, !!me._currentEntry, me._aborted) + return + } + + me._index ++ + if (me._index >= me.entries.length) { + if (!me._ended) { + me._ended = true + me.emit("end") + me.emit("close") + } + return + } + + // ok, handle this one, then. + + // save creating a proxy, by stat'ing the thing now. + var p = path.resolve(me._path, me.entries[me._index]) + assert(p !== me._path) + assert(me.entries[me._index]) + + // set this to prevent trying to _read() again in the stat time. + me._currentEntry = p + fs[ me.props.follow ? "stat" : "lstat" ](p, function (er, stat) { + if (er) return me.error(er) + + var who = me._proxy || me + + stat.path = p + stat.basename = path.basename(p) + stat.dirname = path.dirname(p) + var childProps = me.getChildProps.call(who, stat) + childProps.path = p + childProps.basename = path.basename(p) + childProps.dirname = path.dirname(p) + + var entry = Reader(childProps, stat) + + // console.error("DR Entry", p, stat.size) + + me._currentEntry = entry + + // "entry" events are for direct entries in a specific dir. + // "child" events are for any and all children at all levels. + // This nomenclature is not completely final. + + entry.on("pause", function (who) { + if (!me._paused && !entry._disowned) { + me.pause(who) + } + }) + + entry.on("resume", function (who) { + if (me._paused && !entry._disowned) { + me.resume(who) + } + }) + + entry.on("stat", function (props) { + me.emit("_entryStat", entry, props) + if (entry._aborted) return + if (entry._paused) entry.once("resume", function () { + me.emit("entryStat", entry, props) + }) + else me.emit("entryStat", entry, props) + }) + + entry.on("ready", function EMITCHILD () { + // console.error("DR emit child", entry._path) + if (me._paused) { + // console.error(" DR emit child - try again later") + // pause the child, and emit the "entry" event once we drain. + // console.error("DR pausing child entry") + entry.pause(me) + return me.once("resume", EMITCHILD) + } + + // skip over sockets. they can't be piped around properly, + // so there's really no sense even acknowledging them. + // if someone really wants to see them, they can listen to + // the "socket" events. + if (entry.type === "Socket") { + me.emit("socket", entry) + } else { + me.emitEntry(entry) + } + }) + + var ended = false + entry.on("close", onend) + entry.on("disown", onend) + function onend () { + if (ended) return + ended = true + me.emit("childEnd", entry) + me.emit("entryEnd", entry) + me._currentEntry = null + if (!me._paused) { + me._read() + } + } + + // XXX Remove this. Works in node as of 0.6.2 or so. + // Long filenames should not break stuff. + entry.on("error", function (er) { + if (entry._swallowErrors) { + me.warn(er) + entry.emit("end") + entry.emit("close") + } else { + me.emit("error", er) + } + }) + + // proxy up some events. + ; [ "child" + , "childEnd" + , "warn" + ].forEach(function (ev) { + entry.on(ev, me.emit.bind(me, ev)) + }) + }) +} + +DirReader.prototype.disown = function (entry) { + entry.emit("beforeDisown") + entry._disowned = true + entry.parent = entry.root = null + if (entry === this._currentEntry) { + this._currentEntry = null + } + entry.emit("disown") +} + +DirReader.prototype.getChildProps = function (stat) { + return { depth: this.depth + 1 + , root: this.root || this + , parent: this + , follow: this.follow + , filter: this.filter + , sort: this.props.sort + , hardlinks: this.props.hardlinks + } +} + +DirReader.prototype.pause = function (who) { + var me = this + if (me._paused) return + who = who || me + me._paused = true + if (me._currentEntry && me._currentEntry.pause) { + me._currentEntry.pause(who) + } + me.emit("pause", who) +} + +DirReader.prototype.resume = function (who) { + var me = this + if (!me._paused) return + who = who || me + + me._paused = false + // console.error("DR Emit Resume", me._path) + me.emit("resume", who) + if (me._paused) { + // console.error("DR Re-paused", me._path) + return + } + + if (me._currentEntry) { + if (me._currentEntry.resume) me._currentEntry.resume(who) + } else me._read() +} + +DirReader.prototype.emitEntry = function (entry) { + this.emit("entry", entry) + this.emit("child", entry) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js new file mode 100644 index 0000000..7073b88 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js @@ -0,0 +1,171 @@ +// It is expected that, when .add() returns false, the consumer +// of the DirWriter will pause until a "drain" event occurs. Note +// that this is *almost always going to be the case*, unless the +// thing being written is some sort of unsupported type, and thus +// skipped over. + +module.exports = DirWriter + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , Writer = require("./writer.js") + , inherits = require("inherits") + , mkdir = require("mkdirp") + , path = require("path") + , collect = require("./collect.js") + +inherits(DirWriter, Writer) + +function DirWriter (props) { + var me = this + if (!(me instanceof DirWriter)) me.error( + "DirWriter must be called as constructor.", null, true) + + // should already be established as a Directory type + if (props.type !== "Directory" || !props.Directory) { + me.error("Non-directory type "+ props.type + " " + + JSON.stringify(props), null, true) + } + + Writer.call(this, props) +} + +DirWriter.prototype._create = function () { + var me = this + mkdir(me._path, Writer.dirmode, function (er) { + if (er) return me.error(er) + // ready to start getting entries! + me.ready = true + me.emit("ready") + me._process() + }) +} + +// a DirWriter has an add(entry) method, but its .write() doesn't +// do anything. Why a no-op rather than a throw? Because this +// leaves open the door for writing directory metadata for +// gnu/solaris style dumpdirs. +DirWriter.prototype.write = function () { + return true +} + +DirWriter.prototype.end = function () { + this._ended = true + this._process() +} + +DirWriter.prototype.add = function (entry) { + var me = this + + // console.error("\tadd", entry._path, "->", me._path) + collect(entry) + if (!me.ready || me._currentEntry) { + me._buffer.push(entry) + return false + } + + // create a new writer, and pipe the incoming entry into it. + if (me._ended) { + return me.error("add after end") + } + + me._buffer.push(entry) + me._process() + + return 0 === this._buffer.length +} + +DirWriter.prototype._process = function () { + var me = this + + // console.error("DW Process p=%j", me._processing, me.basename) + + if (me._processing) return + + var entry = me._buffer.shift() + if (!entry) { + // console.error("DW Drain") + me.emit("drain") + if (me._ended) me._finish() + return + } + + me._processing = true + // console.error("DW Entry", entry._path) + + me.emit("entry", entry) + + // ok, add this entry + // + // don't allow recursive copying + var p = entry + do { + var pp = p._path || p.path + if (pp === me.root._path || pp === me._path || + (pp && pp.indexOf(me._path) === 0)) { + // console.error("DW Exit (recursive)", entry.basename, me._path) + me._processing = false + if (entry._collected) entry.pipe() + return me._process() + } + } while (p = p.parent) + + // console.error("DW not recursive") + + // chop off the entry's root dir, replace with ours + var props = { parent: me + , root: me.root || me + , type: entry.type + , depth: me.depth + 1 } + + var p = entry._path || entry.path || entry.props.path + if (entry.parent) { + p = p.substr(entry.parent._path.length + 1) + } + // get rid of any ../../ shenanigans + props.path = path.join(me.path, path.join("/", p)) + + // if i have a filter, the child should inherit it. + props.filter = me.filter + + // all the rest of the stuff, copy over from the source. + Object.keys(entry.props).forEach(function (k) { + if (!props.hasOwnProperty(k)) { + props[k] = entry.props[k] + } + }) + + // not sure at this point what kind of writer this is. + var child = me._currentChild = new Writer(props) + child.on("ready", function () { + // console.error("DW Child Ready", child.type, child._path) + // console.error(" resuming", entry._path) + entry.pipe(child) + entry.resume() + }) + + // XXX Make this work in node. + // Long filenames should not break stuff. + child.on("error", function (er) { + if (child._swallowErrors) { + me.warn(er) + child.emit("end") + child.emit("close") + } else { + me.emit("error", er) + } + }) + + // we fire _end internally *after* end, so that we don't move on + // until any "end" listeners have had their chance to do stuff. + child.on("close", onend) + var ended = false + function onend () { + if (ended) return + ended = true + // console.error("* DW Child end", child.basename) + me._currentChild = null + me._processing = false + me._process() + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js new file mode 100644 index 0000000..b1f9861 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js @@ -0,0 +1,147 @@ +// Basically just a wrapper around an fs.ReadStream + +module.exports = FileReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , Reader = fstream.Reader + , inherits = require("inherits") + , mkdir = require("mkdirp") + , Reader = require("./reader.js") + , EOF = {EOF: true} + , CLOSE = {CLOSE: true} + +inherits(FileReader, Reader) + +function FileReader (props) { + // console.error(" FR create", props.path, props.size, new Error().stack) + var me = this + if (!(me instanceof FileReader)) throw new Error( + "FileReader must be called as constructor.") + + // should already be established as a File type + // XXX Todo: preserve hardlinks by tracking dev+inode+nlink, + // with a HardLinkReader class. + if (!((props.type === "Link" && props.Link) || + (props.type === "File" && props.File))) { + throw new Error("Non-file type "+ props.type) + } + + me._buffer = [] + me._bytesEmitted = 0 + Reader.call(me, props) +} + +FileReader.prototype._getStream = function () { + var me = this + , stream = me._stream = fs.createReadStream(me._path, me.props) + + if (me.props.blksize) { + stream.bufferSize = me.props.blksize + } + + stream.on("open", me.emit.bind(me, "open")) + + stream.on("data", function (c) { + // console.error("\t\t%d %s", c.length, me.basename) + me._bytesEmitted += c.length + // no point saving empty chunks + if (!c.length) return + else if (me._paused || me._buffer.length) { + me._buffer.push(c) + me._read() + } else me.emit("data", c) + }) + + stream.on("end", function () { + if (me._paused || me._buffer.length) { + // console.error("FR Buffering End", me._path) + me._buffer.push(EOF) + me._read() + } else { + me.emit("end") + } + + if (me._bytesEmitted !== me.props.size) { + me.error("Didn't get expected byte count\n"+ + "expect: "+me.props.size + "\n" + + "actual: "+me._bytesEmitted) + } + }) + + stream.on("close", function () { + if (me._paused || me._buffer.length) { + // console.error("FR Buffering Close", me._path) + me._buffer.push(CLOSE) + me._read() + } else { + // console.error("FR close 1", me._path) + me.emit("close") + } + }) + + me._read() +} + +FileReader.prototype._read = function () { + var me = this + // console.error("FR _read", me._path) + if (me._paused) { + // console.error("FR _read paused", me._path) + return + } + + if (!me._stream) { + // console.error("FR _getStream calling", me._path) + return me._getStream() + } + + // clear out the buffer, if there is one. + if (me._buffer.length) { + // console.error("FR _read has buffer", me._buffer.length, me._path) + var buf = me._buffer + for (var i = 0, l = buf.length; i < l; i ++) { + var c = buf[i] + if (c === EOF) { + // console.error("FR Read emitting buffered end", me._path) + me.emit("end") + } else if (c === CLOSE) { + // console.error("FR Read emitting buffered close", me._path) + me.emit("close") + } else { + // console.error("FR Read emitting buffered data", me._path) + me.emit("data", c) + } + + if (me._paused) { + // console.error("FR Read Re-pausing at "+i, me._path) + me._buffer = buf.slice(i) + return + } + } + me._buffer.length = 0 + } + // console.error("FR _read done") + // that's about all there is to it. +} + +FileReader.prototype.pause = function (who) { + var me = this + // console.error("FR Pause", me._path) + if (me._paused) return + who = who || me + me._paused = true + if (me._stream) me._stream.pause() + me.emit("pause", who) +} + +FileReader.prototype.resume = function (who) { + var me = this + // console.error("FR Resume", me._path) + if (!me._paused) return + who = who || me + me.emit("resume", who) + me._paused = false + if (me._stream) me._stream.resume() + me._read() +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js new file mode 100644 index 0000000..5e9902a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js @@ -0,0 +1,104 @@ +module.exports = FileWriter + +var fs = require("graceful-fs") + , mkdir = require("mkdirp") + , Writer = require("./writer.js") + , inherits = require("inherits") + , EOF = {} + +inherits(FileWriter, Writer) + +function FileWriter (props) { + var me = this + if (!(me instanceof FileWriter)) throw new Error( + "FileWriter must be called as constructor.") + + // should already be established as a File type + if (props.type !== "File" || !props.File) { + throw new Error("Non-file type "+ props.type) + } + + me._buffer = [] + me._bytesWritten = 0 + + Writer.call(this, props) +} + +FileWriter.prototype._create = function () { + var me = this + if (me._stream) return + + var so = {} + if (me.props.flags) so.flags = me.props.flags + so.mode = Writer.filemode + if (me._old && me._old.blksize) so.bufferSize = me._old.blksize + + me._stream = fs.createWriteStream(me._path, so) + + me._stream.on("open", function (fd) { + // console.error("FW open", me._buffer, me._path) + me.ready = true + me._buffer.forEach(function (c) { + if (c === EOF) me._stream.end() + else me._stream.write(c) + }) + me.emit("ready") + // give this a kick just in case it needs it. + me.emit("drain") + }) + + me._stream.on("drain", function () { me.emit("drain") }) + + me._stream.on("close", function () { + // console.error("\n\nFW Stream Close", me._path, me.size) + me._finish() + }) +} + +FileWriter.prototype.write = function (c) { + var me = this + + me._bytesWritten += c.length + + if (!me.ready) { + if (!Buffer.isBuffer(c) && typeof c !== 'string') + throw new Error('invalid write data') + me._buffer.push(c) + return false + } + + var ret = me._stream.write(c) + // console.error("\t-- fw wrote, _stream says", ret, me._stream._queue.length) + + // allow 2 buffered writes, because otherwise there's just too + // much stop and go bs. + if (ret === false && me._stream._queue) { + return me._stream._queue.length <= 2; + } else { + return ret; + } +} + +FileWriter.prototype.end = function (c) { + var me = this + + if (c) me.write(c) + + if (!me.ready) { + me._buffer.push(EOF) + return false + } + + return me._stream.end() +} + +FileWriter.prototype._finish = function () { + var me = this + if (typeof me.size === "number" && me._bytesWritten != me.size) { + me.error( + "Did not get expected byte count.\n" + + "expect: " + me.size + "\n" + + "actual: " + me._bytesWritten) + } + Writer.prototype._finish.call(me) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js new file mode 100644 index 0000000..cd65c41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js @@ -0,0 +1,32 @@ +module.exports = getType + +function getType (st) { + var types = + [ "Directory" + , "File" + , "SymbolicLink" + , "Link" // special for hardlinks from tarballs + , "BlockDevice" + , "CharacterDevice" + , "FIFO" + , "Socket" ] + , type + + if (st.type && -1 !== types.indexOf(st.type)) { + st[st.type] = true + return st.type + } + + for (var i = 0, l = types.length; i < l; i ++) { + type = types[i] + var is = st[type] || st["is" + type] + if (typeof is === "function") is = is.call(st) + if (is) { + st[type] = true + st.type = type + return type + } + } + + return null +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js new file mode 100644 index 0000000..7e7ab6c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js @@ -0,0 +1,54 @@ +// Basically just a wrapper around an fs.readlink +// +// XXX: Enhance this to support the Link type, by keeping +// a lookup table of {:}, so that hardlinks +// can be preserved in tarballs. + +module.exports = LinkReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , inherits = require("inherits") + , mkdir = require("mkdirp") + , Reader = require("./reader.js") + +inherits(LinkReader, Reader) + +function LinkReader (props) { + var me = this + if (!(me instanceof LinkReader)) throw new Error( + "LinkReader must be called as constructor.") + + if (!((props.type === "Link" && props.Link) || + (props.type === "SymbolicLink" && props.SymbolicLink))) { + throw new Error("Non-link type "+ props.type) + } + + Reader.call(me, props) +} + +// When piping a LinkReader into a LinkWriter, we have to +// already have the linkpath property set, so that has to +// happen *before* the "ready" event, which means we need to +// override the _stat method. +LinkReader.prototype._stat = function (currentStat) { + var me = this + fs.readlink(me._path, function (er, linkpath) { + if (er) return me.error(er) + me.linkpath = me.props.linkpath = linkpath + me.emit("linkpath", linkpath) + Reader.prototype._stat.call(me, currentStat) + }) +} + +LinkReader.prototype._read = function () { + var me = this + if (me._paused) return + // basically just a no-op, since we got all the info we need + // from the _stat method + if (!me._ended) { + me.emit("end") + me.emit("close") + me._ended = true + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js new file mode 100644 index 0000000..5c8f1e7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js @@ -0,0 +1,95 @@ + +module.exports = LinkWriter + +var fs = require("graceful-fs") + , Writer = require("./writer.js") + , inherits = require("inherits") + , path = require("path") + , rimraf = require("rimraf") + +inherits(LinkWriter, Writer) + +function LinkWriter (props) { + var me = this + if (!(me instanceof LinkWriter)) throw new Error( + "LinkWriter must be called as constructor.") + + // should already be established as a Link type + if (!((props.type === "Link" && props.Link) || + (props.type === "SymbolicLink" && props.SymbolicLink))) { + throw new Error("Non-link type "+ props.type) + } + + if (props.linkpath === "") props.linkpath = "." + if (!props.linkpath) { + me.error("Need linkpath property to create " + props.type) + } + + Writer.call(this, props) +} + +LinkWriter.prototype._create = function () { + // console.error(" LW _create") + var me = this + , hard = me.type === "Link" || process.platform === "win32" + , link = hard ? "link" : "symlink" + , lp = hard ? path.resolve(me.dirname, me.linkpath) : me.linkpath + + // can only change the link path by clobbering + // For hard links, let's just assume that's always the case, since + // there's no good way to read them if we don't already know. + if (hard) return clobber(me, lp, link) + + fs.readlink(me._path, function (er, p) { + // only skip creation if it's exactly the same link + if (p && p === lp) return finish(me) + clobber(me, lp, link) + }) +} + +function clobber (me, lp, link) { + rimraf(me._path, function (er) { + if (er) return me.error(er) + create(me, lp, link) + }) +} + +function create (me, lp, link) { + fs[link](lp, me._path, function (er) { + // if this is a hard link, and we're in the process of writing out a + // directory, it's very possible that the thing we're linking to + // doesn't exist yet (especially if it was intended as a symlink), + // so swallow ENOENT errors here and just soldier in. + // Additionally, an EPERM or EACCES can happen on win32 if it's trying + // to make a link to a directory. Again, just skip it. + // A better solution would be to have fs.symlink be supported on + // windows in some nice fashion. + if (er) { + if ((er.code === "ENOENT" || + er.code === "EACCES" || + er.code === "EPERM" ) && process.platform === "win32") { + me.ready = true + me.emit("ready") + me.emit("end") + me.emit("close") + me.end = me._finish = function () {} + } else return me.error(er) + } + finish(me) + }) +} + +function finish (me) { + me.ready = true + me.emit("ready") + if (me._ended && !me._finished) me._finish() +} + +LinkWriter.prototype.end = function () { + // console.error("LW finish in end") + this._ended = true + if (this.ready) { + this._finished = true + this._finish() + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js new file mode 100644 index 0000000..a0ece34 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js @@ -0,0 +1,93 @@ +// A reader for when we don't yet know what kind of thing +// the thing is. + +module.exports = ProxyReader + +var Reader = require("./reader.js") + , getType = require("./get-type.js") + , inherits = require("inherits") + , fs = require("graceful-fs") + +inherits(ProxyReader, Reader) + +function ProxyReader (props) { + var me = this + if (!(me instanceof ProxyReader)) throw new Error( + "ProxyReader must be called as constructor.") + + me.props = props + me._buffer = [] + me.ready = false + + Reader.call(me, props) +} + +ProxyReader.prototype._stat = function () { + var me = this + , props = me.props + // stat the thing to see what the proxy should be. + , stat = props.follow ? "stat" : "lstat" + + fs[stat](props.path, function (er, current) { + var type + if (er || !current) { + type = "File" + } else { + type = getType(current) + } + + props[type] = true + props.type = me.type = type + + me._old = current + me._addProxy(Reader(props, current)) + }) +} + +ProxyReader.prototype._addProxy = function (proxy) { + var me = this + if (me._proxyTarget) { + return me.error("proxy already set") + } + + me._proxyTarget = proxy + proxy._proxy = me + + ; [ "error" + , "data" + , "end" + , "close" + , "linkpath" + , "entry" + , "entryEnd" + , "child" + , "childEnd" + , "warn" + , "stat" + ].forEach(function (ev) { + // console.error("~~ proxy event", ev, me.path) + proxy.on(ev, me.emit.bind(me, ev)) + }) + + me.emit("proxy", proxy) + + proxy.on("ready", function () { + // console.error("~~ proxy is ready!", me.path) + me.ready = true + me.emit("ready") + }) + + var calls = me._buffer + me._buffer.length = 0 + calls.forEach(function (c) { + proxy[c[0]].apply(proxy, c[1]) + }) +} + +ProxyReader.prototype.pause = function () { + return this._proxyTarget ? this._proxyTarget.pause() : false +} + +ProxyReader.prototype.resume = function () { + return this._proxyTarget ? this._proxyTarget.resume() : false +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js new file mode 100644 index 0000000..b047663 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js @@ -0,0 +1,109 @@ +// A writer for when we don't know what kind of thing +// the thing is. That is, it's not explicitly set, +// so we're going to make it whatever the thing already +// is, or "File" +// +// Until then, collect all events. + +module.exports = ProxyWriter + +var Writer = require("./writer.js") + , getType = require("./get-type.js") + , inherits = require("inherits") + , collect = require("./collect.js") + , fs = require("fs") + +inherits(ProxyWriter, Writer) + +function ProxyWriter (props) { + var me = this + if (!(me instanceof ProxyWriter)) throw new Error( + "ProxyWriter must be called as constructor.") + + me.props = props + me._needDrain = false + + Writer.call(me, props) +} + +ProxyWriter.prototype._stat = function () { + var me = this + , props = me.props + // stat the thing to see what the proxy should be. + , stat = props.follow ? "stat" : "lstat" + + fs[stat](props.path, function (er, current) { + var type + if (er || !current) { + type = "File" + } else { + type = getType(current) + } + + props[type] = true + props.type = me.type = type + + me._old = current + me._addProxy(Writer(props, current)) + }) +} + +ProxyWriter.prototype._addProxy = function (proxy) { + // console.error("~~ set proxy", this.path) + var me = this + if (me._proxy) { + return me.error("proxy already set") + } + + me._proxy = proxy + ; [ "ready" + , "error" + , "close" + , "pipe" + , "drain" + , "warn" + ].forEach(function (ev) { + proxy.on(ev, me.emit.bind(me, ev)) + }) + + me.emit("proxy", proxy) + + var calls = me._buffer + calls.forEach(function (c) { + // console.error("~~ ~~ proxy buffered call", c[0], c[1]) + proxy[c[0]].apply(proxy, c[1]) + }) + me._buffer.length = 0 + if (me._needsDrain) me.emit("drain") +} + +ProxyWriter.prototype.add = function (entry) { + // console.error("~~ proxy add") + collect(entry) + + if (!this._proxy) { + this._buffer.push(["add", [entry]]) + this._needDrain = true + return false + } + return this._proxy.add(entry) +} + +ProxyWriter.prototype.write = function (c) { + // console.error("~~ proxy write") + if (!this._proxy) { + this._buffer.push(["write", [c]]) + this._needDrain = true + return false + } + return this._proxy.write(c) +} + +ProxyWriter.prototype.end = function (c) { + // console.error("~~ proxy end") + if (!this._proxy) { + this._buffer.push(["end", [c]]) + return false + } + return this._proxy.end(c) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js new file mode 100644 index 0000000..0edb794 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js @@ -0,0 +1,262 @@ + +module.exports = Reader + +var fs = require("graceful-fs") + , Stream = require("stream").Stream + , inherits = require("inherits") + , path = require("path") + , getType = require("./get-type.js") + , hardLinks = Reader.hardLinks = {} + , Abstract = require("./abstract.js") + +// Must do this *before* loading the child classes +inherits(Reader, Abstract) + +var DirReader = require("./dir-reader.js") + , FileReader = require("./file-reader.js") + , LinkReader = require("./link-reader.js") + , SocketReader = require("./socket-reader.js") + , ProxyReader = require("./proxy-reader.js") + +function Reader (props, currentStat) { + var me = this + if (!(me instanceof Reader)) return new Reader(props, currentStat) + + if (typeof props === "string") { + props = { path: props } + } + + if (!props.path) { + me.error("Must provide a path", null, true) + } + + // polymorphism. + // call fstream.Reader(dir) to get a DirReader object, etc. + // Note that, unlike in the Writer case, ProxyReader is going + // to be the *normal* state of affairs, since we rarely know + // the type of a file prior to reading it. + + + var type + , ClassType + + if (props.type && typeof props.type === "function") { + type = props.type + ClassType = type + } else { + type = getType(props) + ClassType = Reader + } + + if (currentStat && !type) { + type = getType(currentStat) + props[type] = true + props.type = type + } + + switch (type) { + case "Directory": + ClassType = DirReader + break + + case "Link": + // XXX hard links are just files. + // However, it would be good to keep track of files' dev+inode + // and nlink values, and create a HardLinkReader that emits + // a linkpath value of the original copy, so that the tar + // writer can preserve them. + // ClassType = HardLinkReader + // break + + case "File": + ClassType = FileReader + break + + case "SymbolicLink": + ClassType = LinkReader + break + + case "Socket": + ClassType = SocketReader + break + + case null: + ClassType = ProxyReader + break + } + + if (!(me instanceof ClassType)) { + return new ClassType(props) + } + + Abstract.call(me) + + me.readable = true + me.writable = false + + me.type = type + me.props = props + me.depth = props.depth = props.depth || 0 + me.parent = props.parent || null + me.root = props.root || (props.parent && props.parent.root) || me + + me._path = me.path = path.resolve(props.path) + if (process.platform === "win32") { + me.path = me._path = me.path.replace(/\?/g, "_") + if (me._path.length >= 260) { + // how DOES one create files on the moon? + // if the path has spaces in it, then UNC will fail. + me._swallowErrors = true + //if (me._path.indexOf(" ") === -1) { + me._path = "\\\\?\\" + me.path.replace(/\//g, "\\") + //} + } + } + me.basename = props.basename = path.basename(me.path) + me.dirname = props.dirname = path.dirname(me.path) + + // these have served their purpose, and are now just noisy clutter + props.parent = props.root = null + + // console.error("\n\n\n%s setting size to", props.path, props.size) + me.size = props.size + me.filter = typeof props.filter === "function" ? props.filter : null + if (props.sort === "alpha") props.sort = alphasort + + // start the ball rolling. + // this will stat the thing, and then call me._read() + // to start reading whatever it is. + // console.error("calling stat", props.path, currentStat) + me._stat(currentStat) +} + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + +Reader.prototype._stat = function (currentStat) { + var me = this + , props = me.props + , stat = props.follow ? "stat" : "lstat" + // console.error("Reader._stat", me._path, currentStat) + if (currentStat) process.nextTick(statCb.bind(null, null, currentStat)) + else fs[stat](me._path, statCb) + + + function statCb (er, props_) { + // console.error("Reader._stat, statCb", me._path, props_, props_.nlink) + if (er) return me.error(er) + + Object.keys(props_).forEach(function (k) { + props[k] = props_[k] + }) + + // if it's not the expected size, then abort here. + if (undefined !== me.size && props.size !== me.size) { + return me.error("incorrect size") + } + me.size = props.size + + var type = getType(props) + var handleHardlinks = props.hardlinks !== false + + // special little thing for handling hardlinks. + if (handleHardlinks && type !== "Directory" && props.nlink && props.nlink > 1) { + var k = props.dev + ":" + props.ino + // console.error("Reader has nlink", me._path, k) + if (hardLinks[k] === me._path || !hardLinks[k]) hardLinks[k] = me._path + else { + // switch into hardlink mode. + type = me.type = me.props.type = "Link" + me.Link = me.props.Link = true + me.linkpath = me.props.linkpath = hardLinks[k] + // console.error("Hardlink detected, switching mode", me._path, me.linkpath) + // Setting __proto__ would arguably be the "correct" + // approach here, but that just seems too wrong. + me._stat = me._read = LinkReader.prototype._read + } + } + + if (me.type && me.type !== type) { + me.error("Unexpected type: " + type) + } + + // if the filter doesn't pass, then just skip over this one. + // still have to emit end so that dir-walking can move on. + if (me.filter) { + var who = me._proxy || me + // special handling for ProxyReaders + if (!me.filter.call(who, who, props)) { + if (!me._disowned) { + me.abort() + me.emit("end") + me.emit("close") + } + return + } + } + + // last chance to abort or disown before the flow starts! + var events = ["_stat", "stat", "ready"] + var e = 0 + ;(function go () { + if (me._aborted) { + me.emit("end") + me.emit("close") + return + } + + if (me._paused && me.type !== "Directory") { + me.once("resume", go) + return + } + + var ev = events[e ++] + if (!ev) { + return me._read() + } + me.emit(ev, props) + go() + })() + } +} + +Reader.prototype.pipe = function (dest, opts) { + var me = this + if (typeof dest.add === "function") { + // piping to a multi-compatible, and we've got directory entries. + me.on("entry", function (entry) { + var ret = dest.add(entry) + if (false === ret) { + me.pause() + } + }) + } + + // console.error("R Pipe apply Stream Pipe") + return Stream.prototype.pipe.apply(this, arguments) +} + +Reader.prototype.pause = function (who) { + this._paused = true + who = who || this + this.emit("pause", who) + if (this._stream) this._stream.pause(who) +} + +Reader.prototype.resume = function (who) { + this._paused = false + who = who || this + this.emit("resume", who) + if (this._stream) this._stream.resume(who) + this._read() +} + +Reader.prototype._read = function () { + this.error("Cannot read unknown type: "+this.type) +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js new file mode 100644 index 0000000..e89c173 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js @@ -0,0 +1,38 @@ +// Just get the stats, and then don't do anything. +// You can't really "read" from a socket. You "connect" to it. +// Mostly, this is here so that reading a dir with a socket in it +// doesn't blow up. + +module.exports = SocketReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , inherits = require("inherits") + , mkdir = require("mkdirp") + , Reader = require("./reader.js") + +inherits(SocketReader, Reader) + +function SocketReader (props) { + var me = this + if (!(me instanceof SocketReader)) throw new Error( + "SocketReader must be called as constructor.") + + if (!(props.type === "Socket" && props.Socket)) { + throw new Error("Non-socket type "+ props.type) + } + + Reader.call(me, props) +} + +SocketReader.prototype._read = function () { + var me = this + if (me._paused) return + // basically just a no-op, since we got all the info we have + // from the _stat method + if (!me._ended) { + me.emit("end") + me.emit("close") + me._ended = true + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js new file mode 100644 index 0000000..5599fb2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js @@ -0,0 +1,389 @@ + +module.exports = Writer + +var fs = require("graceful-fs") + , inherits = require("inherits") + , rimraf = require("rimraf") + , mkdir = require("mkdirp") + , path = require("path") + , umask = process.platform === "win32" ? 0 : process.umask() + , getType = require("./get-type.js") + , Abstract = require("./abstract.js") + +// Must do this *before* loading the child classes +inherits(Writer, Abstract) + +Writer.dirmode = 0777 & (~umask) +Writer.filemode = 0666 & (~umask) + +var DirWriter = require("./dir-writer.js") + , LinkWriter = require("./link-writer.js") + , FileWriter = require("./file-writer.js") + , ProxyWriter = require("./proxy-writer.js") + +// props is the desired state. current is optionally the current stat, +// provided here so that subclasses can avoid statting the target +// more than necessary. +function Writer (props, current) { + var me = this + + if (typeof props === "string") { + props = { path: props } + } + + if (!props.path) me.error("Must provide a path", null, true) + + // polymorphism. + // call fstream.Writer(dir) to get a DirWriter object, etc. + var type = getType(props) + , ClassType = Writer + + switch (type) { + case "Directory": + ClassType = DirWriter + break + case "File": + ClassType = FileWriter + break + case "Link": + case "SymbolicLink": + ClassType = LinkWriter + break + case null: + // Don't know yet what type to create, so we wrap in a proxy. + ClassType = ProxyWriter + break + } + + if (!(me instanceof ClassType)) return new ClassType(props) + + // now get down to business. + + Abstract.call(me) + + // props is what we want to set. + // set some convenience properties as well. + me.type = props.type + me.props = props + me.depth = props.depth || 0 + me.clobber = false === props.clobber ? props.clobber : true + me.parent = props.parent || null + me.root = props.root || (props.parent && props.parent.root) || me + + me._path = me.path = path.resolve(props.path) + if (process.platform === "win32") { + me.path = me._path = me.path.replace(/\?/g, "_") + if (me._path.length >= 260) { + me._swallowErrors = true + me._path = "\\\\?\\" + me.path.replace(/\//g, "\\") + } + } + me.basename = path.basename(props.path) + me.dirname = path.dirname(props.path) + me.linkpath = props.linkpath || null + + props.parent = props.root = null + + // console.error("\n\n\n%s setting size to", props.path, props.size) + me.size = props.size + + if (typeof props.mode === "string") { + props.mode = parseInt(props.mode, 8) + } + + me.readable = false + me.writable = true + + // buffer until ready, or while handling another entry + me._buffer = [] + me.ready = false + + me.filter = typeof props.filter === "function" ? props.filter: null + + // start the ball rolling. + // this checks what's there already, and then calls + // me._create() to call the impl-specific creation stuff. + me._stat(current) +} + +// Calling this means that it's something we can't create. +// Just assert that it's already there, otherwise raise a warning. +Writer.prototype._create = function () { + var me = this + fs[me.props.follow ? "stat" : "lstat"](me._path, function (er, current) { + if (er) { + return me.warn("Cannot create " + me._path + "\n" + + "Unsupported type: "+me.type, "ENOTSUP") + } + me._finish() + }) +} + +Writer.prototype._stat = function (current) { + var me = this + , props = me.props + , stat = props.follow ? "stat" : "lstat" + , who = me._proxy || me + + if (current) statCb(null, current) + else fs[stat](me._path, statCb) + + function statCb (er, current) { + if (me.filter && !me.filter.call(who, who, current)) { + me._aborted = true + me.emit("end") + me.emit("close") + return + } + + // if it's not there, great. We'll just create it. + // if it is there, then we'll need to change whatever differs + if (er || !current) { + return create(me) + } + + me._old = current + var currentType = getType(current) + + // if it's a type change, then we need to clobber or error. + // if it's not a type change, then let the impl take care of it. + if (currentType !== me.type) { + return rimraf(me._path, function (er) { + if (er) return me.error(er) + me._old = null + create(me) + }) + } + + // otherwise, just handle in the app-specific way + // this creates a fs.WriteStream, or mkdir's, or whatever + create(me) + } +} + +function create (me) { + // console.error("W create", me._path, Writer.dirmode) + + // XXX Need to clobber non-dirs that are in the way, + // unless { clobber: false } in the props. + mkdir(path.dirname(me._path), Writer.dirmode, function (er, made) { + // console.error("W created", path.dirname(me._path), er) + if (er) return me.error(er) + + // later on, we have to set the mode and owner for these + me._madeDir = made + return me._create() + }) +} + +function endChmod (me, want, current, path, cb) { + var wantMode = want.mode + , chmod = want.follow || me.type !== "SymbolicLink" + ? "chmod" : "lchmod" + + if (!fs[chmod]) return cb() + if (typeof wantMode !== "number") return cb() + + var curMode = current.mode & 0777 + wantMode = wantMode & 0777 + if (wantMode === curMode) return cb() + + fs[chmod](path, wantMode, 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 (typeof want.uid !== "number" && + typeof want.gid !== "number" ) return cb() + + if (current.uid === want.uid && + current.gid === want.gid) return cb() + + var chown = (me.props.follow || me.type !== "SymbolicLink") + ? "chown" : "lchown" + if (!fs[chown]) return cb() + + if (typeof want.uid !== "number") want.uid = current.uid + if (typeof want.gid !== "number") want.gid = current.gid + + fs[chown](path, want.uid, want.gid, cb) +} + +function endUtimes (me, want, current, path, cb) { + if (!fs.utimes || process.platform === "win32") return cb() + + var utimes = (want.follow || me.type !== "SymbolicLink") + ? "utimes" : "lutimes" + + if (utimes === "lutimes" && !fs[utimes]) { + utimes = "utimes" + } + + if (!fs[utimes]) return cb() + + var curA = current.atime + , curM = current.mtime + , meA = want.atime + , meM = want.mtime + + if (meA === undefined) meA = curA + if (meM === undefined) meM = curM + + if (!isDate(meA)) meA = new Date(meA) + if (!isDate(meM)) meA = new Date(meM) + + if (meA.getTime() === curA.getTime() && + meM.getTime() === curM.getTime()) return cb() + + fs[utimes](path, meA, meM, cb) +} + + +// XXX This function is beastly. Break it up! +Writer.prototype._finish = function () { + var me = this + + // console.error(" W Finish", me._path, me.size) + + // set up all the things. + // At this point, we're already done writing whatever we've gotta write, + // adding files to the dir, etc. + var todo = 0 + var errState = null + var done = false + + if (me._old) { + // the times will almost *certainly* have changed. + // adds the utimes syscall, but remove another stat. + me._old.atime = new Date(0) + me._old.mtime = new Date(0) + // console.error(" W Finish Stale Stat", me._path, me.size) + setProps(me._old) + } else { + var stat = me.props.follow ? "stat" : "lstat" + // console.error(" W Finish Stating", me._path, me.size) + fs[stat](me._path, function (er, current) { + // console.error(" W Finish Stated", me._path, me.size, current) + if (er) { + // if we're in the process of writing out a + // directory, it's very possible that the thing we're linking to + // doesn't exist yet (especially if it was intended as a symlink), + // so swallow ENOENT errors here and just soldier on. + if (er.code === "ENOENT" && + (me.type === "Link" || me.type === "SymbolicLink") && + process.platform === "win32") { + me.ready = true + me.emit("ready") + me.emit("end") + me.emit("close") + me.end = me._finish = function () {} + return + } else return me.error(er) + } + setProps(me._old = current) + }) + } + + return + + function setProps (current) { + todo += 3 + endChmod(me, me.props, current, me._path, next("chmod")) + endChown(me, me.props, current, me._path, next("chown")) + endUtimes(me, me.props, current, me._path, next("utimes")) + } + + function next (what) { + return function (er) { + // console.error(" W Finish", what, todo) + if (errState) return + if (er) { + er.fstream_finish_call = what + return me.error(errState = er) + } + if (--todo > 0) return + if (done) return + done = true + + // we may still need to set the mode/etc. on some parent dirs + // that were created previously. delay end/close until then. + if (!me._madeDir) return end() + else endMadeDir(me, me._path, end) + + function end (er) { + if (er) { + er.fstream_finish_call = "setupMadeDir" + return me.error(er) + } + // all the props have been set, so we're completely done. + me.emit("end") + me.emit("close") + } + } + } +} + +function endMadeDir (me, p, cb) { + var made = me._madeDir + // everything *between* made and path.dirname(me._path) + // needs to be set up. Note that this may just be one dir. + var d = path.dirname(p) + + endMadeDir_(me, d, function (er) { + if (er) return cb(er) + if (d === made) { + return cb() + } + endMadeDir(me, d, cb) + }) +} + +function endMadeDir_ (me, p, cb) { + var dirProps = {} + Object.keys(me.props).forEach(function (k) { + dirProps[k] = me.props[k] + + // only make non-readable dirs if explicitly requested. + if (k === "mode" && me.type !== "Directory") { + dirProps[k] = dirProps[k] | 0111 + } + }) + + var todo = 3 + , errState = null + fs.stat(p, function (er, current) { + if (er) return cb(errState = er) + endChmod(me, dirProps, current, p, next) + endChown(me, dirProps, current, p, next) + endUtimes(me, dirProps, current, p, next) + }) + + function next (er) { + if (errState) return + if (er) return cb(errState = er) + if (-- todo === 0) return cb() + } +} + +Writer.prototype.pipe = function () { + this.error("Can't pipe from writable stream") +} + +Writer.prototype.add = function () { + this.error("Cannot add to non-Directory type") +} + +Writer.prototype.write = function () { + return true +} + +function objectToString (d) { + return Object.prototype.toString.call(d) +} + +function isDate(d) { + return typeof d === 'object' && objectToString(d) === '[object Date]'; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/.npmignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md new file mode 100644 index 0000000..13a2e86 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md @@ -0,0 +1,36 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over [fs module](http://api.nodejs.org/fs.html) + +graceful-fs: + +* Queues up `open` and `readdir` calls, and retries them once + something closes if there is an EMFILE error from too many file + descriptors. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. + +## USAGE + +```javascript +// use just like fs +var fs = require('graceful-fs') + +// now go and do stuff with it... +fs.readFileSync('some-file-or-whatever') +``` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js new file mode 100644 index 0000000..ae9fd6f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js @@ -0,0 +1,11 @@ +// eeeeeevvvvviiiiiiillllll +// more evil than monkey-patching the native builtin? +// Not sure. + +var mod = require("module") +var pre = '(function (exports, require, module, __filename, __dirname) { ' +var post = '});' +var src = pre + process.binding('natives').fs + post +var vm = require('vm') +var fn = vm.runInThisContext(src) +return fn(exports, require, module, __filename, __dirname) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 0000000..77fc702 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,158 @@ +// Monkey-patching the fs module. +// It's ugly, but there is simply no other way to do this. +var fs = module.exports = require('./fs.js') + +var assert = require('assert') + +// fix up some busted stuff, mostly on windows and old nodes +require('./polyfills.js') + +var util = require('util') + +function noop () {} + +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs') +else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS: ' + m.split(/\n/).join('\nGFS: ') + console.error(m) + } + +if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug('fds', fds) + debug(queue) + assert.equal(queue.length, 0) + }) +} + + +var originalOpen = fs.open +fs.open = open + +function open(path, flags, mode, cb) { + if (typeof mode === "function") cb = mode, mode = null + if (typeof cb !== "function") cb = noop + new OpenReq(path, flags, mode, cb) +} + +function OpenReq(path, flags, mode, cb) { + this.path = path + this.flags = flags + this.mode = mode + this.cb = cb + Req.call(this) +} + +util.inherits(OpenReq, Req) + +OpenReq.prototype.process = function() { + originalOpen.call(fs, this.path, this.flags, this.mode, this.done) +} + +var fds = {} +OpenReq.prototype.done = function(er, fd) { + debug('open done', er, fd) + if (fd) + fds['fd' + fd] = this.path + Req.prototype.done.call(this, er, fd) +} + + +var originalReaddir = fs.readdir +fs.readdir = readdir + +function readdir(path, cb) { + if (typeof cb !== "function") cb = noop + new ReaddirReq(path, cb) +} + +function ReaddirReq(path, cb) { + this.path = path + this.cb = cb + Req.call(this) +} + +util.inherits(ReaddirReq, Req) + +ReaddirReq.prototype.process = function() { + originalReaddir.call(fs, this.path, this.done) +} + +ReaddirReq.prototype.done = function(er, files) { + if (files && files.sort) + files = files.sort() + Req.prototype.done.call(this, er, files) + onclose() +} + + +var originalClose = fs.close +fs.close = close + +function close (fd, cb) { + debug('close', fd) + if (typeof cb !== "function") cb = noop + delete fds['fd' + fd] + originalClose.call(fs, fd, function(er) { + onclose() + cb(er) + }) +} + + +var originalCloseSync = fs.closeSync +fs.closeSync = closeSync + +function closeSync (fd) { + try { + return originalCloseSync(fd) + } finally { + onclose() + } +} + + +// Req class +function Req () { + // start processing + this.done = this.done.bind(this) + this.failures = 0 + this.process() +} + +Req.prototype.done = function (er, result) { + var tryAgain = false + if (er) { + var code = er.code + var tryAgain = code === "EMFILE" + if (process.platform === "win32") + tryAgain = tryAgain || code === "OK" + } + + if (tryAgain) { + this.failures ++ + enqueue(this) + } else { + var cb = this.cb + cb(er, result) + } +} + +var queue = [] + +function enqueue(req) { + queue.push(req) + debug('enqueue %d %s', queue.length, req.constructor.name, req) +} + +function onclose() { + var req = queue.shift() + if (req) { + debug('process', req.constructor.name, req) + req.process() + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json new file mode 100644 index 0000000..2e61b24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json @@ -0,0 +1,66 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "3.0.2", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "BSD", + "gitHead": "0caa11544c0c9001db78bf593cf0c5805d149a41", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "homepage": "https://github.com/isaacs/node-graceful-fs", + "_id": "graceful-fs@3.0.2", + "_shasum": "2cb5bf7f742bea8ad47c754caeee032b7e71a577", + "_from": "graceful-fs@~3.0.2", + "_npmVersion": "1.4.14", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "2cb5bf7f742bea8ad47c754caeee032b7e71a577", + "tarball": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz" + }, + "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js new file mode 100644 index 0000000..9d62af5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js @@ -0,0 +1,255 @@ +var fs = require('./fs.js') +var constants = require('constants') + +var origCwd = process.cwd +var cwd = null +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} + +// (re-)implement some things that are known busted or missing. + +// lchmod, broken prior to 0.6.2 +// back-port the fix here. +if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + fs.lchmod = function (path, mode, callback) { + callback = callback || noop + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var err, err2 + try { + var ret = fs.fchmodSync(fd, mode) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } +} + + +// lutimes implementation, or no-op +if (!fs.lutimes) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + cb = cb || noop + if (er) return cb(er) + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + return cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + , err + , err2 + , ret + + try { + var ret = fs.futimesSync(fd, at, mt) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } + + } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { + // maybe utimensat will be bound soonish? + fs.lutimes = function (path, at, mt, cb) { + fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) + } + + fs.lutimesSync = function (path, at, mt) { + return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + + +// https://github.com/isaacs/node-graceful-fs/issues/4 +// Chown should not fail on einval or eperm if non-root. +// It should not fail on enosys ever, as this just indicates +// that a fs doesn't support the intended operation. + +fs.chown = chownFix(fs.chown) +fs.fchown = chownFix(fs.fchown) +fs.lchown = chownFix(fs.lchown) + +fs.chmod = chownFix(fs.chmod) +fs.fchmod = chownFix(fs.fchmod) +fs.lchmod = chownFix(fs.lchmod) + +fs.chownSync = chownFixSync(fs.chownSync) +fs.fchownSync = chownFixSync(fs.fchownSync) +fs.lchownSync = chownFixSync(fs.lchownSync) + +fs.chmodSync = chownFix(fs.chmodSync) +fs.fchmodSync = chownFix(fs.fchmodSync) +fs.lchmodSync = chownFix(fs.lchmodSync) + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er, res) { + if (chownErOk(er)) er = null + cb(er, res) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true + + if (er.code === "ENOSYS") + return true + + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false +} + + +// if lchmod/lchown do not exist, then make them no-ops +if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + process.nextTick(cb) + } + fs.lchmodSync = function () {} +} +if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + process.nextTick(cb) + } + fs.lchownSync = function () {} +} + + + +// on Windows, A/V software can lock the directory, causing this +// to fail with an EACCES or EPERM if the directory contains newly +// created files. Try again on failure, for up to 1 second. +if (process.platform === "win32") { + var rename_ = fs.rename + fs.rename = function rename (from, to, cb) { + var start = Date.now() + rename_(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return rename_(from, to, CB) + } + cb(er) + }) + } +} + + +// if read() returns EAGAIN, then just try it again. +var read = fs.read +fs.read = function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return read.call(fs, fd, buffer, offset, length, position, callback) +} + +var readSync = fs.readSync +fs.readSync = function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/open.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/open.js new file mode 100644 index 0000000..85732f2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/open.js @@ -0,0 +1,39 @@ +var test = require('tap').test +var fs = require('../graceful-fs.js') + +test('graceful fs is monkeypatched fs', function (t) { + t.equal(fs, require('../fs.js')) + t.end() +}) + +test('open an existing file works', function (t) { + var fd = fs.openSync(__filename, 'r') + fs.closeSync(fd) + fs.open(__filename, 'r', function (er, fd) { + if (er) throw er + fs.close(fd, function (er) { + if (er) throw er + t.pass('works') + t.end() + }) + }) +}) + +test('open a non-existing file throws', function (t) { + var er + try { + var fd = fs.openSync('this file does not exist', 'r') + } catch (x) { + er = x + } + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + + fs.open('neither does this file', 'r', function (er, fd) { + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js new file mode 100644 index 0000000..fe005aa --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js @@ -0,0 +1,21 @@ +var test = require("tap").test +var fs = require("../fs.js") + +var readdir = fs.readdir +fs.readdir = function(path, cb) { + process.nextTick(function() { + cb(null, ["b", "z", "a"]) + }) +} + +var g = require("../") + +test("readdir reorder", function (t) { + g.readdir("whatevers", function (er, files) { + if (er) + throw er + console.error(files) + t.same(files, [ "a", "b", "z" ]) + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json new file mode 100644 index 0000000..837558d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json @@ -0,0 +1,51 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "_id": "inherits@2.0.1", + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@~2.0.0", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json new file mode 100644 index 0000000..29622a3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json @@ -0,0 +1,57 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "fstream", + "description": "Advanced file system stream things", + "version": "0.1.31", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/fstream.git" + }, + "main": "fstream.js", + "engines": { + "node": ">=0.6" + }, + "dependencies": { + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" + }, + "devDependencies": { + "tap": "" + }, + "scripts": { + "test": "tap examples/*.js" + }, + "license": "BSD", + "gitHead": "3512b3d41b4c9b3ef15cf32a04e06b297f3dd6a4", + "bugs": { + "url": "https://github.com/isaacs/fstream/issues" + }, + "homepage": "https://github.com/isaacs/fstream", + "_id": "fstream@0.1.31", + "_shasum": "7337f058fbbbbefa8c9f561a28cab0849202c988", + "_from": "fstream@~0.1.22", + "_npmVersion": "2.0.0-alpha-5", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "7337f058fbbbbefa8c9f561a28cab0849202c988", + "tarball": "http://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/.npmignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/README.md new file mode 100644 index 0000000..01af3d6 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/README.md @@ -0,0 +1,33 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over fs module + +graceful-fs: + +* keeps track of how many file descriptors are open, and by default + limits this to 1024. Any further requests to open a file are put in a + queue until new slots become available. If 1024 turns out to be too + much, it decreases the limit further. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. + +## Configuration + +The maximum number of open file descriptors that graceful-fs manages may +be adjusted by setting `fs.MAX_OPEN` to a different number. The default +is 1024. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/graceful-fs.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 0000000..ca91152 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,442 @@ +// this keeps a queue of opened file descriptors, and will make +// fs operations wait until some have closed before trying to open more. + +var fs = exports = module.exports = {} +fs._originalFs = require("fs") + +Object.getOwnPropertyNames(fs._originalFs).forEach(function(prop) { + var desc = Object.getOwnPropertyDescriptor(fs._originalFs, prop) + Object.defineProperty(fs, prop, desc) +}) + +var queue = [] + , constants = require("constants") + +fs._curOpen = 0 + +fs.MIN_MAX_OPEN = 64 +fs.MAX_OPEN = 1024 + +// prevent EMFILE errors +function OpenReq (path, flags, mode, cb) { + this.path = path + this.flags = flags + this.mode = mode + this.cb = cb +} + +function noop () {} + +fs.open = gracefulOpen + +function gracefulOpen (path, flags, mode, cb) { + if (typeof mode === "function") cb = mode, mode = null + if (typeof cb !== "function") cb = noop + + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new OpenReq(path, flags, mode, cb)) + setTimeout(flush) + return + } + open(path, flags, mode, function (er, fd) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + // that was too many. reduce max, get back in queue. + // this should only happen once in a great while, and only + // if the ulimit -n is set lower than 1024. + fs.MAX_OPEN = fs._curOpen - 1 + return fs.open(path, flags, mode, cb) + } + cb(er, fd) + }) +} + +function open (path, flags, mode, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.open.call(fs, path, flags, mode, function (er, fd) { + if (er) onclose() + cb(er, fd) + }) +} + +fs.openSync = function (path, flags, mode) { + var ret + ret = fs._originalFs.openSync.call(fs, path, flags, mode) + fs._curOpen ++ + return ret +} + +function onclose () { + fs._curOpen -- + flush() +} + +function flush () { + while (fs._curOpen < fs.MAX_OPEN) { + var req = queue.shift() + if (!req) return + switch (req.constructor.name) { + case 'OpenReq': + open(req.path, req.flags || "r", req.mode || 0777, req.cb) + break + case 'ReaddirReq': + readdir(req.path, req.cb) + break + case 'ReadFileReq': + readFile(req.path, req.options, req.cb) + break + case 'WriteFileReq': + writeFile(req.path, req.data, req.options, req.cb) + break + default: + throw new Error('Unknown req type: ' + req.constructor.name) + } + } +} + +fs.close = function (fd, cb) { + cb = cb || noop + fs._originalFs.close.call(fs, fd, function (er) { + onclose() + cb(er) + }) +} + +fs.closeSync = function (fd) { + try { + return fs._originalFs.closeSync.call(fs, fd) + } finally { + onclose() + } +} + + +// readdir takes a fd as well. +// however, the sync version closes it right away, so +// there's no need to wrap. +// It would be nice to catch when it throws an EMFILE, +// but that's relatively rare anyway. + +fs.readdir = gracefulReaddir + +function gracefulReaddir (path, cb) { + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new ReaddirReq(path, cb)) + setTimeout(flush) + return + } + + readdir(path, function (er, files) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + fs.MAX_OPEN = fs._curOpen - 1 + return fs.readdir(path, cb) + } + cb(er, files) + }) +} + +function readdir (path, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.readdir.call(fs, path, function (er, files) { + onclose() + cb(er, files) + }) +} + +function ReaddirReq (path, cb) { + this.path = path + this.cb = cb +} + + +fs.readFile = gracefulReadFile + +function gracefulReadFile(path, options, cb) { + if (typeof options === "function") cb = options, options = null + if (typeof cb !== "function") cb = noop + + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new ReadFileReq(path, options, cb)) + setTimeout(flush) + return + } + + readFile(path, options, function (er, data) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + fs.MAX_OPEN = fs._curOpen - 1 + return fs.readFile(path, options, cb) + } + cb(er, data) + }) +} + +function readFile (path, options, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.readFile.call(fs, path, options, function (er, data) { + onclose() + cb(er, data) + }) +} + +function ReadFileReq (path, options, cb) { + this.path = path + this.options = options + this.cb = cb +} + + + + +fs.writeFile = gracefulWriteFile + +function gracefulWriteFile(path, data, options, cb) { + if (typeof options === "function") cb = options, options = null + if (typeof cb !== "function") cb = noop + + if (fs._curOpen >= fs.MAX_OPEN) { + queue.push(new WriteFileReq(path, data, options, cb)) + setTimeout(flush) + return + } + + writeFile(path, data, options, function (er) { + if (er && er.code === "EMFILE" && fs._curOpen > fs.MIN_MAX_OPEN) { + fs.MAX_OPEN = fs._curOpen - 1 + return fs.writeFile(path, data, options, cb) + } + cb(er) + }) +} + +function writeFile (path, data, options, cb) { + cb = cb || noop + fs._curOpen ++ + fs._originalFs.writeFile.call(fs, path, data, options, function (er) { + onclose() + cb(er) + }) +} + +function WriteFileReq (path, data, options, cb) { + this.path = path + this.data = data + this.options = options + this.cb = cb +} + + +// (re-)implement some things that are known busted or missing. + +var constants = require("constants") + +// lchmod, broken prior to 0.6.2 +// back-port the fix here. +if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + fs.lchmod = function (path, mode, callback) { + callback = callback || noop + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var err, err2 + try { + var ret = fs.fchmodSync(fd, mode) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } +} + + +// lutimes implementation, or no-op +if (!fs.lutimes) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + cb = cb || noop + if (er) return cb(er) + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + return cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + , err + , err2 + , ret + + try { + var ret = fs.futimesSync(fd, at, mt) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } + + } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { + // maybe utimensat will be bound soonish? + fs.lutimes = function (path, at, mt, cb) { + fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) + } + + fs.lutimesSync = function (path, at, mt) { + return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + + +// https://github.com/isaacs/node-graceful-fs/issues/4 +// Chown should not fail on einval or eperm if non-root. + +fs.chown = chownFix(fs.chown) +fs.fchown = chownFix(fs.fchown) +fs.lchown = chownFix(fs.lchown) + +fs.chownSync = chownFixSync(fs.chownSync) +fs.fchownSync = chownFixSync(fs.fchownSync) +fs.lchownSync = chownFixSync(fs.lchownSync) + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er, res) { + if (chownErOk(er)) er = null + cb(er, res) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + +function chownErOk (er) { + // if there's no getuid, or if getuid() is something other than 0, + // and the error is EINVAL or EPERM, then just ignore it. + // This specific case is a silent failure in cp, install, tar, + // and most other unix tools that manage permissions. + // When running as root, or if other types of errors are encountered, + // then it's strict. + if (!er || (!process.getuid || process.getuid() !== 0) + && (er.code === "EINVAL" || er.code === "EPERM")) return true +} + + +// if lchmod/lchown do not exist, then make them no-ops +if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + process.nextTick(cb) + } + fs.lchmodSync = function () {} +} +if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + process.nextTick(cb) + } + fs.lchownSync = function () {} +} + + + +// on Windows, A/V software can lock the directory, causing this +// to fail with an EACCES or EPERM if the directory contains newly +// created files. Try again on failure, for up to 1 second. +if (process.platform === "win32") { + var rename_ = fs.rename + fs.rename = function rename (from, to, cb) { + var start = Date.now() + rename_(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return rename_(from, to, CB) + } + cb(er) + }) + } +} + + +// if read() returns EAGAIN, then just try it again. +var read = fs.read +fs.read = function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return read.call(fs, fd, buffer, offset, length, position, callback) +} + +var readSync = fs.readSync +fs.readSync = function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/package.json new file mode 100644 index 0000000..53646ed --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/package.json @@ -0,0 +1,63 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "1.2.3", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "BSD", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "_id": "graceful-fs@1.2.3", + "dist": { + "shasum": "15a4806a57547cb2d2dbf27f42e89a8c3451b364", + "tarball": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "_from": "graceful-fs@1.2", + "_npmVersion": "1.3.2", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_shasum": "15a4806a57547cb2d2dbf27f42e89a8c3451b364", + "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/open.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/open.js new file mode 100644 index 0000000..930d532 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/open.js @@ -0,0 +1,46 @@ +var test = require('tap').test +var fs = require('../graceful-fs.js') + +test('graceful fs is not fs', function (t) { + t.notEqual(fs, require('fs')) + t.end() +}) + +test('open an existing file works', function (t) { + var start = fs._curOpen + var fd = fs.openSync(__filename, 'r') + t.equal(fs._curOpen, start + 1) + fs.closeSync(fd) + t.equal(fs._curOpen, start) + fs.open(__filename, 'r', function (er, fd) { + if (er) throw er + t.equal(fs._curOpen, start + 1) + fs.close(fd, function (er) { + if (er) throw er + t.equal(fs._curOpen, start) + t.end() + }) + }) +}) + +test('open a non-existing file throws', function (t) { + var start = fs._curOpen + var er + try { + var fd = fs.openSync('this file does not exist', 'r') + } catch (x) { + er = x + } + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.equal(fs._curOpen, start) + + fs.open('neither does this file', 'r', function (er, fd) { + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.equal(fs._curOpen, start) + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/ulimit.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/ulimit.js new file mode 100644 index 0000000..8d0882d --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/graceful-fs/test/ulimit.js @@ -0,0 +1,158 @@ +var test = require('tap').test + +// simulated ulimit +// this is like graceful-fs, but in reverse +var fs_ = require('fs') +var fs = require('../graceful-fs.js') +var files = fs.readdirSync(__dirname) + +// Ok, no more actual file reading! + +var fds = 0 +var nextFd = 60 +var limit = 8 +fs_.open = function (path, flags, mode, cb) { + process.nextTick(function() { + ++fds + if (fds >= limit) { + --fds + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + return cb(er) + } else { + cb(null, nextFd++) + } + }) +} + +fs_.openSync = function (path, flags, mode) { + if (fds >= limit) { + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + throw er + } else { + ++fds + return nextFd++ + } +} + +fs_.close = function (fd, cb) { + process.nextTick(function () { + --fds + cb() + }) +} + +fs_.closeSync = function (fd) { + --fds +} + +fs_.readdir = function (path, cb) { + process.nextTick(function() { + if (fds >= limit) { + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + return cb(er) + } else { + ++fds + process.nextTick(function () { + --fds + cb(null, [__filename, "some-other-file.js"]) + }) + } + }) +} + +fs_.readdirSync = function (path) { + if (fds >= limit) { + var er = new Error('EMFILE Curses!') + er.code = 'EMFILE' + er.path = path + throw er + } else { + return [__filename, "some-other-file.js"] + } +} + + +test('open emfile autoreduce', function (t) { + fs.MIN_MAX_OPEN = 4 + t.equal(fs.MAX_OPEN, 1024) + + var max = 12 + for (var i = 0; i < max; i++) { + fs.open(__filename, 'r', next(i)) + } + + var phase = 0 + + var expect = + [ [ 0, 60, null, 1024, 4, 12, 1 ], + [ 1, 61, null, 1024, 4, 12, 2 ], + [ 2, 62, null, 1024, 4, 12, 3 ], + [ 3, 63, null, 1024, 4, 12, 4 ], + [ 4, 64, null, 1024, 4, 12, 5 ], + [ 5, 65, null, 1024, 4, 12, 6 ], + [ 6, 66, null, 1024, 4, 12, 7 ], + [ 7, 67, null, 6, 4, 5, 1 ], + [ 8, 68, null, 6, 4, 5, 2 ], + [ 9, 69, null, 6, 4, 5, 3 ], + [ 10, 70, null, 6, 4, 5, 4 ], + [ 11, 71, null, 6, 4, 5, 5 ] ] + + var actual = [] + + function next (i) { return function (er, fd) { + if (er) + throw er + actual.push([i, fd, er, fs.MAX_OPEN, fs.MIN_MAX_OPEN, fs._curOpen, fds]) + + if (i === max - 1) { + t.same(actual, expect) + t.ok(fs.MAX_OPEN < limit) + t.end() + } + + fs.close(fd) + } } +}) + +test('readdir emfile autoreduce', function (t) { + fs.MAX_OPEN = 1024 + var max = 12 + for (var i = 0; i < max; i ++) { + fs.readdir(__dirname, next(i)) + } + + var expect = + [ [0,[__filename,"some-other-file.js"],null,7,4,7,7], + [1,[__filename,"some-other-file.js"],null,7,4,7,6], + [2,[__filename,"some-other-file.js"],null,7,4,7,5], + [3,[__filename,"some-other-file.js"],null,7,4,7,4], + [4,[__filename,"some-other-file.js"],null,7,4,7,3], + [5,[__filename,"some-other-file.js"],null,7,4,6,2], + [6,[__filename,"some-other-file.js"],null,7,4,5,1], + [7,[__filename,"some-other-file.js"],null,7,4,4,0], + [8,[__filename,"some-other-file.js"],null,7,4,3,3], + [9,[__filename,"some-other-file.js"],null,7,4,2,2], + [10,[__filename,"some-other-file.js"],null,7,4,1,1], + [11,[__filename,"some-other-file.js"],null,7,4,0,0] ] + + var actual = [] + + function next (i) { return function (er, files) { + if (er) + throw er + var line = [i, files, er, fs.MAX_OPEN, fs.MIN_MAX_OPEN, fs._curOpen, fds ] + actual.push(line) + + if (i === max - 1) { + t.ok(fs.MAX_OPEN < limit) + t.same(actual, expect) + t.end() + } + } } +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md new file mode 100644 index 0000000..e833b83 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md @@ -0,0 +1,33 @@ +# once + +Only call a function once. + +## usage + +```javascript +var once = require('once') + +function load (file, cb) { + cb = once(cb) + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Or add to the Function.prototype in a responsible way: + +```javascript +// only has to be done once +require('once').proto() + +function load (file, cb) { + cb = cb.once() + loader.load('file') + loader.once('load', cb) + loader.once('error', cb) +} +``` + +Ironically, the prototype feature makes this module twice as +complicated as necessary. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js new file mode 100644 index 0000000..effc50a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js @@ -0,0 +1,19 @@ +module.exports = once + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) +}) + +function once (fn) { + var called = false + return function () { + if (called) return + called = true + return fn.apply(this, arguments) + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json new file mode 100644 index 0000000..a043fc0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json @@ -0,0 +1,56 @@ +{ + "name": "once", + "version": "1.1.1", + "description": "Run a function exactly one time", + "main": "once.js", + "directories": { + "test": "test" + }, + "dependencies": {}, + "devDependencies": { + "tap": "~0.3.0" + }, + "scripts": { + "test": "tap test/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/once" + }, + "keywords": [ + "once", + "function", + "one", + "single" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "BSD", + "readme": "# once\n\nOnly call a function once.\n\n## usage\n\n```javascript\nvar once = require('once')\n\nfunction load (file, cb) {\n cb = once(cb)\n loader.load('file')\n loader.once('load', cb)\n loader.once('error', cb)\n}\n```\n\nOr add to the Function.prototype in a responsible way:\n\n```javascript\n// only has to be done once\nrequire('once').proto()\n\nfunction load (file, cb) {\n cb = cb.once()\n loader.load('file')\n loader.once('load', cb)\n loader.once('error', cb)\n}\n```\n\nIronically, the prototype feature makes this module twice as\ncomplicated as necessary.\n", + "_id": "once@1.1.1", + "dist": { + "shasum": "9db574933ccb08c3a7614d154032c09ea6f339e7", + "tarball": "http://registry.npmjs.org/once/-/once-1.1.1.tgz" + }, + "_npmVersion": "1.1.48", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_shasum": "9db574933ccb08c3a7614d154032c09ea6f339e7", + "_from": "once@~1.1.1", + "_resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz", + "bugs": { + "url": "https://github.com/isaacs/once/issues" + }, + "homepage": "https://github.com/isaacs/once" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/test/once.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/test/once.js new file mode 100644 index 0000000..f0291a4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/test/once.js @@ -0,0 +1,18 @@ +var test = require('tap').test +var once = require('../once.js') + +test('once', function (t) { + var f = 0 + var foo = once(function (g) { + t.equal(f, 0) + f ++ + return f + g + this + }) + for (var i = 0; i < 1E3; i++) { + t.same(f, i === 0 ? 0 : 1) + var g = foo.call(1, 1) + t.same(g, i === 0 ? 3 : undefined) + t.same(f, 1) + } + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore new file mode 100644 index 0000000..38344f8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore @@ -0,0 +1,5 @@ +build/ +test/ +examples/ +fs.js +zlib.js \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md new file mode 100644 index 0000000..34c1189 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md @@ -0,0 +1,15 @@ +# readable-stream + +***Node-core streams for userland*** + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png)](https://nodei.co/npm/readable-stream/) + +This package is a mirror of the Streams2 and Streams3 implementations in Node-core. + +If you want to guarantee a stable streams base, regardless of what version of Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core. + +**readable-stream** comes in two major versions, v1.0.x and v1.1.x. The former tracks the Streams2 implementation in Node 0.10, including bug-fixes and minor improvements as they are added. The latter tracks Streams3 as it develops in Node 0.11; we will likely see a v1.2.x branch for Node 0.12. + +**readable-stream** uses proper patch-level versioning so if you pin to `"~1.0.0"` you’ll get the latest Node 0.10 Streams2 implementation, including any fixes and minor non-breaking improvements. The patch-level versions of 1.0.x and 1.1.x should mirror the patch-level versions of Node-core releases. You should prefer the **1.0.x** releases for now and when you’re ready to start using Streams3, pin to `"~1.1.0"` + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js new file mode 100644 index 0000000..ca807af --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_duplex.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 0000000..b513d61 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,89 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +module.exports = Duplex; + +/**/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} +/**/ + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +forEach(objectKeys(Writable.prototype), function(method) { + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; +}); + +function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) + return; + + // no more data can be written. + // But allow more writes to happen in this tick. + process.nextTick(this.end.bind(this)); +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 0000000..895ca50 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,46 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) + return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 0000000..6307220 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,982 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Readable; + +/**/ +var isArray = require('isarray'); +/**/ + + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Readable.ReadableState = ReadableState; + +var EE = require('events').EventEmitter; + +/**/ +if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { + return emitter.listeners(type).length; +}; +/**/ + +var Stream = require('stream'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var StringDecoder; + +util.inherits(Readable, Stream); + +function ReadableState(options, stream) { + options = options || {}; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = false; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // In streams that never have any data, and do push(null) right away, + // the consumer can miss the 'end' event if they do some I/O before + // consuming the stream. So, we don't emit('end') until some reading + // happens. + this.calledRead = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, becuase any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + if (!(this instanceof Readable)) + return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + + if (typeof chunk === 'string' && !state.objectMode) { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null || chunk === undefined) { + state.reading = false; + if (!state.ended) + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) { + state.buffer.unshift(chunk); + } else { + state.reading = false; + state.buffer.push(chunk); + } + + if (state.needReadable) + emitReadable(stream); + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + + + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; +}; + +// Don't raise the hwm > 128MB +var MAX_HWM = 0x800000; +function roundUpToNextPowerOf2(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + for (var p = 1; p < 32; p <<= 1) n |= n >> p; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + + if (state.objectMode) + return n === 0 ? 0 : 1; + + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + + if (n <= 0) + return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) + state.highWaterMark = roundUpToNextPowerOf2(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else + return state.length; + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function(n) { + var state = this._readableState; + state.calledRead = true; + var nOrig = n; + var ret; + + if (typeof n !== 'number' || n > 0) + state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended)) { + emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + ret = null; + + // In cases where the decoder did not receive enough data + // to produce a full chunk, then immediately received an + // EOF, state.buffer will contain [, ]. + // howMuchToRead will see this and coerce the amount to + // read to zero (because it's looking at the length of the + // first in state.buffer), and we'll end up here. + // + // This can only happen via state.decoder -- no other venue + // exists for pushing a zero-length chunk into state.buffer + // and triggering this behavior. In this case, we return our + // remaining data and end the stream, if appropriate. + if (state.length > 0 && state.decoder) { + ret = fromList(n, state); + state.length -= ret.length; + } + + if (state.length === 0) + endReadable(this); + + return ret; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + + // if we currently have less than the highWaterMark, then also read some + if (state.length - n <= state.highWaterMark) + doRead = true; + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) + doRead = false; + + if (doRead) { + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read called its callback synchronously, then `reading` + // will be false, and we need to re-evaluate how much data we + // can return to the user. + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + + if (n > 0) + ret = fromList(n, state); + else + ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + + // If we happened to read() exactly the remaining amount in the + // buffer, and the EOF has been seen at this point, then make sure + // that we emit 'end' on the very next tick. + if (state.ended && !state.endEmitted && state.length === 0) + endReadable(this); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && + 'string' !== typeof chunk && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + + +function onEofChunk(stream, state) { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // if we've ended and we have some data left, then emit + // 'readable' now to make sure it gets picked up. + if (state.length > 0) + emitReadable(stream); + else + endReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (state.emittedReadable) + return; + + state.emittedReadable = true; + if (state.sync) + process.nextTick(function() { + emitReadable_(stream); + }); + else + emitReadable_(stream); +} + +function emitReadable_(stream) { + stream.emit('readable'); +} + + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(function() { + maybeReadMore_(stream, state); + }); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && + state.length < state.highWaterMark) { + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else + len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function(n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + process.nextTick(endFn); + else + src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + if (readable !== src) return; + cleanup(); + } + + function onend() { + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + function cleanup() { + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (!dest._writableState || dest._writableState.needDrain) + ondrain(); + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + unpipe(); + dest.removeListener('error', onerror); + if (EE.listenerCount(dest, 'error') === 0) + dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) + dest.on('error', onerror); + else if (isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + + + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + // the handler that waits for readable events after all + // the data gets sucked out in flow. + // This would be easier to follow with a .once() handler + // in flow(), but that is too slow. + this.on('readable', pipeOnReadable); + + state.flowing = true; + process.nextTick(function() { + flow(src); + }); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function() { + var dest = this; + var state = src._readableState; + state.awaitDrain--; + if (state.awaitDrain === 0) + flow(src); + }; +} + +function flow(src) { + var state = src._readableState; + var chunk; + state.awaitDrain = 0; + + function write(dest, i, list) { + var written = dest.write(chunk); + if (false === written) { + state.awaitDrain++; + } + } + + while (state.pipesCount && null !== (chunk = src.read())) { + + if (state.pipesCount === 1) + write(state.pipes, 0, null); + else + forEach(state.pipes, write); + + src.emit('data', chunk); + + // if anyone needs a drain, then we have to wait for that. + if (state.awaitDrain > 0) + return; + } + + // if every destination was unpiped, either before entering this + // function, or in the while loop, then stop flowing. + // + // NB: This is a pretty rare edge case. + if (state.pipesCount === 0) { + state.flowing = false; + + // if there were data event listeners added, then switch to old mode. + if (EE.listenerCount(src, 'data') > 0) + emitDataEvents(src); + return; + } + + // at this point, no one needed a drain, so we just ran out of data + // on the next readable event, start it over again. + state.ranOut = true; +} + +function pipeOnReadable() { + if (this._readableState.ranOut) { + this._readableState.ranOut = false; + flow(this); + } +} + + +Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) + return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) + return this; + + if (!dest) + dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + this.removeListener('readable', pipeOnReadable); + state.flowing = false; + if (dest) + dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + this.removeListener('readable', pipeOnReadable); + state.flowing = false; + + for (var i = 0; i < len; i++) + dests[i].emit('unpipe', this); + return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) + return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data' && !this._readableState.flowing) + emitDataEvents(this); + + if (ev === 'readable' && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + this.read(0); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function() { + emitDataEvents(this); + this.read(0); + this.emit('resume'); +}; + +Readable.prototype.pause = function() { + emitDataEvents(this, true); + this.emit('pause'); +}; + +function emitDataEvents(stream, startPaused) { + var state = stream._readableState; + + if (state.flowing) { + // https://github.com/isaacs/readable-stream/issues/16 + throw new Error('Cannot switch to old mode now.'); + } + + var paused = startPaused || false; + var readable = false; + + // convert to an old-style stream. + stream.readable = true; + stream.pipe = Stream.prototype.pipe; + stream.on = stream.addListener = Stream.prototype.on; + + stream.on('readable', function() { + readable = true; + + var c; + while (!paused && (null !== (c = stream.read()))) + stream.emit('data', c); + + if (c === null) { + readable = false; + stream._readableState.needReadable = true; + } + }); + + stream.pause = function() { + paused = true; + this.emit('pause'); + }; + + stream.resume = function() { + paused = false; + if (readable) + process.nextTick(function() { + stream.emit('readable'); + }); + else + this.read(0); + this.emit('resume'); + }; + + // now make it start, just in case it hadn't already. + stream.emit('readable'); +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function() { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function(chunk) { + if (state.decoder) + chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + //if (state.objectMode && util.isNullOrUndefined(chunk)) + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) + return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (typeof stream[i] === 'function' && + typeof this[i] === 'undefined') { + this[i] = function(method) { return function() { + return stream[method].apply(stream, arguments); + }}(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function(ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function(n) { + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + + + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) + return null; + + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) + ret = list.join(''); + else + ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) + ret = ''; + else + ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted && state.calledRead) { + state.ended = true; + process.nextTick(function() { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + }); + } +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf (xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 0000000..eb188df --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,210 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +util.inherits(Transform, Duplex); + + +function TransformState(options, stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) + return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) + stream.push(data); + + if (cb) + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + + +function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + + Duplex.call(this, options); + + var ts = this._transformState = new TransformState(options, this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + this.once('finish', function() { + if ('function' === typeof this._flush) + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); +} + +Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + + +function done(stream, er) { + if (er) + return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var rs = stream._readableState; + var ts = stream._transformState; + + if (ws.length) + throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) + throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 0000000..4bdaa4f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,386 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, cb), and it'll handle all +// the drain event emission and buffering. + +module.exports = Writable; + +/**/ +var Buffer = require('buffer').Buffer; +/**/ + +Writable.WritableState = WritableState; + + +/**/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/**/ + +var Stream = require('stream'); + +util.inherits(Writable, Stream); + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; +} + +function WritableState(options, stream) { + options = options || {}; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, becuase any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.buffer = []; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; +} + +function Writable(options) { + var Duplex = require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) + return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function() { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + + +function writeAfterEnd(stream, state, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + if (!Buffer.isBuffer(chunk) && + 'string' !== typeof chunk && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); + valid = false; + } + return valid; +} + +Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + else if (!encoding) + encoding = state.defaultEncoding; + + if (typeof cb !== 'function') + cb = function() {}; + + if (state.ended) + writeAfterEnd(this, state, cb); + else if (validChunk(this, state, chunk, cb)) + ret = writeOrBuffer(this, state, chunk, encoding, cb); + + return ret; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && + state.decodeStrings !== false && + typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) + state.needDrain = true; + + if (state.writing) + state.buffer.push(new WriteReq(chunk, encoding, cb)); + else + doWrite(stream, state, len, chunk, encoding, cb); + + return ret; +} + +function doWrite(stream, state, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + if (sync) + process.nextTick(function() { + cb(er); + }); + else + cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) + onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(stream, state); + + if (!finished && !state.bufferProcessing && state.buffer.length) + clearBuffer(stream, state); + + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + cb(); + if (finished) + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + + for (var c = 0; c < state.buffer.length; c++) { + var entry = state.buffer[c]; + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, len, chunk, encoding, cb); + + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + c++; + break; + } + } + + state.bufferProcessing = false; + if (c < state.buffer.length) + state.buffer = state.buffer.slice(c); + else + state.buffer.length = 0; +} + +Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (typeof chunk !== 'undefined' && chunk !== null) + this.write(chunk, encoding); + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) + endWritable(this, state, cb); +}; + + +function needFinish(stream, state) { + return (state.ending && + state.length === 0 && + !state.finished && + !state.writing); +} + +function finishMaybe(stream, state) { + var need = needFinish(stream, state); + if (need) { + state.finished = true; + stream.emit('finish'); + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + process.nextTick(cb); + else + stream.once('finish', cb); + } + state.ended = true; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md new file mode 100644 index 0000000..5a76b41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md @@ -0,0 +1,3 @@ +# core-util-is + +The `util.is*` functions introduced in Node v0.12. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch new file mode 100644 index 0000000..a06d5c0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch @@ -0,0 +1,604 @@ +diff --git a/lib/util.js b/lib/util.js +index a03e874..9074e8e 100644 +--- a/lib/util.js ++++ b/lib/util.js +@@ -19,430 +19,6 @@ + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + +-var formatRegExp = /%[sdj%]/g; +-exports.format = function(f) { +- if (!isString(f)) { +- var objects = []; +- for (var i = 0; i < arguments.length; i++) { +- objects.push(inspect(arguments[i])); +- } +- return objects.join(' '); +- } +- +- var i = 1; +- var args = arguments; +- var len = args.length; +- var str = String(f).replace(formatRegExp, function(x) { +- if (x === '%%') return '%'; +- if (i >= len) return x; +- switch (x) { +- case '%s': return String(args[i++]); +- case '%d': return Number(args[i++]); +- case '%j': +- try { +- return JSON.stringify(args[i++]); +- } catch (_) { +- return '[Circular]'; +- } +- default: +- return x; +- } +- }); +- for (var x = args[i]; i < len; x = args[++i]) { +- if (isNull(x) || !isObject(x)) { +- str += ' ' + x; +- } else { +- str += ' ' + inspect(x); +- } +- } +- return str; +-}; +- +- +-// Mark that a method should not be used. +-// Returns a modified function which warns once by default. +-// If --no-deprecation is set, then it is a no-op. +-exports.deprecate = function(fn, msg) { +- // Allow for deprecating things in the process of starting up. +- if (isUndefined(global.process)) { +- return function() { +- return exports.deprecate(fn, msg).apply(this, arguments); +- }; +- } +- +- if (process.noDeprecation === true) { +- return fn; +- } +- +- var warned = false; +- function deprecated() { +- if (!warned) { +- if (process.throwDeprecation) { +- throw new Error(msg); +- } else if (process.traceDeprecation) { +- console.trace(msg); +- } else { +- console.error(msg); +- } +- warned = true; +- } +- return fn.apply(this, arguments); +- } +- +- return deprecated; +-}; +- +- +-var debugs = {}; +-var debugEnviron; +-exports.debuglog = function(set) { +- if (isUndefined(debugEnviron)) +- debugEnviron = process.env.NODE_DEBUG || ''; +- set = set.toUpperCase(); +- if (!debugs[set]) { +- if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { +- var pid = process.pid; +- debugs[set] = function() { +- var msg = exports.format.apply(exports, arguments); +- console.error('%s %d: %s', set, pid, msg); +- }; +- } else { +- debugs[set] = function() {}; +- } +- } +- return debugs[set]; +-}; +- +- +-/** +- * Echos the value of a value. Trys to print the value out +- * in the best way possible given the different types. +- * +- * @param {Object} obj The object to print out. +- * @param {Object} opts Optional options object that alters the output. +- */ +-/* legacy: obj, showHidden, depth, colors*/ +-function inspect(obj, opts) { +- // default options +- var ctx = { +- seen: [], +- stylize: stylizeNoColor +- }; +- // legacy... +- if (arguments.length >= 3) ctx.depth = arguments[2]; +- if (arguments.length >= 4) ctx.colors = arguments[3]; +- if (isBoolean(opts)) { +- // legacy... +- ctx.showHidden = opts; +- } else if (opts) { +- // got an "options" object +- exports._extend(ctx, opts); +- } +- // set default options +- if (isUndefined(ctx.showHidden)) ctx.showHidden = false; +- if (isUndefined(ctx.depth)) ctx.depth = 2; +- if (isUndefined(ctx.colors)) ctx.colors = false; +- if (isUndefined(ctx.customInspect)) ctx.customInspect = true; +- if (ctx.colors) ctx.stylize = stylizeWithColor; +- return formatValue(ctx, obj, ctx.depth); +-} +-exports.inspect = inspect; +- +- +-// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +-inspect.colors = { +- 'bold' : [1, 22], +- 'italic' : [3, 23], +- 'underline' : [4, 24], +- 'inverse' : [7, 27], +- 'white' : [37, 39], +- 'grey' : [90, 39], +- 'black' : [30, 39], +- 'blue' : [34, 39], +- 'cyan' : [36, 39], +- 'green' : [32, 39], +- 'magenta' : [35, 39], +- 'red' : [31, 39], +- 'yellow' : [33, 39] +-}; +- +-// Don't use 'blue' not visible on cmd.exe +-inspect.styles = { +- 'special': 'cyan', +- 'number': 'yellow', +- 'boolean': 'yellow', +- 'undefined': 'grey', +- 'null': 'bold', +- 'string': 'green', +- 'date': 'magenta', +- // "name": intentionally not styling +- 'regexp': 'red' +-}; +- +- +-function stylizeWithColor(str, styleType) { +- var style = inspect.styles[styleType]; +- +- if (style) { +- return '\u001b[' + inspect.colors[style][0] + 'm' + str + +- '\u001b[' + inspect.colors[style][1] + 'm'; +- } else { +- return str; +- } +-} +- +- +-function stylizeNoColor(str, styleType) { +- return str; +-} +- +- +-function arrayToHash(array) { +- var hash = {}; +- +- array.forEach(function(val, idx) { +- hash[val] = true; +- }); +- +- return hash; +-} +- +- +-function formatValue(ctx, value, recurseTimes) { +- // Provide a hook for user-specified inspect functions. +- // Check that value is an object with an inspect function on it +- if (ctx.customInspect && +- value && +- isFunction(value.inspect) && +- // Filter out the util module, it's inspect function is special +- value.inspect !== exports.inspect && +- // Also filter out any prototype objects using the circular check. +- !(value.constructor && value.constructor.prototype === value)) { +- var ret = value.inspect(recurseTimes, ctx); +- if (!isString(ret)) { +- ret = formatValue(ctx, ret, recurseTimes); +- } +- return ret; +- } +- +- // Primitive types cannot have properties +- var primitive = formatPrimitive(ctx, value); +- if (primitive) { +- return primitive; +- } +- +- // Look up the keys of the object. +- var keys = Object.keys(value); +- var visibleKeys = arrayToHash(keys); +- +- if (ctx.showHidden) { +- keys = Object.getOwnPropertyNames(value); +- } +- +- // Some type of object without properties can be shortcutted. +- if (keys.length === 0) { +- if (isFunction(value)) { +- var name = value.name ? ': ' + value.name : ''; +- return ctx.stylize('[Function' + name + ']', 'special'); +- } +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } +- if (isDate(value)) { +- return ctx.stylize(Date.prototype.toString.call(value), 'date'); +- } +- if (isError(value)) { +- return formatError(value); +- } +- } +- +- var base = '', array = false, braces = ['{', '}']; +- +- // Make Array say that they are Array +- if (isArray(value)) { +- array = true; +- braces = ['[', ']']; +- } +- +- // Make functions say that they are functions +- if (isFunction(value)) { +- var n = value.name ? ': ' + value.name : ''; +- base = ' [Function' + n + ']'; +- } +- +- // Make RegExps say that they are RegExps +- if (isRegExp(value)) { +- base = ' ' + RegExp.prototype.toString.call(value); +- } +- +- // Make dates with properties first say the date +- if (isDate(value)) { +- base = ' ' + Date.prototype.toUTCString.call(value); +- } +- +- // Make error with message first say the error +- if (isError(value)) { +- base = ' ' + formatError(value); +- } +- +- if (keys.length === 0 && (!array || value.length == 0)) { +- return braces[0] + base + braces[1]; +- } +- +- if (recurseTimes < 0) { +- if (isRegExp(value)) { +- return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); +- } else { +- return ctx.stylize('[Object]', 'special'); +- } +- } +- +- ctx.seen.push(value); +- +- var output; +- if (array) { +- output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); +- } else { +- output = keys.map(function(key) { +- return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); +- }); +- } +- +- ctx.seen.pop(); +- +- return reduceToSingleString(output, base, braces); +-} +- +- +-function formatPrimitive(ctx, value) { +- if (isUndefined(value)) +- return ctx.stylize('undefined', 'undefined'); +- if (isString(value)) { +- var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') +- .replace(/'/g, "\\'") +- .replace(/\\"/g, '"') + '\''; +- return ctx.stylize(simple, 'string'); +- } +- if (isNumber(value)) { +- // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, +- // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . +- if (value === 0 && 1 / value < 0) +- return ctx.stylize('-0', 'number'); +- return ctx.stylize('' + value, 'number'); +- } +- if (isBoolean(value)) +- return ctx.stylize('' + value, 'boolean'); +- // For some reason typeof null is "object", so special case here. +- if (isNull(value)) +- return ctx.stylize('null', 'null'); +-} +- +- +-function formatError(value) { +- return '[' + Error.prototype.toString.call(value) + ']'; +-} +- +- +-function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { +- var output = []; +- for (var i = 0, l = value.length; i < l; ++i) { +- if (hasOwnProperty(value, String(i))) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- String(i), true)); +- } else { +- output.push(''); +- } +- } +- keys.forEach(function(key) { +- if (!key.match(/^\d+$/)) { +- output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, +- key, true)); +- } +- }); +- return output; +-} +- +- +-function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { +- var name, str, desc; +- desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; +- if (desc.get) { +- if (desc.set) { +- str = ctx.stylize('[Getter/Setter]', 'special'); +- } else { +- str = ctx.stylize('[Getter]', 'special'); +- } +- } else { +- if (desc.set) { +- str = ctx.stylize('[Setter]', 'special'); +- } +- } +- if (!hasOwnProperty(visibleKeys, key)) { +- name = '[' + key + ']'; +- } +- if (!str) { +- if (ctx.seen.indexOf(desc.value) < 0) { +- if (isNull(recurseTimes)) { +- str = formatValue(ctx, desc.value, null); +- } else { +- str = formatValue(ctx, desc.value, recurseTimes - 1); +- } +- if (str.indexOf('\n') > -1) { +- if (array) { +- str = str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n').substr(2); +- } else { +- str = '\n' + str.split('\n').map(function(line) { +- return ' ' + line; +- }).join('\n'); +- } +- } +- } else { +- str = ctx.stylize('[Circular]', 'special'); +- } +- } +- if (isUndefined(name)) { +- if (array && key.match(/^\d+$/)) { +- return str; +- } +- name = JSON.stringify('' + key); +- if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { +- name = name.substr(1, name.length - 2); +- name = ctx.stylize(name, 'name'); +- } else { +- name = name.replace(/'/g, "\\'") +- .replace(/\\"/g, '"') +- .replace(/(^"|"$)/g, "'"); +- name = ctx.stylize(name, 'string'); +- } +- } +- +- return name + ': ' + str; +-} +- +- +-function reduceToSingleString(output, base, braces) { +- var numLinesEst = 0; +- var length = output.reduce(function(prev, cur) { +- numLinesEst++; +- if (cur.indexOf('\n') >= 0) numLinesEst++; +- return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; +- }, 0); +- +- if (length > 60) { +- return braces[0] + +- (base === '' ? '' : base + '\n ') + +- ' ' + +- output.join(',\n ') + +- ' ' + +- braces[1]; +- } +- +- return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +-} +- +- + // NOTE: These type checking functions intentionally don't use `instanceof` + // because it is fragile and can be easily faked with `Object.create()`. + function isArray(ar) { +@@ -522,166 +98,10 @@ function isPrimitive(arg) { + exports.isPrimitive = isPrimitive; + + function isBuffer(arg) { +- return arg instanceof Buffer; ++ return Buffer.isBuffer(arg); + } + exports.isBuffer = isBuffer; + + function objectToString(o) { + return Object.prototype.toString.call(o); +-} +- +- +-function pad(n) { +- return n < 10 ? '0' + n.toString(10) : n.toString(10); +-} +- +- +-var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', +- 'Oct', 'Nov', 'Dec']; +- +-// 26 Feb 16:19:34 +-function timestamp() { +- var d = new Date(); +- var time = [pad(d.getHours()), +- pad(d.getMinutes()), +- pad(d.getSeconds())].join(':'); +- return [d.getDate(), months[d.getMonth()], time].join(' '); +-} +- +- +-// log is just a thin wrapper to console.log that prepends a timestamp +-exports.log = function() { +- console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +-}; +- +- +-/** +- * Inherit the prototype methods from one constructor into another. +- * +- * The Function.prototype.inherits from lang.js rewritten as a standalone +- * function (not on Function.prototype). NOTE: If this file is to be loaded +- * during bootstrapping this function needs to be rewritten using some native +- * functions as prototype setup using normal JavaScript does not work as +- * expected during bootstrapping (see mirror.js in r114903). +- * +- * @param {function} ctor Constructor function which needs to inherit the +- * prototype. +- * @param {function} superCtor Constructor function to inherit prototype from. +- */ +-exports.inherits = function(ctor, superCtor) { +- ctor.super_ = superCtor; +- ctor.prototype = Object.create(superCtor.prototype, { +- constructor: { +- value: ctor, +- enumerable: false, +- writable: true, +- configurable: true +- } +- }); +-}; +- +-exports._extend = function(origin, add) { +- // Don't do anything if add isn't an object +- if (!add || !isObject(add)) return origin; +- +- var keys = Object.keys(add); +- var i = keys.length; +- while (i--) { +- origin[keys[i]] = add[keys[i]]; +- } +- return origin; +-}; +- +-function hasOwnProperty(obj, prop) { +- return Object.prototype.hasOwnProperty.call(obj, prop); +-} +- +- +-// Deprecated old stuff. +- +-exports.p = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- console.error(exports.inspect(arguments[i])); +- } +-}, 'util.p: Use console.error() instead'); +- +- +-exports.exec = exports.deprecate(function() { +- return require('child_process').exec.apply(this, arguments); +-}, 'util.exec is now called `child_process.exec`.'); +- +- +-exports.print = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(String(arguments[i])); +- } +-}, 'util.print: Use console.log instead'); +- +- +-exports.puts = exports.deprecate(function() { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stdout.write(arguments[i] + '\n'); +- } +-}, 'util.puts: Use console.log instead'); +- +- +-exports.debug = exports.deprecate(function(x) { +- process.stderr.write('DEBUG: ' + x + '\n'); +-}, 'util.debug: Use console.error instead'); +- +- +-exports.error = exports.deprecate(function(x) { +- for (var i = 0, len = arguments.length; i < len; ++i) { +- process.stderr.write(arguments[i] + '\n'); +- } +-}, 'util.error: Use console.error instead'); +- +- +-exports.pump = exports.deprecate(function(readStream, writeStream, callback) { +- var callbackCalled = false; +- +- function call(a, b, c) { +- if (callback && !callbackCalled) { +- callback(a, b, c); +- callbackCalled = true; +- } +- } +- +- readStream.addListener('data', function(chunk) { +- if (writeStream.write(chunk) === false) readStream.pause(); +- }); +- +- writeStream.addListener('drain', function() { +- readStream.resume(); +- }); +- +- readStream.addListener('end', function() { +- writeStream.end(); +- }); +- +- readStream.addListener('close', function() { +- call(); +- }); +- +- readStream.addListener('error', function(err) { +- writeStream.end(); +- call(err); +- }); +- +- writeStream.addListener('error', function(err) { +- readStream.destroy(); +- call(err); +- }); +-}, 'util.pump(): Use readableStream.pipe() instead'); +- +- +-var uv; +-exports._errnoException = function(err, syscall) { +- if (isUndefined(uv)) uv = process.binding('uv'); +- var errname = uv.errname(err); +- var e = new Error(syscall + ' ' + errname); +- e.code = errname; +- e.errno = errname; +- e.syscall = syscall; +- return e; +-}; ++} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js new file mode 100644 index 0000000..9074e8e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js @@ -0,0 +1,107 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return Buffer.isBuffer(arg); +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json new file mode 100644 index 0000000..2b7593c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json @@ -0,0 +1,54 @@ +{ + "name": "core-util-is", + "version": "1.0.1", + "description": "The `util.is*` functions introduced in Node v0.12.", + "main": "lib/util.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/core-util-is" + }, + "keywords": [ + "util", + "isBuffer", + "isArray", + "isNumber", + "isString", + "isRegExp", + "isThis", + "isThat", + "polyfill" + ], + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/core-util-is/issues" + }, + "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n", + "readmeFilename": "README.md", + "homepage": "https://github.com/isaacs/core-util-is", + "_id": "core-util-is@1.0.1", + "dist": { + "shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", + "tarball": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz" + }, + "_from": "core-util-is@~1.0.0", + "_npmVersion": "1.3.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "6b07085aef9a3ccac6ee53bf9d3df0c1521a5538", + "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "scripts": {} +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/util.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/util.js new file mode 100644 index 0000000..007fa10 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/util.js @@ -0,0 +1,106 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && objectToString(e) === '[object Error]'; +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +function isBuffer(arg) { + return arg instanceof Buffer; +} +exports.isBuffer = isBuffer; + +function objectToString(o) { + return Object.prototype.toString.call(o); +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json new file mode 100644 index 0000000..3d69f4f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json @@ -0,0 +1,51 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "_id": "inherits@2.0.1", + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@~2.0.1", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md new file mode 100644 index 0000000..052a62b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md @@ -0,0 +1,54 @@ + +# isarray + +`Array#isArray` for older browsers. + +## Usage + +```js +var isArray = require('isarray'); + +console.log(isArray([])); // => true +console.log(isArray({})); // => false +``` + +## Installation + +With [npm](http://npmjs.org) do + +```bash +$ npm install isarray +``` + +Then bundle for the browser with +[browserify](https://github.com/substack/browserify). + +With [component](http://component.io) do + +```bash +$ component install juliangruber/isarray +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.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/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json new file mode 100644 index 0000000..9e31b68 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json @@ -0,0 +1,19 @@ +{ + "name" : "isarray", + "description" : "Array#isArray for older browsers", + "version" : "0.0.1", + "repository" : "juliangruber/isarray", + "homepage": "https://github.com/juliangruber/isarray", + "main" : "index.js", + "scripts" : [ + "index.js" + ], + "dependencies" : {}, + "keywords": ["browser","isarray","array"], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js new file mode 100644 index 0000000..5f5ad45 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js @@ -0,0 +1,3 @@ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json new file mode 100644 index 0000000..04d6a3f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json @@ -0,0 +1,51 @@ +{ + "name": "isarray", + "description": "Array#isArray for older browsers", + "version": "0.0.1", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/isarray.git" + }, + "homepage": "https://github.com/juliangruber/isarray", + "main": "index.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": {}, + "devDependencies": { + "tap": "*" + }, + "keywords": [ + "browser", + "isarray", + "array" + ], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "readme": "\n# isarray\n\n`Array#isArray` for older browsers.\n\n## Usage\n\n```js\nvar isArray = require('isarray');\n\nconsole.log(isArray([])); // => true\nconsole.log(isArray({})); // => false\n```\n\n## Installation\n\nWith [npm](http://npmjs.org) do\n\n```bash\n$ npm install isarray\n```\n\nThen bundle for the browser with\n[browserify](https://github.com/substack/browserify).\n\nWith [component](http://component.io) do\n\n```bash\n$ component install juliangruber/isarray\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber <julian@juliangruber.com>\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\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject 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", + "readmeFilename": "README.md", + "_id": "isarray@0.0.1", + "dist": { + "shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "tarball": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "_from": "isarray@0.0.1", + "_npmVersion": "1.2.18", + "_npmUser": { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + "maintainers": [ + { + "name": "juliangruber", + "email": "julian@juliangruber.com" + } + ], + "directories": {}, + "_shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "_resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore new file mode 100644 index 0000000..206320c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore @@ -0,0 +1,2 @@ +build +test diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE new file mode 100644 index 0000000..6de584a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE @@ -0,0 +1,20 @@ +Copyright Joyent, Inc. and other Node contributors. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md new file mode 100644 index 0000000..4d2aa00 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md @@ -0,0 +1,7 @@ +**string_decoder.js** (`require('string_decoder')`) from Node.js core + +Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details. + +Version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.** + +The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version. \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js new file mode 100644 index 0000000..b00e54f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js @@ -0,0 +1,221 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var Buffer = require('buffer').Buffer; + +var isBufferEncoding = Buffer.isEncoding + || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true; + default: return false; + } + } + + +function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error('Unknown encoding: ' + encoding); + } +} + +// StringDecoder provides an interface for efficiently splitting a series of +// buffers into a series of JS strings without breaking apart multi-byte +// characters. CESU-8 is handled as part of the UTF-8 encoding. +// +// @TODO Handling all encodings inside a single object makes it very difficult +// to reason about this code, so it should be split up in the future. +// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code +// points as used by CESU-8. +var StringDecoder = exports.StringDecoder = function(encoding) { + this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, ''); + assertEncoding(encoding); + switch (this.encoding) { + case 'utf8': + // CESU-8 represents each of Surrogate Pair by 3-bytes + this.surrogateSize = 3; + break; + case 'ucs2': + case 'utf16le': + // UTF-16 represents each of Surrogate Pair by 2-bytes + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case 'base64': + // Base-64 stores 3 bytes in 4 chars, and pads the remainder. + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + + // Enough space to store all bytes of a single character. UTF-8 needs 4 + // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate). + this.charBuffer = new Buffer(6); + // Number of bytes received for the current incomplete multi-byte character. + this.charReceived = 0; + // Number of bytes expected for the current incomplete multi-byte character. + this.charLength = 0; +}; + + +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; + + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; + } + + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); + + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; + } + this.charReceived = this.charLength = 0; + + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; + } + break; + } + + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); + + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + + charStr += buffer.toString(this.encoding, 0, end); + + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; +}; + +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; + + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + + // See http://en.wikipedia.org/wiki/UTF-8#Description + + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } + + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } + + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; + } + } + this.charReceived = i; +}; + +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); + + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); +} + +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} + +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json new file mode 100644 index 0000000..a8c586b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json @@ -0,0 +1,54 @@ +{ + "name": "string_decoder", + "version": "0.10.31", + "description": "The string_decoder module from Node core", + "main": "index.js", + "dependencies": {}, + "devDependencies": { + "tap": "~0.4.8" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/rvagg/string_decoder.git" + }, + "homepage": "https://github.com/rvagg/string_decoder", + "keywords": [ + "string", + "decoder", + "browser", + "browserify" + ], + "license": "MIT", + "gitHead": "d46d4fd87cf1d06e031c23f1ba170ca7d4ade9a0", + "bugs": { + "url": "https://github.com/rvagg/string_decoder/issues" + }, + "_id": "string_decoder@0.10.31", + "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "_from": "string_decoder@~0.10.x", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "substack", + "email": "mail@substack.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94", + "tarball": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json new file mode 100644 index 0000000..7c125e1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json @@ -0,0 +1,69 @@ +{ + "name": "readable-stream", + "version": "1.0.31", + "description": "Streams2, a user-land copy of the stream library from Node.js v0.10.x", + "main": "readable.js", + "dependencies": { + "core-util-is": "~1.0.0", + "isarray": "0.0.1", + "string_decoder": "~0.10.x", + "inherits": "~2.0.1" + }, + "devDependencies": { + "tap": "~0.2.6" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/isaacs/readable-stream" + }, + "keywords": [ + "readable", + "stream", + "pipe" + ], + "browser": { + "util": false + }, + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "license": "MIT", + "bugs": { + "url": "https://github.com/isaacs/readable-stream/issues" + }, + "homepage": "https://github.com/isaacs/readable-stream", + "_id": "readable-stream@1.0.31", + "_shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", + "_from": "readable-stream@~1.0.2", + "_npmVersion": "1.4.9", + "_npmUser": { + "name": "rvagg", + "email": "rod@vagg.org" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + } + ], + "dist": { + "shasum": "8f2502e0bc9e3b0da1b94520aabb4e2603ecafae", + "tarball": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js new file mode 100644 index 0000000..27e8d8a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_passthrough.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js new file mode 100644 index 0000000..4d1ddfc --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js @@ -0,0 +1,6 @@ +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js new file mode 100644 index 0000000..5d482f0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_transform.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js new file mode 100644 index 0000000..e1e9efd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_writable.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.npmignore new file mode 100644 index 0000000..c167ad5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.npmignore @@ -0,0 +1,5 @@ +.*.swp +node_modules +examples/extract/ +test/tmp/ +test/fixtures/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.travis.yml new file mode 100644 index 0000000..2d26206 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.6 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/LICENCE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/LICENCE new file mode 100644 index 0000000..74489e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/LICENCE @@ -0,0 +1,25 @@ +Copyright (c) Isaac Z. Schlueter +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/README.md new file mode 100644 index 0000000..424a278 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/README.md @@ -0,0 +1,48 @@ +# node-tar + +Tar for Node.js. + +[![NPM](https://nodei.co/npm/tar.png)](https://nodei.co/npm/tar/) + +## API + +See `examples/` for usage examples. + +### var tar = require('tar') + +Returns an object with `.Pack`, `.Extract` and `.Parse` methods. + +### tar.Pack([properties]) + +Returns a through stream. Use +[fstream](https://npmjs.org/package/fstream) to write files into the +pack stream and you will receive tar archive data from the pack +stream. + +This only works with directories, it does not work with individual files. + +The optional `properties` object are used to set properties in the tar +'Global Extended Header'. + +### tar.Extract([options]) + +Returns a through stream. Write tar data to the stream and the files +in the tarball will be extracted onto the filesystem. + +`options` can be: + +```js +{ + path: '/path/to/extract/tar/into', + strip: 0, // how many path segments to strip from the root when extracting +} +``` + +`options` also get passed to the `fstream.Writer` instance that `tar` +uses internally. + +### tar.Parse() + +Returns a writable stream. Write tar data to it and it will emit +`entry` events for each entry parsed from the tarball. This is used by +`tar.Extract`. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/extracter.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/extracter.js new file mode 100644 index 0000000..e150abf --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/extracter.js @@ -0,0 +1,11 @@ +var tar = require("../tar.js") + , fs = require("fs") + +fs.createReadStream(__dirname + "/../test/fixtures/c.tar") + .pipe(tar.Extract({ path: __dirname + "/extract" })) + .on("error", function (er) { + console.error("error here") + }) + .on("end", function () { + console.error("done") + }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/packer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/packer.js new file mode 100644 index 0000000..ebe3892 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/packer.js @@ -0,0 +1,10 @@ +var tar = require("../tar.js") + , fstream = require("fstream") + , fs = require("fs") + +var dir_destination = fs.createWriteStream('dir.tar') + +// This must be a "directory" +fstream.Reader({ path: __dirname, type: "Directory" }) + .pipe(tar.Pack({ noProprietary: true })) + .pipe(dir_destination) \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/reader.js new file mode 100644 index 0000000..39f3f08 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/examples/reader.js @@ -0,0 +1,36 @@ +var tar = require("../tar.js") + , fs = require("fs") + +fs.createReadStream(__dirname + "/../test/fixtures/c.tar") + .pipe(tar.Parse()) + .on("extendedHeader", function (e) { + console.error("extended pax header", e.props) + e.on("end", function () { + console.error("extended pax fields:", e.fields) + }) + }) + .on("ignoredEntry", function (e) { + console.error("ignoredEntry?!?", e.props) + }) + .on("longLinkpath", function (e) { + console.error("longLinkpath entry", e.props) + e.on("end", function () { + console.error("value=%j", e.body.toString()) + }) + }) + .on("longPath", function (e) { + console.error("longPath entry", e.props) + e.on("end", function () { + console.error("value=%j", e.body.toString()) + }) + }) + .on("entry", function (e) { + console.error("entry", e.props) + e.on("data", function (c) { + console.error(" >>>" + c.toString().replace(/\n/g, "\\n")) + }) + e.on("end", function () { + console.error(" << 0 + return !this._needDrain +} + +EntryWriter.prototype.end = function (c) { + // console.error(".. ew end") + if (c) this._buffer.push(c) + this._buffer.push(EOF) + this._ended = true + this._process() + this._needDrain = this._buffer.length > 0 +} + +EntryWriter.prototype.pause = function () { + // console.error(".. ew pause") + this._paused = true + this.emit("pause") +} + +EntryWriter.prototype.resume = function () { + // console.error(".. ew resume") + this._paused = false + this.emit("resume") + this._process() +} + +EntryWriter.prototype.add = function (entry) { + // console.error(".. ew add") + if (!this.parent) return this.emit("error", new Error("no parent")) + + // make sure that the _header and such is emitted, and clear out + // the _currentEntry link on the parent. + if (!this._ended) this.end() + + return this.parent.add(entry) +} + +EntryWriter.prototype._header = function () { + // console.error(".. ew header") + if (this._didHeader) return + this._didHeader = true + + var headerBlock = TarHeader.encode(this.props) + + if (this.props.needExtended && !this._meta) { + var me = this + + ExtendedHeaderWriter = ExtendedHeaderWriter || + require("./extended-header-writer.js") + + ExtendedHeaderWriter(this.props) + .on("data", function (c) { + me.emit("data", c) + }) + .on("error", function (er) { + me.emit("error", er) + }) + .end() + } + + // console.error(".. .. ew headerBlock emitting") + this.emit("data", headerBlock) + this.emit("header") +} + +EntryWriter.prototype._process = function () { + // console.error(".. .. ew process") + if (!this._didHeader && !this._meta) { + this._header() + } + + if (this._paused || this._processing) { + // console.error(".. .. .. paused=%j, processing=%j", this._paused, this._processing) + return + } + + this._processing = true + + var buf = this._buffer + for (var i = 0; i < buf.length; i ++) { + // console.error(".. .. .. i=%d", i) + + var c = buf[i] + + if (c === EOF) this._stream.end() + else this._stream.write(c) + + if (this._paused) { + // console.error(".. .. .. paused mid-emission") + this._processing = false + if (i < buf.length) { + this._needDrain = true + this._buffer = buf.slice(i + 1) + } + return + } + } + + // console.error(".. .. .. emitted") + this._buffer.length = 0 + this._processing = false + + // console.error(".. .. .. emitting drain") + this.emit("drain") +} + +EntryWriter.prototype.destroy = function () {} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/entry.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/entry.js new file mode 100644 index 0000000..4af5c41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/entry.js @@ -0,0 +1,213 @@ +// A passthrough read/write stream that sets its properties +// based on a header, extendedHeader, and globalHeader +// +// Can be either a file system object of some sort, or +// a pax/ustar metadata entry. + +module.exports = Entry + +var TarHeader = require("./header.js") + , tar = require("../tar") + , assert = require("assert").ok + , Stream = require("stream").Stream + , inherits = require("inherits") + , fstream = require("fstream").Abstract + +function Entry (header, extended, global) { + Stream.call(this) + this.readable = true + this.writable = true + + this._needDrain = false + this._paused = false + this._reading = false + this._ending = false + this._ended = false + this._remaining = 0 + this._queue = [] + this._index = 0 + this._queueLen = 0 + + this._read = this._read.bind(this) + + this.props = {} + this._header = header + this._extended = extended || {} + + // globals can change throughout the course of + // a file parse operation. Freeze it at its current state. + this._global = {} + var me = this + Object.keys(global || {}).forEach(function (g) { + me._global[g] = global[g] + }) + + this._setProps() +} + +inherits(Entry, Stream) + +Entry.prototype.write = function (c) { + if (this._ending) this.error("write() after end()", null, true) + if (this._remaining === 0) { + this.error("invalid bytes past eof") + } + + // often we'll get a bunch of \0 at the end of the last write, + // since chunks will always be 512 bytes when reading a tarball. + if (c.length > this._remaining) { + c = c.slice(0, this._remaining) + } + this._remaining -= c.length + + // put it on the stack. + var ql = this._queueLen + this._queue.push(c) + this._queueLen ++ + + this._read() + + // either paused, or buffered + if (this._paused || ql > 0) { + this._needDrain = true + return false + } + + return true +} + +Entry.prototype.end = function (c) { + if (c) this.write(c) + this._ending = true + this._read() +} + +Entry.prototype.pause = function () { + this._paused = true + this.emit("pause") +} + +Entry.prototype.resume = function () { + // console.error(" Tar Entry resume", this.path) + this.emit("resume") + this._paused = false + this._read() + return this._queueLen - this._index > 1 +} + + // This is bound to the instance +Entry.prototype._read = function () { + // console.error(" Tar Entry _read", this.path) + + if (this._paused || this._reading || this._ended) return + + // set this flag so that event handlers don't inadvertently + // get multiple _read() calls running. + this._reading = true + + // have any data to emit? + while (this._index < this._queueLen && !this._paused) { + var chunk = this._queue[this._index ++] + this.emit("data", chunk) + } + + // check if we're drained + if (this._index >= this._queueLen) { + this._queue.length = this._queueLen = this._index = 0 + if (this._needDrain) { + this._needDrain = false + this.emit("drain") + } + if (this._ending) { + this._ended = true + this.emit("end") + } + } + + // if the queue gets too big, then pluck off whatever we can. + // this should be fairly rare. + var mql = this._maxQueueLen + if (this._queueLen > mql && this._index > 0) { + mql = Math.min(this._index, mql) + this._index -= mql + this._queueLen -= mql + this._queue = this._queue.slice(mql) + } + + this._reading = false +} + +Entry.prototype._setProps = function () { + // props = extended->global->header->{} + var header = this._header + , extended = this._extended + , global = this._global + , props = this.props + + // first get the values from the normal header. + var fields = tar.fields + for (var f = 0; fields[f] !== null; f ++) { + var field = fields[f] + , val = header[field] + if (typeof val !== "undefined") props[field] = val + } + + // next, the global header for this file. + // numeric values, etc, will have already been parsed. + ;[global, extended].forEach(function (p) { + Object.keys(p).forEach(function (f) { + if (typeof p[f] !== "undefined") props[f] = p[f] + }) + }) + + // no nulls allowed in path or linkpath + ;["path", "linkpath"].forEach(function (p) { + if (props.hasOwnProperty(p)) { + props[p] = props[p].split("\0")[0] + } + }) + + + // set date fields to be a proper date + ;["mtime", "ctime", "atime"].forEach(function (p) { + if (props.hasOwnProperty(p)) { + props[p] = new Date(props[p] * 1000) + } + }) + + // set the type so that we know what kind of file to create + var type + switch (tar.types[props.type]) { + case "OldFile": + case "ContiguousFile": + type = "File" + break + + case "GNUDumpDir": + type = "Directory" + break + + case undefined: + type = "Unknown" + break + + case "Link": + case "SymbolicLink": + case "CharacterDevice": + case "BlockDevice": + case "Directory": + case "FIFO": + default: + type = tar.types[props.type] + } + + this.type = type + this.path = props.path + this.size = props.size + + // size is special, since it signals when the file needs to end. + this._remaining = props.size +} + +Entry.prototype.warn = fstream.warn +Entry.prototype.error = fstream.error diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header-writer.js new file mode 100644 index 0000000..1728c45 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header-writer.js @@ -0,0 +1,191 @@ + +module.exports = ExtendedHeaderWriter + +var inherits = require("inherits") + , EntryWriter = require("./entry-writer.js") + +inherits(ExtendedHeaderWriter, EntryWriter) + +var tar = require("../tar.js") + , path = require("path") + , TarHeader = require("./header.js") + +// props is the props of the thing we need to write an +// extended header for. +// Don't be shy with it. Just encode everything. +function ExtendedHeaderWriter (props) { + // console.error(">> ehw ctor") + var me = this + + if (!(me instanceof ExtendedHeaderWriter)) { + return new ExtendedHeaderWriter(props) + } + + me.fields = props + + var p = + { path : ("PaxHeader" + path.join("/", props.path || "")) + .replace(/\\/g, "/").substr(0, 100) + , mode : props.mode || 0666 + , uid : props.uid || 0 + , gid : props.gid || 0 + , size : 0 // will be set later + , mtime : props.mtime || Date.now() / 1000 + , type : "x" + , linkpath : "" + , ustar : "ustar\0" + , ustarver : "00" + , uname : props.uname || "" + , gname : props.gname || "" + , devmaj : props.devmaj || 0 + , devmin : props.devmin || 0 + } + + + EntryWriter.call(me, p) + // console.error(">> ehw props", me.props) + me.props = p + + me._meta = true +} + +ExtendedHeaderWriter.prototype.end = function () { + // console.error(">> ehw end") + var me = this + + if (me._ended) return + me._ended = true + + me._encodeFields() + + if (me.props.size === 0) { + // nothing to write! + me._ready = true + me._stream.end() + return + } + + me._stream.write(TarHeader.encode(me.props)) + me.body.forEach(function (l) { + me._stream.write(l) + }) + me._ready = true + + // console.error(">> ehw _process calling end()", me.props) + this._stream.end() +} + +ExtendedHeaderWriter.prototype._encodeFields = function () { + // console.error(">> ehw _encodeFields") + this.body = [] + if (this.fields.prefix) { + this.fields.path = this.fields.prefix + "/" + this.fields.path + this.fields.prefix = "" + } + encodeFields(this.fields, "", this.body, this.fields.noProprietary) + var me = this + this.body.forEach(function (l) { + me.props.size += l.length + }) +} + +function encodeFields (fields, prefix, body, nop) { + // console.error(">> >> ehw encodeFields") + // "%d %s=%s\n", , , + // The length is a decimal number, and includes itself and the \n + // Numeric values are decimal strings. + + Object.keys(fields).forEach(function (k) { + var val = fields[k] + , numeric = tar.numeric[k] + + if (prefix) k = prefix + "." + k + + // already including NODETAR.type, don't need File=true also + if (k === fields.type && val === true) return + + switch (k) { + // don't include anything that's always handled just fine + // in the normal header, or only meaningful in the context + // of nodetar + case "mode": + case "cksum": + case "ustar": + case "ustarver": + case "prefix": + case "basename": + case "dirname": + case "needExtended": + case "block": + case "filter": + return + + case "rdev": + if (val === 0) return + break + + case "nlink": + case "dev": // Truly a hero among men, Creator of Star! + case "ino": // Speak his name with reverent awe! It is: + k = "SCHILY." + k + break + + default: break + } + + if (val && typeof val === "object" && + !Buffer.isBuffer(val)) encodeFields(val, k, body, nop) + else if (val === null || val === undefined) return + else body.push.apply(body, encodeField(k, val, nop)) + }) + + return body +} + +function encodeField (k, v, nop) { + // lowercase keys must be valid, otherwise prefix with + // "NODETAR." + if (k.charAt(0) === k.charAt(0).toLowerCase()) { + var m = k.split(".")[0] + if (!tar.knownExtended[m]) k = "NODETAR." + k + } + + // no proprietary + if (nop && k.charAt(0) !== k.charAt(0).toLowerCase()) { + return [] + } + + if (typeof val === "number") val = val.toString(10) + + var s = new Buffer(" " + k + "=" + v + "\n") + , digits = Math.floor(Math.log(s.length) / Math.log(10)) + 1 + + // console.error("1 s=%j digits=%j s.length=%d", s.toString(), digits, s.length) + + // if adding that many digits will make it go over that length, + // then add one to it. For example, if the string is: + // " foo=bar\n" + // then that's 9 characters. With the "9", that bumps the length + // up to 10. However, this is invalid: + // "10 foo=bar\n" + // but, since that's actually 11 characters, since 10 adds another + // character to the length, and the length includes the number + // itself. In that case, just bump it up again. + if (s.length + digits >= Math.pow(10, digits)) digits += 1 + // console.error("2 s=%j digits=%j s.length=%d", s.toString(), digits, s.length) + + var len = digits + s.length + // console.error("3 s=%j digits=%j s.length=%d len=%d", s.toString(), digits, s.length, len) + var lenBuf = new Buffer("" + len) + if (lenBuf.length + s.length !== len) { + throw new Error("Bad length calculation\n"+ + "len="+len+"\n"+ + "lenBuf="+JSON.stringify(lenBuf.toString())+"\n"+ + "lenBuf.length="+lenBuf.length+"\n"+ + "digits="+digits+"\n"+ + "s="+JSON.stringify(s.toString())+"\n"+ + "s.length="+s.length) + } + + return [lenBuf, s] +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header.js new file mode 100644 index 0000000..74f432c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extended-header.js @@ -0,0 +1,140 @@ +// An Entry consisting of: +// +// "%d %s=%s\n", , , +// +// The length is a decimal number, and includes itself and the \n +// \0 does not terminate anything. Only the length terminates the string. +// Numeric values are decimal strings. + +module.exports = ExtendedHeader + +var Entry = require("./entry.js") + , inherits = require("inherits") + , tar = require("../tar.js") + , numeric = tar.numeric + , keyTrans = { "SCHILY.dev": "dev" + , "SCHILY.ino": "ino" + , "SCHILY.nlink": "nlink" } + +function ExtendedHeader () { + Entry.apply(this, arguments) + this.on("data", this._parse) + this.fields = {} + this._position = 0 + this._fieldPos = 0 + this._state = SIZE + this._sizeBuf = [] + this._keyBuf = [] + this._valBuf = [] + this._size = -1 + this._key = "" +} + +inherits(ExtendedHeader, Entry) +ExtendedHeader.prototype._parse = parse + +var s = 0 + , states = ExtendedHeader.states = {} + , SIZE = states.SIZE = s++ + , KEY = states.KEY = s++ + , VAL = states.VAL = s++ + , ERR = states.ERR = s++ + +Object.keys(states).forEach(function (s) { + states[states[s]] = states[s] +}) + +states[s] = null + +// char code values for comparison +var _0 = "0".charCodeAt(0) + , _9 = "9".charCodeAt(0) + , point = ".".charCodeAt(0) + , a = "a".charCodeAt(0) + , Z = "Z".charCodeAt(0) + , a = "a".charCodeAt(0) + , z = "z".charCodeAt(0) + , space = " ".charCodeAt(0) + , eq = "=".charCodeAt(0) + , cr = "\n".charCodeAt(0) + +function parse (c) { + if (this._state === ERR) return + + for ( var i = 0, l = c.length + ; i < l + ; this._position++, this._fieldPos++, i++) { + // console.error("top of loop, size="+this._size) + + var b = c[i] + + if (this._size >= 0 && this._fieldPos > this._size) { + error(this, "field exceeds length="+this._size) + return + } + + switch (this._state) { + case ERR: return + + case SIZE: + // console.error("parsing size, b=%d, rest=%j", b, c.slice(i).toString()) + if (b === space) { + this._state = KEY + // this._fieldPos = this._sizeBuf.length + this._size = parseInt(new Buffer(this._sizeBuf).toString(), 10) + this._sizeBuf.length = 0 + continue + } + if (b < _0 || b > _9) { + error(this, "expected [" + _0 + ".." + _9 + "], got " + b) + return + } + this._sizeBuf.push(b) + continue + + case KEY: + // can be any char except =, not > size. + if (b === eq) { + this._state = VAL + this._key = new Buffer(this._keyBuf).toString() + if (keyTrans[this._key]) this._key = keyTrans[this._key] + this._keyBuf.length = 0 + continue + } + this._keyBuf.push(b) + continue + + case VAL: + // field must end with cr + if (this._fieldPos === this._size - 1) { + // console.error("finished with "+this._key) + if (b !== cr) { + error(this, "expected \\n at end of field") + return + } + var val = new Buffer(this._valBuf).toString() + if (numeric[this._key]) { + val = parseFloat(val) + } + this.fields[this._key] = val + + this._valBuf.length = 0 + this._state = SIZE + this._size = -1 + this._fieldPos = -1 + continue + } + this._valBuf.push(b) + continue + } + } +} + +function error (me, msg) { + msg = "invalid header: " + msg + + "\nposition=" + me._position + + "\nfield position=" + me._fieldPos + + me.error(msg) + me.state = ERR +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extract.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extract.js new file mode 100644 index 0000000..c34a81e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/extract.js @@ -0,0 +1,78 @@ +// give it a tarball and a path, and it'll dump the contents + +module.exports = Extract + +var tar = require("../tar.js") + , fstream = require("fstream") + , inherits = require("inherits") + , path = require("path") + +function Extract (opts) { + if (!(this instanceof Extract)) return new Extract(opts) + tar.Parse.apply(this) + + // have to dump into a directory + opts.type = "Directory" + opts.Directory = true + + if (typeof opts !== "object") { + opts = { path: opts } + } + + // better to drop in cwd? seems more standard. + opts.path = opts.path || path.resolve("node-tar-extract") + opts.type = "Directory" + opts.Directory = true + + // similar to --strip or --strip-components + opts.strip = +opts.strip + if (!opts.strip || opts.strip <= 0) opts.strip = 0 + + this._fst = fstream.Writer(opts) + + this.pause() + var me = this + + // Hardlinks in tarballs are relative to the root + // of the tarball. So, they need to be resolved against + // the target directory in order to be created properly. + me.on("entry", function (entry) { + // if there's a "strip" argument, then strip off that many + // path components. + if (opts.strip) { + var p = entry.path.split("/").slice(opts.strip).join("/") + entry.path = entry.props.path = p + if (entry.linkpath) { + var lp = entry.linkpath.split("/").slice(opts.strip).join("/") + entry.linkpath = entry.props.linkpath = lp + } + } + if (entry.type !== "Link") return + entry.linkpath = entry.props.linkpath = + path.join(opts.path, path.join("/", entry.props.linkpath)) + }) + + this._fst.on("ready", function () { + me.pipe(me._fst, { end: false }) + me.resume() + }) + + // this._fst.on("end", function () { + // console.error("\nEEEE Extract End", me._fst.path) + // }) + + this._fst.on("close", function () { + // console.error("\nEEEE Extract End", me._fst.path) + me.emit("end") + me.emit("close") + }) +} + +inherits(Extract, tar.Parse) + +Extract.prototype._streamEnd = function () { + var me = this + if (!me._ended) me.error("unexpected eof") + me._fst.end() + // my .end() is coming later. +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/global-header-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/global-header-writer.js new file mode 100644 index 0000000..0bfc7b8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/global-header-writer.js @@ -0,0 +1,14 @@ +module.exports = GlobalHeaderWriter + +var ExtendedHeaderWriter = require("./extended-header-writer.js") + , inherits = require("inherits") + +inherits(GlobalHeaderWriter, ExtendedHeaderWriter) + +function GlobalHeaderWriter (props) { + if (!(this instanceof GlobalHeaderWriter)) { + return new GlobalHeaderWriter(props) + } + ExtendedHeaderWriter.call(this, props) + this.props.type = "g" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/header.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/header.js new file mode 100644 index 0000000..05b237c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/header.js @@ -0,0 +1,385 @@ +// parse a 512-byte header block to a data object, or vice-versa +// If the data won't fit nicely in a simple header, then generate +// the appropriate extended header file, and return that. + +module.exports = TarHeader + +var tar = require("../tar.js") + , fields = tar.fields + , fieldOffs = tar.fieldOffs + , fieldEnds = tar.fieldEnds + , fieldSize = tar.fieldSize + , numeric = tar.numeric + , assert = require("assert").ok + , space = " ".charCodeAt(0) + , slash = "/".charCodeAt(0) + , bslash = process.platform === "win32" ? "\\".charCodeAt(0) : null + +function TarHeader (block) { + if (!(this instanceof TarHeader)) return new TarHeader(block) + if (block) this.decode(block) +} + +TarHeader.prototype = + { decode : decode + , encode: encode + , calcSum: calcSum + , checkSum: checkSum + } + +TarHeader.parseNumeric = parseNumeric +TarHeader.encode = encode +TarHeader.decode = decode + +// note that this will only do the normal ustar header, not any kind +// of extended posix header file. If something doesn't fit comfortably, +// then it will set obj.needExtended = true, and set the block to +// the closest approximation. +function encode (obj) { + if (!obj && !(this instanceof TarHeader)) throw new Error( + "encode must be called on a TarHeader, or supplied an object") + + obj = obj || this + var block = obj.block = new Buffer(512) + + // if the object has a "prefix", then that's actually an extension of + // the path field. + if (obj.prefix) { + // console.error("%% header encoding, got a prefix", obj.prefix) + obj.path = obj.prefix + "/" + obj.path + // console.error("%% header encoding, prefixed path", obj.path) + obj.prefix = "" + } + + obj.needExtended = false + + if (obj.mode) { + if (typeof obj.mode === "string") obj.mode = parseInt(obj.mode, 8) + obj.mode = obj.mode & 0777 + } + + for (var f = 0; fields[f] !== null; f ++) { + var field = fields[f] + , off = fieldOffs[f] + , end = fieldEnds[f] + , ret + + switch (field) { + case "cksum": + // special, done below, after all the others + break + + case "prefix": + // special, this is an extension of the "path" field. + // console.error("%% header encoding, skip prefix later") + break + + case "type": + // convert from long name to a single char. + var type = obj.type || "0" + if (type.length > 1) { + type = tar.types[obj.type] + if (!type) type = "0" + } + writeText(block, off, end, type) + break + + case "path": + // uses the "prefix" field if > 100 bytes, but <= 255 + var pathLen = Buffer.byteLength(obj.path) + , pathFSize = fieldSize[fields.path] + , prefFSize = fieldSize[fields.prefix] + + // paths between 100 and 255 should use the prefix field. + // longer than 255 + if (pathLen > pathFSize && + pathLen <= pathFSize + prefFSize) { + // need to find a slash somewhere in the middle so that + // path and prefix both fit in their respective fields + var searchStart = pathLen - 1 - pathFSize + , searchEnd = prefFSize + , found = false + , pathBuf = new Buffer(obj.path) + + for ( var s = searchStart + ; (s <= searchEnd) + ; s ++ ) { + if (pathBuf[s] === slash || pathBuf[s] === bslash) { + found = s + break + } + } + + if (found !== false) { + prefix = pathBuf.slice(0, found).toString("utf8") + path = pathBuf.slice(found + 1).toString("utf8") + + ret = writeText(block, off, end, path) + off = fieldOffs[fields.prefix] + end = fieldEnds[fields.prefix] + // console.error("%% header writing prefix", off, end, prefix) + ret = writeText(block, off, end, prefix) || ret + break + } + } + + // paths less than 100 chars don't need a prefix + // and paths longer than 255 need an extended header and will fail + // on old implementations no matter what we do here. + // Null out the prefix, and fallthrough to default. + // console.error("%% header writing no prefix") + var poff = fieldOffs[fields.prefix] + , pend = fieldEnds[fields.prefix] + writeText(block, poff, pend, "") + // fallthrough + + // all other fields are numeric or text + default: + ret = numeric[field] + ? writeNumeric(block, off, end, obj[field]) + : writeText(block, off, end, obj[field] || "") + break + } + obj.needExtended = obj.needExtended || ret + } + + var off = fieldOffs[fields.cksum] + , end = fieldEnds[fields.cksum] + + writeNumeric(block, off, end, calcSum.call(this, block)) + + return block +} + +// if it's a negative number, or greater than will fit, +// then use write256. +var MAXNUM = { 12: 077777777777 + , 11: 07777777777 + , 8 : 07777777 + , 7 : 0777777 } +function writeNumeric (block, off, end, num) { + var writeLen = end - off + , maxNum = MAXNUM[writeLen] || 0 + + num = num || 0 + // console.error(" numeric", num) + + if (num instanceof Date || + Object.prototype.toString.call(num) === "[object Date]") { + num = num.getTime() / 1000 + } + + if (num > maxNum || num < 0) { + write256(block, off, end, num) + // need an extended header if negative or too big. + return true + } + + // god, tar is so annoying + // if the string is small enough, you should put a space + // between the octal string and the \0, but if it doesn't + // fit, then don't. + var numStr = Math.floor(num).toString(8) + if (num < MAXNUM[writeLen - 1]) numStr += " " + + // pad with "0" chars + if (numStr.length < writeLen) { + numStr = (new Array(writeLen - numStr.length).join("0")) + numStr + } + + if (numStr.length !== writeLen - 1) { + throw new Error("invalid length: " + JSON.stringify(numStr) + "\n" + + "expected: "+writeLen) + } + block.write(numStr, off, writeLen, "utf8") + block[end - 1] = 0 +} + +function write256 (block, off, end, num) { + var buf = block.slice(off, end) + var positive = num >= 0 + buf[0] = positive ? 0x80 : 0xFF + + // get the number as a base-256 tuple + if (!positive) num *= -1 + var tuple = [] + do { + var n = num % 256 + tuple.push(n) + num = (num - n) / 256 + } while (num) + + var bytes = tuple.length + + var fill = buf.length - bytes + for (var i = 1; i < fill; i ++) { + buf[i] = positive ? 0 : 0xFF + } + + // tuple is a base256 number, with [0] as the *least* significant byte + // if it's negative, then we need to flip all the bits once we hit the + // first non-zero bit. The 2's-complement is (0x100 - n), and the 1's- + // complement is (0xFF - n). + var zero = true + for (i = bytes; i > 0; i --) { + var byte = tuple[bytes - i] + if (positive) buf[fill + i] = byte + else if (zero && byte === 0) buf[fill + i] = 0 + else if (zero) { + zero = false + buf[fill + i] = 0x100 - byte + } else buf[fill + i] = 0xFF - byte + } +} + +function writeText (block, off, end, str) { + // strings are written as utf8, then padded with \0 + var strLen = Buffer.byteLength(str) + , writeLen = Math.min(strLen, end - off) + // non-ascii fields need extended headers + // long fields get truncated + , needExtended = strLen !== str.length || strLen > writeLen + + // write the string, and null-pad + if (writeLen > 0) block.write(str, off, writeLen, "utf8") + for (var i = off + writeLen; i < end; i ++) block[i] = 0 + + return needExtended +} + +function calcSum (block) { + block = block || this.block + assert(Buffer.isBuffer(block) && block.length === 512) + + if (!block) throw new Error("Need block to checksum") + + // now figure out what it would be if the cksum was " " + var sum = 0 + , start = fieldOffs[fields.cksum] + , end = fieldEnds[fields.cksum] + + for (var i = 0; i < fieldOffs[fields.cksum]; i ++) { + sum += block[i] + } + + for (var i = start; i < end; i ++) { + sum += space + } + + for (var i = end; i < 512; i ++) { + sum += block[i] + } + + return sum +} + + +function checkSum (block) { + var sum = calcSum.call(this, block) + block = block || this.block + + var cksum = block.slice(fieldOffs[fields.cksum], fieldEnds[fields.cksum]) + cksum = parseNumeric(cksum) + + return cksum === sum +} + +function decode (block) { + block = block || this.block + assert(Buffer.isBuffer(block) && block.length === 512) + + this.block = block + this.cksumValid = this.checkSum() + + var prefix = null + + // slice off each field. + for (var f = 0; fields[f] !== null; f ++) { + var field = fields[f] + , val = block.slice(fieldOffs[f], fieldEnds[f]) + + switch (field) { + case "ustar": + // if not ustar, then everything after that is just padding. + if (val.toString() !== "ustar\0") { + this.ustar = false + return + } else { + // console.error("ustar:", val, val.toString()) + this.ustar = val.toString() + } + break + + // prefix is special, since it might signal the xstar header + case "prefix": + var atime = parseNumeric(val.slice(131, 131 + 12)) + , ctime = parseNumeric(val.slice(131 + 12, 131 + 12 + 12)) + if ((val[130] === 0 || val[130] === space) && + typeof atime === "number" && + typeof ctime === "number" && + val[131 + 12] === space && + val[131 + 12 + 12] === space) { + this.atime = atime + this.ctime = ctime + val = val.slice(0, 130) + } + prefix = val.toString("utf8").replace(/\0+$/, "") + // console.error("%% header reading prefix", prefix) + break + + // all other fields are null-padding text + // or a number. + default: + if (numeric[field]) { + this[field] = parseNumeric(val) + } else { + this[field] = val.toString("utf8").replace(/\0+$/, "") + } + break + } + } + + // if we got a prefix, then prepend it to the path. + if (prefix) { + this.path = prefix + "/" + this.path + // console.error("%% header got a prefix", this.path) + } +} + +function parse256 (buf) { + // first byte MUST be either 80 or FF + // 80 for positive, FF for 2's comp + var positive + if (buf[0] === 0x80) positive = true + else if (buf[0] === 0xFF) positive = false + else return null + + // build up a base-256 tuple from the least sig to the highest + var zero = false + , tuple = [] + for (var i = buf.length - 1; i > 0; i --) { + var byte = buf[i] + if (positive) tuple.push(byte) + else if (zero && byte === 0) tuple.push(0) + else if (zero) { + zero = false + tuple.push(0x100 - byte) + } else tuple.push(0xFF - byte) + } + + for (var sum = 0, i = 0, l = tuple.length; i < l; i ++) { + sum += tuple[i] * Math.pow(256, i) + } + + return positive ? sum : -1 * sum +} + +function parseNumeric (f) { + if (f[0] & 0x80) return parse256(f) + + var str = f.toString("utf8").split("\0")[0].trim() + , res = parseInt(str, 8) + + return isNaN(res) ? null : res +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/pack.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/pack.js new file mode 100644 index 0000000..3ff14dd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/pack.js @@ -0,0 +1,231 @@ +// pipe in an fstream, and it'll make a tarball. +// key-value pair argument is global extended header props. + +module.exports = Pack + +var EntryWriter = require("./entry-writer.js") + , Stream = require("stream").Stream + , path = require("path") + , inherits = require("inherits") + , GlobalHeaderWriter = require("./global-header-writer.js") + , collect = require("fstream").collect + , eof = new Buffer(512) + +for (var i = 0; i < 512; i ++) eof[i] = 0 + +inherits(Pack, Stream) + +function Pack (props) { + // console.error("-- p ctor") + var me = this + if (!(me instanceof Pack)) return new Pack(props) + + if (props) me._noProprietary = props.noProprietary + else me._noProprietary = false + + me._global = props + + me.readable = true + me.writable = true + me._buffer = [] + // console.error("-- -- set current to null in ctor") + me._currentEntry = null + me._processing = false + + me._pipeRoot = null + me.on("pipe", function (src) { + if (src.root === me._pipeRoot) return + me._pipeRoot = src + src.on("end", function () { + me._pipeRoot = null + }) + me.add(src) + }) +} + +Pack.prototype.addGlobal = function (props) { + // console.error("-- p addGlobal") + if (this._didGlobal) return + this._didGlobal = true + + var me = this + GlobalHeaderWriter(props) + .on("data", function (c) { + me.emit("data", c) + }) + .end() +} + +Pack.prototype.add = function (stream) { + if (this._global && !this._didGlobal) this.addGlobal(this._global) + + if (this._ended) return this.emit("error", new Error("add after end")) + + collect(stream) + this._buffer.push(stream) + this._process() + this._needDrain = this._buffer.length > 0 + return !this._needDrain +} + +Pack.prototype.pause = function () { + this._paused = true + if (this._currentEntry) this._currentEntry.pause() + this.emit("pause") +} + +Pack.prototype.resume = function () { + this._paused = false + if (this._currentEntry) this._currentEntry.resume() + this.emit("resume") + this._process() +} + +Pack.prototype.end = function () { + this._ended = true + this._buffer.push(eof) + this._process() +} + +Pack.prototype._process = function () { + var me = this + if (me._paused || me._processing) { + return + } + + var entry = me._buffer.shift() + + if (!entry) { + if (me._needDrain) { + me.emit("drain") + } + return + } + + if (entry.ready === false) { + // console.error("-- entry is not ready", entry) + me._buffer.unshift(entry) + entry.on("ready", function () { + // console.error("-- -- ready!", entry) + me._process() + }) + return + } + + me._processing = true + + if (entry === eof) { + // need 2 ending null blocks. + me.emit("data", eof) + me.emit("data", eof) + me.emit("end") + me.emit("close") + return + } + + // Change the path to be relative to the root dir that was + // added to the tarball. + // + // XXX This should be more like how -C works, so you can + // explicitly set a root dir, and also explicitly set a pathname + // in the tarball to use. That way we can skip a lot of extra + // work when resolving symlinks for bundled dependencies in npm. + + var root = path.dirname((entry.root || entry).path) + var wprops = {} + + Object.keys(entry.props || {}).forEach(function (k) { + wprops[k] = entry.props[k] + }) + + if (me._noProprietary) wprops.noProprietary = true + + wprops.path = path.relative(root, entry.path || '') + + // actually not a matter of opinion or taste. + if (process.platform === "win32") { + wprops.path = wprops.path.replace(/\\/g, "/") + } + + if (!wprops.type) + wprops.type = 'Directory' + + switch (wprops.type) { + // sockets not supported + case "Socket": + return + + case "Directory": + wprops.path += "/" + wprops.size = 0 + break + + case "Link": + var lp = path.resolve(path.dirname(entry.path), entry.linkpath) + wprops.linkpath = path.relative(root, lp) || "." + wprops.size = 0 + break + + case "SymbolicLink": + var lp = path.resolve(path.dirname(entry.path), entry.linkpath) + wprops.linkpath = path.relative(path.dirname(entry.path), lp) || "." + wprops.size = 0 + break + } + + // console.error("-- new writer", wprops) + // if (!wprops.type) { + // // console.error("-- no type?", entry.constructor.name, entry) + // } + + // console.error("-- -- set current to new writer", wprops.path) + var writer = me._currentEntry = EntryWriter(wprops) + + writer.parent = me + + // writer.on("end", function () { + // // console.error("-- -- writer end", writer.path) + // }) + + writer.on("data", function (c) { + me.emit("data", c) + }) + + writer.on("header", function () { + Buffer.prototype.toJSON = function () { + return this.toString().split(/\0/).join(".") + } + // console.error("-- -- writer header %j", writer.props) + if (writer.props.size === 0) nextEntry() + }) + writer.on("close", nextEntry) + + var ended = false + function nextEntry () { + if (ended) return + ended = true + + // console.error("-- -- writer close", writer.path) + // console.error("-- -- set current to null", wprops.path) + me._currentEntry = null + me._processing = false + me._process() + } + + writer.on("error", function (er) { + // console.error("-- -- writer error", writer.path) + me.emit("error", er) + }) + + // if it's the root, then there's no need to add its entries, + // or data, since they'll be added directly. + if (entry === me._pipeRoot) { + // console.error("-- is the root, don't auto-add") + writer.add = null + } + + entry.pipe(writer) +} + +Pack.prototype.destroy = function () {} +Pack.prototype.write = function () {} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/parse.js new file mode 100644 index 0000000..009a85f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/lib/parse.js @@ -0,0 +1,271 @@ + +// A writable stream. +// It emits "entry" events, which provide a readable stream that has +// header info attached. + +module.exports = Parse.create = Parse + +var stream = require("stream") + , Stream = stream.Stream + , BlockStream = require("block-stream") + , tar = require("../tar.js") + , TarHeader = require("./header.js") + , Entry = require("./entry.js") + , BufferEntry = require("./buffer-entry.js") + , ExtendedHeader = require("./extended-header.js") + , assert = require("assert").ok + , inherits = require("inherits") + , fstream = require("fstream") + +// reading a tar is a lot like reading a directory +// However, we're actually not going to run the ctor, +// since it does a stat and various other stuff. +// This inheritance gives us the pause/resume/pipe +// behavior that is desired. +inherits(Parse, fstream.Reader) + +function Parse () { + var me = this + if (!(me instanceof Parse)) return new Parse() + + // doesn't apply fstream.Reader ctor? + // no, becasue we don't want to stat/etc, we just + // want to get the entry/add logic from .pipe() + Stream.apply(me) + + me.writable = true + me.readable = true + me._stream = new BlockStream(512) + me.position = 0 + me._ended = false + + me._stream.on("error", function (e) { + me.emit("error", e) + }) + + me._stream.on("data", function (c) { + me._process(c) + }) + + me._stream.on("end", function () { + me._streamEnd() + }) + + me._stream.on("drain", function () { + me.emit("drain") + }) +} + +// overridden in Extract class, since it needs to +// wait for its DirWriter part to finish before +// emitting "end" +Parse.prototype._streamEnd = function () { + var me = this + if (!me._ended) me.error("unexpected eof") + me.emit("end") +} + +// a tar reader is actually a filter, not just a readable stream. +// So, you should pipe a tarball stream into it, and it needs these +// write/end methods to do that. +Parse.prototype.write = function (c) { + if (this._ended) { + // gnutar puts a LOT of nulls at the end. + // you can keep writing these things forever. + // Just ignore them. + for (var i = 0, l = c.length; i > l; i ++) { + if (c[i] !== 0) return this.error("write() after end()") + } + return + } + return this._stream.write(c) +} + +Parse.prototype.end = function (c) { + this._ended = true + return this._stream.end(c) +} + +// don't need to do anything, since we're just +// proxying the data up from the _stream. +// Just need to override the parent's "Not Implemented" +// error-thrower. +Parse.prototype._read = function () {} + +Parse.prototype._process = function (c) { + assert(c && c.length === 512, "block size should be 512") + + // one of three cases. + // 1. A new header + // 2. A part of a file/extended header + // 3. One of two or more EOF null blocks + + if (this._entry) { + var entry = this._entry + entry.write(c) + if (entry._remaining === 0) { + entry.end() + this._entry = null + } + } else { + // either zeroes or a header + var zero = true + for (var i = 0; i < 512 && zero; i ++) { + zero = c[i] === 0 + } + + // eof is *at least* 2 blocks of nulls, and then the end of the + // file. you can put blocks of nulls between entries anywhere, + // so appending one tarball to another is technically valid. + // ending without the eof null blocks is not allowed, however. + if (zero) { + if (this._eofStarted) + this._ended = true + this._eofStarted = true + } else { + this._eofStarted = false + this._startEntry(c) + } + } + + this.position += 512 +} + +// take a header chunk, start the right kind of entry. +Parse.prototype._startEntry = function (c) { + var header = new TarHeader(c) + , self = this + , entry + , ev + , EntryType + , onend + , meta = false + + if (null === header.size || !header.cksumValid) { + var e = new Error("invalid tar file") + e.header = header + e.tar_file_offset = this.position + e.tar_block = this.position / 512 + this.emit("error", e) + } + + switch (tar.types[header.type]) { + case "File": + case "OldFile": + case "Link": + case "SymbolicLink": + case "CharacterDevice": + case "BlockDevice": + case "Directory": + case "FIFO": + case "ContiguousFile": + case "GNUDumpDir": + // start a file. + // pass in any extended headers + // These ones consumers are typically most interested in. + EntryType = Entry + ev = "entry" + break + + case "GlobalExtendedHeader": + // extended headers that apply to the rest of the tarball + EntryType = ExtendedHeader + onend = function () { + self._global = self._global || {} + Object.keys(entry.fields).forEach(function (k) { + self._global[k] = entry.fields[k] + }) + } + ev = "globalExtendedHeader" + meta = true + break + + case "ExtendedHeader": + case "OldExtendedHeader": + // extended headers that apply to the next entry + EntryType = ExtendedHeader + onend = function () { + self._extended = entry.fields + } + ev = "extendedHeader" + meta = true + break + + case "NextFileHasLongLinkpath": + // set linkpath= in extended header + EntryType = BufferEntry + onend = function () { + self._extended = self._extended || {} + self._extended.linkpath = entry.body + } + ev = "longLinkpath" + meta = true + break + + case "NextFileHasLongPath": + case "OldGnuLongPath": + // set path= in file-extended header + EntryType = BufferEntry + onend = function () { + self._extended = self._extended || {} + self._extended.path = entry.body + } + ev = "longPath" + meta = true + break + + default: + // all the rest we skip, but still set the _entry + // member, so that we can skip over their data appropriately. + // emit an event to say that this is an ignored entry type? + EntryType = Entry + ev = "ignoredEntry" + break + } + + var global, extended + if (meta) { + global = extended = null + } else { + var global = this._global + var extended = this._extended + + // extendedHeader only applies to one entry, so once we start + // an entry, it's over. + this._extended = null + } + entry = new EntryType(header, extended, global) + entry.meta = meta + + // only proxy data events of normal files. + if (!meta) { + entry.on("data", function (c) { + me.emit("data", c) + }) + } + + if (onend) entry.on("end", onend) + + this._entry = entry + var me = this + + entry.on("pause", function () { + me.pause() + }) + + entry.on("resume", function () { + me.resume() + }) + + if (this.listeners("*").length) { + this.emit("*", ev, entry) + } + + this.emit(ev, entry) + + // Zero-byte entry. End immediately. + if (entry.props.size === 0) { + entry.end() + this._entry = null + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/LICENCE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/LICENCE new file mode 100644 index 0000000..74489e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/LICENCE @@ -0,0 +1,25 @@ +Copyright (c) Isaac Z. Schlueter +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/README.md new file mode 100644 index 0000000..c16e9c4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/README.md @@ -0,0 +1,14 @@ +# block-stream + +A stream of blocks. + +Write data into it, and it'll output data in buffer blocks the size you +specify, padding with zeroes if necessary. + +```javascript +var block = new BlockStream(512) +fs.createReadStream("some-file").pipe(block) +block.pipe(fs.createWriteStream("block-file")) +``` + +When `.end()` or `.flush()` is called, it'll pad the block with zeroes. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js new file mode 100644 index 0000000..9328844 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js @@ -0,0 +1,70 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + f.pause() + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + f.resume() + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream.js new file mode 100644 index 0000000..1141f3a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/block-stream.js @@ -0,0 +1,68 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js new file mode 100644 index 0000000..93e4068 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js @@ -0,0 +1,70 @@ +var BlockStream = require("dropper") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + f.pause() + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + f.resume() + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper.js new file mode 100644 index 0000000..55fa133 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/bench/dropper.js @@ -0,0 +1,68 @@ +var BlockStream = require("dropper") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/block-stream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/block-stream.js new file mode 100644 index 0000000..008de03 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/block-stream.js @@ -0,0 +1,209 @@ +// write data to it, and it'll emit data in 512 byte blocks. +// if you .end() or .flush(), it'll emit whatever it's got, +// padded with nulls to 512 bytes. + +module.exports = BlockStream + +var Stream = require("stream").Stream + , inherits = require("inherits") + , assert = require("assert").ok + , debug = process.env.DEBUG ? console.error : function () {} + +function BlockStream (size, opt) { + this.writable = this.readable = true + this._opt = opt || {} + this._chunkSize = size || 512 + this._offset = 0 + this._buffer = [] + this._bufferLength = 0 + if (this._opt.nopad) this._zeroes = false + else { + this._zeroes = new Buffer(this._chunkSize) + for (var i = 0; i < this._chunkSize; i ++) { + this._zeroes[i] = 0 + } + } +} + +inherits(BlockStream, Stream) + +BlockStream.prototype.write = function (c) { + // debug(" BS write", c) + if (this._ended) throw new Error("BlockStream: write after end") + if (c && !Buffer.isBuffer(c)) c = new Buffer(c + "") + if (c.length) { + this._buffer.push(c) + this._bufferLength += c.length + } + // debug("pushed onto buffer", this._bufferLength) + if (this._bufferLength >= this._chunkSize) { + if (this._paused) { + // debug(" BS paused, return false, need drain") + this._needDrain = true + return false + } + this._emitChunk() + } + return true +} + +BlockStream.prototype.pause = function () { + // debug(" BS pausing") + this._paused = true +} + +BlockStream.prototype.resume = function () { + // debug(" BS resume") + this._paused = false + return this._emitChunk() +} + +BlockStream.prototype.end = function (chunk) { + // debug("end", chunk) + if (typeof chunk === "function") cb = chunk, chunk = null + if (chunk) this.write(chunk) + this._ended = true + this.flush() +} + +BlockStream.prototype.flush = function () { + this._emitChunk(true) +} + +BlockStream.prototype._emitChunk = function (flush) { + // debug("emitChunk flush=%j emitting=%j paused=%j", flush, this._emitting, this._paused) + + // emit a chunk + if (flush && this._zeroes) { + // debug(" BS push zeroes", this._bufferLength) + // push a chunk of zeroes + var padBytes = (this._bufferLength % this._chunkSize) + if (padBytes !== 0) padBytes = this._chunkSize - padBytes + if (padBytes > 0) { + // debug("padBytes", padBytes, this._zeroes.slice(0, padBytes)) + this._buffer.push(this._zeroes.slice(0, padBytes)) + this._bufferLength += padBytes + // debug(this._buffer[this._buffer.length - 1].length, this._bufferLength) + } + } + + if (this._emitting || this._paused) return + this._emitting = true + + // debug(" BS entering loops") + var bufferIndex = 0 + while (this._bufferLength >= this._chunkSize && + (flush || !this._paused)) { + // debug(" BS data emission loop", this._bufferLength) + + var out + , outOffset = 0 + , outHas = this._chunkSize + + while (outHas > 0 && (flush || !this._paused) ) { + // debug(" BS data inner emit loop", this._bufferLength) + var cur = this._buffer[bufferIndex] + , curHas = cur.length - this._offset + // debug("cur=", cur) + // debug("curHas=%j", curHas) + // If it's not big enough to fill the whole thing, then we'll need + // to copy multiple buffers into one. However, if it is big enough, + // then just slice out the part we want, to save unnecessary copying. + // Also, need to copy if we've already done some copying, since buffers + // can't be joined like cons strings. + if (out || curHas < outHas) { + out = out || new Buffer(this._chunkSize) + cur.copy(out, outOffset, + this._offset, this._offset + Math.min(curHas, outHas)) + } else if (cur.length === outHas && this._offset === 0) { + // shortcut -- cur is exactly long enough, and no offset. + out = cur + } else { + // slice out the piece of cur that we need. + out = cur.slice(this._offset, this._offset + outHas) + } + + if (curHas > outHas) { + // means that the current buffer couldn't be completely output + // update this._offset to reflect how much WAS written + this._offset += outHas + outHas = 0 + } else { + // output the entire current chunk. + // toss it away + outHas -= curHas + outOffset += curHas + bufferIndex ++ + this._offset = 0 + } + } + + this._bufferLength -= this._chunkSize + assert(out.length === this._chunkSize) + // debug("emitting data", out) + // debug(" BS emitting, paused=%j", this._paused, this._bufferLength) + this.emit("data", out) + out = null + } + // debug(" BS out of loops", this._bufferLength) + + // whatever is left, it's not enough to fill up a block, or we're paused + this._buffer = this._buffer.slice(bufferIndex) + if (this._paused) { + // debug(" BS paused, leaving", this._bufferLength) + this._needsDrain = true + this._emitting = false + return + } + + // if flushing, and not using null-padding, then need to emit the last + // chunk(s) sitting in the queue. We know that it's not enough to + // fill up a whole block, because otherwise it would have been emitted + // above, but there may be some offset. + var l = this._buffer.length + if (flush && !this._zeroes && l) { + if (l === 1) { + if (this._offset) { + this.emit("data", this._buffer[0].slice(this._offset)) + } else { + this.emit("data", this._buffer[0]) + } + } else { + var outHas = this._bufferLength + , out = new Buffer(outHas) + , outOffset = 0 + for (var i = 0; i < l; i ++) { + var cur = this._buffer[i] + , curHas = cur.length - this._offset + cur.copy(out, outOffset, this._offset) + this._offset = 0 + outOffset += curHas + this._bufferLength -= curHas + } + this.emit("data", out) + } + // truncate + this._buffer.length = 0 + this._bufferLength = 0 + this._offset = 0 + } + + // now either drained or ended + // debug("either draining, or ended", this._bufferLength, this._ended) + // means that we've flushed out all that we can so far. + if (this._needDrain) { + // debug("emitting drain", this._bufferLength) + this._needDrain = false + this.emit("drain") + } + + if ((this._bufferLength === 0) && this._ended && !this._endEmitted) { + // debug("emitting end", this._bufferLength) + this._endEmitted = true + this.emit("end") + } + + this._emitting = false + + // debug(" BS no longer emitting", flush, this._paused, this._emitting, this._bufferLength, this._chunkSize) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/package.json new file mode 100644 index 0000000..b9be4d9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/package.json @@ -0,0 +1,54 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "block-stream", + "description": "a stream of blocks", + "version": "0.0.7", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/block-stream.git" + }, + "engines": { + "node": "0.4 || >=0.5.8" + }, + "main": "block-stream.js", + "dependencies": { + "inherits": "~2.0.0" + }, + "devDependencies": { + "tap": "0.x" + }, + "scripts": { + "test": "tap test/" + }, + "license": "BSD", + "readme": "# block-stream\n\nA stream of blocks.\n\nWrite data into it, and it'll output data in buffer blocks the size you\nspecify, padding with zeroes if necessary.\n\n```javascript\nvar block = new BlockStream(512)\nfs.createReadStream(\"some-file\").pipe(block)\nblock.pipe(fs.createWriteStream(\"block-file\"))\n```\n\nWhen `.end()` or `.flush()` is called, it'll pad the block with zeroes.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/block-stream/issues" + }, + "_id": "block-stream@0.0.7", + "dist": { + "shasum": "9088ab5ae1e861f4d81b176b4a8046080703deed", + "tarball": "http://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "_from": "block-stream@*", + "_npmVersion": "1.3.4", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "9088ab5ae1e861f4d81b176b4a8046080703deed", + "_resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz", + "homepage": "https://github.com/isaacs/block-stream" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/basic.js new file mode 100644 index 0000000..b4b9305 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/basic.js @@ -0,0 +1,27 @@ +var tap = require("tap") + , BlockStream = require("../block-stream.js") + +tap.test("basic test", function (t) { + var b = new BlockStream(16) + var fs = require("fs") + var fstr = fs.createReadStream(__filename, {encoding: "utf8"}) + fstr.pipe(b) + + var stat + t.doesNotThrow(function () { + stat = fs.statSync(__filename) + }, "stat should not throw") + + var totalBytes = 0 + b.on("data", function (c) { + t.equal(c.length, 16, "chunks should be 16 bytes long") + t.type(c, Buffer, "chunks should be buffer objects") + totalBytes += c.length + }) + b.on("end", function () { + var expectedBytes = stat.size + (16 - stat.size % 16) + t.equal(totalBytes, expectedBytes, "Should be multiple of 16") + t.end() + }) + +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js new file mode 100644 index 0000000..7a8de88 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js @@ -0,0 +1,68 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16]//, 25]//, 1024] + , writeSizes = [4, 15, 16, 17, 64 ]//, 64, 100] + , writeCounts = [1, 10]//, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad.js new file mode 100644 index 0000000..6d38429 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/nopad.js @@ -0,0 +1,57 @@ +var BlockStream = require("../") +var tap = require("tap") + + +tap.test("don't pad, small writes", function (t) { + var f = new BlockStream(16, { nopad: true }) + t.plan(1) + + f.on("data", function (c) { + t.equal(c.toString(), "abc", "should get 'abc'") + }) + + f.on("end", function () { t.end() }) + + f.write(new Buffer("a")) + f.write(new Buffer("b")) + f.write(new Buffer("c")) + f.end() +}) + +tap.test("don't pad, exact write", function (t) { + var f = new BlockStream(16, { nopad: true }) + t.plan(1) + + var first = true + f.on("data", function (c) { + if (first) { + first = false + t.equal(c.toString(), "abcdefghijklmnop", "first chunk") + } else { + t.fail("should only get one") + } + }) + + f.on("end", function () { t.end() }) + + f.end(new Buffer("abcdefghijklmnop")) +}) + +tap.test("don't pad, big write", function (t) { + var f = new BlockStream(16, { nopad: true }) + t.plan(2) + + var first = true + f.on("data", function (c) { + if (first) { + first = false + t.equal(c.toString(), "abcdefghijklmnop", "first chunk") + } else { + t.equal(c.toString(), "q") + } + }) + + f.on("end", function () { t.end() }) + + f.end(new Buffer("abcdefghijklmnopq")) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/pause-resume.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/pause-resume.js new file mode 100644 index 0000000..64d0d09 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/pause-resume.js @@ -0,0 +1,73 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16] + , writeSizes = [15, 16, 17] + , writeCounts = [1, 10]//, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + var paused = false + + f.on("data", function (c) { + timeouts ++ + t.notOk(paused, "should not be paused when emitting data") + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + paused = true + f.pause() + process.nextTick(function () { + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + paused = false + f.resume() + timeouts -- + }) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = expectChunks * blockSize + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 200) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/thorough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/thorough.js new file mode 100644 index 0000000..1cc9ea0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/thorough.js @@ -0,0 +1,68 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16]//, 25]//, 1024] + , writeSizes = [4, 15, 16, 17, 64 ]//, 64, 100] + , writeCounts = [1, 10]//, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = expectChunks * blockSize + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/two-stream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/two-stream.js new file mode 100644 index 0000000..c6db79a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/block-stream/test/two-stream.js @@ -0,0 +1,59 @@ +var log = console.log, + assert = require( 'assert' ), + BlockStream = require("../block-stream.js"), + isize = 0, tsize = 0, fsize = 0, psize = 0, i = 0, + filter = null, paper = null, stack = null, + +// a source data buffer +tsize = 1 * 1024; // <- 1K +stack = new Buffer( tsize ); +for ( ; i < tsize; i++) stack[i] = "x".charCodeAt(0); + +isize = 1 * 1024; // <- initial packet size with 4K no bug! +fsize = 2 * 1024 ; // <- first block-stream size +psize = Math.ceil( isize / 6 ); // <- second block-stream size + +fexpected = Math.ceil( tsize / fsize ); // <- packets expected for first +pexpected = Math.ceil( tsize / psize ); // <- packets expected for second + + +filter = new BlockStream( fsize, { nopad : true } ); +paper = new BlockStream( psize, { nopad : true } ); + + +var fcounter = 0; +filter.on( 'data', function (c) { + // verify that they're not null-padded + for (var i = 0; i < c.length; i ++) { + assert.strictEqual(c[i], "x".charCodeAt(0)) + } + ++fcounter; +} ); + +var pcounter = 0; +paper.on( 'data', function (c) { + // verify that they're not null-padded + for (var i = 0; i < c.length; i ++) { + assert.strictEqual(c[i], "x".charCodeAt(0)) + } + ++pcounter; +} ); + +filter.pipe( paper ); + +filter.on( 'end', function () { + log("fcounter: %s === %s", fcounter, fexpected) + assert.strictEqual( fcounter, fexpected ); +} ); + +paper.on( 'end', function () { + log("pcounter: %s === %s", pcounter, pexpected); + assert.strictEqual( pcounter, pexpected ); +} ); + + +for ( i = 0, j = isize; j <= tsize; j += isize ) { + filter.write( stack.slice( j - isize, j ) ); +} + +filter.end(); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits_browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/package.json new file mode 100644 index 0000000..754a114 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/package.json @@ -0,0 +1,51 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "_id": "inherits@2.0.1", + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@2", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/package.json new file mode 100644 index 0000000..ea072cb --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/package.json @@ -0,0 +1,54 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "tar", + "description": "tar for node", + "version": "0.1.20", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-tar.git" + }, + "main": "tar.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "block-stream": "*", + "fstream": "~0.1.28", + "inherits": "2" + }, + "devDependencies": { + "tap": "0.x", + "rimraf": "1.x" + }, + "license": "BSD", + "gitHead": "b5931010907cd1ef5a186bc947954391050cbcce", + "bugs": { + "url": "https://github.com/isaacs/node-tar/issues" + }, + "homepage": "https://github.com/isaacs/node-tar", + "_id": "tar@0.1.20", + "_shasum": "42940bae5b5f22c74483699126f9f3f27449cb13", + "_from": "tar@~0.1.17", + "_npmVersion": "1.4.16", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "42940bae5b5f22c74483699126f9f3f27449cb13", + "tarball": "http://registry.npmjs.org/tar/-/tar-0.1.20.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/tar/-/tar-0.1.20.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/tar.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/tar.js new file mode 100644 index 0000000..a81298b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/tar.js @@ -0,0 +1,173 @@ +// field paths that every tar file must have. +// header is padded to 512 bytes. +var f = 0 + , fields = {} + , path = fields.path = f++ + , mode = fields.mode = f++ + , uid = fields.uid = f++ + , gid = fields.gid = f++ + , size = fields.size = f++ + , mtime = fields.mtime = f++ + , cksum = fields.cksum = f++ + , type = fields.type = f++ + , linkpath = fields.linkpath = f++ + , headerSize = 512 + , blockSize = 512 + , fieldSize = [] + +fieldSize[path] = 100 +fieldSize[mode] = 8 +fieldSize[uid] = 8 +fieldSize[gid] = 8 +fieldSize[size] = 12 +fieldSize[mtime] = 12 +fieldSize[cksum] = 8 +fieldSize[type] = 1 +fieldSize[linkpath] = 100 + +// "ustar\0" may introduce another bunch of headers. +// these are optional, and will be nulled out if not present. + +var ustar = fields.ustar = f++ + , ustarver = fields.ustarver = f++ + , uname = fields.uname = f++ + , gname = fields.gname = f++ + , devmaj = fields.devmaj = f++ + , devmin = fields.devmin = f++ + , prefix = fields.prefix = f++ + , fill = fields.fill = f++ + +// terminate fields. +fields[f] = null + +fieldSize[ustar] = 6 +fieldSize[ustarver] = 2 +fieldSize[uname] = 32 +fieldSize[gname] = 32 +fieldSize[devmaj] = 8 +fieldSize[devmin] = 8 +fieldSize[prefix] = 155 +fieldSize[fill] = 12 + +// nb: prefix field may in fact be 130 bytes of prefix, +// a null char, 12 bytes for atime, 12 bytes for ctime. +// +// To recognize this format: +// 1. prefix[130] === ' ' or '\0' +// 2. atime and ctime are octal numeric values +// 3. atime and ctime have ' ' in their last byte + +var fieldEnds = {} + , fieldOffs = {} + , fe = 0 +for (var i = 0; i < f; i ++) { + fieldOffs[i] = fe + fieldEnds[i] = (fe += fieldSize[i]) +} + +// build a translation table of field paths. +Object.keys(fields).forEach(function (f) { + if (fields[f] !== null) fields[fields[f]] = f +}) + +// different values of the 'type' field +// paths match the values of Stats.isX() functions, where appropriate +var types = + { 0: "File" + , "\0": "OldFile" // like 0 + , "": "OldFile" + , 1: "Link" + , 2: "SymbolicLink" + , 3: "CharacterDevice" + , 4: "BlockDevice" + , 5: "Directory" + , 6: "FIFO" + , 7: "ContiguousFile" // like 0 + // posix headers + , g: "GlobalExtendedHeader" // k=v for the rest of the archive + , x: "ExtendedHeader" // k=v for the next file + // vendor-specific stuff + , A: "SolarisACL" // skip + , D: "GNUDumpDir" // like 5, but with data, which should be skipped + , I: "Inode" // metadata only, skip + , K: "NextFileHasLongLinkpath" // data = link path of next file + , L: "NextFileHasLongPath" // data = path of next file + , M: "ContinuationFile" // skip + , N: "OldGnuLongPath" // like L + , S: "SparseFile" // skip + , V: "TapeVolumeHeader" // skip + , X: "OldExtendedHeader" // like x + } + +Object.keys(types).forEach(function (t) { + types[types[t]] = types[types[t]] || t +}) + +// values for the mode field +var modes = + { suid: 04000 // set uid on extraction + , sgid: 02000 // set gid on extraction + , svtx: 01000 // set restricted deletion flag on dirs on extraction + , uread: 0400 + , uwrite: 0200 + , uexec: 0100 + , gread: 040 + , gwrite: 020 + , gexec: 010 + , oread: 4 + , owrite: 2 + , oexec: 1 + , all: 07777 + } + +var numeric = + { mode: true + , uid: true + , gid: true + , size: true + , mtime: true + , devmaj: true + , devmin: true + , cksum: true + , atime: true + , ctime: true + , dev: true + , ino: true + , nlink: true + } + +Object.keys(modes).forEach(function (t) { + modes[modes[t]] = modes[modes[t]] || t +}) + +var knownExtended = + { atime: true + , charset: true + , comment: true + , ctime: true + , gid: true + , gname: true + , linkpath: true + , mtime: true + , path: true + , realtime: true + , security: true + , size: true + , uid: true + , uname: true } + + +exports.fields = fields +exports.fieldSize = fieldSize +exports.fieldOffs = fieldOffs +exports.fieldEnds = fieldEnds +exports.types = types +exports.modes = modes +exports.numeric = numeric +exports.headerSize = headerSize +exports.blockSize = blockSize +exports.knownExtended = knownExtended + +exports.Pack = require("./lib/pack.js") +exports.Parse = require("./lib/parse.js") +exports.Extract = require("./lib/extract.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/00-setup-fixtures.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/00-setup-fixtures.js new file mode 100644 index 0000000..1524ff7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/00-setup-fixtures.js @@ -0,0 +1,53 @@ +// the fixtures have some weird stuff that is painful +// to include directly in the repo for various reasons. +// +// So, unpack the fixtures with the system tar first. +// +// This means, of course, that it'll only work if you +// already have a tar implementation, and some of them +// will not properly unpack the fixtures anyway. +// +// But, since usually those tests will fail on Windows +// and other systems with less capable filesystems anyway, +// at least this way we don't cause inconveniences by +// merely cloning the repo or installing the package. + +var tap = require("tap") +, child_process = require("child_process") +, rimraf = require("rimraf") +, test = tap.test +, path = require("path") + +test("clean fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "rimraf ./fixtures/") + t.end() + }) +}) + +test("clean tmp", function (t) { + rimraf(path.resolve(__dirname, "tmp"), function (er) { + t.ifError(er, "rimraf ./tmp/") + t.end() + }) +}) + +test("extract fixtures", function (t) { + var c = child_process.spawn("tar" + ,["xzvf", "fixtures.tgz"] + ,{ cwd: __dirname }) + + c.stdout.on("data", errwrite) + c.stderr.on("data", errwrite) + function errwrite (chunk) { + process.stderr.write(chunk) + } + + c.on("exit", function (code) { + t.equal(code, 0, "extract fixtures should exit with 0") + if (code) { + t.comment("Note, all tests from here on out will fail because of this.") + } + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/extract.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/extract.js new file mode 100644 index 0000000..a68144b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/extract.js @@ -0,0 +1,367 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + , target = path.resolve(__dirname, "tmp/extract-test") + , index = 0 + , fstream = require("fstream") + + , ee = 0 + , expectEntries = +[ { path: 'c.txt', + mode: '644', + type: '0', + depth: undefined, + size: 513, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'cc.txt', + mode: '644', + type: '0', + depth: undefined, + size: 513, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 100, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'Ω.txt', + mode: '644', + type: '0', + depth: undefined, + size: 2, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'Ω.txt', + mode: '644', + type: '0', + depth: undefined, + size: 2, + linkpath: '', + nlink: 1, + dev: 234881026, + ino: 51693379 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 200, + linkpath: '', + nlink: 1, + dev: 234881026, + ino: 51681874 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 201, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: '777', + type: '2', + depth: undefined, + size: 0, + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: '200-hard', + mode: '644', + type: '0', + depth: undefined, + size: 200, + linkpath: '', + nlink: 2, + dev: 234881026, + ino: 51681874 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '1', + depth: undefined, + size: 0, + linkpath: path.resolve(target, '200-hard'), + nlink: 2, + dev: 234881026, + ino: 51681874 } ] + + , ef = 0 + , expectFiles = +[ { path: '', + mode: '40755', + type: 'Directory', + depth: 0, + linkpath: undefined }, + { path: '/200-hard', + mode: '100644', + type: 'File', + depth: 1, + size: 200, + linkpath: undefined, + nlink: 2 }, + { path: '/200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: '120755', + type: 'SymbolicLink', + depth: 1, + size: 200, + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + nlink: 1 }, + { path: '/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '100644', + type: 'Link', + depth: 1, + size: 200, + linkpath: path.join(target, '200-hard'), + nlink: 2 }, + { path: '/c.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 513, + linkpath: undefined, + nlink: 1 }, + { path: '/cc.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 513, + linkpath: undefined, + nlink: 1 }, + { path: '/r', + mode: '40755', + type: 'Directory', + depth: 1, + linkpath: undefined }, + { path: '/r/e', + mode: '40755', + type: 'Directory', + depth: 2, + linkpath: undefined }, + { path: '/r/e/a', + mode: '40755', + type: 'Directory', + depth: 3, + linkpath: undefined }, + { path: '/r/e/a/l', + mode: '40755', + type: 'Directory', + depth: 4, + linkpath: undefined }, + { path: '/r/e/a/l/l', + mode: '40755', + type: 'Directory', + depth: 5, + linkpath: undefined }, + { path: '/r/e/a/l/l/y', + mode: '40755', + type: 'Directory', + depth: 6, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-', + mode: '40755', + type: 'Directory', + depth: 7, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d', + mode: '40755', + type: 'Directory', + depth: 8, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e', + mode: '40755', + type: 'Directory', + depth: 9, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e', + mode: '40755', + type: 'Directory', + depth: 10, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p', + mode: '40755', + type: 'Directory', + depth: 11, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-', + mode: '40755', + type: 'Directory', + depth: 12, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f', + mode: '40755', + type: 'Directory', + depth: 13, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o', + mode: '40755', + type: 'Directory', + depth: 14, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l', + mode: '40755', + type: 'Directory', + depth: 15, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d', + mode: '40755', + type: 'Directory', + depth: 16, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e', + mode: '40755', + type: 'Directory', + depth: 17, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r', + mode: '40755', + type: 'Directory', + depth: 18, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-', + mode: '40755', + type: 'Directory', + depth: 19, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p', + mode: '40755', + type: 'Directory', + depth: 20, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a', + mode: '40755', + type: 'Directory', + depth: 21, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', + mode: '40755', + type: 'Directory', + depth: 22, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h', + mode: '40755', + type: 'Directory', + depth: 23, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '100644', + type: 'File', + depth: 24, + size: 100, + linkpath: undefined, + nlink: 1 }, + { path: '/Ω.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 2, + linkpath: undefined, + nlink: 1 } ] + + + +// The extract class basically just pipes the input +// to a Reader, and then to a fstream.DirWriter + +// So, this is as much a test of fstream.Reader and fstream.Writer +// as it is of tar.Extract, but it sort of makes sense. + +tap.test("preclean", function (t) { + require("rimraf").sync(__dirname + "/tmp/extract-test") + t.pass("cleaned!") + t.end() +}) + +tap.test("extract test", function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + // give it a weird buffer size to try to break in odd places + inp.bufferSize = 1234 + + inp.pipe(extract) + + extract.on("end", function () { + t.equal(ee, expectEntries.length, "should see "+ee+" entries") + + // should get no more entries after end + extract.removeAllListeners("entry") + extract.on("entry", function (e) { + t.fail("Should not get entries after end!") + }) + + next() + }) + + extract.on("entry", function (entry) { + var found = + { path: entry.path + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + , dev: entry.props.dev + , ino: entry.props.ino + } + + var wanted = expectEntries[ee ++] + + t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path) + }) + + function next () { + var r = fstream.Reader({ path: target + , type: "Directory" + // this is just to encourage consistency + , sort: "alpha" }) + + r.on("ready", function () { + foundEntry(r) + }) + + r.on("end", finish) + + function foundEntry (entry) { + var p = entry.path.substr(target.length) + var found = + { path: p + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + } + + var wanted = expectFiles[ef ++] + + t.has(found, wanted, "unpacked file " + ef + " " + wanted.path) + + entry.on("entry", foundEntry) + } + + function finish () { + t.equal(ef, expectFiles.length, "should have "+ef+" items") + t.end() + } + } +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/fixtures.tgz b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/fixtures.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4501bcf22695435b84edb3d4076cd9a70687b035 GIT binary patch literal 19205 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 b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + + +function runTest (t, doGH) { + var reader = Reader({ path: input + , filter: function () { + return !this.path.match(/\.(tar|hex)$/) + } + , sort: alphasort + }) + + var props = doGH ? pkg : {} + props.noProprietary = true + var pack = Pack(props) + var writer = Writer(target) + + // global header should be skipped regardless, since it has no content. + var entry = 0 + + t.ok(reader, "reader ok") + t.ok(pack, "pack ok") + t.ok(writer, "writer ok") + + pack.pipe(writer) + + var parse = tar.Parse() + t.ok(parse, "parser should be ok") + + pack.on("data", function (c) { + // console.error("PACK DATA") + if (c.length !== 512) { + // this one is too noisy, only assert if it'll be relevant + t.equal(c.length, 512, "parser should emit data in 512byte blocks") + } + parse.write(c) + }) + + pack.on("end", function () { + // console.error("PACK END") + t.pass("parser ends") + parse.end() + }) + + pack.on("error", function (er) { + t.fail("pack error", er) + }) + + parse.on("error", function (er) { + t.fail("parse error", er) + }) + + writer.on("error", function (er) { + t.fail("writer error", er) + }) + + reader.on("error", function (er) { + t.fail("reader error", er) + }) + + parse.on("*", function (ev, e) { + var wanted = entries[entry++] + if (!wanted) { + t.fail("unexpected event: "+ev) + return + } + t.equal(ev, wanted[0], "event type should be "+wanted[0]) + + if (ev !== wanted[0] || e.path !== wanted[1].path) { + console.error(wanted) + console.error([ev, e.props]) + e.on("end", function () { + console.error(e.fields) + throw "break" + }) + } + + t.has(e.props, wanted[1], "properties "+wanted[1].path) + if (wanted[2]) { + e.on("end", function () { + if (!e.fields) { + t.ok(e.fields, "should get fields") + } else { + t.has(e.fields, wanted[2], "should get expected fields") + } + }) + } + }) + + reader.pipe(pack) + + writer.on("close", function () { + t.equal(entry, entries.length, "should get all expected entries") + t.pass("it finished") + t.end() + }) + +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/pack.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/pack.js new file mode 100644 index 0000000..0f50994 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/pack.js @@ -0,0 +1,897 @@ + +// the symlink file is excluded from git, because it makes +// windows freak the hell out. +var fs = require("fs") + , path = require("path") + , symlink = path.resolve(__dirname, "fixtures/symlink") +try { fs.unlinkSync(symlink) } catch (e) {} +fs.symlinkSync("./hardlink-1", symlink) +process.on("exit", function () { + fs.unlinkSync(symlink) +}) + + +var tap = require("tap") + , tar = require("../tar.js") + , pkg = require("../package.json") + , Pack = tar.Pack + , fstream = require("fstream") + , Reader = fstream.Reader + , Writer = fstream.Writer + , input = path.resolve(__dirname, "fixtures/") + , target = path.resolve(__dirname, "tmp/pack.tar") + , uid = process.getuid ? process.getuid() : 0 + , gid = process.getgid ? process.getgid() : 0 + + , entries = + + // the global header and root fixtures/ dir are going to get + // a different date each time, so omit that bit. + // Also, dev/ino values differ across machines, so that's not + // included. + [ [ 'globalExtendedHeader', + { path: 'PaxHeader/', + mode: 438, + uid: 0, + gid: 0, + type: 'g', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { "NODETAR.author": pkg.author, + "NODETAR.name": pkg.name, + "NODETAR.description": pkg.description, + "NODETAR.version": pkg.version, + "NODETAR.repository.type": pkg.repository.type, + "NODETAR.repository.url": pkg.repository.url, + "NODETAR.main": pkg.main, + "NODETAR.scripts.test": pkg.scripts.test } ] + + , [ 'entry', + { path: 'fixtures/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + uid: uid, + gid: gid, + size: 200, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/a.txt', + mode: 420, + uid: uid, + gid: gid, + size: 257, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/b.txt', + mode: 420, + uid: uid, + gid: gid, + size: 512, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/c.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/cc.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/foo.js', + mode: 420, + uid: uid, + gid: gid, + size: 4, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-1', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-2', + mode: 420, + uid: uid, + gid: gid, + size: 0, + type: '1', + linkpath: 'fixtures/hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/star.4.html', + mode: 420, + uid: uid, + gid: gid, + size: 54081, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/packtest/Ω.txt', + 'NODETAR.depth': '2', + 'NODETAR.type': 'File', + nlink: 1, + uid: uid, + gid: gid, + size: 2, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '2', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 100, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/symlink', + uid: uid, + gid: gid, + size: 0, + type: '2', + linkpath: 'hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: "fixtures/Ω.txt" + , "NODETAR.depth": "1" + , "NODETAR.type": "File" + , nlink: 1 + , uid: uid + , gid: gid + , size: 2 + , "NODETAR.blksize": "4096" + , "NODETAR.blocks": "8" } ] + + , [ 'entry', + { path: 'fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + ] + + +// first, make sure that the hardlinks are actually hardlinks, or this +// won't work. Git has a way of replacing them with a copy. +var hard1 = path.resolve(__dirname, "fixtures/hardlink-1") + , hard2 = path.resolve(__dirname, "fixtures/hardlink-2") + , fs = require("fs") + +try { fs.unlinkSync(hard2) } catch (e) {} +fs.linkSync(hard1, hard2) + +tap.test("with global header", { timeout: 10000 }, function (t) { + runTest(t, true) +}) + +tap.test("without global header", { timeout: 10000 }, function (t) { + runTest(t, false) +}) + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + + +function runTest (t, doGH) { + var reader = Reader({ path: input + , filter: function () { + return !this.path.match(/\.(tar|hex)$/) + } + , sort: alphasort + }) + + var pack = Pack(doGH ? pkg : null) + var writer = Writer(target) + + // skip the global header if we're not doing that. + var entry = doGH ? 0 : 1 + + t.ok(reader, "reader ok") + t.ok(pack, "pack ok") + t.ok(writer, "writer ok") + + pack.pipe(writer) + + var parse = tar.Parse() + t.ok(parse, "parser should be ok") + + pack.on("data", function (c) { + // console.error("PACK DATA") + if (c.length !== 512) { + // this one is too noisy, only assert if it'll be relevant + t.equal(c.length, 512, "parser should emit data in 512byte blocks") + } + parse.write(c) + }) + + pack.on("end", function () { + // console.error("PACK END") + t.pass("parser ends") + parse.end() + }) + + pack.on("error", function (er) { + t.fail("pack error", er) + }) + + parse.on("error", function (er) { + t.fail("parse error", er) + }) + + writer.on("error", function (er) { + t.fail("writer error", er) + }) + + reader.on("error", function (er) { + t.fail("reader error", er) + }) + + parse.on("*", function (ev, e) { + var wanted = entries[entry++] + if (!wanted) { + t.fail("unexpected event: "+ev) + return + } + t.equal(ev, wanted[0], "event type should be "+wanted[0]) + + // if (ev !== wanted[0] || e.path !== wanted[1].path) { + // console.error(wanted) + // console.error([ev, e.props]) + // throw "break" + // } + + t.has(e.props, wanted[1], "properties "+wanted[1].path) + if (wanted[2]) { + e.on("end", function () { + if (!e.fields) { + t.ok(e.fields, "should get fields") + } else { + t.has(e.fields, wanted[2], "should get expected fields") + } + }) + } + }) + + reader.pipe(pack) + + writer.on("close", function () { + t.equal(entry, entries.length, "should get all expected entries") + t.pass("it finished") + t.end() + }) + +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/parse.js new file mode 100644 index 0000000..f765a50 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/parse.js @@ -0,0 +1,359 @@ +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + , index = 0 + + , expect = +[ [ 'entry', + { path: 'c.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 513, + mtime: new Date('Wed, 26 Oct 2011 01:10:58 GMT'), + cksum: 5422, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'cc.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 513, + mtime: new Date('Wed, 26 Oct 2011 01:11:02 GMT'), + cksum: 5525, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('Thu, 27 Oct 2011 03:43:23 GMT'), + cksum: 18124, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 2, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 5695, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 120, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 6702, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'Ω.txt', + ctime: 1319737909, + atime: 1319739061, + dev: 234881026, + ino: 51693379, + nlink: 1 } ], + [ 'entry', + { path: 'Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 2, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 5695, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + atime: new Date('Thu, 27 Oct 2011 18:11:01 GMT'), + dev: 234881026, + ino: 51693379, + nlink: 1 }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 353, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14488, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ctime: 1319686868, + atime: 1319741254, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 1 } ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 200, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14570, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + atime: new Date('Thu, 27 Oct 2011 18:47:34 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 1 }, + undefined ], + [ 'longPath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4976, + type: 'L', + linkpath: '', + ustar: false }, + '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 1000, + gid: 1000, + size: 201, + mtime: new Date('Thu, 27 Oct 2011 22:21:50 GMT'), + cksum: 14086, + type: '0', + linkpath: '', + ustar: false }, + undefined ], + [ 'longLinkpath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4975, + type: 'K', + linkpath: '', + ustar: false }, + '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ], + [ 'longPath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4976, + type: 'L', + linkpath: '', + ustar: false }, + '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL' ], + [ 'entry', + { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: 511, + uid: 1000, + gid: 1000, + size: 0, + mtime: new Date('Fri, 28 Oct 2011 23:05:17 GMT'), + cksum: 21603, + type: '2', + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ustar: false }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200-hard', + mode: 420, + uid: 24561, + gid: 20, + size: 143, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 6533, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { ctime: 1320617144, + atime: 1320617232, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 } ], + [ 'entry', + { path: '200-hard', + mode: 420, + uid: 24561, + gid: 20, + size: 200, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 5526, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'), + atime: new Date('Sun, 06 Nov 2011 22:07:12 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 353, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14488, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ctime: 1320617144, + atime: 1320617406, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 } ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 0, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 15173, + type: '1', + linkpath: '200-hard', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'), + atime: new Date('Sun, 06 Nov 2011 22:10:06 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 }, + undefined ] ] + + +tap.test("parser test", function (t) { + var parser = tar.Parse() + + parser.on("end", function () { + t.equal(index, expect.length, "saw all expected events") + t.end() + }) + + fs.createReadStream(file) + .pipe(parser) + .on("*", function (ev, entry) { + var wanted = expect[index] + if (!wanted) { + return t.fail("Unexpected event: " + ev) + } + var result = [ev, entry.props] + entry.on("end", function () { + result.push(entry.fields || entry.body) + + t.equal(ev, wanted[0], index + " event type") + t.equivalent(entry.props, wanted[1], wanted[1].path + " entry properties") + if (wanted[2]) { + t.equivalent(result[2], wanted[2], "metadata values") + } + index ++ + }) + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/zz-cleanup.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/zz-cleanup.js new file mode 100644 index 0000000..a00ff7f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/tar/test/zz-cleanup.js @@ -0,0 +1,20 @@ +// clean up the fixtures + +var tap = require("tap") +, rimraf = require("rimraf") +, test = tap.test +, path = require("path") + +test("clean fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "rimraf ./fixtures/") + t.end() + }) +}) + +test("clean tmp", function (t) { + rimraf(path.resolve(__dirname, "tmp"), function (er) { + t.ifError(er, "rimraf ./tmp/") + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENCE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENCE new file mode 100644 index 0000000..74489e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENCE @@ -0,0 +1,25 @@ +Copyright (c) Isaac Z. Schlueter +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md new file mode 100644 index 0000000..8116675 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md @@ -0,0 +1,17 @@ +Use this module to convert a username/groupname to a uid/gid number. + +Usage: + +``` +npm install uid-number +``` + +Then, in your node program: + +```javascript +var uidNumber = require("uid-number") +uidNumber("isaacs", function (er, uid, gid) { + // gid is null because we didn't ask for a group name + // uid === 24561 because that's my number. +}) +``` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js new file mode 100755 index 0000000..0b39174 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js @@ -0,0 +1,24 @@ +if (module !== require.main) { + throw new Error("This file should not be loaded with require()") +} + +if (!process.getuid || !process.getgid) { + throw new Error("this file should not be called without uid/gid support") +} + +var argv = process.argv.slice(2) + , user = argv[0] || process.getuid() + , group = argv[1] || process.getgid() + +if (!isNaN(user)) user = +user +if (!isNaN(group)) group = +group + +console.error([user, group]) + +try { + process.setgid(group) + process.setuid(user) + console.log(JSON.stringify({uid:+process.getuid(), gid:+process.getgid()})) +} catch (ex) { + console.log(JSON.stringify({error:ex.message,errno:ex.errno})) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json new file mode 100644 index 0000000..fc9e2f7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json @@ -0,0 +1,45 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "uid-number", + "description": "Convert a username/group name to a uid/gid number", + "version": "0.0.3", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/uid-number.git" + }, + "main": "uid-number.js", + "dependencies": {}, + "devDependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "license": "BSD", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "_id": "uid-number@0.0.3", + "_engineSupported": true, + "_npmVersion": "1.1.23", + "_nodeVersion": "v0.7.10-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "cefb0fa138d8d8098da71a40a0d04a8327d6e1cc", + "tarball": "http://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "cefb0fa138d8d8098da71a40a0d04a8327d6e1cc", + "_from": "uid-number@0.0.3", + "_resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js new file mode 100644 index 0000000..93f372b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js @@ -0,0 +1,54 @@ +module.exports = uidNumber + +// This module calls into get-uid-gid.js, which sets the +// uid and gid to the supplied argument, in order to find out their +// numeric value. This can't be done in the main node process, +// because otherwise node would be running as that user from this +// point on. + +var child_process = require("child_process") + , path = require("path") + , uidSupport = process.getuid && process.setuid + , uidCache = {} + , gidCache = {} + +function uidNumber (uid, gid, cb) { + if (!uidSupport) return cb() + if (typeof cb !== "function") cb = gid, gid = null + if (typeof cb !== "function") cb = uid, uid = null + if (gid == null) gid = process.getgid() + if (uid == null) uid = process.getuid() + if (!isNaN(gid)) gid = uidCache[gid] = +gid + if (!isNaN(uid)) uid = uidCache[uid] = +uid + + if (uidCache.hasOwnProperty(uid)) uid = uidCache[uid] + if (gidCache.hasOwnProperty(gid)) gid = gidCache[gid] + + if (typeof gid === "number" && typeof uid === "number") { + return process.nextTick(cb.bind(null, null, uid, gid)) + } + + var getter = require.resolve("./get-uid-gid.js") + + child_process.execFile( process.execPath + , [getter, uid, gid] + , function (code, out, err) { + if (er) return cb(new Error("could not get uid/gid\n" + err)) + try { + out = JSON.parse(out+"") + } catch (ex) { + return cb(ex) + } + + if (out.error) { + var er = new Error(out.error) + er.errno = out.errno + return cb(er) + } + + if (isNaN(out.uid) || isNaN(out.gid)) return cb(new Error( + "Could not get uid/gid: "+JSON.stringify(out))) + + cb(null, uidCache[uid] = +out.uid, uidCache[gid] = +out.gid) + }) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/package.json new file mode 100644 index 0000000..1e66035 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/package.json @@ -0,0 +1,54 @@ +{ + "name": "tar-pack", + "version": "2.0.0", + "description": "Package and un-package modules of some sort (in tar/gz bundles).", + "scripts": { + "test": "mocha -R list" + }, + "repository": { + "type": "git", + "url": "https://github.com/ForbesLindesay/tar-pack.git" + }, + "license": "BSD", + "optionalDependencies": { + "graceful-fs": "1.2" + }, + "dependencies": { + "uid-number": "0.0.3", + "once": "~1.1.1", + "debug": "~0.7.2", + "rimraf": "~2.2.0", + "fstream": "~0.1.22", + "tar": "~0.1.17", + "fstream-ignore": "0.0.7", + "readable-stream": "~1.0.2", + "graceful-fs": "1.2" + }, + "devDependencies": { + "mocha": "*", + "rfile": "*", + "mkdirp": "*" + }, + "readme": "# Tar Pack\r\n\r\nPackage and un-package modules of some sort (in tar/gz bundles). This is mostly useful for package managers. Note that it doesn't check for or touch `package.json` so it can be used even if that's not the way you store your package info.\r\n\r\n[![Build Status](https://travis-ci.org/ForbesLindesay/tar-pack.png?branch=master)](https://travis-ci.org/ForbesLindesay/tar-pack)\r\n[![Dependency Status](https://gemnasium.com/ForbesLindesay/tar-pack.png)](https://gemnasium.com/ForbesLindesay/tar-pack)\r\n[![NPM version](https://badge.fury.io/js/tar-pack.png)](http://badge.fury.io/js/tar-pack)\r\n\r\n## Installation\r\n\r\n $ npm install tar-pack\r\n\r\n## API\r\n\r\n### pack(folder|packer, [options])\r\n\r\nPack the folder at `folder` into a gzipped tarball and return the tgz as a stream. Files ignored by `.gitignore` will not be in the package.\r\n\r\nYou can optionally pass a `fstream.DirReader` directly, instead of folder. For example, to create an npm package, do:\r\n\r\n```js\r\npack(require(\"fstream-npm\")(folder), [options])\r\n```\r\n\r\nOptions:\r\n\r\n - `noProprietary` (defaults to `false`) Set this to `true` to prevent any proprietary attributes being added to the tarball. These attributes are allowed by the spec, but may trip up some poorly written tarball parsers.\r\n - `ignoreFiles` (defaults to `['.gitignore']`) These files can specify files to be excluded from the package using the syntax of `.gitignore`. This option is ignored if you parse a `fstream.DirReader` instead of a string for folder.\r\n - `filter` (defaults to `entry => true`) A function that takes an entry and returns `true` if it should be included in the package and `false` if it should not. Entryies are of the form `{path, basename, dirname, type}` where (type is \"Directory\" or \"File\"). This function is ignored if you parse a `fstream.DirReader` instead of a string for folder.\r\n\r\nExample:\r\n\r\n```js\r\nvar write = require('fs').createWriteStream\r\nvar pack = require('tar-pack').pack\r\npack(process.cwd())\r\n .pipe(write(__dirname + '/package.tar.gz'))\r\n .on('error', function (err) {\r\n console.error(err.stack)\r\n })\r\n .on('close', function () {\r\n console.log('done')\r\n })\r\n```\r\n\r\n### unpack(folder, [options,] cb)\r\n\r\nReturn a stream that unpacks a tarball into a folder at `folder`. N.B. the output folder will be removed first if it already exists.\r\n\r\nThe callback is called with an optional error and, as its second argument, a string which is one of:\r\n\r\n - `'directory'`, indicating that the extracted package was a directory (either `.tar.gz` or `.tar`)\r\n - `'file'`, incating that the extracted package was just a single file (extracted to `defaultName`, see options)\r\n\r\nBasic Options:\r\n\r\n - `defaultName` (defaults to `index.js`) If the package is a single file, rather than a tarball, it will be \"extracted\" to this file name, set to `false` to disable.\r\n\r\nAdvanced Options (you probably don't need any of these):\r\n\r\n - `gid` - (defaults to `null`) the `gid` to use when writing files\r\n - `uid` - (defaults to `null`) the `uid` to use when writing files\r\n - `dmode` - (defaults to `0777`) The mode to use when creating directories\r\n - `fmode` - (defaults to `0666`) The mode to use when creating files\r\n - `unsafe` - (defaults to `false`) (on non win32 OSes it overrides `gid` and `uid` with the current processes IDs)\r\n\r\nExample:\r\n\r\n```js\r\nvar read = require('fs').createReadStream\r\nvar unpack = require('tar-pack').unpack\r\nread(process.cwd() + '/package.tar.gz')\r\n .pipe(unpack(__dirname + '/package/', function (err) {\r\n if (err) console.error(err.stack)\r\n else console.log('done')\r\n }))\r\n```\r\n\r\n## License\r\n\r\n BSD", + "readmeFilename": "README.md", + "_id": "tar-pack@2.0.0", + "dist": { + "shasum": "c2c401c02dd366138645e917b3a6baa256a9dcab", + "tarball": "http://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz" + }, + "_from": "tar-pack@~2.0.0", + "_npmVersion": "1.2.10", + "_npmUser": { + "name": "forbeslindesay", + "email": "forbes@lindesay.co.uk" + }, + "maintainers": [ + { + "name": "forbeslindesay", + "email": "forbes@lindesay.co.uk" + } + ], + "directories": {}, + "_shasum": "c2c401c02dd366138645e917b3a6baa256a9dcab", + "_resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-2.0.0.tgz" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt new file mode 100644 index 0000000..ba0e162 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt @@ -0,0 +1 @@ +bar \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar new file mode 100644 index 0000000000000000000000000000000000000000..35fd1745182fd4c3c4572a7d11e0d9f2f41658b3 GIT binary patch literal 3584 zcmeH{K?(vf3`KjCoIsPdnVhF1>cYhgG7ItaMy)WoaTOTwchfe|B)s3Bxg9R;eB7tN zMU~Br5C~06%Nc|=-cm2n9-7U8z1dH%5{R?&dH4oMGH-ABi yL%KoIHG#3+*H@hXjKIhLr)k=T|24n-pMCzr|M8#E=YD(E_7jX0PWO03Iah41>hVd7f>@lNzOAX*jS9n z6yoU}#YM2$YLcfTRTkX(XB^`12+V^V_A=KiO0 zKek7s5rQoBpML#Y?%7-;lMswHl_$Y|&HKO9x{dv7{OsQh`(H!<`vd?0`||=f!0QwM G4gdh@=127a literal 0 HcmV?d00001 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt new file mode 100644 index 0000000..3f95386 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt @@ -0,0 +1 @@ +baz \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt new file mode 100644 index 0000000..ba0e162 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt @@ -0,0 +1 @@ +bar \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js new file mode 100644 index 0000000..85b5f41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js @@ -0,0 +1,67 @@ +var tar = require('../') +var path = require('path') +var rfile = require('rfile') +var rimraf = require('rimraf').sync +var mkdir = require('mkdirp').sync + +var read = require('fs').createReadStream +var write = require('fs').createWriteStream +var assert = require('assert') + +beforeEach(function () { + rimraf(__dirname + '/output') +}) +afterEach(function () { + rimraf(__dirname + '/output') +}) +describe('tarball.pipe(unpack(directory, callback))', function () { + it('unpacks the tarball into the directory', function (done) { + read(__dirname + '/fixtures/packed.tar').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) { + if (err) return done(err) + assert.equal(rfile('./output/unpacked/bar.txt'), rfile('./fixtures/to-pack/bar.txt')) + assert.equal(rfile('./output/unpacked/foo.txt'), rfile('./fixtures/to-pack/foo.txt')) + done() + })) + }) +}) +describe('gziptarball.pipe(unpack(directory, callback))', function () { + it('unpacks the tarball into the directory', function (done) { + read(__dirname + '/fixtures/packed.tar.gz').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) { + if (err) return done(err) + assert.equal(rfile('./output/unpacked/bar.txt'), rfile('./fixtures/to-pack/bar.txt')) + assert.equal(rfile('./output/unpacked/foo.txt'), rfile('./fixtures/to-pack/foo.txt')) + done() + })) + }) +}) +describe('file.pipe(unpack(directory, callback))', function () { + it('copies the file into the directory', function (done) { + read(__dirname + '/fixtures/packed-file.txt').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) { + if (err) return done(err) + assert.equal(rfile('./output/unpacked/index.js'), rfile('./fixtures/packed-file.txt')) + done() + })) + }) +}) +describe('pack(directory).pipe(tarball)', function () { + it('packs the directory into the output', function (done) { + var called = false + mkdir(__dirname + '/output/') + tar.pack(__dirname + '/fixtures/to-pack').pipe(write(__dirname + '/output/packed.tar.gz')) + .on('error', function (err) { + if (called) return + called = true + done(err) + }) + .on('close', function () { + if (called) return + called = true + read(__dirname + '/output/packed.tar.gz').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) { + if (err) return done(err) + assert.equal(rfile('./output/unpacked/bar.txt'), rfile('./fixtures/to-pack/bar.txt')) + assert.equal(rfile('./output/unpacked/foo.txt'), rfile('./fixtures/to-pack/foo.txt')) + done() + })) + }) + }) +}) \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.npmignore new file mode 100644 index 0000000..c167ad5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.npmignore @@ -0,0 +1,5 @@ +.*.swp +node_modules +examples/extract/ +test/tmp/ +test/fixtures/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.travis.yml new file mode 100644 index 0000000..2d26206 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.6 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/LICENCE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/LICENCE new file mode 100644 index 0000000..74489e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/LICENCE @@ -0,0 +1,25 @@ +Copyright (c) Isaac Z. Schlueter +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/README.md new file mode 100644 index 0000000..424a278 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/README.md @@ -0,0 +1,48 @@ +# node-tar + +Tar for Node.js. + +[![NPM](https://nodei.co/npm/tar.png)](https://nodei.co/npm/tar/) + +## API + +See `examples/` for usage examples. + +### var tar = require('tar') + +Returns an object with `.Pack`, `.Extract` and `.Parse` methods. + +### tar.Pack([properties]) + +Returns a through stream. Use +[fstream](https://npmjs.org/package/fstream) to write files into the +pack stream and you will receive tar archive data from the pack +stream. + +This only works with directories, it does not work with individual files. + +The optional `properties` object are used to set properties in the tar +'Global Extended Header'. + +### tar.Extract([options]) + +Returns a through stream. Write tar data to the stream and the files +in the tarball will be extracted onto the filesystem. + +`options` can be: + +```js +{ + path: '/path/to/extract/tar/into', + strip: 0, // how many path segments to strip from the root when extracting +} +``` + +`options` also get passed to the `fstream.Writer` instance that `tar` +uses internally. + +### tar.Parse() + +Returns a writable stream. Write tar data to it and it will emit +`entry` events for each entry parsed from the tarball. This is used by +`tar.Extract`. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js new file mode 100644 index 0000000..e150abf --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js @@ -0,0 +1,11 @@ +var tar = require("../tar.js") + , fs = require("fs") + +fs.createReadStream(__dirname + "/../test/fixtures/c.tar") + .pipe(tar.Extract({ path: __dirname + "/extract" })) + .on("error", function (er) { + console.error("error here") + }) + .on("end", function () { + console.error("done") + }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js new file mode 100644 index 0000000..ebe3892 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js @@ -0,0 +1,10 @@ +var tar = require("../tar.js") + , fstream = require("fstream") + , fs = require("fs") + +var dir_destination = fs.createWriteStream('dir.tar') + +// This must be a "directory" +fstream.Reader({ path: __dirname, type: "Directory" }) + .pipe(tar.Pack({ noProprietary: true })) + .pipe(dir_destination) \ No newline at end of file diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js new file mode 100644 index 0000000..39f3f08 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js @@ -0,0 +1,36 @@ +var tar = require("../tar.js") + , fs = require("fs") + +fs.createReadStream(__dirname + "/../test/fixtures/c.tar") + .pipe(tar.Parse()) + .on("extendedHeader", function (e) { + console.error("extended pax header", e.props) + e.on("end", function () { + console.error("extended pax fields:", e.fields) + }) + }) + .on("ignoredEntry", function (e) { + console.error("ignoredEntry?!?", e.props) + }) + .on("longLinkpath", function (e) { + console.error("longLinkpath entry", e.props) + e.on("end", function () { + console.error("value=%j", e.body.toString()) + }) + }) + .on("longPath", function (e) { + console.error("longPath entry", e.props) + e.on("end", function () { + console.error("value=%j", e.body.toString()) + }) + }) + .on("entry", function (e) { + console.error("entry", e.props) + e.on("data", function (c) { + console.error(" >>>" + c.toString().replace(/\n/g, "\\n")) + }) + e.on("end", function () { + console.error(" << 0 + return !this._needDrain +} + +EntryWriter.prototype.end = function (c) { + // console.error(".. ew end") + if (c) this._buffer.push(c) + this._buffer.push(EOF) + this._ended = true + this._process() + this._needDrain = this._buffer.length > 0 +} + +EntryWriter.prototype.pause = function () { + // console.error(".. ew pause") + this._paused = true + this.emit("pause") +} + +EntryWriter.prototype.resume = function () { + // console.error(".. ew resume") + this._paused = false + this.emit("resume") + this._process() +} + +EntryWriter.prototype.add = function (entry) { + // console.error(".. ew add") + if (!this.parent) return this.emit("error", new Error("no parent")) + + // make sure that the _header and such is emitted, and clear out + // the _currentEntry link on the parent. + if (!this._ended) this.end() + + return this.parent.add(entry) +} + +EntryWriter.prototype._header = function () { + // console.error(".. ew header") + if (this._didHeader) return + this._didHeader = true + + var headerBlock = TarHeader.encode(this.props) + + if (this.props.needExtended && !this._meta) { + var me = this + + ExtendedHeaderWriter = ExtendedHeaderWriter || + require("./extended-header-writer.js") + + ExtendedHeaderWriter(this.props) + .on("data", function (c) { + me.emit("data", c) + }) + .on("error", function (er) { + me.emit("error", er) + }) + .end() + } + + // console.error(".. .. ew headerBlock emitting") + this.emit("data", headerBlock) + this.emit("header") +} + +EntryWriter.prototype._process = function () { + // console.error(".. .. ew process") + if (!this._didHeader && !this._meta) { + this._header() + } + + if (this._paused || this._processing) { + // console.error(".. .. .. paused=%j, processing=%j", this._paused, this._processing) + return + } + + this._processing = true + + var buf = this._buffer + for (var i = 0; i < buf.length; i ++) { + // console.error(".. .. .. i=%d", i) + + var c = buf[i] + + if (c === EOF) this._stream.end() + else this._stream.write(c) + + if (this._paused) { + // console.error(".. .. .. paused mid-emission") + this._processing = false + if (i < buf.length) { + this._needDrain = true + this._buffer = buf.slice(i + 1) + } + return + } + } + + // console.error(".. .. .. emitted") + this._buffer.length = 0 + this._processing = false + + // console.error(".. .. .. emitting drain") + this.emit("drain") +} + +EntryWriter.prototype.destroy = function () {} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js new file mode 100644 index 0000000..4af5c41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js @@ -0,0 +1,213 @@ +// A passthrough read/write stream that sets its properties +// based on a header, extendedHeader, and globalHeader +// +// Can be either a file system object of some sort, or +// a pax/ustar metadata entry. + +module.exports = Entry + +var TarHeader = require("./header.js") + , tar = require("../tar") + , assert = require("assert").ok + , Stream = require("stream").Stream + , inherits = require("inherits") + , fstream = require("fstream").Abstract + +function Entry (header, extended, global) { + Stream.call(this) + this.readable = true + this.writable = true + + this._needDrain = false + this._paused = false + this._reading = false + this._ending = false + this._ended = false + this._remaining = 0 + this._queue = [] + this._index = 0 + this._queueLen = 0 + + this._read = this._read.bind(this) + + this.props = {} + this._header = header + this._extended = extended || {} + + // globals can change throughout the course of + // a file parse operation. Freeze it at its current state. + this._global = {} + var me = this + Object.keys(global || {}).forEach(function (g) { + me._global[g] = global[g] + }) + + this._setProps() +} + +inherits(Entry, Stream) + +Entry.prototype.write = function (c) { + if (this._ending) this.error("write() after end()", null, true) + if (this._remaining === 0) { + this.error("invalid bytes past eof") + } + + // often we'll get a bunch of \0 at the end of the last write, + // since chunks will always be 512 bytes when reading a tarball. + if (c.length > this._remaining) { + c = c.slice(0, this._remaining) + } + this._remaining -= c.length + + // put it on the stack. + var ql = this._queueLen + this._queue.push(c) + this._queueLen ++ + + this._read() + + // either paused, or buffered + if (this._paused || ql > 0) { + this._needDrain = true + return false + } + + return true +} + +Entry.prototype.end = function (c) { + if (c) this.write(c) + this._ending = true + this._read() +} + +Entry.prototype.pause = function () { + this._paused = true + this.emit("pause") +} + +Entry.prototype.resume = function () { + // console.error(" Tar Entry resume", this.path) + this.emit("resume") + this._paused = false + this._read() + return this._queueLen - this._index > 1 +} + + // This is bound to the instance +Entry.prototype._read = function () { + // console.error(" Tar Entry _read", this.path) + + if (this._paused || this._reading || this._ended) return + + // set this flag so that event handlers don't inadvertently + // get multiple _read() calls running. + this._reading = true + + // have any data to emit? + while (this._index < this._queueLen && !this._paused) { + var chunk = this._queue[this._index ++] + this.emit("data", chunk) + } + + // check if we're drained + if (this._index >= this._queueLen) { + this._queue.length = this._queueLen = this._index = 0 + if (this._needDrain) { + this._needDrain = false + this.emit("drain") + } + if (this._ending) { + this._ended = true + this.emit("end") + } + } + + // if the queue gets too big, then pluck off whatever we can. + // this should be fairly rare. + var mql = this._maxQueueLen + if (this._queueLen > mql && this._index > 0) { + mql = Math.min(this._index, mql) + this._index -= mql + this._queueLen -= mql + this._queue = this._queue.slice(mql) + } + + this._reading = false +} + +Entry.prototype._setProps = function () { + // props = extended->global->header->{} + var header = this._header + , extended = this._extended + , global = this._global + , props = this.props + + // first get the values from the normal header. + var fields = tar.fields + for (var f = 0; fields[f] !== null; f ++) { + var field = fields[f] + , val = header[field] + if (typeof val !== "undefined") props[field] = val + } + + // next, the global header for this file. + // numeric values, etc, will have already been parsed. + ;[global, extended].forEach(function (p) { + Object.keys(p).forEach(function (f) { + if (typeof p[f] !== "undefined") props[f] = p[f] + }) + }) + + // no nulls allowed in path or linkpath + ;["path", "linkpath"].forEach(function (p) { + if (props.hasOwnProperty(p)) { + props[p] = props[p].split("\0")[0] + } + }) + + + // set date fields to be a proper date + ;["mtime", "ctime", "atime"].forEach(function (p) { + if (props.hasOwnProperty(p)) { + props[p] = new Date(props[p] * 1000) + } + }) + + // set the type so that we know what kind of file to create + var type + switch (tar.types[props.type]) { + case "OldFile": + case "ContiguousFile": + type = "File" + break + + case "GNUDumpDir": + type = "Directory" + break + + case undefined: + type = "Unknown" + break + + case "Link": + case "SymbolicLink": + case "CharacterDevice": + case "BlockDevice": + case "Directory": + case "FIFO": + default: + type = tar.types[props.type] + } + + this.type = type + this.path = props.path + this.size = props.size + + // size is special, since it signals when the file needs to end. + this._remaining = props.size +} + +Entry.prototype.warn = fstream.warn +Entry.prototype.error = fstream.error diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js new file mode 100644 index 0000000..1728c45 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js @@ -0,0 +1,191 @@ + +module.exports = ExtendedHeaderWriter + +var inherits = require("inherits") + , EntryWriter = require("./entry-writer.js") + +inherits(ExtendedHeaderWriter, EntryWriter) + +var tar = require("../tar.js") + , path = require("path") + , TarHeader = require("./header.js") + +// props is the props of the thing we need to write an +// extended header for. +// Don't be shy with it. Just encode everything. +function ExtendedHeaderWriter (props) { + // console.error(">> ehw ctor") + var me = this + + if (!(me instanceof ExtendedHeaderWriter)) { + return new ExtendedHeaderWriter(props) + } + + me.fields = props + + var p = + { path : ("PaxHeader" + path.join("/", props.path || "")) + .replace(/\\/g, "/").substr(0, 100) + , mode : props.mode || 0666 + , uid : props.uid || 0 + , gid : props.gid || 0 + , size : 0 // will be set later + , mtime : props.mtime || Date.now() / 1000 + , type : "x" + , linkpath : "" + , ustar : "ustar\0" + , ustarver : "00" + , uname : props.uname || "" + , gname : props.gname || "" + , devmaj : props.devmaj || 0 + , devmin : props.devmin || 0 + } + + + EntryWriter.call(me, p) + // console.error(">> ehw props", me.props) + me.props = p + + me._meta = true +} + +ExtendedHeaderWriter.prototype.end = function () { + // console.error(">> ehw end") + var me = this + + if (me._ended) return + me._ended = true + + me._encodeFields() + + if (me.props.size === 0) { + // nothing to write! + me._ready = true + me._stream.end() + return + } + + me._stream.write(TarHeader.encode(me.props)) + me.body.forEach(function (l) { + me._stream.write(l) + }) + me._ready = true + + // console.error(">> ehw _process calling end()", me.props) + this._stream.end() +} + +ExtendedHeaderWriter.prototype._encodeFields = function () { + // console.error(">> ehw _encodeFields") + this.body = [] + if (this.fields.prefix) { + this.fields.path = this.fields.prefix + "/" + this.fields.path + this.fields.prefix = "" + } + encodeFields(this.fields, "", this.body, this.fields.noProprietary) + var me = this + this.body.forEach(function (l) { + me.props.size += l.length + }) +} + +function encodeFields (fields, prefix, body, nop) { + // console.error(">> >> ehw encodeFields") + // "%d %s=%s\n", , , + // The length is a decimal number, and includes itself and the \n + // Numeric values are decimal strings. + + Object.keys(fields).forEach(function (k) { + var val = fields[k] + , numeric = tar.numeric[k] + + if (prefix) k = prefix + "." + k + + // already including NODETAR.type, don't need File=true also + if (k === fields.type && val === true) return + + switch (k) { + // don't include anything that's always handled just fine + // in the normal header, or only meaningful in the context + // of nodetar + case "mode": + case "cksum": + case "ustar": + case "ustarver": + case "prefix": + case "basename": + case "dirname": + case "needExtended": + case "block": + case "filter": + return + + case "rdev": + if (val === 0) return + break + + case "nlink": + case "dev": // Truly a hero among men, Creator of Star! + case "ino": // Speak his name with reverent awe! It is: + k = "SCHILY." + k + break + + default: break + } + + if (val && typeof val === "object" && + !Buffer.isBuffer(val)) encodeFields(val, k, body, nop) + else if (val === null || val === undefined) return + else body.push.apply(body, encodeField(k, val, nop)) + }) + + return body +} + +function encodeField (k, v, nop) { + // lowercase keys must be valid, otherwise prefix with + // "NODETAR." + if (k.charAt(0) === k.charAt(0).toLowerCase()) { + var m = k.split(".")[0] + if (!tar.knownExtended[m]) k = "NODETAR." + k + } + + // no proprietary + if (nop && k.charAt(0) !== k.charAt(0).toLowerCase()) { + return [] + } + + if (typeof val === "number") val = val.toString(10) + + var s = new Buffer(" " + k + "=" + v + "\n") + , digits = Math.floor(Math.log(s.length) / Math.log(10)) + 1 + + // console.error("1 s=%j digits=%j s.length=%d", s.toString(), digits, s.length) + + // if adding that many digits will make it go over that length, + // then add one to it. For example, if the string is: + // " foo=bar\n" + // then that's 9 characters. With the "9", that bumps the length + // up to 10. However, this is invalid: + // "10 foo=bar\n" + // but, since that's actually 11 characters, since 10 adds another + // character to the length, and the length includes the number + // itself. In that case, just bump it up again. + if (s.length + digits >= Math.pow(10, digits)) digits += 1 + // console.error("2 s=%j digits=%j s.length=%d", s.toString(), digits, s.length) + + var len = digits + s.length + // console.error("3 s=%j digits=%j s.length=%d len=%d", s.toString(), digits, s.length, len) + var lenBuf = new Buffer("" + len) + if (lenBuf.length + s.length !== len) { + throw new Error("Bad length calculation\n"+ + "len="+len+"\n"+ + "lenBuf="+JSON.stringify(lenBuf.toString())+"\n"+ + "lenBuf.length="+lenBuf.length+"\n"+ + "digits="+digits+"\n"+ + "s="+JSON.stringify(s.toString())+"\n"+ + "s.length="+s.length) + } + + return [lenBuf, s] +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js new file mode 100644 index 0000000..74f432c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js @@ -0,0 +1,140 @@ +// An Entry consisting of: +// +// "%d %s=%s\n", , , +// +// The length is a decimal number, and includes itself and the \n +// \0 does not terminate anything. Only the length terminates the string. +// Numeric values are decimal strings. + +module.exports = ExtendedHeader + +var Entry = require("./entry.js") + , inherits = require("inherits") + , tar = require("../tar.js") + , numeric = tar.numeric + , keyTrans = { "SCHILY.dev": "dev" + , "SCHILY.ino": "ino" + , "SCHILY.nlink": "nlink" } + +function ExtendedHeader () { + Entry.apply(this, arguments) + this.on("data", this._parse) + this.fields = {} + this._position = 0 + this._fieldPos = 0 + this._state = SIZE + this._sizeBuf = [] + this._keyBuf = [] + this._valBuf = [] + this._size = -1 + this._key = "" +} + +inherits(ExtendedHeader, Entry) +ExtendedHeader.prototype._parse = parse + +var s = 0 + , states = ExtendedHeader.states = {} + , SIZE = states.SIZE = s++ + , KEY = states.KEY = s++ + , VAL = states.VAL = s++ + , ERR = states.ERR = s++ + +Object.keys(states).forEach(function (s) { + states[states[s]] = states[s] +}) + +states[s] = null + +// char code values for comparison +var _0 = "0".charCodeAt(0) + , _9 = "9".charCodeAt(0) + , point = ".".charCodeAt(0) + , a = "a".charCodeAt(0) + , Z = "Z".charCodeAt(0) + , a = "a".charCodeAt(0) + , z = "z".charCodeAt(0) + , space = " ".charCodeAt(0) + , eq = "=".charCodeAt(0) + , cr = "\n".charCodeAt(0) + +function parse (c) { + if (this._state === ERR) return + + for ( var i = 0, l = c.length + ; i < l + ; this._position++, this._fieldPos++, i++) { + // console.error("top of loop, size="+this._size) + + var b = c[i] + + if (this._size >= 0 && this._fieldPos > this._size) { + error(this, "field exceeds length="+this._size) + return + } + + switch (this._state) { + case ERR: return + + case SIZE: + // console.error("parsing size, b=%d, rest=%j", b, c.slice(i).toString()) + if (b === space) { + this._state = KEY + // this._fieldPos = this._sizeBuf.length + this._size = parseInt(new Buffer(this._sizeBuf).toString(), 10) + this._sizeBuf.length = 0 + continue + } + if (b < _0 || b > _9) { + error(this, "expected [" + _0 + ".." + _9 + "], got " + b) + return + } + this._sizeBuf.push(b) + continue + + case KEY: + // can be any char except =, not > size. + if (b === eq) { + this._state = VAL + this._key = new Buffer(this._keyBuf).toString() + if (keyTrans[this._key]) this._key = keyTrans[this._key] + this._keyBuf.length = 0 + continue + } + this._keyBuf.push(b) + continue + + case VAL: + // field must end with cr + if (this._fieldPos === this._size - 1) { + // console.error("finished with "+this._key) + if (b !== cr) { + error(this, "expected \\n at end of field") + return + } + var val = new Buffer(this._valBuf).toString() + if (numeric[this._key]) { + val = parseFloat(val) + } + this.fields[this._key] = val + + this._valBuf.length = 0 + this._state = SIZE + this._size = -1 + this._fieldPos = -1 + continue + } + this._valBuf.push(b) + continue + } + } +} + +function error (me, msg) { + msg = "invalid header: " + msg + + "\nposition=" + me._position + + "\nfield position=" + me._fieldPos + + me.error(msg) + me.state = ERR +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js new file mode 100644 index 0000000..c34a81e --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js @@ -0,0 +1,78 @@ +// give it a tarball and a path, and it'll dump the contents + +module.exports = Extract + +var tar = require("../tar.js") + , fstream = require("fstream") + , inherits = require("inherits") + , path = require("path") + +function Extract (opts) { + if (!(this instanceof Extract)) return new Extract(opts) + tar.Parse.apply(this) + + // have to dump into a directory + opts.type = "Directory" + opts.Directory = true + + if (typeof opts !== "object") { + opts = { path: opts } + } + + // better to drop in cwd? seems more standard. + opts.path = opts.path || path.resolve("node-tar-extract") + opts.type = "Directory" + opts.Directory = true + + // similar to --strip or --strip-components + opts.strip = +opts.strip + if (!opts.strip || opts.strip <= 0) opts.strip = 0 + + this._fst = fstream.Writer(opts) + + this.pause() + var me = this + + // Hardlinks in tarballs are relative to the root + // of the tarball. So, they need to be resolved against + // the target directory in order to be created properly. + me.on("entry", function (entry) { + // if there's a "strip" argument, then strip off that many + // path components. + if (opts.strip) { + var p = entry.path.split("/").slice(opts.strip).join("/") + entry.path = entry.props.path = p + if (entry.linkpath) { + var lp = entry.linkpath.split("/").slice(opts.strip).join("/") + entry.linkpath = entry.props.linkpath = lp + } + } + if (entry.type !== "Link") return + entry.linkpath = entry.props.linkpath = + path.join(opts.path, path.join("/", entry.props.linkpath)) + }) + + this._fst.on("ready", function () { + me.pipe(me._fst, { end: false }) + me.resume() + }) + + // this._fst.on("end", function () { + // console.error("\nEEEE Extract End", me._fst.path) + // }) + + this._fst.on("close", function () { + // console.error("\nEEEE Extract End", me._fst.path) + me.emit("end") + me.emit("close") + }) +} + +inherits(Extract, tar.Parse) + +Extract.prototype._streamEnd = function () { + var me = this + if (!me._ended) me.error("unexpected eof") + me._fst.end() + // my .end() is coming later. +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js new file mode 100644 index 0000000..0bfc7b8 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js @@ -0,0 +1,14 @@ +module.exports = GlobalHeaderWriter + +var ExtendedHeaderWriter = require("./extended-header-writer.js") + , inherits = require("inherits") + +inherits(GlobalHeaderWriter, ExtendedHeaderWriter) + +function GlobalHeaderWriter (props) { + if (!(this instanceof GlobalHeaderWriter)) { + return new GlobalHeaderWriter(props) + } + ExtendedHeaderWriter.call(this, props) + this.props.type = "g" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/header.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/header.js new file mode 100644 index 0000000..05b237c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/header.js @@ -0,0 +1,385 @@ +// parse a 512-byte header block to a data object, or vice-versa +// If the data won't fit nicely in a simple header, then generate +// the appropriate extended header file, and return that. + +module.exports = TarHeader + +var tar = require("../tar.js") + , fields = tar.fields + , fieldOffs = tar.fieldOffs + , fieldEnds = tar.fieldEnds + , fieldSize = tar.fieldSize + , numeric = tar.numeric + , assert = require("assert").ok + , space = " ".charCodeAt(0) + , slash = "/".charCodeAt(0) + , bslash = process.platform === "win32" ? "\\".charCodeAt(0) : null + +function TarHeader (block) { + if (!(this instanceof TarHeader)) return new TarHeader(block) + if (block) this.decode(block) +} + +TarHeader.prototype = + { decode : decode + , encode: encode + , calcSum: calcSum + , checkSum: checkSum + } + +TarHeader.parseNumeric = parseNumeric +TarHeader.encode = encode +TarHeader.decode = decode + +// note that this will only do the normal ustar header, not any kind +// of extended posix header file. If something doesn't fit comfortably, +// then it will set obj.needExtended = true, and set the block to +// the closest approximation. +function encode (obj) { + if (!obj && !(this instanceof TarHeader)) throw new Error( + "encode must be called on a TarHeader, or supplied an object") + + obj = obj || this + var block = obj.block = new Buffer(512) + + // if the object has a "prefix", then that's actually an extension of + // the path field. + if (obj.prefix) { + // console.error("%% header encoding, got a prefix", obj.prefix) + obj.path = obj.prefix + "/" + obj.path + // console.error("%% header encoding, prefixed path", obj.path) + obj.prefix = "" + } + + obj.needExtended = false + + if (obj.mode) { + if (typeof obj.mode === "string") obj.mode = parseInt(obj.mode, 8) + obj.mode = obj.mode & 0777 + } + + for (var f = 0; fields[f] !== null; f ++) { + var field = fields[f] + , off = fieldOffs[f] + , end = fieldEnds[f] + , ret + + switch (field) { + case "cksum": + // special, done below, after all the others + break + + case "prefix": + // special, this is an extension of the "path" field. + // console.error("%% header encoding, skip prefix later") + break + + case "type": + // convert from long name to a single char. + var type = obj.type || "0" + if (type.length > 1) { + type = tar.types[obj.type] + if (!type) type = "0" + } + writeText(block, off, end, type) + break + + case "path": + // uses the "prefix" field if > 100 bytes, but <= 255 + var pathLen = Buffer.byteLength(obj.path) + , pathFSize = fieldSize[fields.path] + , prefFSize = fieldSize[fields.prefix] + + // paths between 100 and 255 should use the prefix field. + // longer than 255 + if (pathLen > pathFSize && + pathLen <= pathFSize + prefFSize) { + // need to find a slash somewhere in the middle so that + // path and prefix both fit in their respective fields + var searchStart = pathLen - 1 - pathFSize + , searchEnd = prefFSize + , found = false + , pathBuf = new Buffer(obj.path) + + for ( var s = searchStart + ; (s <= searchEnd) + ; s ++ ) { + if (pathBuf[s] === slash || pathBuf[s] === bslash) { + found = s + break + } + } + + if (found !== false) { + prefix = pathBuf.slice(0, found).toString("utf8") + path = pathBuf.slice(found + 1).toString("utf8") + + ret = writeText(block, off, end, path) + off = fieldOffs[fields.prefix] + end = fieldEnds[fields.prefix] + // console.error("%% header writing prefix", off, end, prefix) + ret = writeText(block, off, end, prefix) || ret + break + } + } + + // paths less than 100 chars don't need a prefix + // and paths longer than 255 need an extended header and will fail + // on old implementations no matter what we do here. + // Null out the prefix, and fallthrough to default. + // console.error("%% header writing no prefix") + var poff = fieldOffs[fields.prefix] + , pend = fieldEnds[fields.prefix] + writeText(block, poff, pend, "") + // fallthrough + + // all other fields are numeric or text + default: + ret = numeric[field] + ? writeNumeric(block, off, end, obj[field]) + : writeText(block, off, end, obj[field] || "") + break + } + obj.needExtended = obj.needExtended || ret + } + + var off = fieldOffs[fields.cksum] + , end = fieldEnds[fields.cksum] + + writeNumeric(block, off, end, calcSum.call(this, block)) + + return block +} + +// if it's a negative number, or greater than will fit, +// then use write256. +var MAXNUM = { 12: 077777777777 + , 11: 07777777777 + , 8 : 07777777 + , 7 : 0777777 } +function writeNumeric (block, off, end, num) { + var writeLen = end - off + , maxNum = MAXNUM[writeLen] || 0 + + num = num || 0 + // console.error(" numeric", num) + + if (num instanceof Date || + Object.prototype.toString.call(num) === "[object Date]") { + num = num.getTime() / 1000 + } + + if (num > maxNum || num < 0) { + write256(block, off, end, num) + // need an extended header if negative or too big. + return true + } + + // god, tar is so annoying + // if the string is small enough, you should put a space + // between the octal string and the \0, but if it doesn't + // fit, then don't. + var numStr = Math.floor(num).toString(8) + if (num < MAXNUM[writeLen - 1]) numStr += " " + + // pad with "0" chars + if (numStr.length < writeLen) { + numStr = (new Array(writeLen - numStr.length).join("0")) + numStr + } + + if (numStr.length !== writeLen - 1) { + throw new Error("invalid length: " + JSON.stringify(numStr) + "\n" + + "expected: "+writeLen) + } + block.write(numStr, off, writeLen, "utf8") + block[end - 1] = 0 +} + +function write256 (block, off, end, num) { + var buf = block.slice(off, end) + var positive = num >= 0 + buf[0] = positive ? 0x80 : 0xFF + + // get the number as a base-256 tuple + if (!positive) num *= -1 + var tuple = [] + do { + var n = num % 256 + tuple.push(n) + num = (num - n) / 256 + } while (num) + + var bytes = tuple.length + + var fill = buf.length - bytes + for (var i = 1; i < fill; i ++) { + buf[i] = positive ? 0 : 0xFF + } + + // tuple is a base256 number, with [0] as the *least* significant byte + // if it's negative, then we need to flip all the bits once we hit the + // first non-zero bit. The 2's-complement is (0x100 - n), and the 1's- + // complement is (0xFF - n). + var zero = true + for (i = bytes; i > 0; i --) { + var byte = tuple[bytes - i] + if (positive) buf[fill + i] = byte + else if (zero && byte === 0) buf[fill + i] = 0 + else if (zero) { + zero = false + buf[fill + i] = 0x100 - byte + } else buf[fill + i] = 0xFF - byte + } +} + +function writeText (block, off, end, str) { + // strings are written as utf8, then padded with \0 + var strLen = Buffer.byteLength(str) + , writeLen = Math.min(strLen, end - off) + // non-ascii fields need extended headers + // long fields get truncated + , needExtended = strLen !== str.length || strLen > writeLen + + // write the string, and null-pad + if (writeLen > 0) block.write(str, off, writeLen, "utf8") + for (var i = off + writeLen; i < end; i ++) block[i] = 0 + + return needExtended +} + +function calcSum (block) { + block = block || this.block + assert(Buffer.isBuffer(block) && block.length === 512) + + if (!block) throw new Error("Need block to checksum") + + // now figure out what it would be if the cksum was " " + var sum = 0 + , start = fieldOffs[fields.cksum] + , end = fieldEnds[fields.cksum] + + for (var i = 0; i < fieldOffs[fields.cksum]; i ++) { + sum += block[i] + } + + for (var i = start; i < end; i ++) { + sum += space + } + + for (var i = end; i < 512; i ++) { + sum += block[i] + } + + return sum +} + + +function checkSum (block) { + var sum = calcSum.call(this, block) + block = block || this.block + + var cksum = block.slice(fieldOffs[fields.cksum], fieldEnds[fields.cksum]) + cksum = parseNumeric(cksum) + + return cksum === sum +} + +function decode (block) { + block = block || this.block + assert(Buffer.isBuffer(block) && block.length === 512) + + this.block = block + this.cksumValid = this.checkSum() + + var prefix = null + + // slice off each field. + for (var f = 0; fields[f] !== null; f ++) { + var field = fields[f] + , val = block.slice(fieldOffs[f], fieldEnds[f]) + + switch (field) { + case "ustar": + // if not ustar, then everything after that is just padding. + if (val.toString() !== "ustar\0") { + this.ustar = false + return + } else { + // console.error("ustar:", val, val.toString()) + this.ustar = val.toString() + } + break + + // prefix is special, since it might signal the xstar header + case "prefix": + var atime = parseNumeric(val.slice(131, 131 + 12)) + , ctime = parseNumeric(val.slice(131 + 12, 131 + 12 + 12)) + if ((val[130] === 0 || val[130] === space) && + typeof atime === "number" && + typeof ctime === "number" && + val[131 + 12] === space && + val[131 + 12 + 12] === space) { + this.atime = atime + this.ctime = ctime + val = val.slice(0, 130) + } + prefix = val.toString("utf8").replace(/\0+$/, "") + // console.error("%% header reading prefix", prefix) + break + + // all other fields are null-padding text + // or a number. + default: + if (numeric[field]) { + this[field] = parseNumeric(val) + } else { + this[field] = val.toString("utf8").replace(/\0+$/, "") + } + break + } + } + + // if we got a prefix, then prepend it to the path. + if (prefix) { + this.path = prefix + "/" + this.path + // console.error("%% header got a prefix", this.path) + } +} + +function parse256 (buf) { + // first byte MUST be either 80 or FF + // 80 for positive, FF for 2's comp + var positive + if (buf[0] === 0x80) positive = true + else if (buf[0] === 0xFF) positive = false + else return null + + // build up a base-256 tuple from the least sig to the highest + var zero = false + , tuple = [] + for (var i = buf.length - 1; i > 0; i --) { + var byte = buf[i] + if (positive) tuple.push(byte) + else if (zero && byte === 0) tuple.push(0) + else if (zero) { + zero = false + tuple.push(0x100 - byte) + } else tuple.push(0xFF - byte) + } + + for (var sum = 0, i = 0, l = tuple.length; i < l; i ++) { + sum += tuple[i] * Math.pow(256, i) + } + + return positive ? sum : -1 * sum +} + +function parseNumeric (f) { + if (f[0] & 0x80) return parse256(f) + + var str = f.toString("utf8").split("\0")[0].trim() + , res = parseInt(str, 8) + + return isNaN(res) ? null : res +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js new file mode 100644 index 0000000..3ff14dd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js @@ -0,0 +1,231 @@ +// pipe in an fstream, and it'll make a tarball. +// key-value pair argument is global extended header props. + +module.exports = Pack + +var EntryWriter = require("./entry-writer.js") + , Stream = require("stream").Stream + , path = require("path") + , inherits = require("inherits") + , GlobalHeaderWriter = require("./global-header-writer.js") + , collect = require("fstream").collect + , eof = new Buffer(512) + +for (var i = 0; i < 512; i ++) eof[i] = 0 + +inherits(Pack, Stream) + +function Pack (props) { + // console.error("-- p ctor") + var me = this + if (!(me instanceof Pack)) return new Pack(props) + + if (props) me._noProprietary = props.noProprietary + else me._noProprietary = false + + me._global = props + + me.readable = true + me.writable = true + me._buffer = [] + // console.error("-- -- set current to null in ctor") + me._currentEntry = null + me._processing = false + + me._pipeRoot = null + me.on("pipe", function (src) { + if (src.root === me._pipeRoot) return + me._pipeRoot = src + src.on("end", function () { + me._pipeRoot = null + }) + me.add(src) + }) +} + +Pack.prototype.addGlobal = function (props) { + // console.error("-- p addGlobal") + if (this._didGlobal) return + this._didGlobal = true + + var me = this + GlobalHeaderWriter(props) + .on("data", function (c) { + me.emit("data", c) + }) + .end() +} + +Pack.prototype.add = function (stream) { + if (this._global && !this._didGlobal) this.addGlobal(this._global) + + if (this._ended) return this.emit("error", new Error("add after end")) + + collect(stream) + this._buffer.push(stream) + this._process() + this._needDrain = this._buffer.length > 0 + return !this._needDrain +} + +Pack.prototype.pause = function () { + this._paused = true + if (this._currentEntry) this._currentEntry.pause() + this.emit("pause") +} + +Pack.prototype.resume = function () { + this._paused = false + if (this._currentEntry) this._currentEntry.resume() + this.emit("resume") + this._process() +} + +Pack.prototype.end = function () { + this._ended = true + this._buffer.push(eof) + this._process() +} + +Pack.prototype._process = function () { + var me = this + if (me._paused || me._processing) { + return + } + + var entry = me._buffer.shift() + + if (!entry) { + if (me._needDrain) { + me.emit("drain") + } + return + } + + if (entry.ready === false) { + // console.error("-- entry is not ready", entry) + me._buffer.unshift(entry) + entry.on("ready", function () { + // console.error("-- -- ready!", entry) + me._process() + }) + return + } + + me._processing = true + + if (entry === eof) { + // need 2 ending null blocks. + me.emit("data", eof) + me.emit("data", eof) + me.emit("end") + me.emit("close") + return + } + + // Change the path to be relative to the root dir that was + // added to the tarball. + // + // XXX This should be more like how -C works, so you can + // explicitly set a root dir, and also explicitly set a pathname + // in the tarball to use. That way we can skip a lot of extra + // work when resolving symlinks for bundled dependencies in npm. + + var root = path.dirname((entry.root || entry).path) + var wprops = {} + + Object.keys(entry.props || {}).forEach(function (k) { + wprops[k] = entry.props[k] + }) + + if (me._noProprietary) wprops.noProprietary = true + + wprops.path = path.relative(root, entry.path || '') + + // actually not a matter of opinion or taste. + if (process.platform === "win32") { + wprops.path = wprops.path.replace(/\\/g, "/") + } + + if (!wprops.type) + wprops.type = 'Directory' + + switch (wprops.type) { + // sockets not supported + case "Socket": + return + + case "Directory": + wprops.path += "/" + wprops.size = 0 + break + + case "Link": + var lp = path.resolve(path.dirname(entry.path), entry.linkpath) + wprops.linkpath = path.relative(root, lp) || "." + wprops.size = 0 + break + + case "SymbolicLink": + var lp = path.resolve(path.dirname(entry.path), entry.linkpath) + wprops.linkpath = path.relative(path.dirname(entry.path), lp) || "." + wprops.size = 0 + break + } + + // console.error("-- new writer", wprops) + // if (!wprops.type) { + // // console.error("-- no type?", entry.constructor.name, entry) + // } + + // console.error("-- -- set current to new writer", wprops.path) + var writer = me._currentEntry = EntryWriter(wprops) + + writer.parent = me + + // writer.on("end", function () { + // // console.error("-- -- writer end", writer.path) + // }) + + writer.on("data", function (c) { + me.emit("data", c) + }) + + writer.on("header", function () { + Buffer.prototype.toJSON = function () { + return this.toString().split(/\0/).join(".") + } + // console.error("-- -- writer header %j", writer.props) + if (writer.props.size === 0) nextEntry() + }) + writer.on("close", nextEntry) + + var ended = false + function nextEntry () { + if (ended) return + ended = true + + // console.error("-- -- writer close", writer.path) + // console.error("-- -- set current to null", wprops.path) + me._currentEntry = null + me._processing = false + me._process() + } + + writer.on("error", function (er) { + // console.error("-- -- writer error", writer.path) + me.emit("error", er) + }) + + // if it's the root, then there's no need to add its entries, + // or data, since they'll be added directly. + if (entry === me._pipeRoot) { + // console.error("-- is the root, don't auto-add") + writer.add = null + } + + entry.pipe(writer) +} + +Pack.prototype.destroy = function () {} +Pack.prototype.write = function () {} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js new file mode 100644 index 0000000..009a85f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js @@ -0,0 +1,271 @@ + +// A writable stream. +// It emits "entry" events, which provide a readable stream that has +// header info attached. + +module.exports = Parse.create = Parse + +var stream = require("stream") + , Stream = stream.Stream + , BlockStream = require("block-stream") + , tar = require("../tar.js") + , TarHeader = require("./header.js") + , Entry = require("./entry.js") + , BufferEntry = require("./buffer-entry.js") + , ExtendedHeader = require("./extended-header.js") + , assert = require("assert").ok + , inherits = require("inherits") + , fstream = require("fstream") + +// reading a tar is a lot like reading a directory +// However, we're actually not going to run the ctor, +// since it does a stat and various other stuff. +// This inheritance gives us the pause/resume/pipe +// behavior that is desired. +inherits(Parse, fstream.Reader) + +function Parse () { + var me = this + if (!(me instanceof Parse)) return new Parse() + + // doesn't apply fstream.Reader ctor? + // no, becasue we don't want to stat/etc, we just + // want to get the entry/add logic from .pipe() + Stream.apply(me) + + me.writable = true + me.readable = true + me._stream = new BlockStream(512) + me.position = 0 + me._ended = false + + me._stream.on("error", function (e) { + me.emit("error", e) + }) + + me._stream.on("data", function (c) { + me._process(c) + }) + + me._stream.on("end", function () { + me._streamEnd() + }) + + me._stream.on("drain", function () { + me.emit("drain") + }) +} + +// overridden in Extract class, since it needs to +// wait for its DirWriter part to finish before +// emitting "end" +Parse.prototype._streamEnd = function () { + var me = this + if (!me._ended) me.error("unexpected eof") + me.emit("end") +} + +// a tar reader is actually a filter, not just a readable stream. +// So, you should pipe a tarball stream into it, and it needs these +// write/end methods to do that. +Parse.prototype.write = function (c) { + if (this._ended) { + // gnutar puts a LOT of nulls at the end. + // you can keep writing these things forever. + // Just ignore them. + for (var i = 0, l = c.length; i > l; i ++) { + if (c[i] !== 0) return this.error("write() after end()") + } + return + } + return this._stream.write(c) +} + +Parse.prototype.end = function (c) { + this._ended = true + return this._stream.end(c) +} + +// don't need to do anything, since we're just +// proxying the data up from the _stream. +// Just need to override the parent's "Not Implemented" +// error-thrower. +Parse.prototype._read = function () {} + +Parse.prototype._process = function (c) { + assert(c && c.length === 512, "block size should be 512") + + // one of three cases. + // 1. A new header + // 2. A part of a file/extended header + // 3. One of two or more EOF null blocks + + if (this._entry) { + var entry = this._entry + entry.write(c) + if (entry._remaining === 0) { + entry.end() + this._entry = null + } + } else { + // either zeroes or a header + var zero = true + for (var i = 0; i < 512 && zero; i ++) { + zero = c[i] === 0 + } + + // eof is *at least* 2 blocks of nulls, and then the end of the + // file. you can put blocks of nulls between entries anywhere, + // so appending one tarball to another is technically valid. + // ending without the eof null blocks is not allowed, however. + if (zero) { + if (this._eofStarted) + this._ended = true + this._eofStarted = true + } else { + this._eofStarted = false + this._startEntry(c) + } + } + + this.position += 512 +} + +// take a header chunk, start the right kind of entry. +Parse.prototype._startEntry = function (c) { + var header = new TarHeader(c) + , self = this + , entry + , ev + , EntryType + , onend + , meta = false + + if (null === header.size || !header.cksumValid) { + var e = new Error("invalid tar file") + e.header = header + e.tar_file_offset = this.position + e.tar_block = this.position / 512 + this.emit("error", e) + } + + switch (tar.types[header.type]) { + case "File": + case "OldFile": + case "Link": + case "SymbolicLink": + case "CharacterDevice": + case "BlockDevice": + case "Directory": + case "FIFO": + case "ContiguousFile": + case "GNUDumpDir": + // start a file. + // pass in any extended headers + // These ones consumers are typically most interested in. + EntryType = Entry + ev = "entry" + break + + case "GlobalExtendedHeader": + // extended headers that apply to the rest of the tarball + EntryType = ExtendedHeader + onend = function () { + self._global = self._global || {} + Object.keys(entry.fields).forEach(function (k) { + self._global[k] = entry.fields[k] + }) + } + ev = "globalExtendedHeader" + meta = true + break + + case "ExtendedHeader": + case "OldExtendedHeader": + // extended headers that apply to the next entry + EntryType = ExtendedHeader + onend = function () { + self._extended = entry.fields + } + ev = "extendedHeader" + meta = true + break + + case "NextFileHasLongLinkpath": + // set linkpath= in extended header + EntryType = BufferEntry + onend = function () { + self._extended = self._extended || {} + self._extended.linkpath = entry.body + } + ev = "longLinkpath" + meta = true + break + + case "NextFileHasLongPath": + case "OldGnuLongPath": + // set path= in file-extended header + EntryType = BufferEntry + onend = function () { + self._extended = self._extended || {} + self._extended.path = entry.body + } + ev = "longPath" + meta = true + break + + default: + // all the rest we skip, but still set the _entry + // member, so that we can skip over their data appropriately. + // emit an event to say that this is an ignored entry type? + EntryType = Entry + ev = "ignoredEntry" + break + } + + var global, extended + if (meta) { + global = extended = null + } else { + var global = this._global + var extended = this._extended + + // extendedHeader only applies to one entry, so once we start + // an entry, it's over. + this._extended = null + } + entry = new EntryType(header, extended, global) + entry.meta = meta + + // only proxy data events of normal files. + if (!meta) { + entry.on("data", function (c) { + me.emit("data", c) + }) + } + + if (onend) entry.on("end", onend) + + this._entry = entry + var me = this + + entry.on("pause", function () { + me.pause() + }) + + entry.on("resume", function () { + me.resume() + }) + + if (this.listeners("*").length) { + this.emit("*", ev, entry) + } + + this.emit(ev, entry) + + // Zero-byte entry. End immediately. + if (entry.props.size === 0) { + entry.end() + this._entry = null + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE new file mode 100644 index 0000000..74489e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE @@ -0,0 +1,25 @@ +Copyright (c) Isaac Z. Schlueter +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md new file mode 100644 index 0000000..c16e9c4 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md @@ -0,0 +1,14 @@ +# block-stream + +A stream of blocks. + +Write data into it, and it'll output data in buffer blocks the size you +specify, padding with zeroes if necessary. + +```javascript +var block = new BlockStream(512) +fs.createReadStream("some-file").pipe(block) +block.pipe(fs.createWriteStream("block-file")) +``` + +When `.end()` or `.flush()` is called, it'll pad the block with zeroes. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js new file mode 100644 index 0000000..9328844 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream-pause.js @@ -0,0 +1,70 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + f.pause() + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + f.resume() + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream.js new file mode 100644 index 0000000..1141f3a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/block-stream.js @@ -0,0 +1,68 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js new file mode 100644 index 0000000..93e4068 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper-pause.js @@ -0,0 +1,70 @@ +var BlockStream = require("dropper") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + f.pause() + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + f.resume() + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper.js new file mode 100644 index 0000000..55fa133 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/bench/dropper.js @@ -0,0 +1,68 @@ +var BlockStream = require("dropper") + +var blockSizes = [16, 25, 1024] + , writeSizes = [4, 8, 15, 16, 17, 64, 100] + , writeCounts = [1, 10, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js new file mode 100644 index 0000000..008de03 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js @@ -0,0 +1,209 @@ +// write data to it, and it'll emit data in 512 byte blocks. +// if you .end() or .flush(), it'll emit whatever it's got, +// padded with nulls to 512 bytes. + +module.exports = BlockStream + +var Stream = require("stream").Stream + , inherits = require("inherits") + , assert = require("assert").ok + , debug = process.env.DEBUG ? console.error : function () {} + +function BlockStream (size, opt) { + this.writable = this.readable = true + this._opt = opt || {} + this._chunkSize = size || 512 + this._offset = 0 + this._buffer = [] + this._bufferLength = 0 + if (this._opt.nopad) this._zeroes = false + else { + this._zeroes = new Buffer(this._chunkSize) + for (var i = 0; i < this._chunkSize; i ++) { + this._zeroes[i] = 0 + } + } +} + +inherits(BlockStream, Stream) + +BlockStream.prototype.write = function (c) { + // debug(" BS write", c) + if (this._ended) throw new Error("BlockStream: write after end") + if (c && !Buffer.isBuffer(c)) c = new Buffer(c + "") + if (c.length) { + this._buffer.push(c) + this._bufferLength += c.length + } + // debug("pushed onto buffer", this._bufferLength) + if (this._bufferLength >= this._chunkSize) { + if (this._paused) { + // debug(" BS paused, return false, need drain") + this._needDrain = true + return false + } + this._emitChunk() + } + return true +} + +BlockStream.prototype.pause = function () { + // debug(" BS pausing") + this._paused = true +} + +BlockStream.prototype.resume = function () { + // debug(" BS resume") + this._paused = false + return this._emitChunk() +} + +BlockStream.prototype.end = function (chunk) { + // debug("end", chunk) + if (typeof chunk === "function") cb = chunk, chunk = null + if (chunk) this.write(chunk) + this._ended = true + this.flush() +} + +BlockStream.prototype.flush = function () { + this._emitChunk(true) +} + +BlockStream.prototype._emitChunk = function (flush) { + // debug("emitChunk flush=%j emitting=%j paused=%j", flush, this._emitting, this._paused) + + // emit a chunk + if (flush && this._zeroes) { + // debug(" BS push zeroes", this._bufferLength) + // push a chunk of zeroes + var padBytes = (this._bufferLength % this._chunkSize) + if (padBytes !== 0) padBytes = this._chunkSize - padBytes + if (padBytes > 0) { + // debug("padBytes", padBytes, this._zeroes.slice(0, padBytes)) + this._buffer.push(this._zeroes.slice(0, padBytes)) + this._bufferLength += padBytes + // debug(this._buffer[this._buffer.length - 1].length, this._bufferLength) + } + } + + if (this._emitting || this._paused) return + this._emitting = true + + // debug(" BS entering loops") + var bufferIndex = 0 + while (this._bufferLength >= this._chunkSize && + (flush || !this._paused)) { + // debug(" BS data emission loop", this._bufferLength) + + var out + , outOffset = 0 + , outHas = this._chunkSize + + while (outHas > 0 && (flush || !this._paused) ) { + // debug(" BS data inner emit loop", this._bufferLength) + var cur = this._buffer[bufferIndex] + , curHas = cur.length - this._offset + // debug("cur=", cur) + // debug("curHas=%j", curHas) + // If it's not big enough to fill the whole thing, then we'll need + // to copy multiple buffers into one. However, if it is big enough, + // then just slice out the part we want, to save unnecessary copying. + // Also, need to copy if we've already done some copying, since buffers + // can't be joined like cons strings. + if (out || curHas < outHas) { + out = out || new Buffer(this._chunkSize) + cur.copy(out, outOffset, + this._offset, this._offset + Math.min(curHas, outHas)) + } else if (cur.length === outHas && this._offset === 0) { + // shortcut -- cur is exactly long enough, and no offset. + out = cur + } else { + // slice out the piece of cur that we need. + out = cur.slice(this._offset, this._offset + outHas) + } + + if (curHas > outHas) { + // means that the current buffer couldn't be completely output + // update this._offset to reflect how much WAS written + this._offset += outHas + outHas = 0 + } else { + // output the entire current chunk. + // toss it away + outHas -= curHas + outOffset += curHas + bufferIndex ++ + this._offset = 0 + } + } + + this._bufferLength -= this._chunkSize + assert(out.length === this._chunkSize) + // debug("emitting data", out) + // debug(" BS emitting, paused=%j", this._paused, this._bufferLength) + this.emit("data", out) + out = null + } + // debug(" BS out of loops", this._bufferLength) + + // whatever is left, it's not enough to fill up a block, or we're paused + this._buffer = this._buffer.slice(bufferIndex) + if (this._paused) { + // debug(" BS paused, leaving", this._bufferLength) + this._needsDrain = true + this._emitting = false + return + } + + // if flushing, and not using null-padding, then need to emit the last + // chunk(s) sitting in the queue. We know that it's not enough to + // fill up a whole block, because otherwise it would have been emitted + // above, but there may be some offset. + var l = this._buffer.length + if (flush && !this._zeroes && l) { + if (l === 1) { + if (this._offset) { + this.emit("data", this._buffer[0].slice(this._offset)) + } else { + this.emit("data", this._buffer[0]) + } + } else { + var outHas = this._bufferLength + , out = new Buffer(outHas) + , outOffset = 0 + for (var i = 0; i < l; i ++) { + var cur = this._buffer[i] + , curHas = cur.length - this._offset + cur.copy(out, outOffset, this._offset) + this._offset = 0 + outOffset += curHas + this._bufferLength -= curHas + } + this.emit("data", out) + } + // truncate + this._buffer.length = 0 + this._bufferLength = 0 + this._offset = 0 + } + + // now either drained or ended + // debug("either draining, or ended", this._bufferLength, this._ended) + // means that we've flushed out all that we can so far. + if (this._needDrain) { + // debug("emitting drain", this._bufferLength) + this._needDrain = false + this.emit("drain") + } + + if ((this._bufferLength === 0) && this._ended && !this._endEmitted) { + // debug("emitting end", this._bufferLength) + this._endEmitted = true + this.emit("end") + } + + this._emitting = false + + // debug(" BS no longer emitting", flush, this._paused, this._emitting, this._bufferLength, this._chunkSize) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json new file mode 100644 index 0000000..b9be4d9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json @@ -0,0 +1,54 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "block-stream", + "description": "a stream of blocks", + "version": "0.0.7", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/block-stream.git" + }, + "engines": { + "node": "0.4 || >=0.5.8" + }, + "main": "block-stream.js", + "dependencies": { + "inherits": "~2.0.0" + }, + "devDependencies": { + "tap": "0.x" + }, + "scripts": { + "test": "tap test/" + }, + "license": "BSD", + "readme": "# block-stream\n\nA stream of blocks.\n\nWrite data into it, and it'll output data in buffer blocks the size you\nspecify, padding with zeroes if necessary.\n\n```javascript\nvar block = new BlockStream(512)\nfs.createReadStream(\"some-file\").pipe(block)\nblock.pipe(fs.createWriteStream(\"block-file\"))\n```\n\nWhen `.end()` or `.flush()` is called, it'll pad the block with zeroes.\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/block-stream/issues" + }, + "_id": "block-stream@0.0.7", + "dist": { + "shasum": "9088ab5ae1e861f4d81b176b4a8046080703deed", + "tarball": "http://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz" + }, + "_from": "block-stream@*", + "_npmVersion": "1.3.4", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "9088ab5ae1e861f4d81b176b4a8046080703deed", + "_resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.7.tgz", + "homepage": "https://github.com/isaacs/block-stream" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/basic.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/basic.js new file mode 100644 index 0000000..b4b9305 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/basic.js @@ -0,0 +1,27 @@ +var tap = require("tap") + , BlockStream = require("../block-stream.js") + +tap.test("basic test", function (t) { + var b = new BlockStream(16) + var fs = require("fs") + var fstr = fs.createReadStream(__filename, {encoding: "utf8"}) + fstr.pipe(b) + + var stat + t.doesNotThrow(function () { + stat = fs.statSync(__filename) + }, "stat should not throw") + + var totalBytes = 0 + b.on("data", function (c) { + t.equal(c.length, 16, "chunks should be 16 bytes long") + t.type(c, Buffer, "chunks should be buffer objects") + totalBytes += c.length + }) + b.on("end", function () { + var expectedBytes = stat.size + (16 - stat.size % 16) + t.equal(totalBytes, expectedBytes, "Should be multiple of 16") + t.end() + }) + +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js new file mode 100644 index 0000000..7a8de88 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad-thorough.js @@ -0,0 +1,68 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16]//, 25]//, 1024] + , writeSizes = [4, 15, 16, 17, 64 ]//, 64, 100] + , writeCounts = [1, 10]//, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize, {nopad: true }) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = writeSize * writeCount * 2 + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad.js new file mode 100644 index 0000000..6d38429 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/nopad.js @@ -0,0 +1,57 @@ +var BlockStream = require("../") +var tap = require("tap") + + +tap.test("don't pad, small writes", function (t) { + var f = new BlockStream(16, { nopad: true }) + t.plan(1) + + f.on("data", function (c) { + t.equal(c.toString(), "abc", "should get 'abc'") + }) + + f.on("end", function () { t.end() }) + + f.write(new Buffer("a")) + f.write(new Buffer("b")) + f.write(new Buffer("c")) + f.end() +}) + +tap.test("don't pad, exact write", function (t) { + var f = new BlockStream(16, { nopad: true }) + t.plan(1) + + var first = true + f.on("data", function (c) { + if (first) { + first = false + t.equal(c.toString(), "abcdefghijklmnop", "first chunk") + } else { + t.fail("should only get one") + } + }) + + f.on("end", function () { t.end() }) + + f.end(new Buffer("abcdefghijklmnop")) +}) + +tap.test("don't pad, big write", function (t) { + var f = new BlockStream(16, { nopad: true }) + t.plan(2) + + var first = true + f.on("data", function (c) { + if (first) { + first = false + t.equal(c.toString(), "abcdefghijklmnop", "first chunk") + } else { + t.equal(c.toString(), "q") + } + }) + + f.on("end", function () { t.end() }) + + f.end(new Buffer("abcdefghijklmnopq")) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/pause-resume.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/pause-resume.js new file mode 100644 index 0000000..64d0d09 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/pause-resume.js @@ -0,0 +1,73 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16] + , writeSizes = [15, 16, 17] + , writeCounts = [1, 10]//, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + var paused = false + + f.on("data", function (c) { + timeouts ++ + t.notOk(paused, "should not be paused when emitting data") + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + paused = true + f.pause() + process.nextTick(function () { + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + paused = false + f.resume() + timeouts -- + }) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = expectChunks * blockSize + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 200) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/thorough.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/thorough.js new file mode 100644 index 0000000..1cc9ea0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/thorough.js @@ -0,0 +1,68 @@ +var BlockStream = require("../block-stream.js") + +var blockSizes = [16]//, 25]//, 1024] + , writeSizes = [4, 15, 16, 17, 64 ]//, 64, 100] + , writeCounts = [1, 10]//, 100] + , tap = require("tap") + +writeCounts.forEach(function (writeCount) { +blockSizes.forEach(function (blockSize) { +writeSizes.forEach(function (writeSize) { + tap.test("writeSize=" + writeSize + + " blockSize="+blockSize + + " writeCount="+writeCount, function (t) { + var f = new BlockStream(blockSize) + + var actualChunks = 0 + var actualBytes = 0 + var timeouts = 0 + + f.on("data", function (c) { + timeouts ++ + + actualChunks ++ + actualBytes += c.length + + // make sure that no data gets corrupted, and basic sanity + var before = c.toString() + // simulate a slow write operation + setTimeout(function () { + timeouts -- + + var after = c.toString() + t.equal(after, before, "should not change data") + + // now corrupt it, to find leaks. + for (var i = 0; i < c.length; i ++) { + c[i] = "x".charCodeAt(0) + } + }, 100) + }) + + f.on("end", function () { + // round up to the nearest block size + var expectChunks = Math.ceil(writeSize * writeCount * 2 / blockSize) + var expectBytes = expectChunks * blockSize + t.equal(actualBytes, expectBytes, + "bytes=" + expectBytes + " writeSize=" + writeSize) + t.equal(actualChunks, expectChunks, + "chunks=" + expectChunks + " writeSize=" + writeSize) + + // wait for all the timeout checks to finish, then end the test + setTimeout(function WAIT () { + if (timeouts > 0) return setTimeout(WAIT) + t.end() + }, 100) + }) + + for (var i = 0; i < writeCount; i ++) { + var a = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) a[j] = "a".charCodeAt(0) + var b = new Buffer(writeSize); + for (var j = 0; j < writeSize; j ++) b[j] = "b".charCodeAt(0) + f.write(a) + f.write(b) + } + f.end() + }) +}) }) }) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/two-stream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/two-stream.js new file mode 100644 index 0000000..c6db79a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/test/two-stream.js @@ -0,0 +1,59 @@ +var log = console.log, + assert = require( 'assert' ), + BlockStream = require("../block-stream.js"), + isize = 0, tsize = 0, fsize = 0, psize = 0, i = 0, + filter = null, paper = null, stack = null, + +// a source data buffer +tsize = 1 * 1024; // <- 1K +stack = new Buffer( tsize ); +for ( ; i < tsize; i++) stack[i] = "x".charCodeAt(0); + +isize = 1 * 1024; // <- initial packet size with 4K no bug! +fsize = 2 * 1024 ; // <- first block-stream size +psize = Math.ceil( isize / 6 ); // <- second block-stream size + +fexpected = Math.ceil( tsize / fsize ); // <- packets expected for first +pexpected = Math.ceil( tsize / psize ); // <- packets expected for second + + +filter = new BlockStream( fsize, { nopad : true } ); +paper = new BlockStream( psize, { nopad : true } ); + + +var fcounter = 0; +filter.on( 'data', function (c) { + // verify that they're not null-padded + for (var i = 0; i < c.length; i ++) { + assert.strictEqual(c[i], "x".charCodeAt(0)) + } + ++fcounter; +} ); + +var pcounter = 0; +paper.on( 'data', function (c) { + // verify that they're not null-padded + for (var i = 0; i < c.length; i ++) { + assert.strictEqual(c[i], "x".charCodeAt(0)) + } + ++pcounter; +} ); + +filter.pipe( paper ); + +filter.on( 'end', function () { + log("fcounter: %s === %s", fcounter, fexpected) + assert.strictEqual( fcounter, fexpected ); +} ); + +paper.on( 'end', function () { + log("pcounter: %s === %s", pcounter, pexpected); + assert.strictEqual( pcounter, pexpected ); +} ); + + +for ( i = 0, j = isize; j <= tsize; j += isize ) { + filter.write( stack.slice( j - isize, j ) ); +} + +filter.end(); diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore new file mode 100644 index 0000000..494272a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore @@ -0,0 +1,5 @@ +.*.swp +node_modules/ +examples/deep-copy/ +examples/path/ +examples/filter-copy/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml new file mode 100644 index 0000000..2d26206 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - 0.6 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md new file mode 100644 index 0000000..9d8cb77 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md @@ -0,0 +1,76 @@ +Like FS streams, but with stat on them, and supporting directories and +symbolic links, as well as normal files. Also, you can use this to set +the stats on a file, even if you don't change its contents, or to create +a symlink, etc. + +So, for example, you can "write" a directory, and it'll call `mkdir`. You +can specify a uid and gid, and it'll call `chown`. You can specify a +`mtime` and `atime`, and it'll call `utimes`. You can call it a symlink +and provide a `linkpath` and it'll call `symlink`. + +Note that it won't automatically resolve symbolic links. So, if you +call `fstream.Reader('/some/symlink')` then you'll get an object +that stats and then ends immediately (since it has no data). To follow +symbolic links, do this: `fstream.Reader({path:'/some/symlink', follow: +true })`. + +There are various checks to make sure that the bytes emitted are the +same as the intended size, if the size is set. + +## Examples + +```javascript +fstream + .Writer({ path: "path/to/file" + , mode: 0755 + , size: 6 + }) + .write("hello\n") + .end() +``` + +This will create the directories if they're missing, and then write +`hello\n` into the file, chmod it to 0755, and assert that 6 bytes have +been written when it's done. + +```javascript +fstream + .Writer({ path: "path/to/file" + , mode: 0755 + , size: 6 + , flags: "a" + }) + .write("hello\n") + .end() +``` + +You can pass flags in, if you want to append to a file. + +```javascript +fstream + .Writer({ path: "path/to/symlink" + , linkpath: "./file" + , SymbolicLink: true + , mode: "0755" // octal strings supported + }) + .end() +``` + +If isSymbolicLink is a function, it'll be called, and if it returns +true, then it'll treat it as a symlink. If it's not a function, then +any truish value will make a symlink, or you can set `type: +'SymbolicLink'`, which does the same thing. + +Note that the linkpath is relative to the symbolic link location, not +the parent dir or cwd. + +```javascript +fstream + .Reader("path/to/dir") + .pipe(fstream.Writer("path/to/other/dir")) +``` + +This will do like `cp -Rp path/to/dir path/to/other/dir`. If the other +dir exists and isn't a directory, then it'll emit an error. It'll also +set the uid, gid, mode, etc. to be identical. In this way, it's more +like `rsync -a` than simply a copy. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js new file mode 100644 index 0000000..c6b55b3 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js @@ -0,0 +1,131 @@ +var fstream = require("../fstream.js") +var path = require("path") + +var r = fstream.Reader({ path: path.dirname(__dirname) + , filter: function () { + return !this.basename.match(/^\./) && + !this.basename.match(/^node_modules$/) + !this.basename.match(/^deep-copy$/) + !this.basename.match(/^filter-copy$/) + } + }) + +// this writer will only write directories +var w = fstream.Writer({ path: path.resolve(__dirname, "filter-copy") + , type: "Directory" + , filter: function () { + return this.type === "Directory" + } + }) + +var indent = "" +var escape = {} + +r.on("entry", appears) +r.on("ready", function () { + console.error("ready to begin!", r.path) +}) + +function appears (entry) { + console.error(indent + "a %s appears!", entry.type, entry.basename, typeof entry.basename) + if (foggy) { + console.error("FOGGY!") + var p = entry + do { + console.error(p.depth, p.path, p._paused) + } while (p = p.parent) + + throw new Error("\033[mshould not have entries while foggy") + } + indent += "\t" + entry.on("data", missile(entry)) + entry.on("end", runaway(entry)) + entry.on("entry", appears) +} + +var foggy +function missile (entry) { + if (entry.type === "Directory") { + var ended = false + entry.once("end", function () { ended = true }) + return function (c) { + // throw in some pathological pause()/resume() behavior + // just for extra fun. + process.nextTick(function () { + if (!foggy && !ended) { // && Math.random() < 0.3) { + console.error(indent +"%s casts a spell", entry.basename) + console.error("\na slowing fog comes over the battlefield...\n\033[32m") + entry.pause() + entry.once("resume", liftFog) + foggy = setTimeout(liftFog, 1000) + + function liftFog (who) { + if (!foggy) return + if (who) { + console.error("%s breaks the spell!", who && who.path) + } else { + console.error("the spell expires!") + } + console.error("\033[mthe fog lifts!\n") + clearTimeout(foggy) + foggy = null + if (entry._paused) entry.resume() + } + + } + }) + } + } + + return function (c) { + var e = Math.random() < 0.5 + console.error(indent + "%s %s for %d damage!", + entry.basename, + e ? "is struck" : "fires a chunk", + c.length) + } +} + +function runaway (entry) { return function () { + var e = Math.random() < 0.5 + console.error(indent + "%s %s", + entry.basename, + e ? "turns to flee" : "is vanquished!") + indent = indent.slice(0, -1) +}} + + +w.on("entry", attacks) +//w.on("ready", function () { attacks(w) }) +function attacks (entry) { + console.error(indent + "%s %s!", entry.basename, + entry.type === "Directory" ? "calls for backup" : "attacks") + entry.on("entry", attacks) +} + +ended = false +var i = 1 +r.on("end", function () { + if (foggy) clearTimeout(foggy) + console.error("\033[mIT'S OVER!!") + console.error("A WINNAR IS YOU!") + + console.log("ok " + (i ++) + " A WINNAR IS YOU") + ended = true + // now go through and verify that everything in there is a dir. + var p = path.resolve(__dirname, "filter-copy") + var checker = fstream.Reader({ path: p }) + checker.checker = true + checker.on("child", function (e) { + var ok = e.type === "Directory" + console.log((ok ? "" : "not ") + "ok " + (i ++) + + " should be a dir: " + + e.path.substr(checker.path.length + 1)) + }) +}) + +process.on("exit", function () { + console.log((ended ? "" : "not ") + "ok " + (i ++) + " ended") +}) + +r.pipe(w) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js new file mode 100644 index 0000000..648ec84 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js @@ -0,0 +1,115 @@ +var fstream = require("../fstream.js") +var path = require("path") + +var r = fstream.Reader({ path: path.dirname(__dirname) + , filter: function () { + return !this.basename.match(/^\./) && + !this.basename.match(/^node_modules$/) + !this.basename.match(/^deep-copy$/) + } + }) + +var w = fstream.Writer({ path: path.resolve(__dirname, "deep-copy") + , type: "Directory" + }) + +var indent = "" +var escape = {} + +r.on("entry", appears) +r.on("ready", function () { + console.error("ready to begin!", r.path) +}) + +function appears (entry) { + console.error(indent + "a %s appears!", entry.type, entry.basename, typeof entry.basename, entry) + if (foggy) { + console.error("FOGGY!") + var p = entry + do { + console.error(p.depth, p.path, p._paused) + } while (p = p.parent) + + throw new Error("\033[mshould not have entries while foggy") + } + indent += "\t" + entry.on("data", missile(entry)) + entry.on("end", runaway(entry)) + entry.on("entry", appears) +} + +var foggy +function missile (entry) { + if (entry.type === "Directory") { + var ended = false + entry.once("end", function () { ended = true }) + return function (c) { + // throw in some pathological pause()/resume() behavior + // just for extra fun. + process.nextTick(function () { + if (!foggy && !ended) { // && Math.random() < 0.3) { + console.error(indent +"%s casts a spell", entry.basename) + console.error("\na slowing fog comes over the battlefield...\n\033[32m") + entry.pause() + entry.once("resume", liftFog) + foggy = setTimeout(liftFog, 10) + + function liftFog (who) { + if (!foggy) return + if (who) { + console.error("%s breaks the spell!", who && who.path) + } else { + console.error("the spell expires!") + } + console.error("\033[mthe fog lifts!\n") + clearTimeout(foggy) + foggy = null + if (entry._paused) entry.resume() + } + + } + }) + } + } + + return function (c) { + var e = Math.random() < 0.5 + console.error(indent + "%s %s for %d damage!", + entry.basename, + e ? "is struck" : "fires a chunk", + c.length) + } +} + +function runaway (entry) { return function () { + var e = Math.random() < 0.5 + console.error(indent + "%s %s", + entry.basename, + e ? "turns to flee" : "is vanquished!") + indent = indent.slice(0, -1) +}} + + +w.on("entry", attacks) +//w.on("ready", function () { attacks(w) }) +function attacks (entry) { + console.error(indent + "%s %s!", entry.basename, + entry.type === "Directory" ? "calls for backup" : "attacks") + entry.on("entry", attacks) +} + +ended = false +r.on("end", function () { + if (foggy) clearTimeout(foggy) + console.error("\033[mIT'S OVER!!") + console.error("A WINNAR IS YOU!") + + console.log("ok 1 A WINNAR IS YOU") + ended = true +}) + +process.on("exit", function () { + console.log((ended ? "" : "not ") + "ok 2 ended") +}) + +r.pipe(w) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js new file mode 100644 index 0000000..9aa1a95 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js @@ -0,0 +1,54 @@ +var fstream = require("../fstream.js") +var tap = require("tap") +var fs = require("fs") +var path = require("path") +var children = -1 +var dir = path.dirname(__dirname) + +var gotReady = false +var ended = false + +tap.test("reader test", function (t) { + + var r = fstream.Reader({ path: dir + , filter: function () { + // return this.parent === r + return this.parent === r || this === r + } + }) + + r.on("ready", function () { + gotReady = true + children = fs.readdirSync(dir).length + console.error("Setting expected children to "+children) + t.equal(r.type, "Directory", "should be a directory") + }) + + r.on("entry", function (entry) { + children -- + if (!gotReady) { + t.fail("children before ready!") + } + t.equal(entry.dirname, r.path, "basename is parent dir") + }) + + r.on("error", function (er) { + t.fail(er) + t.end() + process.exit(1) + }) + + r.on("end", function () { + t.equal(children, 0, "should have seen all children") + ended = true + }) + + var closed = false + r.on("close", function () { + t.ok(ended, "saw end before close") + t.notOk(closed, "close should only happen once") + closed = true + t.end() + }) + +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js new file mode 100644 index 0000000..d7816d2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js @@ -0,0 +1,24 @@ +var fstream = require("../fstream.js") + , closed = false + +fstream + .Writer({ path: "path/to/symlink" + , linkpath: "./file" + , isSymbolicLink: true + , mode: "0755" // octal strings supported + }) + .on("close", function () { + closed = true + var fs = require("fs") + var s = fs.lstatSync("path/to/symlink") + var isSym = s.isSymbolicLink() + console.log((isSym?"":"not ") +"ok 1 should be symlink") + var t = fs.readlinkSync("path/to/symlink") + var isTarget = t === "./file" + console.log((isTarget?"":"not ") +"ok 2 should link to ./file") + }) + .end() + +process.on("exit", function () { + console.log((closed?"":"not ")+"ok 3 should be closed") +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js new file mode 100644 index 0000000..c66d26f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js @@ -0,0 +1,31 @@ +exports.Abstract = require("./lib/abstract.js") +exports.Reader = require("./lib/reader.js") +exports.Writer = require("./lib/writer.js") + +exports.File = + { Reader: require("./lib/file-reader.js") + , Writer: require("./lib/file-writer.js") } + +exports.Dir = + { Reader : require("./lib/dir-reader.js") + , Writer : require("./lib/dir-writer.js") } + +exports.Link = + { Reader : require("./lib/link-reader.js") + , Writer : require("./lib/link-writer.js") } + +exports.Proxy = + { Reader : require("./lib/proxy-reader.js") + , Writer : require("./lib/proxy-writer.js") } + +exports.Reader.Dir = exports.DirReader = exports.Dir.Reader +exports.Reader.File = exports.FileReader = exports.File.Reader +exports.Reader.Link = exports.LinkReader = exports.Link.Reader +exports.Reader.Proxy = exports.ProxyReader = exports.Proxy.Reader + +exports.Writer.Dir = exports.DirWriter = exports.Dir.Writer +exports.Writer.File = exports.FileWriter = exports.File.Writer +exports.Writer.Link = exports.LinkWriter = exports.Link.Writer +exports.Writer.Proxy = exports.ProxyWriter = exports.Proxy.Writer + +exports.collect = require("./lib/collect.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js new file mode 100644 index 0000000..11ef0e2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js @@ -0,0 +1,85 @@ +// the parent class for all fstreams. + +module.exports = Abstract + +var Stream = require("stream").Stream + , inherits = require("inherits") + +function Abstract () { + Stream.call(this) +} + +inherits(Abstract, Stream) + +Abstract.prototype.on = function (ev, fn) { + if (ev === "ready" && this.ready) { + process.nextTick(fn.bind(this)) + } else { + Stream.prototype.on.call(this, ev, fn) + } + return this +} + +Abstract.prototype.abort = function () { + this._aborted = true + this.emit("abort") +} + +Abstract.prototype.destroy = function () {} + +Abstract.prototype.warn = function (msg, code) { + var me = this + , er = decorate(msg, code, me) + if (!me.listeners("warn")) { + console.error("%s %s\n" + + "path = %s\n" + + "syscall = %s\n" + + "fstream_type = %s\n" + + "fstream_path = %s\n" + + "fstream_unc_path = %s\n" + + "fstream_class = %s\n" + + "fstream_stack =\n%s\n", + code || "UNKNOWN", + er.stack, + er.path, + er.syscall, + er.fstream_type, + er.fstream_path, + er.fstream_unc_path, + er.fstream_class, + er.fstream_stack.join("\n")) + } else { + me.emit("warn", er) + } +} + +Abstract.prototype.info = function (msg, code) { + this.emit("info", msg, code) +} + +Abstract.prototype.error = function (msg, code, th) { + var er = decorate(msg, code, this) + if (th) throw er + else this.emit("error", er) +} + +function decorate (er, code, me) { + if (!(er instanceof Error)) er = new Error(er) + er.code = er.code || code + er.path = er.path || me.path + er.fstream_type = er.fstream_type || me.type + er.fstream_path = er.fstream_path || me.path + if (me._path !== me.path) { + er.fstream_unc_path = er.fstream_unc_path || me._path + } + if (me.linkpath) { + er.fstream_linkpath = er.fstream_linkpath || me.linkpath + } + er.fstream_class = er.fstream_class || me.constructor.name + er.fstream_stack = er.fstream_stack || + new Error().stack.split(/\n/).slice(3).map(function (s) { + return s.replace(/^ at /, "") + }) + + return er +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js new file mode 100644 index 0000000..a36f780 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js @@ -0,0 +1,67 @@ +module.exports = collect + +function collect (stream) { + if (stream._collected) return + + stream._collected = true + stream.pause() + + stream.on("data", save) + stream.on("end", save) + var buf = [] + function save (b) { + if (typeof b === "string") b = new Buffer(b) + if (Buffer.isBuffer(b) && !b.length) return + buf.push(b) + } + + stream.on("entry", saveEntry) + var entryBuffer = [] + function saveEntry (e) { + collect(e) + entryBuffer.push(e) + } + + stream.on("proxy", proxyPause) + function proxyPause (p) { + p.pause() + } + + + // replace the pipe method with a new version that will + // unlock the buffered stuff. if you just call .pipe() + // without a destination, then it'll re-play the events. + stream.pipe = (function (orig) { return function (dest) { + // console.error(" === open the pipes", dest && dest.path) + + // let the entries flow through one at a time. + // Once they're all done, then we can resume completely. + var e = 0 + ;(function unblockEntry () { + var entry = entryBuffer[e++] + // console.error(" ==== unblock entry", entry && entry.path) + if (!entry) return resume() + entry.on("end", unblockEntry) + if (dest) dest.add(entry) + else stream.emit("entry", entry) + })() + + function resume () { + stream.removeListener("entry", saveEntry) + stream.removeListener("data", save) + stream.removeListener("end", save) + + stream.pipe = orig + if (dest) stream.pipe(dest) + + buf.forEach(function (b) { + if (b) stream.emit("data", b) + else stream.emit("end") + }) + + stream.resume() + } + + return dest + }})(stream.pipe) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js new file mode 100644 index 0000000..346ac2b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js @@ -0,0 +1,251 @@ +// A thing that emits "entry" events with Reader objects +// Pausing it causes it to stop emitting entry events, and also +// pauses the current entry if there is one. + +module.exports = DirReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , Reader = fstream.Reader + , inherits = require("inherits") + , mkdir = require("mkdirp") + , path = require("path") + , Reader = require("./reader.js") + , assert = require("assert").ok + +inherits(DirReader, Reader) + +function DirReader (props) { + var me = this + if (!(me instanceof DirReader)) throw new Error( + "DirReader must be called as constructor.") + + // should already be established as a Directory type + if (props.type !== "Directory" || !props.Directory) { + throw new Error("Non-directory type "+ props.type) + } + + me.entries = null + me._index = -1 + me._paused = false + me._length = -1 + + if (props.sort) { + this.sort = props.sort + } + + Reader.call(this, props) +} + +DirReader.prototype._getEntries = function () { + var me = this + + // race condition. might pause() before calling _getEntries, + // and then resume, and try to get them a second time. + if (me._gotEntries) return + me._gotEntries = true + + fs.readdir(me._path, function (er, entries) { + if (er) return me.error(er) + + me.entries = entries + + me.emit("entries", entries) + if (me._paused) me.once("resume", processEntries) + else processEntries() + + function processEntries () { + me._length = me.entries.length + if (typeof me.sort === "function") { + me.entries = me.entries.sort(me.sort.bind(me)) + } + me._read() + } + }) +} + +// start walking the dir, and emit an "entry" event for each one. +DirReader.prototype._read = function () { + var me = this + + if (!me.entries) return me._getEntries() + + if (me._paused || me._currentEntry || me._aborted) { + // console.error("DR paused=%j, current=%j, aborted=%j", me._paused, !!me._currentEntry, me._aborted) + return + } + + me._index ++ + if (me._index >= me.entries.length) { + if (!me._ended) { + me._ended = true + me.emit("end") + me.emit("close") + } + return + } + + // ok, handle this one, then. + + // save creating a proxy, by stat'ing the thing now. + var p = path.resolve(me._path, me.entries[me._index]) + assert(p !== me._path) + assert(me.entries[me._index]) + + // set this to prevent trying to _read() again in the stat time. + me._currentEntry = p + fs[ me.props.follow ? "stat" : "lstat" ](p, function (er, stat) { + if (er) return me.error(er) + + var who = me._proxy || me + + stat.path = p + stat.basename = path.basename(p) + stat.dirname = path.dirname(p) + var childProps = me.getChildProps.call(who, stat) + childProps.path = p + childProps.basename = path.basename(p) + childProps.dirname = path.dirname(p) + + var entry = Reader(childProps, stat) + + // console.error("DR Entry", p, stat.size) + + me._currentEntry = entry + + // "entry" events are for direct entries in a specific dir. + // "child" events are for any and all children at all levels. + // This nomenclature is not completely final. + + entry.on("pause", function (who) { + if (!me._paused && !entry._disowned) { + me.pause(who) + } + }) + + entry.on("resume", function (who) { + if (me._paused && !entry._disowned) { + me.resume(who) + } + }) + + entry.on("stat", function (props) { + me.emit("_entryStat", entry, props) + if (entry._aborted) return + if (entry._paused) entry.once("resume", function () { + me.emit("entryStat", entry, props) + }) + else me.emit("entryStat", entry, props) + }) + + entry.on("ready", function EMITCHILD () { + // console.error("DR emit child", entry._path) + if (me._paused) { + // console.error(" DR emit child - try again later") + // pause the child, and emit the "entry" event once we drain. + // console.error("DR pausing child entry") + entry.pause(me) + return me.once("resume", EMITCHILD) + } + + // skip over sockets. they can't be piped around properly, + // so there's really no sense even acknowledging them. + // if someone really wants to see them, they can listen to + // the "socket" events. + if (entry.type === "Socket") { + me.emit("socket", entry) + } else { + me.emitEntry(entry) + } + }) + + var ended = false + entry.on("close", onend) + entry.on("disown", onend) + function onend () { + if (ended) return + ended = true + me.emit("childEnd", entry) + me.emit("entryEnd", entry) + me._currentEntry = null + if (!me._paused) { + me._read() + } + } + + // XXX Remove this. Works in node as of 0.6.2 or so. + // Long filenames should not break stuff. + entry.on("error", function (er) { + if (entry._swallowErrors) { + me.warn(er) + entry.emit("end") + entry.emit("close") + } else { + me.emit("error", er) + } + }) + + // proxy up some events. + ; [ "child" + , "childEnd" + , "warn" + ].forEach(function (ev) { + entry.on(ev, me.emit.bind(me, ev)) + }) + }) +} + +DirReader.prototype.disown = function (entry) { + entry.emit("beforeDisown") + entry._disowned = true + entry.parent = entry.root = null + if (entry === this._currentEntry) { + this._currentEntry = null + } + entry.emit("disown") +} + +DirReader.prototype.getChildProps = function (stat) { + return { depth: this.depth + 1 + , root: this.root || this + , parent: this + , follow: this.follow + , filter: this.filter + , sort: this.props.sort + , hardlinks: this.props.hardlinks + } +} + +DirReader.prototype.pause = function (who) { + var me = this + if (me._paused) return + who = who || me + me._paused = true + if (me._currentEntry && me._currentEntry.pause) { + me._currentEntry.pause(who) + } + me.emit("pause", who) +} + +DirReader.prototype.resume = function (who) { + var me = this + if (!me._paused) return + who = who || me + + me._paused = false + // console.error("DR Emit Resume", me._path) + me.emit("resume", who) + if (me._paused) { + // console.error("DR Re-paused", me._path) + return + } + + if (me._currentEntry) { + if (me._currentEntry.resume) me._currentEntry.resume(who) + } else me._read() +} + +DirReader.prototype.emitEntry = function (entry) { + this.emit("entry", entry) + this.emit("child", entry) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js new file mode 100644 index 0000000..7073b88 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js @@ -0,0 +1,171 @@ +// It is expected that, when .add() returns false, the consumer +// of the DirWriter will pause until a "drain" event occurs. Note +// that this is *almost always going to be the case*, unless the +// thing being written is some sort of unsupported type, and thus +// skipped over. + +module.exports = DirWriter + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , Writer = require("./writer.js") + , inherits = require("inherits") + , mkdir = require("mkdirp") + , path = require("path") + , collect = require("./collect.js") + +inherits(DirWriter, Writer) + +function DirWriter (props) { + var me = this + if (!(me instanceof DirWriter)) me.error( + "DirWriter must be called as constructor.", null, true) + + // should already be established as a Directory type + if (props.type !== "Directory" || !props.Directory) { + me.error("Non-directory type "+ props.type + " " + + JSON.stringify(props), null, true) + } + + Writer.call(this, props) +} + +DirWriter.prototype._create = function () { + var me = this + mkdir(me._path, Writer.dirmode, function (er) { + if (er) return me.error(er) + // ready to start getting entries! + me.ready = true + me.emit("ready") + me._process() + }) +} + +// a DirWriter has an add(entry) method, but its .write() doesn't +// do anything. Why a no-op rather than a throw? Because this +// leaves open the door for writing directory metadata for +// gnu/solaris style dumpdirs. +DirWriter.prototype.write = function () { + return true +} + +DirWriter.prototype.end = function () { + this._ended = true + this._process() +} + +DirWriter.prototype.add = function (entry) { + var me = this + + // console.error("\tadd", entry._path, "->", me._path) + collect(entry) + if (!me.ready || me._currentEntry) { + me._buffer.push(entry) + return false + } + + // create a new writer, and pipe the incoming entry into it. + if (me._ended) { + return me.error("add after end") + } + + me._buffer.push(entry) + me._process() + + return 0 === this._buffer.length +} + +DirWriter.prototype._process = function () { + var me = this + + // console.error("DW Process p=%j", me._processing, me.basename) + + if (me._processing) return + + var entry = me._buffer.shift() + if (!entry) { + // console.error("DW Drain") + me.emit("drain") + if (me._ended) me._finish() + return + } + + me._processing = true + // console.error("DW Entry", entry._path) + + me.emit("entry", entry) + + // ok, add this entry + // + // don't allow recursive copying + var p = entry + do { + var pp = p._path || p.path + if (pp === me.root._path || pp === me._path || + (pp && pp.indexOf(me._path) === 0)) { + // console.error("DW Exit (recursive)", entry.basename, me._path) + me._processing = false + if (entry._collected) entry.pipe() + return me._process() + } + } while (p = p.parent) + + // console.error("DW not recursive") + + // chop off the entry's root dir, replace with ours + var props = { parent: me + , root: me.root || me + , type: entry.type + , depth: me.depth + 1 } + + var p = entry._path || entry.path || entry.props.path + if (entry.parent) { + p = p.substr(entry.parent._path.length + 1) + } + // get rid of any ../../ shenanigans + props.path = path.join(me.path, path.join("/", p)) + + // if i have a filter, the child should inherit it. + props.filter = me.filter + + // all the rest of the stuff, copy over from the source. + Object.keys(entry.props).forEach(function (k) { + if (!props.hasOwnProperty(k)) { + props[k] = entry.props[k] + } + }) + + // not sure at this point what kind of writer this is. + var child = me._currentChild = new Writer(props) + child.on("ready", function () { + // console.error("DW Child Ready", child.type, child._path) + // console.error(" resuming", entry._path) + entry.pipe(child) + entry.resume() + }) + + // XXX Make this work in node. + // Long filenames should not break stuff. + child.on("error", function (er) { + if (child._swallowErrors) { + me.warn(er) + child.emit("end") + child.emit("close") + } else { + me.emit("error", er) + } + }) + + // we fire _end internally *after* end, so that we don't move on + // until any "end" listeners have had their chance to do stuff. + child.on("close", onend) + var ended = false + function onend () { + if (ended) return + ended = true + // console.error("* DW Child end", child.basename) + me._currentChild = null + me._processing = false + me._process() + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js new file mode 100644 index 0000000..b1f9861 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js @@ -0,0 +1,147 @@ +// Basically just a wrapper around an fs.ReadStream + +module.exports = FileReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , Reader = fstream.Reader + , inherits = require("inherits") + , mkdir = require("mkdirp") + , Reader = require("./reader.js") + , EOF = {EOF: true} + , CLOSE = {CLOSE: true} + +inherits(FileReader, Reader) + +function FileReader (props) { + // console.error(" FR create", props.path, props.size, new Error().stack) + var me = this + if (!(me instanceof FileReader)) throw new Error( + "FileReader must be called as constructor.") + + // should already be established as a File type + // XXX Todo: preserve hardlinks by tracking dev+inode+nlink, + // with a HardLinkReader class. + if (!((props.type === "Link" && props.Link) || + (props.type === "File" && props.File))) { + throw new Error("Non-file type "+ props.type) + } + + me._buffer = [] + me._bytesEmitted = 0 + Reader.call(me, props) +} + +FileReader.prototype._getStream = function () { + var me = this + , stream = me._stream = fs.createReadStream(me._path, me.props) + + if (me.props.blksize) { + stream.bufferSize = me.props.blksize + } + + stream.on("open", me.emit.bind(me, "open")) + + stream.on("data", function (c) { + // console.error("\t\t%d %s", c.length, me.basename) + me._bytesEmitted += c.length + // no point saving empty chunks + if (!c.length) return + else if (me._paused || me._buffer.length) { + me._buffer.push(c) + me._read() + } else me.emit("data", c) + }) + + stream.on("end", function () { + if (me._paused || me._buffer.length) { + // console.error("FR Buffering End", me._path) + me._buffer.push(EOF) + me._read() + } else { + me.emit("end") + } + + if (me._bytesEmitted !== me.props.size) { + me.error("Didn't get expected byte count\n"+ + "expect: "+me.props.size + "\n" + + "actual: "+me._bytesEmitted) + } + }) + + stream.on("close", function () { + if (me._paused || me._buffer.length) { + // console.error("FR Buffering Close", me._path) + me._buffer.push(CLOSE) + me._read() + } else { + // console.error("FR close 1", me._path) + me.emit("close") + } + }) + + me._read() +} + +FileReader.prototype._read = function () { + var me = this + // console.error("FR _read", me._path) + if (me._paused) { + // console.error("FR _read paused", me._path) + return + } + + if (!me._stream) { + // console.error("FR _getStream calling", me._path) + return me._getStream() + } + + // clear out the buffer, if there is one. + if (me._buffer.length) { + // console.error("FR _read has buffer", me._buffer.length, me._path) + var buf = me._buffer + for (var i = 0, l = buf.length; i < l; i ++) { + var c = buf[i] + if (c === EOF) { + // console.error("FR Read emitting buffered end", me._path) + me.emit("end") + } else if (c === CLOSE) { + // console.error("FR Read emitting buffered close", me._path) + me.emit("close") + } else { + // console.error("FR Read emitting buffered data", me._path) + me.emit("data", c) + } + + if (me._paused) { + // console.error("FR Read Re-pausing at "+i, me._path) + me._buffer = buf.slice(i) + return + } + } + me._buffer.length = 0 + } + // console.error("FR _read done") + // that's about all there is to it. +} + +FileReader.prototype.pause = function (who) { + var me = this + // console.error("FR Pause", me._path) + if (me._paused) return + who = who || me + me._paused = true + if (me._stream) me._stream.pause() + me.emit("pause", who) +} + +FileReader.prototype.resume = function (who) { + var me = this + // console.error("FR Resume", me._path) + if (!me._paused) return + who = who || me + me.emit("resume", who) + me._paused = false + if (me._stream) me._stream.resume() + me._read() +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js new file mode 100644 index 0000000..5e9902a --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js @@ -0,0 +1,104 @@ +module.exports = FileWriter + +var fs = require("graceful-fs") + , mkdir = require("mkdirp") + , Writer = require("./writer.js") + , inherits = require("inherits") + , EOF = {} + +inherits(FileWriter, Writer) + +function FileWriter (props) { + var me = this + if (!(me instanceof FileWriter)) throw new Error( + "FileWriter must be called as constructor.") + + // should already be established as a File type + if (props.type !== "File" || !props.File) { + throw new Error("Non-file type "+ props.type) + } + + me._buffer = [] + me._bytesWritten = 0 + + Writer.call(this, props) +} + +FileWriter.prototype._create = function () { + var me = this + if (me._stream) return + + var so = {} + if (me.props.flags) so.flags = me.props.flags + so.mode = Writer.filemode + if (me._old && me._old.blksize) so.bufferSize = me._old.blksize + + me._stream = fs.createWriteStream(me._path, so) + + me._stream.on("open", function (fd) { + // console.error("FW open", me._buffer, me._path) + me.ready = true + me._buffer.forEach(function (c) { + if (c === EOF) me._stream.end() + else me._stream.write(c) + }) + me.emit("ready") + // give this a kick just in case it needs it. + me.emit("drain") + }) + + me._stream.on("drain", function () { me.emit("drain") }) + + me._stream.on("close", function () { + // console.error("\n\nFW Stream Close", me._path, me.size) + me._finish() + }) +} + +FileWriter.prototype.write = function (c) { + var me = this + + me._bytesWritten += c.length + + if (!me.ready) { + if (!Buffer.isBuffer(c) && typeof c !== 'string') + throw new Error('invalid write data') + me._buffer.push(c) + return false + } + + var ret = me._stream.write(c) + // console.error("\t-- fw wrote, _stream says", ret, me._stream._queue.length) + + // allow 2 buffered writes, because otherwise there's just too + // much stop and go bs. + if (ret === false && me._stream._queue) { + return me._stream._queue.length <= 2; + } else { + return ret; + } +} + +FileWriter.prototype.end = function (c) { + var me = this + + if (c) me.write(c) + + if (!me.ready) { + me._buffer.push(EOF) + return false + } + + return me._stream.end() +} + +FileWriter.prototype._finish = function () { + var me = this + if (typeof me.size === "number" && me._bytesWritten != me.size) { + me.error( + "Did not get expected byte count.\n" + + "expect: " + me.size + "\n" + + "actual: " + me._bytesWritten) + } + Writer.prototype._finish.call(me) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js new file mode 100644 index 0000000..cd65c41 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js @@ -0,0 +1,32 @@ +module.exports = getType + +function getType (st) { + var types = + [ "Directory" + , "File" + , "SymbolicLink" + , "Link" // special for hardlinks from tarballs + , "BlockDevice" + , "CharacterDevice" + , "FIFO" + , "Socket" ] + , type + + if (st.type && -1 !== types.indexOf(st.type)) { + st[st.type] = true + return st.type + } + + for (var i = 0, l = types.length; i < l; i ++) { + type = types[i] + var is = st[type] || st["is" + type] + if (typeof is === "function") is = is.call(st) + if (is) { + st[type] = true + st.type = type + return type + } + } + + return null +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js new file mode 100644 index 0000000..7e7ab6c --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js @@ -0,0 +1,54 @@ +// Basically just a wrapper around an fs.readlink +// +// XXX: Enhance this to support the Link type, by keeping +// a lookup table of {:}, so that hardlinks +// can be preserved in tarballs. + +module.exports = LinkReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , inherits = require("inherits") + , mkdir = require("mkdirp") + , Reader = require("./reader.js") + +inherits(LinkReader, Reader) + +function LinkReader (props) { + var me = this + if (!(me instanceof LinkReader)) throw new Error( + "LinkReader must be called as constructor.") + + if (!((props.type === "Link" && props.Link) || + (props.type === "SymbolicLink" && props.SymbolicLink))) { + throw new Error("Non-link type "+ props.type) + } + + Reader.call(me, props) +} + +// When piping a LinkReader into a LinkWriter, we have to +// already have the linkpath property set, so that has to +// happen *before* the "ready" event, which means we need to +// override the _stat method. +LinkReader.prototype._stat = function (currentStat) { + var me = this + fs.readlink(me._path, function (er, linkpath) { + if (er) return me.error(er) + me.linkpath = me.props.linkpath = linkpath + me.emit("linkpath", linkpath) + Reader.prototype._stat.call(me, currentStat) + }) +} + +LinkReader.prototype._read = function () { + var me = this + if (me._paused) return + // basically just a no-op, since we got all the info we need + // from the _stat method + if (!me._ended) { + me.emit("end") + me.emit("close") + me._ended = true + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js new file mode 100644 index 0000000..5c8f1e7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js @@ -0,0 +1,95 @@ + +module.exports = LinkWriter + +var fs = require("graceful-fs") + , Writer = require("./writer.js") + , inherits = require("inherits") + , path = require("path") + , rimraf = require("rimraf") + +inherits(LinkWriter, Writer) + +function LinkWriter (props) { + var me = this + if (!(me instanceof LinkWriter)) throw new Error( + "LinkWriter must be called as constructor.") + + // should already be established as a Link type + if (!((props.type === "Link" && props.Link) || + (props.type === "SymbolicLink" && props.SymbolicLink))) { + throw new Error("Non-link type "+ props.type) + } + + if (props.linkpath === "") props.linkpath = "." + if (!props.linkpath) { + me.error("Need linkpath property to create " + props.type) + } + + Writer.call(this, props) +} + +LinkWriter.prototype._create = function () { + // console.error(" LW _create") + var me = this + , hard = me.type === "Link" || process.platform === "win32" + , link = hard ? "link" : "symlink" + , lp = hard ? path.resolve(me.dirname, me.linkpath) : me.linkpath + + // can only change the link path by clobbering + // For hard links, let's just assume that's always the case, since + // there's no good way to read them if we don't already know. + if (hard) return clobber(me, lp, link) + + fs.readlink(me._path, function (er, p) { + // only skip creation if it's exactly the same link + if (p && p === lp) return finish(me) + clobber(me, lp, link) + }) +} + +function clobber (me, lp, link) { + rimraf(me._path, function (er) { + if (er) return me.error(er) + create(me, lp, link) + }) +} + +function create (me, lp, link) { + fs[link](lp, me._path, function (er) { + // if this is a hard link, and we're in the process of writing out a + // directory, it's very possible that the thing we're linking to + // doesn't exist yet (especially if it was intended as a symlink), + // so swallow ENOENT errors here and just soldier in. + // Additionally, an EPERM or EACCES can happen on win32 if it's trying + // to make a link to a directory. Again, just skip it. + // A better solution would be to have fs.symlink be supported on + // windows in some nice fashion. + if (er) { + if ((er.code === "ENOENT" || + er.code === "EACCES" || + er.code === "EPERM" ) && process.platform === "win32") { + me.ready = true + me.emit("ready") + me.emit("end") + me.emit("close") + me.end = me._finish = function () {} + } else return me.error(er) + } + finish(me) + }) +} + +function finish (me) { + me.ready = true + me.emit("ready") + if (me._ended && !me._finished) me._finish() +} + +LinkWriter.prototype.end = function () { + // console.error("LW finish in end") + this._ended = true + if (this.ready) { + this._finished = true + this._finish() + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js new file mode 100644 index 0000000..a0ece34 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js @@ -0,0 +1,93 @@ +// A reader for when we don't yet know what kind of thing +// the thing is. + +module.exports = ProxyReader + +var Reader = require("./reader.js") + , getType = require("./get-type.js") + , inherits = require("inherits") + , fs = require("graceful-fs") + +inherits(ProxyReader, Reader) + +function ProxyReader (props) { + var me = this + if (!(me instanceof ProxyReader)) throw new Error( + "ProxyReader must be called as constructor.") + + me.props = props + me._buffer = [] + me.ready = false + + Reader.call(me, props) +} + +ProxyReader.prototype._stat = function () { + var me = this + , props = me.props + // stat the thing to see what the proxy should be. + , stat = props.follow ? "stat" : "lstat" + + fs[stat](props.path, function (er, current) { + var type + if (er || !current) { + type = "File" + } else { + type = getType(current) + } + + props[type] = true + props.type = me.type = type + + me._old = current + me._addProxy(Reader(props, current)) + }) +} + +ProxyReader.prototype._addProxy = function (proxy) { + var me = this + if (me._proxyTarget) { + return me.error("proxy already set") + } + + me._proxyTarget = proxy + proxy._proxy = me + + ; [ "error" + , "data" + , "end" + , "close" + , "linkpath" + , "entry" + , "entryEnd" + , "child" + , "childEnd" + , "warn" + , "stat" + ].forEach(function (ev) { + // console.error("~~ proxy event", ev, me.path) + proxy.on(ev, me.emit.bind(me, ev)) + }) + + me.emit("proxy", proxy) + + proxy.on("ready", function () { + // console.error("~~ proxy is ready!", me.path) + me.ready = true + me.emit("ready") + }) + + var calls = me._buffer + me._buffer.length = 0 + calls.forEach(function (c) { + proxy[c[0]].apply(proxy, c[1]) + }) +} + +ProxyReader.prototype.pause = function () { + return this._proxyTarget ? this._proxyTarget.pause() : false +} + +ProxyReader.prototype.resume = function () { + return this._proxyTarget ? this._proxyTarget.resume() : false +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js new file mode 100644 index 0000000..b047663 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js @@ -0,0 +1,109 @@ +// A writer for when we don't know what kind of thing +// the thing is. That is, it's not explicitly set, +// so we're going to make it whatever the thing already +// is, or "File" +// +// Until then, collect all events. + +module.exports = ProxyWriter + +var Writer = require("./writer.js") + , getType = require("./get-type.js") + , inherits = require("inherits") + , collect = require("./collect.js") + , fs = require("fs") + +inherits(ProxyWriter, Writer) + +function ProxyWriter (props) { + var me = this + if (!(me instanceof ProxyWriter)) throw new Error( + "ProxyWriter must be called as constructor.") + + me.props = props + me._needDrain = false + + Writer.call(me, props) +} + +ProxyWriter.prototype._stat = function () { + var me = this + , props = me.props + // stat the thing to see what the proxy should be. + , stat = props.follow ? "stat" : "lstat" + + fs[stat](props.path, function (er, current) { + var type + if (er || !current) { + type = "File" + } else { + type = getType(current) + } + + props[type] = true + props.type = me.type = type + + me._old = current + me._addProxy(Writer(props, current)) + }) +} + +ProxyWriter.prototype._addProxy = function (proxy) { + // console.error("~~ set proxy", this.path) + var me = this + if (me._proxy) { + return me.error("proxy already set") + } + + me._proxy = proxy + ; [ "ready" + , "error" + , "close" + , "pipe" + , "drain" + , "warn" + ].forEach(function (ev) { + proxy.on(ev, me.emit.bind(me, ev)) + }) + + me.emit("proxy", proxy) + + var calls = me._buffer + calls.forEach(function (c) { + // console.error("~~ ~~ proxy buffered call", c[0], c[1]) + proxy[c[0]].apply(proxy, c[1]) + }) + me._buffer.length = 0 + if (me._needsDrain) me.emit("drain") +} + +ProxyWriter.prototype.add = function (entry) { + // console.error("~~ proxy add") + collect(entry) + + if (!this._proxy) { + this._buffer.push(["add", [entry]]) + this._needDrain = true + return false + } + return this._proxy.add(entry) +} + +ProxyWriter.prototype.write = function (c) { + // console.error("~~ proxy write") + if (!this._proxy) { + this._buffer.push(["write", [c]]) + this._needDrain = true + return false + } + return this._proxy.write(c) +} + +ProxyWriter.prototype.end = function (c) { + // console.error("~~ proxy end") + if (!this._proxy) { + this._buffer.push(["end", [c]]) + return false + } + return this._proxy.end(c) +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js new file mode 100644 index 0000000..0edb794 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js @@ -0,0 +1,262 @@ + +module.exports = Reader + +var fs = require("graceful-fs") + , Stream = require("stream").Stream + , inherits = require("inherits") + , path = require("path") + , getType = require("./get-type.js") + , hardLinks = Reader.hardLinks = {} + , Abstract = require("./abstract.js") + +// Must do this *before* loading the child classes +inherits(Reader, Abstract) + +var DirReader = require("./dir-reader.js") + , FileReader = require("./file-reader.js") + , LinkReader = require("./link-reader.js") + , SocketReader = require("./socket-reader.js") + , ProxyReader = require("./proxy-reader.js") + +function Reader (props, currentStat) { + var me = this + if (!(me instanceof Reader)) return new Reader(props, currentStat) + + if (typeof props === "string") { + props = { path: props } + } + + if (!props.path) { + me.error("Must provide a path", null, true) + } + + // polymorphism. + // call fstream.Reader(dir) to get a DirReader object, etc. + // Note that, unlike in the Writer case, ProxyReader is going + // to be the *normal* state of affairs, since we rarely know + // the type of a file prior to reading it. + + + var type + , ClassType + + if (props.type && typeof props.type === "function") { + type = props.type + ClassType = type + } else { + type = getType(props) + ClassType = Reader + } + + if (currentStat && !type) { + type = getType(currentStat) + props[type] = true + props.type = type + } + + switch (type) { + case "Directory": + ClassType = DirReader + break + + case "Link": + // XXX hard links are just files. + // However, it would be good to keep track of files' dev+inode + // and nlink values, and create a HardLinkReader that emits + // a linkpath value of the original copy, so that the tar + // writer can preserve them. + // ClassType = HardLinkReader + // break + + case "File": + ClassType = FileReader + break + + case "SymbolicLink": + ClassType = LinkReader + break + + case "Socket": + ClassType = SocketReader + break + + case null: + ClassType = ProxyReader + break + } + + if (!(me instanceof ClassType)) { + return new ClassType(props) + } + + Abstract.call(me) + + me.readable = true + me.writable = false + + me.type = type + me.props = props + me.depth = props.depth = props.depth || 0 + me.parent = props.parent || null + me.root = props.root || (props.parent && props.parent.root) || me + + me._path = me.path = path.resolve(props.path) + if (process.platform === "win32") { + me.path = me._path = me.path.replace(/\?/g, "_") + if (me._path.length >= 260) { + // how DOES one create files on the moon? + // if the path has spaces in it, then UNC will fail. + me._swallowErrors = true + //if (me._path.indexOf(" ") === -1) { + me._path = "\\\\?\\" + me.path.replace(/\//g, "\\") + //} + } + } + me.basename = props.basename = path.basename(me.path) + me.dirname = props.dirname = path.dirname(me.path) + + // these have served their purpose, and are now just noisy clutter + props.parent = props.root = null + + // console.error("\n\n\n%s setting size to", props.path, props.size) + me.size = props.size + me.filter = typeof props.filter === "function" ? props.filter : null + if (props.sort === "alpha") props.sort = alphasort + + // start the ball rolling. + // this will stat the thing, and then call me._read() + // to start reading whatever it is. + // console.error("calling stat", props.path, currentStat) + me._stat(currentStat) +} + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + +Reader.prototype._stat = function (currentStat) { + var me = this + , props = me.props + , stat = props.follow ? "stat" : "lstat" + // console.error("Reader._stat", me._path, currentStat) + if (currentStat) process.nextTick(statCb.bind(null, null, currentStat)) + else fs[stat](me._path, statCb) + + + function statCb (er, props_) { + // console.error("Reader._stat, statCb", me._path, props_, props_.nlink) + if (er) return me.error(er) + + Object.keys(props_).forEach(function (k) { + props[k] = props_[k] + }) + + // if it's not the expected size, then abort here. + if (undefined !== me.size && props.size !== me.size) { + return me.error("incorrect size") + } + me.size = props.size + + var type = getType(props) + var handleHardlinks = props.hardlinks !== false + + // special little thing for handling hardlinks. + if (handleHardlinks && type !== "Directory" && props.nlink && props.nlink > 1) { + var k = props.dev + ":" + props.ino + // console.error("Reader has nlink", me._path, k) + if (hardLinks[k] === me._path || !hardLinks[k]) hardLinks[k] = me._path + else { + // switch into hardlink mode. + type = me.type = me.props.type = "Link" + me.Link = me.props.Link = true + me.linkpath = me.props.linkpath = hardLinks[k] + // console.error("Hardlink detected, switching mode", me._path, me.linkpath) + // Setting __proto__ would arguably be the "correct" + // approach here, but that just seems too wrong. + me._stat = me._read = LinkReader.prototype._read + } + } + + if (me.type && me.type !== type) { + me.error("Unexpected type: " + type) + } + + // if the filter doesn't pass, then just skip over this one. + // still have to emit end so that dir-walking can move on. + if (me.filter) { + var who = me._proxy || me + // special handling for ProxyReaders + if (!me.filter.call(who, who, props)) { + if (!me._disowned) { + me.abort() + me.emit("end") + me.emit("close") + } + return + } + } + + // last chance to abort or disown before the flow starts! + var events = ["_stat", "stat", "ready"] + var e = 0 + ;(function go () { + if (me._aborted) { + me.emit("end") + me.emit("close") + return + } + + if (me._paused && me.type !== "Directory") { + me.once("resume", go) + return + } + + var ev = events[e ++] + if (!ev) { + return me._read() + } + me.emit(ev, props) + go() + })() + } +} + +Reader.prototype.pipe = function (dest, opts) { + var me = this + if (typeof dest.add === "function") { + // piping to a multi-compatible, and we've got directory entries. + me.on("entry", function (entry) { + var ret = dest.add(entry) + if (false === ret) { + me.pause() + } + }) + } + + // console.error("R Pipe apply Stream Pipe") + return Stream.prototype.pipe.apply(this, arguments) +} + +Reader.prototype.pause = function (who) { + this._paused = true + who = who || this + this.emit("pause", who) + if (this._stream) this._stream.pause(who) +} + +Reader.prototype.resume = function (who) { + this._paused = false + who = who || this + this.emit("resume", who) + if (this._stream) this._stream.resume(who) + this._read() +} + +Reader.prototype._read = function () { + this.error("Cannot read unknown type: "+this.type) +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js new file mode 100644 index 0000000..e89c173 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js @@ -0,0 +1,38 @@ +// Just get the stats, and then don't do anything. +// You can't really "read" from a socket. You "connect" to it. +// Mostly, this is here so that reading a dir with a socket in it +// doesn't blow up. + +module.exports = SocketReader + +var fs = require("graceful-fs") + , fstream = require("../fstream.js") + , inherits = require("inherits") + , mkdir = require("mkdirp") + , Reader = require("./reader.js") + +inherits(SocketReader, Reader) + +function SocketReader (props) { + var me = this + if (!(me instanceof SocketReader)) throw new Error( + "SocketReader must be called as constructor.") + + if (!(props.type === "Socket" && props.Socket)) { + throw new Error("Non-socket type "+ props.type) + } + + Reader.call(me, props) +} + +SocketReader.prototype._read = function () { + var me = this + if (me._paused) return + // basically just a no-op, since we got all the info we have + // from the _stat method + if (!me._ended) { + me.emit("end") + me.emit("close") + me._ended = true + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js new file mode 100644 index 0000000..8b1bbf9 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js @@ -0,0 +1,392 @@ + +module.exports = Writer + +var fs = require("graceful-fs") + , inherits = require("inherits") + , rimraf = require("rimraf") + , mkdir = require("mkdirp") + , path = require("path") + , umask = process.platform === "win32" ? 0 : process.umask() + , getType = require("./get-type.js") + , Abstract = require("./abstract.js") + +// Must do this *before* loading the child classes +inherits(Writer, Abstract) + +Writer.dirmode = 0777 & (~umask) +Writer.filemode = 0666 & (~umask) + +var DirWriter = require("./dir-writer.js") + , LinkWriter = require("./link-writer.js") + , FileWriter = require("./file-writer.js") + , ProxyWriter = require("./proxy-writer.js") + +// props is the desired state. current is optionally the current stat, +// provided here so that subclasses can avoid statting the target +// more than necessary. +function Writer (props, current) { + var me = this + + if (typeof props === "string") { + props = { path: props } + } + + if (!props.path) me.error("Must provide a path", null, true) + + // polymorphism. + // call fstream.Writer(dir) to get a DirWriter object, etc. + var type = getType(props) + , ClassType = Writer + + switch (type) { + case "Directory": + ClassType = DirWriter + break + case "File": + ClassType = FileWriter + break + case "Link": + case "SymbolicLink": + ClassType = LinkWriter + break + case null: + // Don't know yet what type to create, so we wrap in a proxy. + ClassType = ProxyWriter + break + } + + if (!(me instanceof ClassType)) return new ClassType(props) + + // now get down to business. + + Abstract.call(me) + + // props is what we want to set. + // set some convenience properties as well. + me.type = props.type + me.props = props + me.depth = props.depth || 0 + me.clobber = false === props.clobber ? props.clobber : true + me.parent = props.parent || null + me.root = props.root || (props.parent && props.parent.root) || me + + me._path = me.path = path.resolve(props.path) + if (process.platform === "win32") { + me.path = me._path = me.path.replace(/\?/g, "_") + if (me._path.length >= 260) { + me._swallowErrors = true + me._path = "\\\\?\\" + me.path.replace(/\//g, "\\") + } + } + me.basename = path.basename(props.path) + me.dirname = path.dirname(props.path) + me.linkpath = props.linkpath || null + + props.parent = props.root = null + + // console.error("\n\n\n%s setting size to", props.path, props.size) + me.size = props.size + + if (typeof props.mode === "string") { + props.mode = parseInt(props.mode, 8) + } + + me.readable = false + me.writable = true + + // buffer until ready, or while handling another entry + me._buffer = [] + me.ready = false + + me.filter = typeof props.filter === "function" ? props.filter: null + + // start the ball rolling. + // this checks what's there already, and then calls + // me._create() to call the impl-specific creation stuff. + me._stat(current) +} + +// Calling this means that it's something we can't create. +// Just assert that it's already there, otherwise raise a warning. +Writer.prototype._create = function () { + var me = this + fs[me.props.follow ? "stat" : "lstat"](me._path, function (er, current) { + if (er) { + return me.warn("Cannot create " + me._path + "\n" + + "Unsupported type: "+me.type, "ENOTSUP") + } + me._finish() + }) +} + +Writer.prototype._stat = function (current) { + var me = this + , props = me.props + , stat = props.follow ? "stat" : "lstat" + , who = me._proxy || me + + if (current) statCb(null, current) + else fs[stat](me._path, statCb) + + function statCb (er, current) { + if (me.filter && !me.filter.call(who, who, current)) { + me._aborted = true + me.emit("end") + me.emit("close") + return + } + + // if it's not there, great. We'll just create it. + // if it is there, then we'll need to change whatever differs + if (er || !current) { + return create(me) + } + + me._old = current + var currentType = getType(current) + + // if it's a type change, then we need to clobber or error. + // if it's not a type change, then let the impl take care of it. + if (currentType !== me.type) { + return rimraf(me._path, function (er) { + if (er) return me.error(er) + me._old = null + create(me) + }) + } + + // otherwise, just handle in the app-specific way + // this creates a fs.WriteStream, or mkdir's, or whatever + create(me) + } +} + +function create (me) { + // console.error("W create", me._path, Writer.dirmode) + + // XXX Need to clobber non-dirs that are in the way, + // unless { clobber: false } in the props. + mkdir(path.dirname(me._path), Writer.dirmode, function (er, made) { + // console.error("W created", path.dirname(me._path), er) + if (er) return me.error(er) + + // later on, we have to set the mode and owner for these + me._madeDir = made + return me._create() + }) +} + +function endChmod (me, want, current, path, cb) { + var wantMode = want.mode + , chmod = want.follow || me.type !== "SymbolicLink" + ? "chmod" : "lchmod" + + if (!fs[chmod]) return cb() + if (typeof wantMode !== "number") return cb() + + var curMode = current.mode & 0777 + wantMode = wantMode & 0777 + if (wantMode === curMode) return cb() + + fs[chmod](path, wantMode, 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 (typeof want.uid !== "number" && + typeof want.gid !== "number" ) return cb() + + if (current.uid === want.uid && + current.gid === want.gid) return cb() + + var chown = (me.props.follow || me.type !== "SymbolicLink") + ? "chown" : "lchown" + if (!fs[chown]) return cb() + + if (typeof want.uid !== "number") want.uid = current.uid + if (typeof want.gid !== "number") want.gid = current.gid + + fs[chown](path, want.uid, want.gid, cb) +} + +function endUtimes (me, want, current, path, cb) { + if (!fs.utimes || process.platform === "win32") return cb() + + var utimes = (want.follow || me.type !== "SymbolicLink") + ? "utimes" : "lutimes" + + if (utimes === "lutimes" && !fs[utimes]) { + utimes = "utimes" + } + + if (!fs[utimes]) return cb() + + var curA = current.atime + , curM = current.mtime + , meA = want.atime + , meM = want.mtime + + if (meA === undefined) meA = curA + if (meM === undefined) meM = curM + + if (!isDate(meA)) meA = new Date(meA) + if (!isDate(meM)) meA = new Date(meM) + + if (meA.getTime() === curA.getTime() && + meM.getTime() === curM.getTime()) return cb() + + fs[utimes](path, meA, meM, cb) +} + + +// XXX This function is beastly. Break it up! +Writer.prototype._finish = function () { + var me = this + + if (me._finishing) return + me._finishing = true + + // console.error(" W Finish", me._path, me.size) + + // set up all the things. + // At this point, we're already done writing whatever we've gotta write, + // adding files to the dir, etc. + var todo = 0 + var errState = null + var done = false + + if (me._old) { + // the times will almost *certainly* have changed. + // adds the utimes syscall, but remove another stat. + me._old.atime = new Date(0) + me._old.mtime = new Date(0) + // console.error(" W Finish Stale Stat", me._path, me.size) + setProps(me._old) + } else { + var stat = me.props.follow ? "stat" : "lstat" + // console.error(" W Finish Stating", me._path, me.size) + fs[stat](me._path, function (er, current) { + // console.error(" W Finish Stated", me._path, me.size, current) + if (er) { + // if we're in the process of writing out a + // directory, it's very possible that the thing we're linking to + // doesn't exist yet (especially if it was intended as a symlink), + // so swallow ENOENT errors here and just soldier on. + if (er.code === "ENOENT" && + (me.type === "Link" || me.type === "SymbolicLink") && + process.platform === "win32") { + me.ready = true + me.emit("ready") + me.emit("end") + me.emit("close") + me.end = me._finish = function () {} + return + } else return me.error(er) + } + setProps(me._old = current) + }) + } + + return + + function setProps (current) { + todo += 3 + endChmod(me, me.props, current, me._path, next("chmod")) + endChown(me, me.props, current, me._path, next("chown")) + endUtimes(me, me.props, current, me._path, next("utimes")) + } + + function next (what) { + return function (er) { + // console.error(" W Finish", what, todo) + if (errState) return + if (er) { + er.fstream_finish_call = what + return me.error(errState = er) + } + if (--todo > 0) return + if (done) return + done = true + + // we may still need to set the mode/etc. on some parent dirs + // that were created previously. delay end/close until then. + if (!me._madeDir) return end() + else endMadeDir(me, me._path, end) + + function end (er) { + if (er) { + er.fstream_finish_call = "setupMadeDir" + return me.error(er) + } + // all the props have been set, so we're completely done. + me.emit("end") + me.emit("close") + } + } + } +} + +function endMadeDir (me, p, cb) { + var made = me._madeDir + // everything *between* made and path.dirname(me._path) + // needs to be set up. Note that this may just be one dir. + var d = path.dirname(p) + + endMadeDir_(me, d, function (er) { + if (er) return cb(er) + if (d === made) { + return cb() + } + endMadeDir(me, d, cb) + }) +} + +function endMadeDir_ (me, p, cb) { + var dirProps = {} + Object.keys(me.props).forEach(function (k) { + dirProps[k] = me.props[k] + + // only make non-readable dirs if explicitly requested. + if (k === "mode" && me.type !== "Directory") { + dirProps[k] = dirProps[k] | 0111 + } + }) + + var todo = 3 + , errState = null + fs.stat(p, function (er, current) { + if (er) return cb(errState = er) + endChmod(me, dirProps, current, p, next) + endChown(me, dirProps, current, p, next) + endUtimes(me, dirProps, current, p, next) + }) + + function next (er) { + if (errState) return + if (er) return cb(errState = er) + if (-- todo === 0) return cb() + } +} + +Writer.prototype.pipe = function () { + this.error("Can't pipe from writable stream") +} + +Writer.prototype.add = function () { + this.error("Cannot add to non-Directory type") +} + +Writer.prototype.write = function () { + return true +} + +function objectToString (d) { + return Object.prototype.toString.call(d) +} + +function isDate(d) { + return typeof d === 'object' && objectToString(d) === '[object Date]'; +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/.npmignore b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/.npmignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/.npmignore @@ -0,0 +1 @@ +node_modules/ diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE new file mode 100644 index 0000000..0c44ae7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) Isaac Z. Schlueter ("Author") +All rights reserved. + +The BSD License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md new file mode 100644 index 0000000..13a2e86 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md @@ -0,0 +1,36 @@ +# graceful-fs + +graceful-fs functions as a drop-in replacement for the fs module, +making various improvements. + +The improvements are meant to normalize behavior across different +platforms and environments, and to make filesystem access more +resilient to errors. + +## Improvements over [fs module](http://api.nodejs.org/fs.html) + +graceful-fs: + +* Queues up `open` and `readdir` calls, and retries them once + something closes if there is an EMFILE error from too many file + descriptors. +* fixes `lchmod` for Node versions prior to 0.6.2. +* implements `fs.lutimes` if possible. Otherwise it becomes a noop. +* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or + `lchown` if the user isn't root. +* makes `lchmod` and `lchown` become noops, if not available. +* retries reading a file if `read` results in EAGAIN error. + +On Windows, it retries renaming a file for up to one second if `EACCESS` +or `EPERM` error occurs, likely because antivirus software has locked +the directory. + +## USAGE + +```javascript +// use just like fs +var fs = require('graceful-fs') + +// now go and do stuff with it... +fs.readFileSync('some-file-or-whatever') +``` diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js new file mode 100644 index 0000000..ae9fd6f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js @@ -0,0 +1,11 @@ +// eeeeeevvvvviiiiiiillllll +// more evil than monkey-patching the native builtin? +// Not sure. + +var mod = require("module") +var pre = '(function (exports, require, module, __filename, __dirname) { ' +var post = '});' +var src = pre + process.binding('natives').fs + post +var vm = require('vm') +var fn = vm.runInThisContext(src) +return fn(exports, require, module, __filename, __dirname) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js new file mode 100644 index 0000000..77fc702 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js @@ -0,0 +1,158 @@ +// Monkey-patching the fs module. +// It's ugly, but there is simply no other way to do this. +var fs = module.exports = require('./fs.js') + +var assert = require('assert') + +// fix up some busted stuff, mostly on windows and old nodes +require('./polyfills.js') + +var util = require('util') + +function noop () {} + +var debug = noop +if (util.debuglog) + debug = util.debuglog('gfs') +else if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) + debug = function() { + var m = util.format.apply(util, arguments) + m = 'GFS: ' + m.split(/\n/).join('\nGFS: ') + console.error(m) + } + +if (/\bgfs\b/i.test(process.env.NODE_DEBUG || '')) { + process.on('exit', function() { + debug('fds', fds) + debug(queue) + assert.equal(queue.length, 0) + }) +} + + +var originalOpen = fs.open +fs.open = open + +function open(path, flags, mode, cb) { + if (typeof mode === "function") cb = mode, mode = null + if (typeof cb !== "function") cb = noop + new OpenReq(path, flags, mode, cb) +} + +function OpenReq(path, flags, mode, cb) { + this.path = path + this.flags = flags + this.mode = mode + this.cb = cb + Req.call(this) +} + +util.inherits(OpenReq, Req) + +OpenReq.prototype.process = function() { + originalOpen.call(fs, this.path, this.flags, this.mode, this.done) +} + +var fds = {} +OpenReq.prototype.done = function(er, fd) { + debug('open done', er, fd) + if (fd) + fds['fd' + fd] = this.path + Req.prototype.done.call(this, er, fd) +} + + +var originalReaddir = fs.readdir +fs.readdir = readdir + +function readdir(path, cb) { + if (typeof cb !== "function") cb = noop + new ReaddirReq(path, cb) +} + +function ReaddirReq(path, cb) { + this.path = path + this.cb = cb + Req.call(this) +} + +util.inherits(ReaddirReq, Req) + +ReaddirReq.prototype.process = function() { + originalReaddir.call(fs, this.path, this.done) +} + +ReaddirReq.prototype.done = function(er, files) { + if (files && files.sort) + files = files.sort() + Req.prototype.done.call(this, er, files) + onclose() +} + + +var originalClose = fs.close +fs.close = close + +function close (fd, cb) { + debug('close', fd) + if (typeof cb !== "function") cb = noop + delete fds['fd' + fd] + originalClose.call(fs, fd, function(er) { + onclose() + cb(er) + }) +} + + +var originalCloseSync = fs.closeSync +fs.closeSync = closeSync + +function closeSync (fd) { + try { + return originalCloseSync(fd) + } finally { + onclose() + } +} + + +// Req class +function Req () { + // start processing + this.done = this.done.bind(this) + this.failures = 0 + this.process() +} + +Req.prototype.done = function (er, result) { + var tryAgain = false + if (er) { + var code = er.code + var tryAgain = code === "EMFILE" + if (process.platform === "win32") + tryAgain = tryAgain || code === "OK" + } + + if (tryAgain) { + this.failures ++ + enqueue(this) + } else { + var cb = this.cb + cb(er, result) + } +} + +var queue = [] + +function enqueue(req) { + queue.push(req) + debug('enqueue %d %s', queue.length, req.constructor.name, req) +} + +function onclose() { + var req = queue.shift() + if (req) { + debug('process', req.constructor.name, req) + req.process() + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json new file mode 100644 index 0000000..5da73b0 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json @@ -0,0 +1,66 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me" + }, + "name": "graceful-fs", + "description": "A drop-in replacement for fs, making various improvements.", + "version": "3.0.2", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-graceful-fs.git" + }, + "main": "graceful-fs.js", + "engines": { + "node": ">=0.4.0" + }, + "directories": { + "test": "test" + }, + "scripts": { + "test": "tap test/*.js" + }, + "keywords": [ + "fs", + "module", + "reading", + "retry", + "retries", + "queue", + "error", + "errors", + "handling", + "EMFILE", + "EAGAIN", + "EINVAL", + "EPERM", + "EACCESS" + ], + "license": "BSD", + "gitHead": "0caa11544c0c9001db78bf593cf0c5805d149a41", + "bugs": { + "url": "https://github.com/isaacs/node-graceful-fs/issues" + }, + "homepage": "https://github.com/isaacs/node-graceful-fs", + "_id": "graceful-fs@3.0.2", + "_shasum": "2cb5bf7f742bea8ad47c754caeee032b7e71a577", + "_from": "graceful-fs@3", + "_npmVersion": "1.4.14", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "2cb5bf7f742bea8ad47c754caeee032b7e71a577", + "tarball": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz" + }, + "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js new file mode 100644 index 0000000..9d62af5 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js @@ -0,0 +1,255 @@ +var fs = require('./fs.js') +var constants = require('constants') + +var origCwd = process.cwd +var cwd = null +process.cwd = function() { + if (!cwd) + cwd = origCwd.call(process) + return cwd +} +var chdir = process.chdir +process.chdir = function(d) { + cwd = null + chdir.call(process, d) +} + +// (re-)implement some things that are known busted or missing. + +// lchmod, broken prior to 0.6.2 +// back-port the fix here. +if (constants.hasOwnProperty('O_SYMLINK') && + process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) { + fs.lchmod = function (path, mode, callback) { + callback = callback || noop + fs.open( path + , constants.O_WRONLY | constants.O_SYMLINK + , mode + , function (err, fd) { + if (err) { + callback(err) + return + } + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + fs.fchmod(fd, mode, function (err) { + fs.close(fd, function(err2) { + callback(err || err2) + }) + }) + }) + } + + fs.lchmodSync = function (path, mode) { + var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode) + + // prefer to return the chmod error, if one occurs, + // but still try to close, and report closing errors if they occur. + var err, err2 + try { + var ret = fs.fchmodSync(fd, mode) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } +} + + +// lutimes implementation, or no-op +if (!fs.lutimes) { + if (constants.hasOwnProperty("O_SYMLINK")) { + fs.lutimes = function (path, at, mt, cb) { + fs.open(path, constants.O_SYMLINK, function (er, fd) { + cb = cb || noop + if (er) return cb(er) + fs.futimes(fd, at, mt, function (er) { + fs.close(fd, function (er2) { + return cb(er || er2) + }) + }) + }) + } + + fs.lutimesSync = function (path, at, mt) { + var fd = fs.openSync(path, constants.O_SYMLINK) + , err + , err2 + , ret + + try { + var ret = fs.futimesSync(fd, at, mt) + } catch (er) { + err = er + } + try { + fs.closeSync(fd) + } catch (er) { + err2 = er + } + if (err || err2) throw (err || err2) + return ret + } + + } else if (fs.utimensat && constants.hasOwnProperty("AT_SYMLINK_NOFOLLOW")) { + // maybe utimensat will be bound soonish? + fs.lutimes = function (path, at, mt, cb) { + fs.utimensat(path, at, mt, constants.AT_SYMLINK_NOFOLLOW, cb) + } + + fs.lutimesSync = function (path, at, mt) { + return fs.utimensatSync(path, at, mt, constants.AT_SYMLINK_NOFOLLOW) + } + + } else { + fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) } + fs.lutimesSync = function () {} + } +} + + +// https://github.com/isaacs/node-graceful-fs/issues/4 +// Chown should not fail on einval or eperm if non-root. +// It should not fail on enosys ever, as this just indicates +// that a fs doesn't support the intended operation. + +fs.chown = chownFix(fs.chown) +fs.fchown = chownFix(fs.fchown) +fs.lchown = chownFix(fs.lchown) + +fs.chmod = chownFix(fs.chmod) +fs.fchmod = chownFix(fs.fchmod) +fs.lchmod = chownFix(fs.lchmod) + +fs.chownSync = chownFixSync(fs.chownSync) +fs.fchownSync = chownFixSync(fs.fchownSync) +fs.lchownSync = chownFixSync(fs.lchownSync) + +fs.chmodSync = chownFix(fs.chmodSync) +fs.fchmodSync = chownFix(fs.fchmodSync) +fs.lchmodSync = chownFix(fs.lchmodSync) + +function chownFix (orig) { + if (!orig) return orig + return function (target, uid, gid, cb) { + return orig.call(fs, target, uid, gid, function (er, res) { + if (chownErOk(er)) er = null + cb(er, res) + }) + } +} + +function chownFixSync (orig) { + if (!orig) return orig + return function (target, uid, gid) { + try { + return orig.call(fs, target, uid, gid) + } catch (er) { + if (!chownErOk(er)) throw er + } + } +} + +// ENOSYS means that the fs doesn't support the op. Just ignore +// that, because it doesn't matter. +// +// if there's no getuid, or if getuid() is something other +// than 0, and the error is EINVAL or EPERM, then just ignore +// it. +// +// This specific case is a silent failure in cp, install, tar, +// and most other unix tools that manage permissions. +// +// When running as root, or if other types of errors are +// encountered, then it's strict. +function chownErOk (er) { + if (!er) + return true + + if (er.code === "ENOSYS") + return true + + var nonroot = !process.getuid || process.getuid() !== 0 + if (nonroot) { + if (er.code === "EINVAL" || er.code === "EPERM") + return true + } + + return false +} + + +// if lchmod/lchown do not exist, then make them no-ops +if (!fs.lchmod) { + fs.lchmod = function (path, mode, cb) { + process.nextTick(cb) + } + fs.lchmodSync = function () {} +} +if (!fs.lchown) { + fs.lchown = function (path, uid, gid, cb) { + process.nextTick(cb) + } + fs.lchownSync = function () {} +} + + + +// on Windows, A/V software can lock the directory, causing this +// to fail with an EACCES or EPERM if the directory contains newly +// created files. Try again on failure, for up to 1 second. +if (process.platform === "win32") { + var rename_ = fs.rename + fs.rename = function rename (from, to, cb) { + var start = Date.now() + rename_(from, to, function CB (er) { + if (er + && (er.code === "EACCES" || er.code === "EPERM") + && Date.now() - start < 1000) { + return rename_(from, to, CB) + } + cb(er) + }) + } +} + + +// if read() returns EAGAIN, then just try it again. +var read = fs.read +fs.read = function (fd, buffer, offset, length, position, callback_) { + var callback + if (callback_ && typeof callback_ === 'function') { + var eagCounter = 0 + callback = function (er, _, __) { + if (er && er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + return read.call(fs, fd, buffer, offset, length, position, callback) + } + callback_.apply(this, arguments) + } + } + return read.call(fs, fd, buffer, offset, length, position, callback) +} + +var readSync = fs.readSync +fs.readSync = function (fd, buffer, offset, length, position) { + var eagCounter = 0 + while (true) { + try { + return readSync.call(fs, fd, buffer, offset, length, position) + } catch (er) { + if (er.code === 'EAGAIN' && eagCounter < 10) { + eagCounter ++ + continue + } + throw er + } + } +} + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/open.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/open.js new file mode 100644 index 0000000..85732f2 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/open.js @@ -0,0 +1,39 @@ +var test = require('tap').test +var fs = require('../graceful-fs.js') + +test('graceful fs is monkeypatched fs', function (t) { + t.equal(fs, require('../fs.js')) + t.end() +}) + +test('open an existing file works', function (t) { + var fd = fs.openSync(__filename, 'r') + fs.closeSync(fd) + fs.open(__filename, 'r', function (er, fd) { + if (er) throw er + fs.close(fd, function (er) { + if (er) throw er + t.pass('works') + t.end() + }) + }) +}) + +test('open a non-existing file throws', function (t) { + var er + try { + var fd = fs.openSync('this file does not exist', 'r') + } catch (x) { + er = x + } + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + + fs.open('neither does this file', 'r', function (er, fd) { + t.ok(er, 'should throw') + t.notOk(fd, 'should not get an fd') + t.equal(er.code, 'ENOENT') + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js new file mode 100644 index 0000000..fe005aa --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/test/readdir-sort.js @@ -0,0 +1,21 @@ +var test = require("tap").test +var fs = require("../fs.js") + +var readdir = fs.readdir +fs.readdir = function(path, cb) { + process.nextTick(function() { + cb(null, ["b", "z", "a"]) + }) +} + +var g = require("../") + +test("readdir reorder", function (t) { + g.readdir("whatevers", function (er, files) { + if (er) + throw er + console.error(files) + t.same(files, [ "a", "b", "z" ]) + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json new file mode 100644 index 0000000..c29e2ce --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json @@ -0,0 +1,57 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "fstream", + "description": "Advanced file system stream things", + "version": "1.0.2", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/fstream.git" + }, + "main": "fstream.js", + "engines": { + "node": ">=0.6" + }, + "dependencies": { + "graceful-fs": "3", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "devDependencies": { + "tap": "" + }, + "scripts": { + "test": "tap examples/*.js" + }, + "license": "BSD", + "gitHead": "b3b74e92ef4a91ae206fab90b7998c7cd2e4290d", + "bugs": { + "url": "https://github.com/isaacs/fstream/issues" + }, + "homepage": "https://github.com/isaacs/fstream", + "_id": "fstream@1.0.2", + "_shasum": "56930ff1b4d4d7b1a689c8656b3a11e744ab92c6", + "_from": "fstream@^1.0.2", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "56930ff1b4d4d7b1a689c8656b3a11e744ab92c6", + "tarball": "http://registry.npmjs.org/fstream/-/fstream-1.0.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.2.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE new file mode 100644 index 0000000..dea3013 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE @@ -0,0 +1,16 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md new file mode 100644 index 0000000..b1c5665 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md @@ -0,0 +1,42 @@ +Browser-friendly inheritance fully compatible with standard node.js +[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). + +This package exports standard `inherits` from node.js `util` module in +node environment, but also provides alternative browser-friendly +implementation through [browser +field](https://gist.github.com/shtylman/4339901). Alternative +implementation is a literal copy of standard one located in standalone +module to avoid requiring of `util`. It also has a shim for old +browsers with no `Object.create` support. + +While keeping you sure you are using standard `inherits` +implementation in node.js environment, it allows bundlers such as +[browserify](https://github.com/substack/node-browserify) to not +include full `util` package to your client code if all you need is +just `inherits` function. It worth, because browser shim for `util` +package is large and `inherits` is often the single function you need +from it. + +It's recommended to use this package instead of +`require('util').inherits` for any code that has chances to be used +not only in node.js but in browser too. + +## usage + +```js +var inherits = require('inherits'); +// then use exactly as the standard one +``` + +## note on version ~1.0 + +Version ~1.0 had completely different motivation and is not compatible +neither with 2.0 nor with standard node.js `inherits`. + +If you are using version ~1.0 and planning to switch to ~2.0, be +careful: + +* new version uses `super_` instead of `super` for referencing + superclass +* new version overwrites current prototype while old one preserves any + existing fields on it diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js new file mode 100644 index 0000000..29f5e24 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js @@ -0,0 +1 @@ +module.exports = require('util').inherits diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js new file mode 100644 index 0000000..c1e78a7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js @@ -0,0 +1,23 @@ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json new file mode 100644 index 0000000..3d69f4f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json @@ -0,0 +1,51 @@ +{ + "name": "inherits", + "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", + "version": "2.0.1", + "keywords": [ + "inheritance", + "class", + "klass", + "oop", + "object-oriented", + "inherits", + "browser", + "browserify" + ], + "main": "./inherits.js", + "browser": "./inherits_browser.js", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/inherits" + }, + "license": "ISC", + "scripts": { + "test": "node test" + }, + "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/isaacs/inherits/issues" + }, + "_id": "inherits@2.0.1", + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@~2.0.1", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js new file mode 100644 index 0000000..fc53012 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js @@ -0,0 +1,25 @@ +var inherits = require('./inherits.js') +var assert = require('assert') + +function test(c) { + assert(c.constructor === Child) + assert(c.constructor.super_ === Parent) + assert(Object.getPrototypeOf(c) === Child.prototype) + assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) + assert(c instanceof Child) + assert(c instanceof Parent) +} + +function Child() { + Parent.call(this) + test(this) +} + +function Parent() {} + +inherits(Child, Parent) + +var c = new Child +test(c) + +console.log('ok') diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/package.json new file mode 100644 index 0000000..acbe3ec --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/package.json @@ -0,0 +1,55 @@ +{ + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "name": "tar", + "description": "tar for node", + "version": "1.0.1", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-tar.git" + }, + "main": "tar.js", + "scripts": { + "test": "tap test/*.js" + }, + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + }, + "devDependencies": { + "graceful-fs": "^3.0.2", + "rimraf": "1.x", + "tap": "0.x" + }, + "license": "BSD", + "gitHead": "476bf6f5882b9c33d1cbf66f175d0f25e3981044", + "bugs": { + "url": "https://github.com/isaacs/node-tar/issues" + }, + "homepage": "https://github.com/isaacs/node-tar", + "_id": "tar@1.0.1", + "_shasum": "6075b5a1f236defe0c7e3756d3d9b3ebdad0f19a", + "_from": "tar@~1.0.0", + "_npmVersion": "1.4.23", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "6075b5a1f236defe0c7e3756d3d9b3ebdad0f19a", + "tarball": "http://registry.npmjs.org/tar/-/tar-1.0.1.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/tar/-/tar-1.0.1.tgz", + "readme": "ERROR: No README data found!" +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/tar.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/tar.js new file mode 100644 index 0000000..a81298b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/tar.js @@ -0,0 +1,173 @@ +// field paths that every tar file must have. +// header is padded to 512 bytes. +var f = 0 + , fields = {} + , path = fields.path = f++ + , mode = fields.mode = f++ + , uid = fields.uid = f++ + , gid = fields.gid = f++ + , size = fields.size = f++ + , mtime = fields.mtime = f++ + , cksum = fields.cksum = f++ + , type = fields.type = f++ + , linkpath = fields.linkpath = f++ + , headerSize = 512 + , blockSize = 512 + , fieldSize = [] + +fieldSize[path] = 100 +fieldSize[mode] = 8 +fieldSize[uid] = 8 +fieldSize[gid] = 8 +fieldSize[size] = 12 +fieldSize[mtime] = 12 +fieldSize[cksum] = 8 +fieldSize[type] = 1 +fieldSize[linkpath] = 100 + +// "ustar\0" may introduce another bunch of headers. +// these are optional, and will be nulled out if not present. + +var ustar = fields.ustar = f++ + , ustarver = fields.ustarver = f++ + , uname = fields.uname = f++ + , gname = fields.gname = f++ + , devmaj = fields.devmaj = f++ + , devmin = fields.devmin = f++ + , prefix = fields.prefix = f++ + , fill = fields.fill = f++ + +// terminate fields. +fields[f] = null + +fieldSize[ustar] = 6 +fieldSize[ustarver] = 2 +fieldSize[uname] = 32 +fieldSize[gname] = 32 +fieldSize[devmaj] = 8 +fieldSize[devmin] = 8 +fieldSize[prefix] = 155 +fieldSize[fill] = 12 + +// nb: prefix field may in fact be 130 bytes of prefix, +// a null char, 12 bytes for atime, 12 bytes for ctime. +// +// To recognize this format: +// 1. prefix[130] === ' ' or '\0' +// 2. atime and ctime are octal numeric values +// 3. atime and ctime have ' ' in their last byte + +var fieldEnds = {} + , fieldOffs = {} + , fe = 0 +for (var i = 0; i < f; i ++) { + fieldOffs[i] = fe + fieldEnds[i] = (fe += fieldSize[i]) +} + +// build a translation table of field paths. +Object.keys(fields).forEach(function (f) { + if (fields[f] !== null) fields[fields[f]] = f +}) + +// different values of the 'type' field +// paths match the values of Stats.isX() functions, where appropriate +var types = + { 0: "File" + , "\0": "OldFile" // like 0 + , "": "OldFile" + , 1: "Link" + , 2: "SymbolicLink" + , 3: "CharacterDevice" + , 4: "BlockDevice" + , 5: "Directory" + , 6: "FIFO" + , 7: "ContiguousFile" // like 0 + // posix headers + , g: "GlobalExtendedHeader" // k=v for the rest of the archive + , x: "ExtendedHeader" // k=v for the next file + // vendor-specific stuff + , A: "SolarisACL" // skip + , D: "GNUDumpDir" // like 5, but with data, which should be skipped + , I: "Inode" // metadata only, skip + , K: "NextFileHasLongLinkpath" // data = link path of next file + , L: "NextFileHasLongPath" // data = path of next file + , M: "ContinuationFile" // skip + , N: "OldGnuLongPath" // like L + , S: "SparseFile" // skip + , V: "TapeVolumeHeader" // skip + , X: "OldExtendedHeader" // like x + } + +Object.keys(types).forEach(function (t) { + types[types[t]] = types[types[t]] || t +}) + +// values for the mode field +var modes = + { suid: 04000 // set uid on extraction + , sgid: 02000 // set gid on extraction + , svtx: 01000 // set restricted deletion flag on dirs on extraction + , uread: 0400 + , uwrite: 0200 + , uexec: 0100 + , gread: 040 + , gwrite: 020 + , gexec: 010 + , oread: 4 + , owrite: 2 + , oexec: 1 + , all: 07777 + } + +var numeric = + { mode: true + , uid: true + , gid: true + , size: true + , mtime: true + , devmaj: true + , devmin: true + , cksum: true + , atime: true + , ctime: true + , dev: true + , ino: true + , nlink: true + } + +Object.keys(modes).forEach(function (t) { + modes[modes[t]] = modes[modes[t]] || t +}) + +var knownExtended = + { atime: true + , charset: true + , comment: true + , ctime: true + , gid: true + , gname: true + , linkpath: true + , mtime: true + , path: true + , realtime: true + , security: true + , size: true + , uid: true + , uname: true } + + +exports.fields = fields +exports.fieldSize = fieldSize +exports.fieldOffs = fieldOffs +exports.fieldEnds = fieldEnds +exports.types = types +exports.modes = modes +exports.numeric = numeric +exports.headerSize = headerSize +exports.blockSize = blockSize +exports.knownExtended = knownExtended + +exports.Pack = require("./lib/pack.js") +exports.Parse = require("./lib/parse.js") +exports.Extract = require("./lib/extract.js") diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js new file mode 100644 index 0000000..1524ff7 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js @@ -0,0 +1,53 @@ +// the fixtures have some weird stuff that is painful +// to include directly in the repo for various reasons. +// +// So, unpack the fixtures with the system tar first. +// +// This means, of course, that it'll only work if you +// already have a tar implementation, and some of them +// will not properly unpack the fixtures anyway. +// +// But, since usually those tests will fail on Windows +// and other systems with less capable filesystems anyway, +// at least this way we don't cause inconveniences by +// merely cloning the repo or installing the package. + +var tap = require("tap") +, child_process = require("child_process") +, rimraf = require("rimraf") +, test = tap.test +, path = require("path") + +test("clean fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "rimraf ./fixtures/") + t.end() + }) +}) + +test("clean tmp", function (t) { + rimraf(path.resolve(__dirname, "tmp"), function (er) { + t.ifError(er, "rimraf ./tmp/") + t.end() + }) +}) + +test("extract fixtures", function (t) { + var c = child_process.spawn("tar" + ,["xzvf", "fixtures.tgz"] + ,{ cwd: __dirname }) + + c.stdout.on("data", errwrite) + c.stderr.on("data", errwrite) + function errwrite (chunk) { + process.stderr.write(chunk) + } + + c.on("exit", function (code) { + t.equal(code, 0, "extract fixtures should exit with 0") + if (code) { + t.comment("Note, all tests from here on out will fail because of this.") + } + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js new file mode 100644 index 0000000..45400cd --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js @@ -0,0 +1,132 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , gfs = require("graceful-fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/dir.tar") + , target = path.resolve(__dirname, "tmp/extract-test") + , index = 0 + , fstream = require("fstream") + , rimraf = require("rimraf") + , mkdirp = require("mkdirp") + + , ee = 0 + , expectEntries = [ + { + "path" : "dir/", + "mode" : "750", + "type" : "5", + "depth" : undefined, + "size" : 0, + "linkpath" : "", + "nlink" : undefined, + "dev" : undefined, + "ino" : undefined + }, + { + "path" : "dir/sub/", + "mode" : "750", + "type" : "5", + "depth" : undefined, + "size" : 0, + "linkpath" : "", + "nlink" : undefined, + "dev" : undefined, + "ino" : undefined + } ] + +function slow (fs, method, t1, t2) { + var orig = fs[method] + if (!orig) return null + fs[method] = function () { + var args = [].slice.call(arguments) + console.error("slow", method, args[0]) + var cb = args.pop() + + setTimeout(function () { + orig.apply(fs, args.concat(function(er, data) { + setTimeout(function() { + cb(er, data) + }, t2) + })) + }, t1) + } +} + +// Make sure we get the graceful-fs that fstream is using. +var gfs2 +try { + gfs2 = require("fstream/node_modules/graceful-fs") +} catch (er) {} + +var slowMethods = ["chown", "chmod", "utimes", "lutimes"] +slowMethods.forEach(function (method) { + var t1 = 500 + var t2 = 0 + slow(fs, method, t1, t2) + slow(gfs, method, t1, t2) + if (gfs2) { + slow(gfs2, method, t1, t2) + } +}) + + + +// The extract class basically just pipes the input +// to a Reader, and then to a fstream.DirWriter + +// So, this is as much a test of fstream.Reader and fstream.Writer +// as it is of tar.Extract, but it sort of makes sense. + +tap.test("preclean", function (t) { + rimraf.sync(target) + /mkdirp.sync(target) + t.pass("cleaned!") + t.end() +}) + +tap.test("extract test", function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + // give it a weird buffer size to try to break in odd places + inp.bufferSize = 1234 + + inp.pipe(extract) + + extract.on("end", function () { + rimraf.sync(target) + + t.equal(ee, expectEntries.length, "should see "+ee+" entries") + + // should get no more entries after end + extract.removeAllListeners("entry") + extract.on("entry", function (e) { + t.fail("Should not get entries after end!") + }) + + t.end() + }) + + + extract.on("entry", function (entry) { + var found = + { path: entry.path + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + , dev: entry.props.dev + , ino: entry.props.ino + } + + var wanted = expectEntries[ee ++] + + t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path) + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract.js new file mode 100644 index 0000000..a68144b --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/extract.js @@ -0,0 +1,367 @@ +// Set the umask, so that it works the same everywhere. +process.umask(parseInt('22', 8)) + +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + , target = path.resolve(__dirname, "tmp/extract-test") + , index = 0 + , fstream = require("fstream") + + , ee = 0 + , expectEntries = +[ { path: 'c.txt', + mode: '644', + type: '0', + depth: undefined, + size: 513, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'cc.txt', + mode: '644', + type: '0', + depth: undefined, + size: 513, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 100, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'Ω.txt', + mode: '644', + type: '0', + depth: undefined, + size: 2, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: 'Ω.txt', + mode: '644', + type: '0', + depth: undefined, + size: 2, + linkpath: '', + nlink: 1, + dev: 234881026, + ino: 51693379 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 200, + linkpath: '', + nlink: 1, + dev: 234881026, + ino: 51681874 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '0', + depth: undefined, + size: 201, + linkpath: '', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: '777', + type: '2', + depth: undefined, + size: 0, + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + nlink: undefined, + dev: undefined, + ino: undefined }, + { path: '200-hard', + mode: '644', + type: '0', + depth: undefined, + size: 200, + linkpath: '', + nlink: 2, + dev: 234881026, + ino: 51681874 }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '644', + type: '1', + depth: undefined, + size: 0, + linkpath: path.resolve(target, '200-hard'), + nlink: 2, + dev: 234881026, + ino: 51681874 } ] + + , ef = 0 + , expectFiles = +[ { path: '', + mode: '40755', + type: 'Directory', + depth: 0, + linkpath: undefined }, + { path: '/200-hard', + mode: '100644', + type: 'File', + depth: 1, + size: 200, + linkpath: undefined, + nlink: 2 }, + { path: '/200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: '120755', + type: 'SymbolicLink', + depth: 1, + size: 200, + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + nlink: 1 }, + { path: '/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '100644', + type: 'Link', + depth: 1, + size: 200, + linkpath: path.join(target, '200-hard'), + nlink: 2 }, + { path: '/c.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 513, + linkpath: undefined, + nlink: 1 }, + { path: '/cc.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 513, + linkpath: undefined, + nlink: 1 }, + { path: '/r', + mode: '40755', + type: 'Directory', + depth: 1, + linkpath: undefined }, + { path: '/r/e', + mode: '40755', + type: 'Directory', + depth: 2, + linkpath: undefined }, + { path: '/r/e/a', + mode: '40755', + type: 'Directory', + depth: 3, + linkpath: undefined }, + { path: '/r/e/a/l', + mode: '40755', + type: 'Directory', + depth: 4, + linkpath: undefined }, + { path: '/r/e/a/l/l', + mode: '40755', + type: 'Directory', + depth: 5, + linkpath: undefined }, + { path: '/r/e/a/l/l/y', + mode: '40755', + type: 'Directory', + depth: 6, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-', + mode: '40755', + type: 'Directory', + depth: 7, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d', + mode: '40755', + type: 'Directory', + depth: 8, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e', + mode: '40755', + type: 'Directory', + depth: 9, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e', + mode: '40755', + type: 'Directory', + depth: 10, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p', + mode: '40755', + type: 'Directory', + depth: 11, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-', + mode: '40755', + type: 'Directory', + depth: 12, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f', + mode: '40755', + type: 'Directory', + depth: 13, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o', + mode: '40755', + type: 'Directory', + depth: 14, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l', + mode: '40755', + type: 'Directory', + depth: 15, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d', + mode: '40755', + type: 'Directory', + depth: 16, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e', + mode: '40755', + type: 'Directory', + depth: 17, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r', + mode: '40755', + type: 'Directory', + depth: 18, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-', + mode: '40755', + type: 'Directory', + depth: 19, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p', + mode: '40755', + type: 'Directory', + depth: 20, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a', + mode: '40755', + type: 'Directory', + depth: 21, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', + mode: '40755', + type: 'Directory', + depth: 22, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h', + mode: '40755', + type: 'Directory', + depth: 23, + linkpath: undefined }, + { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: '100644', + type: 'File', + depth: 24, + size: 100, + linkpath: undefined, + nlink: 1 }, + { path: '/Ω.txt', + mode: '100644', + type: 'File', + depth: 1, + size: 2, + linkpath: undefined, + nlink: 1 } ] + + + +// The extract class basically just pipes the input +// to a Reader, and then to a fstream.DirWriter + +// So, this is as much a test of fstream.Reader and fstream.Writer +// as it is of tar.Extract, but it sort of makes sense. + +tap.test("preclean", function (t) { + require("rimraf").sync(__dirname + "/tmp/extract-test") + t.pass("cleaned!") + t.end() +}) + +tap.test("extract test", function (t) { + var extract = tar.Extract(target) + var inp = fs.createReadStream(file) + + // give it a weird buffer size to try to break in odd places + inp.bufferSize = 1234 + + inp.pipe(extract) + + extract.on("end", function () { + t.equal(ee, expectEntries.length, "should see "+ee+" entries") + + // should get no more entries after end + extract.removeAllListeners("entry") + extract.on("entry", function (e) { + t.fail("Should not get entries after end!") + }) + + next() + }) + + extract.on("entry", function (entry) { + var found = + { path: entry.path + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + , dev: entry.props.dev + , ino: entry.props.ino + } + + var wanted = expectEntries[ee ++] + + t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path) + }) + + function next () { + var r = fstream.Reader({ path: target + , type: "Directory" + // this is just to encourage consistency + , sort: "alpha" }) + + r.on("ready", function () { + foundEntry(r) + }) + + r.on("end", finish) + + function foundEntry (entry) { + var p = entry.path.substr(target.length) + var found = + { path: p + , mode: entry.props.mode.toString(8) + , type: entry.props.type + , depth: entry.props.depth + , size: entry.props.size + , linkpath: entry.props.linkpath + , nlink: entry.props.nlink + } + + var wanted = expectFiles[ef ++] + + t.has(found, wanted, "unpacked file " + ef + " " + wanted.path) + + entry.on("entry", foundEntry) + } + + function finish () { + t.equal(ef, expectFiles.length, "should have "+ef+" items") + t.end() + } + } +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/fixtures.tgz b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/fixtures.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f1676023afa2bba2aa18b5508c92f03e1d0816c6 GIT binary patch literal 19352 zcmdS9Wm8?>6E%oKa0>)?hoHgXLLj)iOK^9Wixb@4-2;JO!GpWILvVM$XZZb}7gIGe zUtnIH+O<#h+1^?)mpt7>+4-uRLlz3qxI~Dff#Gk#6 z`g-rTn_<`NkGgSqh`9%iyIO+RJMIEk@Q^cjEPzS$QFJLbkvahQFp1Gi?M1xtX z_d_3jPIjl>+%+o^H;key?OVfX3E8v2FgIk&q5@J)^5h?H8?w4%1l*k;@LW8A*KOPe z2m})_YIt^yV27?Sb9o}&8YLHw}wmBaI#s5;w$~1gL}Yl8$kSfR+T&Wf?T=;vdl4$nrcnE0Smw^kG$rI+igCu zLr{XYa&G{kKrnW&uV)Zm056SzBh^q4DFok3neK>2dnOF*v9)P(VIXSxruX3R_(6<} zOZDyM+Urp`x)%;WHfqw~UlV|((9x}_0fV6Gd7)s-8b8Iyj6dV=FE|k7SbKGn(HT^^ z)#XFd>jGa=?AGFLS4E*@QNW1Z$Q|ykv(g=BFX*Wsx?zg(0`LaBgj=IE_Wi($#wNW= zsOzqY_94)b9n`KM(7@!i*G@qTGS7a5nPO`&8Hxx?HJ_Gs!6KRIcU9CIXw9oVS zaHGn2ODfpk4(T4xmN)?#5wf70ksW$_I+pa)A=&N+ErhZ;zaOTE3v1zIS}$30$99_@ zb#iRJNa!r%r72#Uo2unZQ3}G@roGZvMz_6UPggT$oZ&9C#MNJTEnx0o>7^3(ga*-0 z&|(RQ5v%!l@f?}!_P4aUe|2XDn?Mi3*r3P46Qlh9V>}CRA zNt_D6UCg|6b#Tv={{aM$OtzmQ$i&Yf7iIx&i#I_l@h5^OhV5nYfI{AjKXEfz1ce5@z7!Ei78)mBhq_n%2+n=ux$t?fCf*hcr8^+}NV~}t0I|P;l~Dfy z!P1AX08Kyxu($y+Y>8+@)w&bh(9{}u_Nj(4Ujc>yYM_@la&?%B6_turyY$u2@C7Ki z>{{J++UgDrJ_)=BW)`g6JJY#8KLD>o53tw3D;snh2o7LH?m=^eY+@U^sAij6@eoCg zkH_?3)Vt4Z*h_A7gvEms*^r9@fY@H{SLyQhOQ~PLr_8c^m+W6 zlrdDj_DAr1kbw4f7X2lu)tdOTJ+eBX@l1;u?E88w$R9$A)^86lIoi1RR&Q1rArGd{eH6$HSpvF zphwMqYsS@TeAefy_J-C#%>?2!(}CsK(bvhQe_#uM6`q@?pN%Z91eOzx%h4)7d56K} z)Y>XP9eIg+MkFab6~VjxnM+BoY1%4Zx=r3HKSCDP%_@HsDh**J8G*6><~JvS-j5}W zzN>y}rrh9r%-$m-a*1~eCCjaY{4WI0Chrb*X9B!|^Ez45U3nMx9@%|hqVgKF`s-r!h3v08+ywa|;0oDPc?XrN()H-=WDK=y zYaai@>}TjqOax|hLM@tiXH#C5pD3I`W*?@g?R}KHX+&_+UXGkWX;7aZlAJxXSl*cx zS*GW$`UZnO^uK)BKz6l^dSx}sl1Qpa^#+1uSF~LmnY(|A(wN?|1xcWw5zz3P!XGbX!q*-V*b{#S=Ws@+bDjMqk5mR zjb|;MQs=`KY3kmnTUYzAgWsv)(G8PGVimd8_qS2d+csIGooYB7qs$E z8qKum8fe9z76`L9-#PvjK?QY-b|}l)`zd|C4?)Yy-$!6Y;d`A+A@xA{o}Vktxsgwy zoqqc4KkmMe6m5e2jhguA|+(eH*iS?hzyIMn+ z*2>F;9VRY<+KhECR6w;$kdWCzOCC^eK?4a7Uxwsj*i2qfYtIB9Ji+y%+tD{y;QP1e z`|!*1-wv?f5AXS?iz0#SV`herWGe_@YUeXDa_PUs2~Rq~;?TQPYo3Kf3i zz<-779Bf06Qb8L<@Y$qZ9>^Q%l>Ue4G>6=*i}+H@LkU9n%wtq2r4 z&#xwgbmf|^$iYsa7@p&r=mtL$WkG}?rn(krh*giCv#S|G{h4&`XCJoOfL<32oY8zO zQlQ29&yX7?JdBB2^7R5-gfm$|)W%Ck|I|qwjDe&U21RC{5t3J}t$P|NmVocL+8ZvX z@9;*5@cyf>rQ9^-5z1!?ZOk|`D=IEEySb!I_CoH@KUfDyXp$Gk+r;Rra`-! zj0UZ?_`V$-(;BbcvphCA{EylZO-QQovUdy|4w*%v^%Nm=LAB>D*I!)3##;t#V zcQ1#fZS3oy&zBIV+ORF3FXyeVT?^mfJ%lTndN~%rZbdF^7%edU-&fNIfy*>DMkS=5 zB2JS}KyEh((s@kEt3{)RqWQTnruDh&O#P7zMN=62AnH)=<3cv@ruC`+=v~dLMa^zo z%Sa1g^ap9J&UN(pNxev6GfRK3Kx;9=fZr_ixV z(x3w`A`sma*0_xyvpxGm3S4%GwwrjDz(NP{m-A>O{M5bxY7Pzaiyj2SuXY45KD`E| z!eE4+X$r+XeEdHucqp6>k^Cp#T$t&NHUI;>gt0=sE1&ED2uMo_%uEi!-|vGfHc@{01*RPWf;3OmcKDu@q4D`r~G_ z(cEfdB8)Dxe8|Rcw$&nDOk;}!Y+gW~kii^451AKm=;+x4SMvd&f3I;Fc=G>fCJHGY zv93XawV43cpe67!%BJw191>o~x=y17u+AJ`0N-_20YniO;WGecsI%O=*cuEYTNie# z)1u!4c5u7z{(%;Nh{C2QfCXNI1x);os8>UWsq3y)G6$A&v^7Xv2j5j5l!KIP5H-cq zh2#bm)_D|wCx&uy_%g7I zhQO3;_N&K#5-&8U3GnvX;2+0JbarZeLmcoY-vt@N#Pv-;bSZ7^BaMZHWf6}{AIHbh zrg}Px@lB<@8%BSEaa-=tE+27*iMCAsoaCGXVZdb&_Ul5p2ej^zzZOq-5!>U1tbIo( z%H{qV6h^G^=)*3(+=_v~wQl;y|9YjlvvG?FVRnAF zx-snu-~?f$))jXqriYcbVp;Lai=f z7LWwI%QDBh-25|8bwe;s6!)8egGnwV?GC_ZjizE1c_TyYYy+$qE|o_7|EJmKo7;AG|CH~k3w3D?x9E0F z3KI8Ac*p&BPG3Zxxbzx&kO7^nM^H6MWAo~CbWI!?x_!>;g-Ky^%Ijv>rl8D&<}ko+ ze8>LO)zPs7y@`dSoEow>+JpZ~@!z;KL@Q%HAB? z?p;$|4`WPDlLU^H;3-~PzR?twcq6r^GPayPVaXZ$5P@VzCtq7SNSZ`Cc~VsD;f+V> zOHgm8(cKe^_Z*r}tA1;a;}YuSPG$y=-cZ0R3-J1qy@k-WBn9{O5N}cx2lw^#^7FRy z#udOhocCr;-VyfG&bsQU~7jK=$3BDXX#V z5|YBb^8=U__EqasEAjr`GGkhAyP)o#v)+}CZOW)}8{VqNcL-u&zmwmGn@2K8;KI=-m!&T{tS+)ga26y*a5X?0&iWY?>yGgvkxeHcLrci?Y$}zH1+|a zNVc1$H+j;h=U^S=z2`+mk-33|yeD9{a zci$n8{f>Xx%33GVpxAqN1`_N&_y=%wFN06eKoby*W$>@GzII^u7Em#|hhS7f?qi!( zzaXv%i2AC#bSt`l_3X)j1u?(!zJO?faD&x(us$;H+eLREEaJ%reu#jKfFYeW`|_U` zZb3m@vdLQD5HaCG(iC`+zLo0p*i7NCZiOtKfDF3-%C_u04?^$z(SBF~N07DM86q6s z85)rr<-U=5sskV^#Ls{W1JsEKq^mSohn)PnsmRm9Vvq+GTC|-+Li)D}@9QU|fKZ#> z89U7#DC4<%_a>puerSK*^6HnbD=nP>S)=~j=3c-JutPA}tNxfe~;2BRqT5#}dMsM5r|8?n=XVw51`#Q*3`Pl-PV5$y+?;#JpXb66s zuK`r@o!+m~ssC*o6aRTX^OzQJuCMZ+sexC+W=K?c#tArlW9x1abQRQH18{65-gR*z zxAZ(CChP(w-6bcWKScj62Xj{eUF0!sK;RdgLmedIoy-yUe}XUWaUI|89DE{@0NFsM zYOufVe=mmz{>Sw{e?yw1KWrGi^+3CxbfLb7ZBRI>lvChz(hz%ElDPlU_Lv*j78+RLYcK15!Fyrw!z6z$$w`>R-O&B|%F{bhq5hog z04W$UeDp7_!8Q?HhwhEE{c7|;=n()KS{df@p@eSH46p|Amudq35H+=@vU2kn+SwAj zE4&0p(S<%bw>)UKKizKko)0#Me;01|d^_&{=?QpU9Hhlz#JPiHKYPC-1D=E=fVxNa642WUvph;I>V8~GfQLR^emR^tS?_)0nWH#e zJ-4_!dFfbh_IYNtk-Ah)aEl-7bK)NA8l8w#)jG2sTS8oJwpBXvTDCcDn!kX8iyN8< zocN=i#-6Qm7hJgE=a1vl_^>*?G1%b*{vPnxuUjB^`K^`kijzO)i$u0(*`|!G0Pr z{1+;^@g$>2+9CXSyFa;Ob&5DCe!xXimh+*Su=-fIX0p^2T8maoCPJMOt`v_g?lvNz zdE!}22fk4I@Gm*2=bRHkYhb*+xx$-?RT=!b?_t*eVD9+spO5`5ruV?7SXSD#TlU|a zotQvYjLQztfs3i+QOAQn1lqNQD}`p|xTS4840q&&uczdt4VrVdh8i8X*z1)GSOSfH zL>smDyHHd(LSwi}`6&V?=ND}22{YM!ka0|6(mhdt5P(oh#Xf9YI8hob4Th7yvGmFp z;kkYNxfAaE%MlG_{$sJ_90OJMqqKjbC}`j@OR0!f8I==;5s_5%3#~+AeII0jE+MYo zDH0CFMOu}CEEK`;w2QEFX$5SCMk;aXx0cu4;zb(3_}rT$YHo$)OKAhI5;J9}2wNjD z!fpH{j28Gwfw};#;lq&Asq+w|Pz!O8frkgAm^?7L~UGScl-?lo9__q4Y(A47B zpAJ_zT}^kjueFbwSv}rwwo@e;sb53I(QX?yttxn$9@D@(=5-kD!pK~Esfqyuf@=WA zTgZjiJe~j36VFKm??(BTo9)@v;EuTCgtL_g!+TZ$vYvfW06Xw-r%dd}`|S7x>j3e! zY*ZSodqMw~A2et>DqMPpc`KmUC?!Svac8qHsmn_-vy>Qp-uCw4DIsfvNS;<}|UqE1v1L5t(E0Zf+zv7>t?j)BRv`v89t0CVGmO=E&Mli>C zS!nCy<+GeO)r;yZQAR9$MdLo*bp7{^TDt{SskIRzs3OJU;9)CaA-<1q5$^O*7N9Z~lZ(I&w`Y4jg4DnaUm_ zn$q-85%$sxEyk6;y0f3Ta4gU~!;=$JVK8(VV_4*$$V(OYj}?suJhqS6XL1IL zI-f8ImvB!n<;~Vj4~mjA=`OIxavM+~8uu*N$Ct&YzWxY!l-5bOsMRn?*TeTXzf)AM zY6qRo|Xx!Lp#{p33m01t-HZw~2f7we9*ssbILy%RT$N?Devedw-hN zmAF0M#h=c}jS+7K;h|0aK$0?lIFzDXY4G`7He~MslRI*Sn;P6FO+^`bTwZX-S@>qW z0lywtK(O^U8SgmbQ$1A`Nq~eaVxDlPz!D&Zx19vy{1Z2&?SIGBuTA!^4o^!39e%GG znvxQ=39~R*7E_v<)8e={Ex72-5Ht-V{A7f*vYqS|j2Sd6B#HrJs(#f7`np(%MdU8M zjIAil(WHpzV1<<+_lqa=F)e90Z))bt+NgwWc-N`FaI((UFog+~_c=bXFHs;(`tW0q zS#ZdemGSLAO^FcF-i2mgsN61Wkr%pNVm|N>)M%34D;}y>mB?ngt}jE}-%J#hsb8PJ zg<|G?sjO8~m=j+}LWSX>tG`SXl&)KrP!T*F1>uvKuiFF7Hbn{{G}$M&ynuObi4&+1GJ>z4JkX_I5AxKSjk1d= z(9~6Oh;a}{YBrnqPLL5*j#xioG7m9lhMTNhtk8cNY+BuzVoB0 zhir`hasHztJ!ptjHv30W6qZg~lh}H+SOyJE3}$Q-ugoAF!8f7l+8Qep8)3HCn>N(h zsQ@TRDBh9u$+cfnZqIGVe;p-*sBybSI{0JlgNMKF{7M+GB8~$@Ai#3h@yBtcmX!(i8g_ke4V56?ZEzGLR8k1ghRaTHS&5_x?g$ z#Qvk~W|MENd;nYG*JEg>(dfT86(lWQbC|7e!E_-}KRL_#zXYH@+kK9-<>>jacqVtfd~w70vFyopsz0`P^V+|8jqp^S zT~JBkxJG`-F@u&F)f0d0#(4j!y)}qltWbOP@ zAJTksj6=pJv)9d>GYnIo_QE?Ob|d%G`VzROz2|6k z6l-NpVtAXHu_O;7d6z;~o1U7?{}Q;*F^gCK1jjKpZ8aIke{q*s4N|!rkunY*8ut;Z zL$_>4yZ$tXS!(df&}J-bSkhP~nhy|V@9EyOjDKE!Dwe)pC4o!ec^10NdY)mO^OtU< zqu0*o{LU{vA+To}zM|AN+t3iT$w$%ick;^o=7a^ehFmsxM{_d0HSm?60F;IPOxMfF zIbatnUSgUuC6s#)Q3Fq@gu%TIm&6e@So(f%zXtbDXDx#Nbg1L8%rd?Zs7B7*KnN@o zm4$PQ2aP@}vJIoinIc1vt`p^uYlcmHspz3c>9ti~cImcMEoLUrwRW+LaBuz;E_2A( z+(b`>#px%qWK=)t@+`|h_8M|?dZ~)1`$|wYG2D`9OKZFZ1j%Z0V6 z$XWk~^;0mR6hd_Q;PDfHc)!_gX+`erEyKU-|>^{|+m*+&>F2P~+ubElv&U+s; zMOT;j`(EF#-|hcKD5t|pQn3(uDllY-t&_pRD*Rd&>*Wh#IPVs`(jzhK?u++PJ?nFk zsKQxNQAVBF`E9#CVppX=7?%)6hcn3Nhks<5Y|Meq-1I~_mM)aITOCfslr1Q4`k4Vn zo_FL>Mxadlp;a!UHxw!v;2cL@VG&^!Pm++mETuJhL`P_m6a3dfQ=uEg%Z{(Sa>TJ% zH%h(4b>L^vU?r-`;&R~XY?y*lUiHs7_2nWmZq&Cc+5N_o4*hcVpY?V2KUd4pInoBw z*Dv#EGKstlA9Oj1YUTM9qnq@Y`u!w)Hh=#LlF{TVN6{Z9A+jg}4up}QZsY_JKR)L(fx%d$j-tX>- zDaxr;2{IYl$t%Aj+7Yw(wb@-;A3nz*$3%E1E)?9N5FCBDUoX|yY1kr zfWQ{f>0_j8AgNcqau@?YJ<>3bmWCRbAHtBEc%7TAupMYDyhiPwj8m+t>4`~YjtlR_wW9rJw#o-CuSAhgo)2pHC-F*A&z*s{N2g~rsor5|9DN$wLrN^N`zCH{## z0!?mI(KswjWMRQjGM5e)D94iW;~(YPc$$j@sB|^F$EgsP`T4UwX-tfb#bdRV;A$iBXvzM3@=aFWUEX%|J*ygV$I^db3N@n%O(m^UGhrL383yT z`fv;-6G}Tyb0jxdo-VRPD4t6A6~20;OzN{o`~VT_EKfnk*OdTvp(I=Wfd(rJuN0O9 zO!GR!ejfTqa_mEeZsh=hh@cN17>xfY(q1`jc*iLJrU%ZwePcLUG8cuF9c85<0GuNi z3WV88IL`xuI(Lo|b{+i2=;sN%!mtpSZM3E>f84c|fLsfKIyqQKB30N*kg6!{>z%d!r1){}Y= z8j0E&5CNZpIxi^}5Sn1wbAZF_+NJ+Ai-(Ns2gvm9w}n*FUK(2NQqgolH{>4;uS z_{_9R8KALTb#FaqsieTzXtWcGq7xAt6VZ{>xUWac#oNPr_}$r68O4**_s*#OQ)6-p z(V`NGQa4{5iI@16BlsnU>F8v|N7$xtRfv?}?efaczWPd@%d10)C9D|Yc3dLyJ|uoc z9J|^xt&=e}f%E)4AG-vM{O~a=B=V)OLLL#be+<}xKazE+tEionvTi0Yfi9u3BIf^{ z6UXt~)3)y18FhrztLv<*S@cUWB;M{@Z-Wx!2~mVdsl~{bj3CKea9T#?kE(L{2g~@% zhPGsu%JKch+FVb?WNAjl=wwoqp3iJBc?8?Nz7j2El*Z4tiVbv@@b0doV?g8`+VL0u z+va-7wsHNhFK}_OV9ktOs&vX&f_gB=U)A1)3L=vlRPm2#SFPj+ldfpf-w1IBAZ#=B zfq{y4Gm$gYqfaGT0jQdKPum>mN{C4*LhdDmJx&#+ck4+3>6y% z&s8(>scOiSKIas!i}Vn4orh&_(p3a~&ukYeTH~50X}t}L=t085xv}kvOuO#Wel?03W#B+I5zE`mmtNej&8T)u4H zT6JUpm*}aKgs+2W;sM$>81aVq(M%JG6er@Gm^OroJNgB(JvQ1VxDg#hxc*HSjE2-P-IvS38)>j0J~r-4EMVr0D9wX7ONy7J7};c@0ixt4`}QXi9= z69xU^G6hn%YI%~2;0@E2TjF`Mb@c<8@p$gY|tS%CF&IzAJ z0-{;AvH`_1l4np-Nv@u-jYH&c5_fr6DIh}CN>96-f%K)l<59m@70pPTCae-$F1s;X zxgE43SW5K+s$q1Xm|kWUE2_))v5&aL`HDA6&C7Jfq{=tiJY_qJ{Y4gWCo&b>ztQ|} z$Sf6z$Q}1U%rm$kE$@<>tu&Y#76I^Ge>01rPU@%8rr&1hOEiu<16U4L)W^9hh`!-#dYW<& zrTqDTS>G_V_Eptq3WY3gi}=!V)y_isvd=Tr zDmb)dZg9`DDnfRp;TI38hX&NbsK}~V97!Cj!!nMCMAMFu5ggD>34ZkqIb&wGO8~qGk&OP&Czw7>2bj=cw?jRLV2V)~clR z(ql!59qI)^FUt@bPi0PP`7tmP(zQ*gsNS#fTwj-zt{TKtx_(41LWR$Pw#3sjCkd!b z{`2*K@gOi%o~XI-ho2DFV-=`aNYz|Moje#qi*8+rnK<01Q77dNaM>xTNim9B!(eK=HML^A)x3%H+M7O|#ks`KF@1WTf11NaDF#O3w6;G^ zT414+x~Qn&4dg_9D4lZZYTe~mPENYEU1+q$^b$O`-hZSq59z?Z$0ZyTWzsL8mVM4v z6>vIGO-yRshj=1Qi6{g&Lk@9sBeYEksGV+B~^hc#-$OB(9oM6oU=_4G&{z;S#+Flj4tNFw%yhtD;xMtB;UiY z(O^1E$l>b^)S0U*jCPl7u4CrmMz^g_@O+kAb+8;LmMq?jh|W|XM%!txx0;*AGBV=Y zvndnZ%T|-SGJeHnjI7Z5iHol>8~*5M=;Hvbd2MoL`kYF8g^ZP%c`!&F2A>vgnjp-! z?`|<*(sieWAeKpOre}>;NjhBKKkCe;0$Za=nVu724r(}L2M!e$>%=_MZ{%cq4qc-z z9eapX^OQJ>KlvMfL*qU-qb^noJeT%K(f1l-Z92>^2oXZxIMTH$h9r_dxb5|LhG_4| zPPcPkm5CADQ~et+oIc$t*!M3ASwwvh%?SI*XM-Xbz2o;<*fBaY7EY^1wD+uv;0@N2 zQ&Lp=>!XUQ;z6wmlVYj$y#d>-xSDg^=5tEKQNEP}rHiC2PGY37DuduZ)cGFYcJ$jQ2T$qFN1R~j)R z*iow<%zeGs<^w?{7lp(@+zMtvT%#(pt3@^284;4y?pKWPxxW8gJ9OckTf7!WBFpG) zL`EtPu1!Tv(G+7RR%Y_uj!jnP922WVWxg}$U$5JzVbidm`wR!&6!6A}x6JCvpy;nF zBEXAMh?j;Zx*V>N25d0w^a~-lT{p&S^TARz|Ds6eQ-5)&|3OWX9he%|pitR-HxkNa zCh6B?X~fT79b7n$i`->hV5GjsG$Ibd7sxyC(b7l&w@fYLZr3b6R=^M*Z)2ydA;{(}^Sj*9>93*Q8ZbBv;x=vvVu& zA8wL+z#>vR&1B@;G`rtwWey2z$`Pm03V9%zMT=OKXO>S;BkttPc4$ktYPg1!P9E!T z-Pz%dkfem`VJta|_72Y94Ywr8VvLwfu=?}kuFMTKljaTKru`u-hE|31{MC8ftK%<> zYVm15tMl`J{%QH!f?MqFg7PtUfg1HO!}D`acJp42-~h94K|S<^S8`X?c9*a7wK$$< zptP4Hkqx7vkK*9O)5QZnIE(#y)=d1oCN^fw`s7wxTW%j2ZLH5%r}vcITqNk1NGK-D z->TSsmeub1zfYhiO{>}hJ~k4ErNU~H$&!JpG#52If>jcHGub?UjV_rWWjj5rRf@f4 z!^rctY(p ze*P>EP=@pF709C>gwG1JKCWI~xm>XZ59hH_#eRoff@U7B0;Tf&n-eZO`*v3$Zoh%? z{h5_v;G#hRK;<1>6X0YOGe+fTR$2~C%2tqbjzu6i!1f`iN>^i(GUH*W7mdU4&M`NG zgGDLtVV$3)7$9dr>6OwL^h3}lj6|nPSP%Q$<>xl#=}Uaa6BT54}ucX2MhdqzujElZsA9FIEh=8R(FK2=V%N(UAJk}LCzOY?5d?N_riEKjCCJM@nPrcJ z2$eXoJ0&9$vo*1P(A8)NU?|*;NxxbN)bv`@)KE72_Bhfn6XSLi!?Ls@ugdb$(lSz* zV6kRZQzH=0CYS$MAo#OWR-JW%ZlFYKU-nYL2WPUk^jq2H;1R_6_GbTHv4nt@Wl_hQ z<>PTdBgM@b#v8G|AE!_%U0~lZFUj}hDo|@(P3XYe*Q3268(z6^FWA_63s-qrZmUBg z(%)<(t$xL-L@)!RLg^(bZY40ClRB zFUny;U6kwYsS3@ma9Dh#Z7zk3bJET!p*3EVHy6jmRgs43O$Req!^w)u56iqtFe3QU zygRPEDe!vnWrh*DnSN4kv27o5HE2*mJY@!#(NHTV0{FhV7u&c@qGhaU*Qftu;~$v7 z|By({5usl35jMvC-Y3}xC7T4HKsuq7!0EGWxak2sEQ)D~e{5U_x)8n;&rmfb|)$&Jai0u(|?f#W{ zgJe{6m2JP`p0}no=bLWhAMCV^9;;C8FTGZpWpG9z&9_+uvw1Lwjd<#GRw| z3=;4DXsmH~l?y74_kP!vA8vpE*D-EphDMoXT&+AOQFqTZFJFI=w^rWGYJdAis7)~- zvxVQEhRvJEIf6|sbBNSXEnSsaVRS25VPWPr8(R@Mv*VoXhdDSK(c#B2flysH@`-8h za8H29Np(PTzO)nfP6aJ*`O|vT~?fQr_ zCnil$`PU9^*_=C~>PJ_ziAI zgjUL`!Y`O9>U{J8(hNBiR&{IjIYy_f(;FX^4R5v^ZrdK)YGy_U+Us*e>^tS+OA00f(%Zcd*t*9co@s+l$UqLf} z{ru;)QBWS&03mET>Q@}r98Z0HL$j8}+4NSau8EM-*xB6kw(sP462tHcjc)>vO?v#aFEqkcDk=pTb%S3V~!g#GMlXtQ_M`r}yarJjf8 zt4O0e{1NVXu#t%;@wF*oGs(S8!;W{qU9T+qp`q|@Oh@apt!OwtTx5STa!wt#MWrh9 z&&2Oc=9{*$K9$zTDXSJ@TEvl5cT4KO(Pxx=aeA|^@uUS+1Mv>7cmZTqKp}<1l>0cT zO9%_lK0~%ANlCFD^*iHmIpigC&C@nM)Y&w|hJU-AeSCRxc}DZ(e6wozg5X4R-NO*C zx?J(VeuJILgoHQ<9T?Ji2?q>IR)eqv4A3UEb$s`JDrG`{UlZIc|8XWmQRrH3Sy?QW zD;0PQ=KZC(r2I|y4^B)!NlEghlgj5d36CEm<%}qA2kwp%8h!+hb)Pb9T@oEqV|wW& zsD4(<9;h+^8!}ZgT_tbO_VB{^e}0cE>BPI5XgRHr4GTM`PJ2XuQg7!}@-bwoXw*%2 zZ!R?<(Mg4qFEe#A<$66DI@L-_KTrFppw@ZcCrn1A%e6<^_|`7>E9n5Eg;PuOcQC4F zc1212(Lr-laGEz+j(3IHE^p&e^)cpNv@&JOpVjYN6Y{;#4Kyej=3?j}%TQ**&cyL} z(D3>VRddzHOx4s~6*^y^MW#`uEuspvA(^&&_V7Qgn$~y%nO^+quorP#Rjlm^Rc_iP zkk;+*YZ72Cb>J{_LY+YLFKvuX)?0_N9D^>Br4c#?vg6WjzWb5AR`vQOn^o8VTffc` z*aFRuhX-%0-XRfPPPd-R+%+?gwDM=ga8_AzjYf3c=d3;UlH?uh}ewaGIN>366b9ET0w?`)3c#{le=nU5?~9w@2$&l0T$YQA?}G zmXM}qPYYN5L^tdU7E{ZL7-uqZxRgV&i=tAW;xM)nyQ3GjiR8H>wXTb@{a*U1u`<)Z zLA$JZ)-)?*?NN>)TFOX@A@~V-N-Bn0M)>xs~vpA7LY5wvp&AT>RzCjOU zMLRxIA_d|eSHUM4-_Y>y;o_cx&Kpv98$5B}>}%>Qp7$UrQf%^JDpK5TNtvb_)XDU< zz0n^$+=Yy?C$3B8EwFS|uDY0zFpVx^94J*#L&3r(2KhO+%M=q<6fYnoR>;KalL{!9 zD;fm|*g4F-ggKq>C?b9Fb?%KEz_xh z!`sU9S7ah=9S z0XRmaZ_Tr^rrxSgq&nJq1D477zF%N8g-rRzoQL#~7?L`fl4u16g~U-Kjh^igaVq|} zCZ*A!R~E%*oG0BDxAXj@@cmX+H`4yFt7le^bEu4qH?Dl-R@ow^$#a-*l7Pk`3>mJL zLG(iQ`#hK2;T+ua&$%j>A>44J{r-7?Y;bn(n;maLso>x`g1(xD*;kJjA(z~}H+|FU zw?+Fey}zAPlj00Upl(YyBbPD9mT#Ji;Eq!asmY(YomCVjKO^Ml3dNOxXm>(irQn|kxMx4Yi*B&k(r zCPQe}@~1Ej%`WMOle=x*^C?jcms-bF3EW=L&?*jvlZxy9% z7J;oor9fV#d%tVBOrLd*^1Z26SEmSjy?%`k9jxxujk`xWP*QkCWyr6o=pzJBTr1XmtA9*a zdwav9s^QQ7468(C)Y>`F?4C+9Ph*TMtt=eYZiNXe^mQ8jQ@76@z6-z9 z)xFahF*Y|Mb&t^uk4s=^$+NiP95sEPS^y%YFB@)jkHg2W*)guIBYaVGRgeIC5yL-C zKX|C^ir)B`I+?1`%V)EjZGq;FxNMX#Fly9kwKT`HSfbWef~za?u`PP(?4ONz&+dQS zbMTDm%4ThX4yjdtnZ2q++ z;e>r0Daoz8m7<|GpDto%bIOQ)OvM-@?EDDlo)VEcL0i)9md$;1iefcmwQl$0e&J(z zxLWyKez6GC@h>i;eMF`4A}U7H)?2jJ?N`ff%AioOk`e23dV1DE1siZrHquS$ip<+j zGHb@aTh^)x58mTtELR!VvVJMHajK!8nb6J2D{((htC}uWSK}cyFhN%P|4v0b8VNh3 zHL56TcUqLHxDGKVe7mU_BTdz&0%B@2zX+&281y62xjXArEZ_AiH+ylE%Rj&TZU zl3(f)(TsMv4O4Tr-um?_SCLrny!6zxiO*5oJNW&4SaH27^3y5D)+tPl#*wZ^+x2X3 zr|KK?t0viD&Jp+&S+nZ=a+o5BUEEUOZ4;(r^;$F0xkrCLTKB7FIWty>06XqPUU@ER z=VmZbe+sR<{9t9Ze)#v3u2({~;5uaY7ZFkd!FJGbX;6Z<1wG_1_Wu>?2^IEHc0u=< ztyE(Lc*9(SQX|-{-amIyl2y(618p^9d%%oWlh~%1qD)t>n$$>MKwR3cH)M1(?%72m zDZ%ryK4XbyYG{|MHS;-#r%eT)pGo~S%QdYOsg`qpj>lK@(M0Pw4Xb*v2%W^{a z;tq=M@`__Bg`FC&j_c}9;$&H|PcAB3-e^sUoBgxC9qQqtz@nV{7iGO6Rq7VdtAUm0 z!SR5X>6*}evqD``Q;m|-Cw#^Wt*VRX%vCdV$qWLMGpMpe$JrTHT|+|crQbNc#w6Iu zc#1XCVaYkwrP?D7it2OiYK$g%fPQH{KltR`6T0N*iU$ep=&rd;cC9<(+$0W?ZqT4p zMQY91b$D{}L>45&(_1so5*7{T2SK0DP)H3CY^DfZb&6xj#?JWdO~B>f7^H@&_mj#) zB+b*r*Djx$Ws3+nMo&bf0`vYz#actah^P<&s;t;hmZ)>?2L`+;d0;YOl(>U%*X z|9EDK{TY)e>Iahf&dc&L*P-D;L6fo}UD1`V;HX`N%g=Dq9Xm@zKa9k*!u@?Nht_J(i}@4PiS z8+=!rxhG*u$u!}E%`Q0h*KD?1MQqjy5I6?L%9y3CLQGe{+v5}?k} zR_^QlVW%lm%Z_M zDIy&PVCs?A&v5<1DPBQf23ROC!UtH3VLE~(25KCqWy(W7tZc2r({^6>+00etbnKfg ztR;r*X*3Ij$c%5|pYrk?b68xC{Aar=0$!Vnm!NjdN7YSrGL1>1Hd-?+d0E<@AG$Q_ zgUKZww5T|8HW=}h>SdX8IznYfih37Xb(Xu=%E%bJ@4W zRLBRTAmH!aIRR14E;GAN-h?J=pw6b}DGJ1I+2GE5L|6?UygYJ;d4=%6TSUc=F)J5m zU^~?IgXEn6m`Geq%4@R9(|TS@;^G#)8G0WJJaD!jNe}xa-+a{c0i|>$X4I8$Q%(#9 zVpDg{;z_i;14BgHci6FyC}6TYMJ(l%c#U%)g2ncMx}ZiY+c#6)bXg&F)*@}Vema#2 z-Q9BPC~k3)PslmB z(i-+FSLqt5jr2XIK^daixLVsdCRAB8vaeBR1Lg8DXkeDC`jYkN2-saF7t9>BpFD4JkrKp$KA zAL@2H+T7=td2fHniTr5BwPpvVCMvwr99iMeii$Xu81{Q=%fuK83Ql;>8VHJl^6Di6 zgXC9gTW)iu(+NC1;Zq!F;2}a;0!js>P0lSt(?5I^=bFJVp1g$yBn^6zPK{Q8ij1;J zE&M7U)lFBkhp=D%55F2SV`}D>*@rI&NBiQ}PX}KDL z@n)2OSK9)#-C5m?+XI9Lho1~2=GPxT9qk>?`0n+WceB3Q{c`jktEiS=-cmaRo`L@} z{BQT|+s}K4hp#q1q{FBFGrU%DG$rTo8<%^cE#eocI0d8O<>S-IWc1V4*7xtyvZ}3r{Jk|fpWMC;&-0Qf5|6yN z-A;Ugf8)j~{Y$_5zVQ7d@j@>S!ccgD7l+X!aen)z=L6kR4PEIMY1%1fKL?NXdY9ng zp$Pr&Jpq_*ys6-2oep^QHv&)4eIhUY$lH$Mot+&YKTG+uFo?IqD2aA9f>4#s>t^3x z`boRp4*YH7CgH?j&|89T0Re*`KfHr_1+Oc;T|9ip@!giD-L6RiE|4};x{*M>X oml~`&|2uHtz<~n?4jede;J|?c2M!!Kc-Zj&1MZ2imH?Oo0D?ENMF0Q* literal 0 HcmV?d00001 diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/header.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/header.js new file mode 100644 index 0000000..8ea6f79 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/header.js @@ -0,0 +1,183 @@ +var tap = require("tap") +var TarHeader = require("../lib/header.js") +var tar = require("../tar.js") +var fs = require("fs") + + +var headers = + { "a.txt file header": + [ "612e747874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303430312031313635313336303333332030313234353100203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'a.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 257 + , mtime: 1319493851 + , cksum: 5417 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + + , "omega pax": // the extended header from omega tar. + [ "5061784865616465722fcea92e74787400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303137302031313534333731303631312030313530353100207800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'PaxHeader/Ω.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 120 + , mtime: 1301254537 + , cksum: 6697 + , type: 'x' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } ] + + , "omega file header": + [ "cea92e7478740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303030322031313534333731303631312030313330373200203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'Ω.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 2 + , mtime: 1301254537 + , cksum: 5690 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } ] + + , "foo.js file header": + [ "666f6f2e6a730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303030342031313534333637303734312030313236313700203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'foo.js' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 4 + , mtime: 1301246433 + , cksum: 5519 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + + , "b.txt file header": + [ "622e747874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030313030302031313635313336303637372030313234363100203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true + , path: 'b.txt' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 512 + , mtime: 1319494079 + , cksum: 5425 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + + , "deep nested file": + [ "636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363633030303634342000303537373631200030303030323420003030303030303030313434203131363532313531353333203034333331340020300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075737461720030306973616163730000000000000000000000000000000000000000000000000000737461666600000000000000000000000000000000000000000000000000000030303030303020003030303030302000722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d2f662f6f2f6c2f642f652f722f2d2f702f612f742f680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + , { cksumValid: true, + path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' + , mode: 420 + , uid: 24561 + , gid: 20 + , size: 100 + , mtime: 1319687003 + , cksum: 18124 + , type: '0' + , linkpath: '' + , ustar: 'ustar\0' + , ustarver: '00' + , uname: 'isaacs' + , gname: 'staff' + , devmaj: 0 + , devmin: 0 + , fill: '' } + ] + } + +tap.test("parsing", function (t) { + Object.keys(headers).forEach(function (name) { + var h = headers[name] + , header = new Buffer(h[0], "hex") + , expect = h[1] + , parsed = new TarHeader(header) + + // console.error(parsed) + t.has(parsed, expect, "parse " + name) + }) + t.end() +}) + +tap.test("encoding", function (t) { + Object.keys(headers).forEach(function (name) { + var h = headers[name] + , expect = new Buffer(h[0], "hex") + , encoded = TarHeader.encode(h[1]) + + // might have slightly different bytes, since the standard + // isn't very strict, but should have the same semantics + // checkSum will be different, but cksumValid will be true + + var th = new TarHeader(encoded) + delete h[1].block + delete h[1].needExtended + delete h[1].cksum + t.has(th, h[1], "fields "+name) + }) + t.end() +}) + +// test these manually. they're a bit rare to find in the wild +tap.test("parseNumeric tests", function (t) { + var parseNumeric = TarHeader.parseNumeric + , numbers = + { "303737373737373700": 2097151 + , "30373737373737373737373700": 8589934591 + , "303030303036343400": 420 + , "800000ffffffffffff": 281474976710655 + , "ffffff000000000001": -281474976710654 + , "ffffff000000000000": -281474976710655 + , "800000000000200000": 2097152 + , "8000000000001544c5": 1393861 + , "ffffffffffff1544c5": -15383354 } + Object.keys(numbers).forEach(function (n) { + var b = new Buffer(n, "hex") + t.equal(parseNumeric(b), numbers[n], n + " === " + numbers[n]) + }) + t.end() +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js new file mode 100644 index 0000000..d4b03a1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js @@ -0,0 +1,886 @@ +// This is exactly like test/pack.js, except that it's excluding +// any proprietary headers. +// +// This loses some information about the filesystem, but creates +// tarballs that are supported by more versions of tar, especially +// old non-spec-compliant copies of gnutar. + +// the symlink file is excluded from git, because it makes +// windows freak the hell out. +var fs = require("fs") + , path = require("path") + , symlink = path.resolve(__dirname, "fixtures/symlink") +try { fs.unlinkSync(symlink) } catch (e) {} +fs.symlinkSync("./hardlink-1", symlink) +process.on("exit", function () { + fs.unlinkSync(symlink) +}) + +var tap = require("tap") + , tar = require("../tar.js") + , pkg = require("../package.json") + , Pack = tar.Pack + , fstream = require("fstream") + , Reader = fstream.Reader + , Writer = fstream.Writer + , input = path.resolve(__dirname, "fixtures/") + , target = path.resolve(__dirname, "tmp/pack.tar") + , uid = process.getuid ? process.getuid() : 0 + , gid = process.getgid ? process.getgid() : 0 + + , entries = + + // the global header and root fixtures/ dir are going to get + // a different date each time, so omit that bit. + // Also, dev/ino values differ across machines, so that's not + // included. + [ [ 'entry', + { path: 'fixtures/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + uid: uid, + gid: gid, + size: 200 } ] + + , [ 'entry', + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/a.txt', + mode: 420, + uid: uid, + gid: gid, + size: 257, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/b.txt', + mode: 420, + uid: uid, + gid: gid, + size: 512, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/c.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/cc.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/sub/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/foo.js', + mode: 420, + uid: uid, + gid: gid, + size: 4, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-1', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-2', + mode: 420, + uid: uid, + gid: gid, + size: 0, + type: '1', + linkpath: 'fixtures/hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/star.4.html', + mode: 420, + uid: uid, + gid: gid, + size: 54081, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/packtest/Ω.txt', + uid: uid, + gid: gid, + size: 2 } ] + + , [ 'entry', + { path: 'fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 100, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/symlink', + uid: uid, + gid: gid, + size: 0, + type: '2', + linkpath: 'hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: "fixtures/Ω.txt" + , uid: uid + , gid: gid + , size: 2 } ] + + , [ 'entry', + { path: 'fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + ] + + +// first, make sure that the hardlinks are actually hardlinks, or this +// won't work. Git has a way of replacing them with a copy. +var hard1 = path.resolve(__dirname, "fixtures/hardlink-1") + , hard2 = path.resolve(__dirname, "fixtures/hardlink-2") + , fs = require("fs") + +try { fs.unlinkSync(hard2) } catch (e) {} +fs.linkSync(hard1, hard2) + +tap.test("with global header", { timeout: 10000 }, function (t) { + runTest(t, true) +}) + +tap.test("without global header", { timeout: 10000 }, function (t) { + runTest(t, false) +}) + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + + +function runTest (t, doGH) { + var reader = Reader({ path: input + , filter: function () { + return !this.path.match(/\.(tar|hex)$/) + } + , sort: alphasort + }) + + var props = doGH ? pkg : {} + props.noProprietary = true + var pack = Pack(props) + var writer = Writer(target) + + // global header should be skipped regardless, since it has no content. + var entry = 0 + + t.ok(reader, "reader ok") + t.ok(pack, "pack ok") + t.ok(writer, "writer ok") + + pack.pipe(writer) + + var parse = tar.Parse() + t.ok(parse, "parser should be ok") + + pack.on("data", function (c) { + // console.error("PACK DATA") + if (c.length !== 512) { + // this one is too noisy, only assert if it'll be relevant + t.equal(c.length, 512, "parser should emit data in 512byte blocks") + } + parse.write(c) + }) + + pack.on("end", function () { + // console.error("PACK END") + t.pass("parser ends") + parse.end() + }) + + pack.on("error", function (er) { + t.fail("pack error", er) + }) + + parse.on("error", function (er) { + t.fail("parse error", er) + }) + + writer.on("error", function (er) { + t.fail("writer error", er) + }) + + reader.on("error", function (er) { + t.fail("reader error", er) + }) + + parse.on("*", function (ev, e) { + var wanted = entries[entry++] + if (!wanted) { + t.fail("unexpected event: "+ev) + return + } + t.equal(ev, wanted[0], "event type should be "+wanted[0]) + + if (ev !== wanted[0] || e.path !== wanted[1].path) { + console.error("wanted", wanted) + console.error([ev, e.props]) + e.on("end", function () { + console.error(e.fields) + throw "break" + }) + } + + t.has(e.props, wanted[1], "properties "+wanted[1].path) + if (wanted[2]) { + e.on("end", function () { + if (!e.fields) { + t.ok(e.fields, "should get fields") + } else { + t.has(e.fields, wanted[2], "should get expected fields") + } + }) + } + }) + + reader.pipe(pack) + + writer.on("close", function () { + t.equal(entry, entries.length, "should get all expected entries") + t.pass("it finished") + t.end() + }) + +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack.js new file mode 100644 index 0000000..bf033c1 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/pack.js @@ -0,0 +1,934 @@ + +// the symlink file is excluded from git, because it makes +// windows freak the hell out. +var fs = require("fs") + , path = require("path") + , symlink = path.resolve(__dirname, "fixtures/symlink") +try { fs.unlinkSync(symlink) } catch (e) {} +fs.symlinkSync("./hardlink-1", symlink) +process.on("exit", function () { + fs.unlinkSync(symlink) +}) + + +var tap = require("tap") + , tar = require("../tar.js") + , pkg = require("../package.json") + , Pack = tar.Pack + , fstream = require("fstream") + , Reader = fstream.Reader + , Writer = fstream.Writer + , input = path.resolve(__dirname, "fixtures/") + , target = path.resolve(__dirname, "tmp/pack.tar") + , uid = process.getuid ? process.getuid() : 0 + , gid = process.getgid ? process.getgid() : 0 + + , entries = + + // the global header and root fixtures/ dir are going to get + // a different date each time, so omit that bit. + // Also, dev/ino values differ across machines, so that's not + // included. + [ [ 'globalExtendedHeader', + { path: 'PaxHeader/', + mode: 438, + uid: 0, + gid: 0, + type: 'g', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { "NODETAR.author": pkg.author, + "NODETAR.name": pkg.name, + "NODETAR.description": pkg.description, + "NODETAR.version": pkg.version, + "NODETAR.repository.type": pkg.repository.type, + "NODETAR.repository.url": pkg.repository.url, + "NODETAR.main": pkg.main, + "NODETAR.scripts.test": pkg.scripts.test } ] + + , [ 'entry', + { path: 'fixtures/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + uid: uid, + gid: gid, + size: 200, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/a.txt', + mode: 420, + uid: uid, + gid: gid, + size: 257, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/b.txt', + mode: 420, + uid: uid, + gid: gid, + size: 512, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/c.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/cc.txt', + mode: 420, + uid: uid, + gid: gid, + size: 513, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/dir/sub/', + mode: 488, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + + , [ 'entry', + { path: 'fixtures/foo.js', + mode: 420, + uid: uid, + gid: gid, + size: 4, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-1', + mode: 420, + uid: uid, + gid: gid, + size: 200, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/hardlink-2', + mode: 420, + uid: uid, + gid: gid, + size: 0, + type: '1', + linkpath: 'fixtures/hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/omega.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/packtest/star.4.html', + mode: 420, + uid: uid, + gid: gid, + size: 54081, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'fixtures/packtest/Ω.txt', + 'NODETAR.depth': '2', + 'NODETAR.type': 'File', + nlink: 1, + uid: uid, + gid: gid, + size: 2, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/packtest/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '2', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + + , [ 'entry', + { path: 'fixtures/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', + mode: 493, + uid: uid, + gid: gid, + size: 0, + type: '5', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: uid, + gid: gid, + size: 100, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'entry', + { path: 'fixtures/symlink', + uid: uid, + gid: gid, + size: 0, + type: '2', + linkpath: 'hardlink-1', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' } ] + + , [ 'extendedHeader', + { path: 'PaxHeader/fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + type: 'x', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: "fixtures/Ω.txt" + , "NODETAR.depth": "1" + , "NODETAR.type": "File" + , nlink: 1 + , uid: uid + , gid: gid + , size: 2 + , "NODETAR.blksize": "4096" + , "NODETAR.blocks": "8" } ] + + , [ 'entry', + { path: 'fixtures/Ω.txt', + mode: 420, + uid: uid, + gid: gid, + size: 2, + type: '0', + linkpath: '', + ustar: 'ustar\u0000', + ustarver: '00', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + fill: '', + 'NODETAR.depth': '1', + 'NODETAR.type': 'File', + nlink: 1, + 'NODETAR.blksize': '4096', + 'NODETAR.blocks': '8' } ] + ] + + +// first, make sure that the hardlinks are actually hardlinks, or this +// won't work. Git has a way of replacing them with a copy. +var hard1 = path.resolve(__dirname, "fixtures/hardlink-1") + , hard2 = path.resolve(__dirname, "fixtures/hardlink-2") + , fs = require("fs") + +try { fs.unlinkSync(hard2) } catch (e) {} +fs.linkSync(hard1, hard2) + +tap.test("with global header", { timeout: 10000 }, function (t) { + runTest(t, true) +}) + +tap.test("without global header", { timeout: 10000 }, function (t) { + runTest(t, false) +}) + +function alphasort (a, b) { + return a === b ? 0 + : a.toLowerCase() > b.toLowerCase() ? 1 + : a.toLowerCase() < b.toLowerCase() ? -1 + : a > b ? 1 + : -1 +} + + +function runTest (t, doGH) { + var reader = Reader({ path: input + , filter: function () { + return !this.path.match(/\.(tar|hex)$/) + } + , sort: alphasort + }) + + var pack = Pack(doGH ? pkg : null) + var writer = Writer(target) + + // skip the global header if we're not doing that. + var entry = doGH ? 0 : 1 + + t.ok(reader, "reader ok") + t.ok(pack, "pack ok") + t.ok(writer, "writer ok") + + pack.pipe(writer) + + var parse = tar.Parse() + t.ok(parse, "parser should be ok") + + pack.on("data", function (c) { + // console.error("PACK DATA") + if (c.length !== 512) { + // this one is too noisy, only assert if it'll be relevant + t.equal(c.length, 512, "parser should emit data in 512byte blocks") + } + parse.write(c) + }) + + pack.on("end", function () { + // console.error("PACK END") + t.pass("parser ends") + parse.end() + }) + + pack.on("error", function (er) { + t.fail("pack error", er) + }) + + parse.on("error", function (er) { + t.fail("parse error", er) + }) + + writer.on("error", function (er) { + t.fail("writer error", er) + }) + + reader.on("error", function (er) { + t.fail("reader error", er) + }) + + parse.on("*", function (ev, e) { + var wanted = entries[entry++] + if (!wanted) { + t.fail("unexpected event: "+ev) + return + } + t.equal(ev, wanted[0], "event type should be "+wanted[0]) + + if (ev !== wanted[0] || e.path !== wanted[1].path) { + console.error("wanted", wanted) + console.error([ev, e.props]) + e.on("end", function () { + console.error(e.fields) + throw "break" + }) + } + + + t.has(e.props, wanted[1], "properties "+wanted[1].path) + if (wanted[2]) { + e.on("end", function () { + if (!e.fields) { + t.ok(e.fields, "should get fields") + } else { + t.has(e.fields, wanted[2], "should get expected fields") + } + }) + } + }) + + reader.pipe(pack) + + writer.on("close", function () { + t.equal(entry, entries.length, "should get all expected entries") + t.pass("it finished") + t.end() + }) + +} diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/parse.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/parse.js new file mode 100644 index 0000000..f765a50 --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/parse.js @@ -0,0 +1,359 @@ +var tap = require("tap") + , tar = require("../tar.js") + , fs = require("fs") + , path = require("path") + , file = path.resolve(__dirname, "fixtures/c.tar") + , index = 0 + + , expect = +[ [ 'entry', + { path: 'c.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 513, + mtime: new Date('Wed, 26 Oct 2011 01:10:58 GMT'), + cksum: 5422, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'cc.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 513, + mtime: new Date('Wed, 26 Oct 2011 01:11:02 GMT'), + cksum: 5525, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('Thu, 27 Oct 2011 03:43:23 GMT'), + cksum: 18124, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'entry', + { path: 'Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 2, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 5695, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 120, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 6702, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: 'Ω.txt', + ctime: 1319737909, + atime: 1319739061, + dev: 234881026, + ino: 51693379, + nlink: 1 } ], + [ 'entry', + { path: 'Ω.txt', + mode: 420, + uid: 24561, + gid: 20, + size: 2, + mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + cksum: 5695, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'), + atime: new Date('Thu, 27 Oct 2011 18:11:01 GMT'), + dev: 234881026, + ino: 51693379, + nlink: 1 }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 353, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14488, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ctime: 1319686868, + atime: 1319741254, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 1 } ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 200, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14570, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + atime: new Date('Thu, 27 Oct 2011 18:47:34 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 1 }, + undefined ], + [ 'longPath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4976, + type: 'L', + linkpath: '', + ustar: false }, + '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 1000, + gid: 1000, + size: 201, + mtime: new Date('Thu, 27 Oct 2011 22:21:50 GMT'), + cksum: 14086, + type: '0', + linkpath: '', + ustar: false }, + undefined ], + [ 'longLinkpath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4975, + type: 'K', + linkpath: '', + ustar: false }, + '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ], + [ 'longPath', + { path: '././@LongLink', + mode: 0, + uid: 0, + gid: 0, + size: 201, + mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'), + cksum: 4976, + type: 'L', + linkpath: '', + ustar: false }, + '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL' ], + [ 'entry', + { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL', + mode: 511, + uid: 1000, + gid: 1000, + size: 0, + mtime: new Date('Fri, 28 Oct 2011 23:05:17 GMT'), + cksum: 21603, + type: '2', + linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ustar: false }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200-hard', + mode: 420, + uid: 24561, + gid: 20, + size: 143, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 6533, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { ctime: 1320617144, + atime: 1320617232, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 } ], + [ 'entry', + { path: '200-hard', + mode: 420, + uid: 24561, + gid: 20, + size: 200, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 5526, + type: '0', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'), + atime: new Date('Sun, 06 Nov 2011 22:07:12 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 }, + undefined ], + [ 'extendedHeader', + { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 353, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 14488, + type: 'x', + linkpath: '', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '' }, + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + ctime: 1320617144, + atime: 1320617406, + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 } ], + [ 'entry', + { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: 420, + uid: 24561, + gid: 20, + size: 0, + mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'), + cksum: 15173, + type: '1', + linkpath: '200-hard', + ustar: 'ustar\0', + ustarver: '00', + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + fill: '', + ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'), + atime: new Date('Sun, 06 Nov 2011 22:10:06 GMT'), + 'LIBARCHIVE.creationtime': '1319686852', + dev: 234881026, + ino: 51681874, + nlink: 2 }, + undefined ] ] + + +tap.test("parser test", function (t) { + var parser = tar.Parse() + + parser.on("end", function () { + t.equal(index, expect.length, "saw all expected events") + t.end() + }) + + fs.createReadStream(file) + .pipe(parser) + .on("*", function (ev, entry) { + var wanted = expect[index] + if (!wanted) { + return t.fail("Unexpected event: " + ev) + } + var result = [ev, entry.props] + entry.on("end", function () { + result.push(entry.fields || entry.body) + + t.equal(ev, wanted[0], index + " event type") + t.equivalent(entry.props, wanted[1], wanted[1].path + " entry properties") + if (wanted[2]) { + t.equivalent(result[2], wanted[2], "metadata values") + } + index ++ + }) + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js new file mode 100644 index 0000000..a00ff7f --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js @@ -0,0 +1,20 @@ +// clean up the fixtures + +var tap = require("tap") +, rimraf = require("rimraf") +, test = tap.test +, path = require("path") + +test("clean fixtures", function (t) { + rimraf(path.resolve(__dirname, "fixtures"), function (er) { + t.ifError(er, "rimraf ./fixtures/") + t.end() + }) +}) + +test("clean tmp", function (t) { + rimraf(path.resolve(__dirname, "tmp"), function (er) { + t.ifError(er, "rimraf ./tmp/") + t.end() + }) +}) diff --git a/node_modules/sqlite3/node_modules/node-pre-gyp/package.json b/node_modules/sqlite3/node_modules/node-pre-gyp/package.json new file mode 100644 index 0000000..ba7dacb --- /dev/null +++ b/node_modules/sqlite3/node_modules/node-pre-gyp/package.json @@ -0,0 +1,70 @@ +{ + "name": "node-pre-gyp", + "description": "Node.js native addon binary install tool", + "version": "0.5.27", + "keywords": [ + "native", + "addon", + "module", + "c", + "c++", + "bindings", + "binary" + ], + "author": { + "name": "Dane Springmeyer", + "email": "dane@mapbox.com" + }, + "repository": { + "type": "git", + "url": "git://github.com/mapbox/node-pre-gyp.git" + }, + "bin": { + "node-pre-gyp": "./bin/node-pre-gyp" + }, + "main": "./lib/node-pre-gyp.js", + "dependencies": { + "nopt": "~3.0.1", + "npmlog": "~0.1.1", + "request": "2.x", + "semver": "~3.0.1", + "tar": "~1.0.0", + "tar-pack": "~2.0.0", + "mkdirp": "~0.5.0", + "rc": "~0.5.0", + "rimraf": "~2.2.8" + }, + "devDependencies": { + "aws-sdk": "*", + "mocha": "1.x" + }, + "engineStrict": true, + "engines": { + "node": ">= 0.8.0" + }, + "scripts": { + "update-crosswalk": "node scripts/abi_crosswalk.js > lib/util/abi_crosswalk.json", + "test": "mocha -R spec --timeout 100000" + }, + "readme": "# node-pre-gyp\n\n#### node-pre-gyp makes it easy to publish and install Node.js C++ addons from binaries\n\n[![NPM](https://nodei.co/npm/node-pre-gyp.png)](https://nodei.co/npm/node-pre-gyp/)\n\n[![Build Status](https://api.travis-ci.org/mapbox/node-pre-gyp.svg)](https://travis-ci.org/mapbox/node-pre-gyp)\n[![Build status](https://ci.appveyor.com/api/projects/status/3nxewb425y83c0gv)](https://ci.appveyor.com/project/Mapbox/node-pre-gyp)\n[![Dependencies](https://david-dm.org/mapbox/node-pre-gyp.svg)](https://david-dm.org/mapbox/node-pre-gyp)\n\n`node-pre-gyp` stands between [npm](https://github.com/npm/npm) and [node-gyp](https://github.com/Tootallnate/node-gyp) and offers a cross-platform method of binary deployment.\n\n### Features\n\n - A command line tool called `node-pre-gyp` that can install your package's c++ module from a binary.\n - A variety of developer targeted commands for packaging, testing, and publishing binaries.\n - A Javascript module that can dynamically require your installed binary: `require('node-pre-gyp').find`\n\nFor a hello world example of a module packaged with `node-pre-gyp` see and [the wiki ](https://github.com/mapbox/node-pre-gyp/wiki/Modules-using-node-pre-gyp) for real world examples.\n\n## Credits\n\n - The module is modeled after [node-gyp](https://github.com/Tootallnate/node-gyp) by [@Tootallnate](https://github.com/Tootallnate)\n - Motivation for initial development came from [@ErisDS](https://github.com/ErisDS) and the [Ghost Project](https://github.com/TryGhost/Ghost).\n - Development is sponsored by [Mapbox](https://www.mapbox.com/)\n\n## Depends\n\n - Node.js 0.10.x or 0.8.x\n\n## Install\n\n`node-pre-gyp` is designed to be installed as a local dependency of your Node.js C++ addon and accessed like:\n\n ./node_modules/.bin/node-pre-gyp --help\n\nBut you can also install it globally:\n\n npm install node-pre-gyp -g\n\n## Usage\n\n### Commands\n\nView all possible commands:\n\n node-pre-gyp --help\n\n- clean - Removes the entire folder containing the compiled .node module\n- install - Attempts to install pre-built binary for module\n- reinstall - Runs \"clean\" and \"install\" at once\n- build - Attempts to compile the module by dispatching to node-gyp or nw-gyp\n- rebuild - Runs \"clean\" and \"build\" at once\n- package - Packs binary into tarball\n- testpackage - Tests that the staged package is valid\n- publish - Publishes pre-built binary\n- unpublish - Unpublishes pre-built binary\n- info - Fetches info on published binaries\n\nYou can also chain commands:\n\n node-pre-gyp clean build unpublish publish info\n\n### Options\n\nOptions include:\n\n - `-C/--directory`: run the command in this directory\n - `--build-from-source`: build from source instead of using pre-built binary\n - `--runtime=node-webkit`: customize the runtime: `node` and `node-webkit` are the valid options\n - `--fallback-to-build`: fallback to building from source if pre-built binary is not available\n - `--target=0.10.25`: Pass the target node or node-webkit version to compile against\n - `--target_arch=ia32`: Pass the target arch and override the host `arch`. Valid values are 'ia32','x64', or `arm`.\n - `--target_platform=win32`: Pass the target platform and override the host `platform`. Valid values are `linux`, `darwin`, `win32`, `sunos`, `freebsd`, `openbsd`, and `aix`.\n\nBoth `--build-from-source` and `--fallback-to-build` can be passed alone or they can provide values. You can pass `--fallback-to-build=false` to override the option as declared in package.json. In addition to being able to pass `--build-from-source` you can also pass `--build-from-source=myapp` where `myapp` is the name of your module.\n\nFor example: `npm install --build-from-source=myapp`. This is useful if:\n\n - `myapp` is referenced in the package.json of a larger app and therefore `myapp` is being installed as a dependent with `npm install`.\n - The larger app also depends on other modules installed with `node-pre-gyp`\n - You only want to trigger a source compile for `myapp` and the other modules.\n\n### Configuring\n\nThis is a guide to configuring your module to use node-pre-gyp.\n\n#### 1) Add new entries to your `package.json`\n\n - Add `node-pre-gyp` to `bundledDependencies`\n - Add `aws-sdk` as a `devDependency`\n - Add a custom `install` script\n - Declare a `binary` object\n\nThis looks like:\n\n```js\n \"dependencies\" : {\n \"node-pre-gyp\": \"0.5.x\"\n },\n \"bundledDependencies\":[\"node-pre-gyp\"],\n \"devDependencies\": {\n \"aws-sdk\": \"~2.0.0-rc.15\"\n }\n \"scripts\": {\n \"install\": \"node-pre-gyp install --fallback-to-build\",\n },\n \"binary\": {\n \"module_name\": \"your_module\",\n \"module_path\": \"./lib/binding/\",\n \"host\": \"https://your_module.s3-us-west-1.amazonaws.com\"\n }\n```\n\nFor a full example see [node-addon-examples's package.json](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/package.json#L11-L22).\n\n##### The `binary` object has three required properties\n\n###### module_name\n\nThe name of your native node module. This value must:\n\n - Match the name passed to [the NODE_MODULE macro](http://nodejs.org/api/addons.html#addons_hello_world)\n - Must be a valid C variable name (e.g. it cannot contain `-`)\n - Should not include the `.node` extension.\n\n###### module_path\n\nThe location your native module is placed after a build. This should be an empty directory without other javascript files. This entire directory will be packaged in the binary tarball. When installing from a remote package this directory will be overwritten with the contents of the tarball.\n\nNote: This property supports variables based on [Versioning](#versioning).\n\n###### host\n\nA url to the remote location where you've published tarball binaries (must be `https` not `http`).\n\nIt is highly recommended that you use Amazon S3. The reasons are:\n\n - Various node-pre-gyp commands like `publish` and `info` only work with an S3 host.\n - S3 is a very solid hosting platform for distributing large files, even [Github recommends using it instead of github](https://help.github.com/articles/distributing-large-binaries).\n - We provide detail documentation for using [S3 hosting](#s3-hosting) with node-pre-gyp.\n\nWhy then not require S3? Because while some applications using node-pre-gyp need to distribute binaries as large as 20-30 MB, others might have very small binaries and might wish to store them in a github repo. This is not recommended, but if an author really wants to host in a non-s3 location then it should be possible.\n\n##### The `binary` object has two optional properties\n\n###### remote_path\n\nIt **is recommended** that you customize this property. This is an extra path to use for publishing and finding remote tarballs. The default value for `remote_path` is `\"\"` meaning that if you do not provide it then all packages will be published at the base of the `host`. It is recommended to provide a value like `./{name}/v{version}` to help organize remote packages in the case that you choose to publish multiple node addons to the same `host`.\n\nNote: This property supports variables based on [Versioning](#versioning).\n\n###### package_name\n\nIt is **not recommended** to override this property unless you are also overriding the `remote_path`. This is the versioned name of the remote tarball containing the binary `.node` module and any supporting files you've placed inside the `module_path` directory. Unless you specify `package_name` in your `package.json` then it defaults to `{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz` which allows your binary to work across node versions, platforms, and architectures. If you are using `remote_path` that is also versioned by `./{module_name}/v{version}` then you could remove these variables from the `package_name` and just use: `{node_abi}-{platform}-{arch}.tar.gz`. Then your remote tarball will be looked up at, for example, `https://example.com/your-module/v0.1.0/node-v11-linux-x64.tar.gz`.\n\nNote: This property supports variables based on [Versioning](#versioning).\n\n#### 2) Add a new target to binding.gyp\n\n`node-pre-gyp` calls out to `node-gyp` to compile the module and passes variables along like [module_name](#module_name) and [module_path](#module_path).\n\nA new target must be added to `binding.gyp` that moves the compiled `.node` module from `./build/Release/module_name.node` into the directory specified by `module_path`.\n\nAdd a target like this at the end of your `targets` list:\n\n```js\n {\n \"target_name\": \"action_after_build\",\n \"type\": \"none\",\n \"dependencies\": [ \"<(module_name)\" ],\n \"copies\": [\n {\n \"files\": [ \"<(PRODUCT_DIR)/<(module_name).node\" ],\n \"destination\": \"<(module_path)\"\n }\n ]\n }\n```\n\nFor a full example see [node-addon-example's binding.gyp](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/binding.gyp).\n\n#### 3) Dynamically require your `.node`\n\nInside the main js file that requires your addon module you are likely currently doing:\n\n```js\nvar binding = require('../build/Release/binding.node');\n```\n\nor:\n\n```js\nvar bindings = require('./bindings')\n```\n\nChange those lines to:\n\n```js\nvar binary = require('node-pre-gyp');\nvar path = require('path');\nvar binding_path = binary.find(path.resolve(path.join(__dirname,'./package.json')));\nvar binding = require(binding_path);\n```\n\nFor a full example see [node-addon-example's index.js](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/index.js#L1-L4)\n\n#### 4) Build and package your app\n\nNow build your module from source:\n\n npm install --build-from-source\n\nThe `--build-from-source` tells `node-pre-gyp` to not look for a remote package and instead dispatch to node-gyp to build.\n\nNow `node-pre-gyp` should now also be installed as a local dependency so the command line tool it offers can be found at `./node_modules/.bin/node-pre-gyp`.\n\n#### 5) Test\n\nNow `npm test` should work just as it did before.\n\n#### 6) Publish the tarball\n\nThen package your app:\n\n ./node_modules/.bin/node-pre-gyp package\n\nOnce packaged, now you can publish:\n\n ./node_modules/.bin/node-pre-gyp publish\n\nCurrently the `publish` command pushes your binary to S3. This requires:\n\n - You have installed `aws-sdk` with `npm install aws-sdk`\n - You have created a bucket already.\n - The `host` points to an S3 http or https endpoint.\n - You have configured node-pre-gyp to read your S3 credentials (see [S3 hosting](#s3-hosting) for details).\n\nYou can also host your binaries elsewhere. To do this requires:\n\n - You manually publish the binary created by the `package` command to an `https` endpoint\n - Ensure that the `host` value points to your custom `https` endpoint.\n\n#### 7) Automate builds\n\nNow you need to publish builds for all the platforms and node versions you wish to support. This is best automated.\n\n - See [Appveyor Automation](#appveyor-automation) for how to auto-publish builds on Windows.\n - See [Travis Automation](#travis-automation) for how to auto-publish builds on OS X and Linux.\n\n#### 8) You're done!\n\nNow publish your module to the npm registry. Users will now be able to install your module from a binary. \n\nWhat will happen is this:\n\n1. `npm install ` will pull from the npm registry\n2. npm will run the `install` script which will call out to `node-pre-gyp`\n3. `node-pre-gyp` will fetch the binary `.node` module and unpack in the right place\n4. Assuming that all worked, you are done\n\nIf a a binary was not available for a given platform and `--fallback-to-build` was used then `node-gyp rebuild` will be called to try to source compile the module.\n\n## S3 Hosting\n\nYou can host wherever you choose but S3 is cheap, `node-pre-gyp publish` expects it, and S3 can be integrated well with [travis.ci](http://travis-ci.org) to automate builds for OS X and Ubuntu. Here is an approach to do this:\n\nFirst, get setup locally and test the workflow:\n\n#### 1) Create an S3 bucket\n\nAnd have your **key** and **secret key** ready for writing to the bucket.\n\nIt is recommended to create a IAM user with a policy that only gives permissions to the specific bucket you plan to publish to. This can be done in the [IAM console](https://console.aws.amazon.com/iam/) by: 1) adding a new user, 2) choosing `Attach User Policy`, 3) Using the `Policy Generator`, 4) selecting `Amazon S3` for the service, 5) adding the actions: `DeleteObject`, `GetObject`, `GetObjectAcl`, `ListBucket`, `PutObject`, `PutObjectAcl`, 6) adding an ARN of `arn:aws:s3:::bucket/*` (replacing `bucket` with your bucket name), and finally 7) clicking `Add Statement` and saving the policy. It should generate a policy like:\n\n```js\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"Stmt1394587197000\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:DeleteObject\",\n \"s3:GetObject\",\n \"s3:GetObjectAcl\",\n \"s3:ListBucket\",\n \"s3:PutObject\",\n \"s3:PutObjectAcl\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::node-pre-gyp-tests/*\"\n ]\n }\n ]\n}\n```\n\n#### 2) Install node-pre-gyp\n\nEither install it globally:\n\n npm install node-pre-gyp -g\n\nOr put the local version on your PATH\n\n export PATH=`pwd`/node_modules/.bin/:$PATH\n\n#### 3) Configure AWS credentials\n\nThere are several ways to do this.\n\nYou can use any of the methods described at http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html.\n\nOr you can create a `~/.node_pre_gyprc`\n\nOr pass options in any way supported by [RC](https://github.com/dominictarr/rc#standards)\n\nA `~/.node_pre_gyprc` looks like:\n\n```js\n{\n \"accessKeyId\": \"xxx\",\n \"secretAccessKey\": \"xxx\"\n}\n```\n\nAnother way is to use your environment:\n\n export node_pre_gyp_accessKeyId=xxx\n export node_pre_gyp_secretAccessKey=xxx\n\nYou may also need to specify the `region` if it is not explicit in the `host` value you use. The `bucket` can also be specified but it is optional because `node-pre-gyp` will detect it from the `host` value.\n\n#### 4) Package and publish your build\n\nInstall the `aws-sdk`:\n\n npm install aws-sdk\n\nThen publish:\n\n node-pre-gyp package publish\n\nNote: if you hit an error like `Hostname/IP doesn't match certificate's altnames` it may mean that you need to provide the `region` option in your config.\n\n## Appveyor Automation\n\n[Appveyor](http://www.appveyor.com/) can build binaries and publish the results per commit and supports:\n\n - Windows Visual Studio 2013 and related compilers\n - Both 64 bit (x64) and 32 bit (x86) build configurations\n - Multiple Node.js versions\n\nFor an example of doing this see [node-sqlite3's appveyor.yml](https://github.com/mapbox/node-sqlite3/blob/master/appveyor.yml).\n\nBelow is a guide to getting set up:\n\n#### 1) Create a free Appveyor account\n\nGo to https://ci.appveyor.com/signup/free and sign in with your github account.\n\n#### 2) Create a new project\n\nGo to https://ci.appveyor.com/projects/new and select the github repo for your module\n\n#### 3) Add appveyor.yml and push it\n\nOnce you have committed an `appveyor.yml` ([appveyor.yml reference](http://www.appveyor.com/docs/appveyor-yml)) to your github repo and pushed it appveyor should automatically start building your project.\n\n#### 4) Create secure variables\n\nEncrypt your S3 AWS keys by going to and hitting the `encrypt` button.\n\nThen paste the result into your `appveyor.yml`\n\n```yml\nenvironment:\n node_pre_gyp_accessKeyId:\n secure: Dn9HKdLNYvDgPdQOzRq/DqZ/MPhjknRHB1o+/lVU8MA=\n node_pre_gyp_secretAccessKey:\n secure: W1rwNoSnOku1r+28gnoufO8UA8iWADmL1LiiwH9IOkIVhDTNGdGPJqAlLjNqwLnL\n```\n\nNOTE: keys are per account but not per repo (this is difference than travis where keys are per repo but not related to the account used to encrypt them).\n\n#### 5) Hook up publishing\n\nJust put `node-pre-gyp package publish` in your `appveyor.yml` after `npm install`.\n\n#### 6) Publish when you want\n\nYou might wish to publish binaries only on a specific commit. To do this you could borrow from the [travis.ci idea of commit keywords](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) and add special handling for commit messages with `[publish binary]`:\n\n SET CM=%APPVEYOR_REPO_COMMIT_MESSAGE%\n if not \"%CM%\" == \"%CM:[publish binary]=%\" node-pre-gyp --msvs_version=2013 publish\n\nIf your commit message contains special characters (e.g. `&`) this method might fail. An alternative is to use PowerShell, which gives you additional possibilites, like ignoring case by using `ToLower()`:\n\n ps: if($env:APPVEYOR_REPO_COMMIT_MESSAGE.ToLower().Contains('[publish binary]')) { node-pre-gyp --msvs_version=2013 publish }\n\nRemember this publishing is not the same as `npm publish`. We're just talking about the binary module here and not your entire npm package. To automate the publishing of your entire package to npm on travis see http://about.travis-ci.org/docs/user/deployment/npm/\n\n\n## Travis Automation\n\n[Travis](https://travis-ci.org/) can push to S3 after a successful build and supports both:\n\n - Ubuntu Precise and OS X\n - Multiple Node.js versions\n\nFor an example of doing this see [node-add-example's .travis.yml](https://github.com/springmeyer/node-addon-example/blob/2ff60a8ded7f042864ad21db00c3a5a06cf47075/.travis.yml).\n\nBelow is a guide to getting set up:\n\n#### 1) Install the travis gem\n\n gem install travis\n\n#### 2) Create secure variables\n\nMake sure you run this command from within the directory of your module.\n\nUse `travis-encrypt` like:\n\n travis encrypt node_pre_gyp_accessKeyId=${node_pre_gyp_accessKeyId}\n travis encrypt node_pre_gyp_secretAccessKey=${node_pre_gyp_secretAccessKey}\n\nThen put those values in your `.travis.yml` like:\n\n```yaml\nenv:\n global:\n - secure: F+sEL/v56CzHqmCSSES4pEyC9NeQlkoR0Gs/ZuZxX1ytrj8SKtp3MKqBj7zhIclSdXBz4Ev966Da5ctmcTd410p0b240MV6BVOkLUtkjZJyErMBOkeb8n8yVfSoeMx8RiIhBmIvEn+rlQq+bSFis61/JkE9rxsjkGRZi14hHr4M=\n - secure: o2nkUQIiABD139XS6L8pxq3XO5gch27hvm/gOdV+dzNKc/s2KomVPWcOyXNxtJGhtecAkABzaW8KHDDi5QL1kNEFx6BxFVMLO8rjFPsMVaBG9Ks6JiDQkkmrGNcnVdxI/6EKTLHTH5WLsz8+J7caDBzvKbEfTux5EamEhxIWgrI=\n```\n\nMore details on travis encryption at http://about.travis-ci.org/docs/user/encryption-keys/.\n\n#### 3) Hook up publishing\n\nJust put `node-pre-gyp package publish` in your `.travis.yml` after `npm install`.\n\nIf you want binaries for OS X change you have two options:\n\n - Enable `multi-os` for your repo by emailing a request to `support@travis-ci.com`. More details at . An example of a repo using multi-os is [node-sqlite3](https://github.com/mapbox/node-sqlite3/blob/f69b89a078e2200fee54a9f897e6957bd627d8b7/.travis.yml#L4-L6).\n - Or, you can change the `language` and push to a different branch to build on OS X just when you commit to that branch. Details on this below:\n\n\n##### OS X publishing via a branch\n\nTweak your `.travis.yml` to use:\n\n```yml\nlanguage: objective-c\n```\n\nKeep that change in a different git branch and sync that when you want binaries published.\n\nNote: using `language: objective-c` instead of `language: nodejs` looses node.js specific travis sugar like a matrix for multiple node.js versions.\n\nBut you can replicate the lost behavior by replacing:\n\n```yml\nnode_js:\n - \"0.8\"\n - \"0.10\"\n```\n\nWith:\n\n```yml\nenv:\n matrix:\n - export NODE_VERSION=\"0.8\"\n - export NODE_VERSION=\"0.10\"\n\nbefore_install:\n - git clone https://github.com/creationix/nvm.git ./.nvm\n - source ./.nvm/nvm.sh\n - nvm install $NODE_VERSION\n - nvm use $NODE_VERSION\n```\n\n#### 4) Publish when you want\n\nYou might wish to publish binaries only on a specific commit. To do this you could borrow from the [travis.ci idea of commit keywords](http://about.travis-ci.org/docs/user/how-to-skip-a-build/) and add special handling for commit messages with `[publish binary]`:\n\n COMMIT_MESSAGE=$(git show -s --format=%B $TRAVIS_COMMIT | tr -d '\\n')\n if test \"${COMMIT_MESSAGE#*'[publish binary]'}\" != \"$COMMIT_MESSAGE\"; then node-pre-gyp publish; fi;\n\nThen you can trigger new binaries to be built like:\n\n git commit -a -m \"[publish binary]\"\n\nOr, if you don't have any changes to make simply run:\n\n git commit --allow-empty -m \"[publish binary]\"\n\nRemember this publishing is not the same as `npm publish`. We're just talking about the binary module here and not your entire npm package. To automate the publishing of your entire package to npm on travis see http://about.travis-ci.org/docs/user/deployment/npm/\n\n# Versioning\n\nThe `binary` properties of `module_path`, `remote_path`, and `package_name` support variable substitution. The strings are evaluated by `node-pre-gyp` depending on your system and any custom build flags you passed.\n\n - `configuration` - Either 'Release' or 'Debug' depending on if `--debug` is passed during the build.\n - `module_name` - the `binary.module_name` attribute from `package.json`.\n - `version` - the semver `version` value for your module from `package.json`.\n - `major`, `minor`, `patch`, and `prelease` match the individual semver values for your module's `version`\n - `node_abi`: The node C++ `ABI` number. This value is available in javascript as `process.versions.modules` as of [`>= v0.10.4 >= v0.11.7`](https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e) and in C++ as the `NODE_MODULE_VERSION` define much earlier. For versions of Node before this was available we fallback to the V8 major and minor version.\n - `platform` matches node's `process.platform` like `linux`, `darwin`, and `win32` unless the user passed the `--target_platform` option to override.\n - `arch` matches node's `process.arch` like `x64` or `ia32` unless the user passes the `--target_arch` option to override.\n\n\nThe options are visible in the code at \n", + "readmeFilename": "README.md", + "bugs": { + "url": "https://github.com/mapbox/node-pre-gyp/issues" + }, + "homepage": "https://github.com/mapbox/node-pre-gyp", + "bundleDependencies": [ + "nopt", + "npmlog", + "request", + "semver", + "tar", + "tar-pack", + "mkdirp", + "rc", + "rimraf" + ], + "_id": "node-pre-gyp@0.5.27", + "_shasum": "6a192ee80086ec9a6738bd2efa06e82047861498", + "_from": "node-pre-gyp@~0.5.27", + "_resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.5.27.tgz" +} diff --git a/node_modules/sqlite3/package.json b/node_modules/sqlite3/package.json new file mode 100644 index 0000000..a35113f --- /dev/null +++ b/node_modules/sqlite3/package.json @@ -0,0 +1,143 @@ +{ + "name": "sqlite3", + "description": "Asynchronous, non-blocking SQLite3 bindings", + "version": "3.0.2", + "homepage": "http://github.com/mapbox/node-sqlite3", + "author": { + "name": "MapBox", + "url": "https://mapbox.com/" + }, + "binary": { + "module_name": "node_sqlite3", + "module_path": "./lib/binding/{node_abi}-{platform}-{arch}", + "host": "https://mapbox-node-binary.s3.amazonaws.com", + "remote_path": "./{name}/v{version}/", + "package_name": "{node_abi}-{platform}-{arch}.tar.gz" + }, + "contributors": [ + { + "name": "Konstantin Käfer", + "email": "mail@kkaefer.com" + }, + { + "name": "Dane Springmeyer", + "email": "dane@mapbox.com" + }, + { + "name": "Will White", + "email": "will@mapbox.com" + }, + { + "name": "Orlando Vazquez", + "email": "ovazquez@gmail.com" + }, + { + "name": "Artem Kustikov", + "email": "kustikoff@gmail.com" + }, + { + "name": "Eric Fredricksen", + "email": "efredricksen@gmail.com" + }, + { + "name": "John Wright", + "email": "mrjjwright@gmail.com" + }, + { + "name": "Ryan Dahl", + "email": "ry@tinyclouds.org" + }, + { + "name": "Tom MacWright", + "email": "tom@mapbox.com" + }, + { + "name": "Carter Thaxton", + "email": "carter.thaxton@gmail.com" + }, + { + "name": "Audrius Kažukauskas", + "email": "audrius@neutrino.lt" + }, + { + "name": "Johannes Schauer", + "email": "josch@pyneo.org" + }, + { + "name": "Nathan Rajlich", + "email": "nathan@tootallnate.net" + }, + { + "name": "AJ ONeal", + "email": "coolaj86@gmail.com" + }, + { + "name": "Mithgol" + } + ], + "repository": { + "type": "git", + "url": "git://github.com/mapbox/node-sqlite3.git" + }, + "dependencies": { + "nan": "1.3.0", + "node-pre-gyp": "~0.5.27" + }, + "devDependencies": { + "mocha": "1.x", + "aws-sdk": "~2.0.4" + }, + "engines": { + "node": ">= 0.10.0 < 0.11.0 || >= 0.11.13 < 0.13.0" + }, + "engineStrict": true, + "scripts": { + "install": "node-pre-gyp install --fallback-to-build", + "pretest": "node test/support/createdb.js", + "test": "mocha -R spec --timeout 480000" + }, + "licenses": [ + { + "type": "BSD" + } + ], + "main": "./lib/sqlite3", + "bugs": { + "url": "https://github.com/mapbox/node-sqlite3/issues" + }, + "bundleDependencies": [ + "node-pre-gyp" + ], + "_id": "sqlite3@3.0.2", + "_shasum": "96cdd857f5aa141dc694f9a6353d1aaff9244e0b", + "_from": "sqlite3@", + "_npmVersion": "1.4.9", + "_npmUser": { + "name": "yhahn", + "email": "young@developmentseed.org" + }, + "maintainers": [ + { + "name": "kkaefer", + "email": "kkaefer@gmail.com" + }, + { + "name": "yhahn", + "email": "young@developmentseed.org" + }, + { + "name": "tmcw", + "email": "macwright@gmail.com" + }, + { + "name": "springmeyer", + "email": "dane@dbsgeo.com" + } + ], + "dist": { + "shasum": "96cdd857f5aa141dc694f9a6353d1aaff9244e0b", + "tarball": "http://registry.npmjs.org/sqlite3/-/sqlite3-3.0.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-3.0.2.tgz" +} diff --git a/node_modules/sqlite3/sqlite3.js b/node_modules/sqlite3/sqlite3.js new file mode 100644 index 0000000..c4b587d --- /dev/null +++ b/node_modules/sqlite3/sqlite3.js @@ -0,0 +1 @@ +module.exports = require('./lib/sqlite3'); diff --git a/node_modules/sqlite3/src/async.h b/node_modules/sqlite3/src/async.h new file mode 100644 index 0000000..2b167ce --- /dev/null +++ b/node_modules/sqlite3/src/async.h @@ -0,0 +1,89 @@ +#ifndef NODE_SQLITE3_SRC_ASYNC_H +#define NODE_SQLITE3_SRC_ASYNC_H + +#include "threading.h" +#include + +#if defined(NODE_SQLITE3_BOOST_THREADING) +#include +#endif + + +// Generic uv_async handler. +template class Async { + typedef void (*Callback)(Parent* parent, Item* item); + +protected: + uv_async_t watcher; + NODE_SQLITE3_MUTEX_t + std::vector data; + Callback callback; +public: + Parent* parent; + +public: + Async(Parent* parent_, Callback cb_) + : callback(cb_), parent(parent_) { + watcher.data = this; + NODE_SQLITE3_MUTEX_INIT + uv_async_init(uv_default_loop(), &watcher, reinterpret_cast(listener)); + } + + static void listener(uv_async_t* handle, int status) { + Async* async = static_cast(handle->data); + std::vector rows; + NODE_SQLITE3_MUTEX_LOCK(&async->mutex) + rows.swap(async->data); + NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex) + for (unsigned int i = 0, size = rows.size(); i < size; i++) { +#if NODE_VERSION_AT_LEAST(0, 7, 9) + uv_unref((uv_handle_t *)&async->watcher); +#else + uv_unref(uv_default_loop()); +#endif + async->callback(async->parent, rows[i]); + } + } + + static void close(uv_handle_t* handle) { + assert(handle != NULL); + assert(handle->data != NULL); + Async* async = static_cast(handle->data); + delete async; + } + + void finish() { + // Need to call the listener again to ensure all items have been + // processed. Is this a bug in uv_async? Feels like uv_close + // should handle that. + listener(&watcher, 0); + uv_close((uv_handle_t*)&watcher, close); + } + + void add(Item* item) { + // Make sure node runs long enough to deliver the messages. +#if NODE_VERSION_AT_LEAST(0, 7, 9) + uv_ref((uv_handle_t *)&watcher); +#else + uv_ref(uv_default_loop()); +#endif + NODE_SQLITE3_MUTEX_LOCK(&mutex); + data.push_back(item); + NODE_SQLITE3_MUTEX_UNLOCK(&mutex) + } + + void send() { + uv_async_send(&watcher); + } + + void send(Item* item) { + add(item); + send(); + } + + ~Async() { + NODE_SQLITE3_MUTEX_DESTROY + } +}; + +#endif diff --git a/node_modules/sqlite3/src/database.cc b/node_modules/sqlite3/src/database.cc new file mode 100644 index 0000000..27e4252 --- /dev/null +++ b/node_modules/sqlite3/src/database.cc @@ -0,0 +1,673 @@ +#include +#include + +#include "macros.h" +#include "database.h" +#include "statement.h" + +using namespace node_sqlite3; + +Persistent Database::constructor_template; + +void Database::Init(Handle target) { + NanScope(); + + Local t = NanNew(New); + + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(NanNew("Database")); + + NODE_SET_PROTOTYPE_METHOD(t, "close", Close); + NODE_SET_PROTOTYPE_METHOD(t, "exec", Exec); + NODE_SET_PROTOTYPE_METHOD(t, "wait", Wait); + NODE_SET_PROTOTYPE_METHOD(t, "loadExtension", LoadExtension); + NODE_SET_PROTOTYPE_METHOD(t, "serialize", Serialize); + NODE_SET_PROTOTYPE_METHOD(t, "parallelize", Parallelize); + NODE_SET_PROTOTYPE_METHOD(t, "configure", Configure); + + NODE_SET_GETTER(t, "open", OpenGetter); + + NanAssignPersistent(constructor_template, t); + + target->Set(NanNew("Database"), + t->GetFunction()); +} + +void Database::Process() { + NanScope(); + + if (!open && locked && !queue.empty()) { + EXCEPTION(NanNew("Database handle is closed"), SQLITE_MISUSE, exception); + Local argv[] = { exception }; + bool called = false; + + // Call all callbacks with the error object. + while (!queue.empty()) { + Call* call = queue.front(); + Local cb = NanNew(call->baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(NanObjectWrapHandle(this), cb, 1, argv); + called = true; + } + queue.pop(); + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } + + // When we couldn't call a callback function, emit an error on the + // Database object. + if (!called) { + Local args[] = { NanNew("error"), exception }; + EMIT_EVENT(NanObjectWrapHandle(this), 2, args); + } + return; + } + + while (open && (!locked || pending == 0) && !queue.empty()) { + Call* call = queue.front(); + + if (call->exclusive && pending > 0) { + break; + } + + queue.pop(); + locked = call->exclusive; + call->callback(call->baton); + delete call; + + if (locked) break; + } +} + +void Database::Schedule(Work_Callback callback, Baton* baton, bool exclusive) { + NanScope(); + if (!open && locked) { + EXCEPTION(NanNew("Database is closed"), SQLITE_MISUSE, exception); + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(NanObjectWrapHandle(this), cb, 1, argv); + } + else { + Local argv[] = { NanNew("error"), exception }; + EMIT_EVENT(NanObjectWrapHandle(this), 2, argv); + } + return; + } + + if (!open || ((locked || exclusive || serialize) && pending > 0)) { + queue.push(new Call(callback, baton, exclusive || serialize)); + } + else { + locked = exclusive; + callback(baton); + } +} + +NAN_METHOD(Database::New) { + NanScope(); + + if (!args.IsConstructCall()) { + return NanThrowTypeError("Use the new operator to create new Database objects"); + } + + REQUIRE_ARGUMENT_STRING(0, filename); + int pos = 1; + + int mode; + if (args.Length() >= pos && args[pos]->IsInt32()) { + mode = args[pos++]->Int32Value(); + } else { + mode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FULLMUTEX; + } + + Local callback; + if (args.Length() >= pos && args[pos]->IsFunction()) { + callback = Local::Cast(args[pos++]); + } + + Database* db = new Database(); + db->Wrap(args.This()); + + args.This()->Set(NanNew("filename"), args[0]->ToString(), ReadOnly); + args.This()->Set(NanNew("mode"), NanNew(mode), ReadOnly); + + // Start opening the database. + OpenBaton* baton = new OpenBaton(db, callback, *filename, mode); + Work_BeginOpen(baton); + + NanReturnValue(args.This()); +} + +void Database::Work_BeginOpen(Baton* baton) { + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Open, (uv_after_work_cb)Work_AfterOpen); + assert(status == 0); +} + +void Database::Work_Open(uv_work_t* req) { + OpenBaton* baton = static_cast(req->data); + Database* db = baton->db; + + baton->status = sqlite3_open_v2( + baton->filename.c_str(), + &db->_handle, + baton->mode, + NULL + ); + + if (baton->status != SQLITE_OK) { + baton->message = std::string(sqlite3_errmsg(db->_handle)); + sqlite3_close(db->_handle); + db->_handle = NULL; + } + else { + // Set default database handle values. + sqlite3_busy_timeout(db->_handle, 1000); + } +} + +void Database::Work_AfterOpen(uv_work_t* req) { + NanScope(); + OpenBaton* baton = static_cast(req->data); + Database* db = baton->db; + + Local argv[1]; + if (baton->status != SQLITE_OK) { + EXCEPTION(NanNew(baton->message.c_str()), baton->status, exception); + argv[0] = exception; + } + else { + db->open = true; + argv[0] = NanNew(NanNull()); + } + + Local cb = NanNew(baton->callback); + + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(NanObjectWrapHandle(db), cb, 1, argv); + } + else if (!db->open) { + Local args[] = { NanNew("error"), argv[0] }; + EMIT_EVENT(NanObjectWrapHandle(db), 2, args); + } + + if (db->open) { + Local args[] = { NanNew("open") }; + EMIT_EVENT(NanObjectWrapHandle(db), 1, args); + db->Process(); + } + + delete baton; +} + +NAN_GETTER(Database::OpenGetter) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + NanReturnValue(NanNew(db->open)); +} + +NAN_METHOD(Database::Close) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(db, callback); + db->Schedule(Work_BeginClose, baton, true); + + NanReturnValue(args.This()); +} + +void Database::Work_BeginClose(Baton* baton) { + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + + baton->db->RemoveCallbacks(); + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Close, (uv_after_work_cb)Work_AfterClose); + assert(status == 0); +} + +void Database::Work_Close(uv_work_t* req) { + Baton* baton = static_cast(req->data); + Database* db = baton->db; + + baton->status = sqlite3_close(db->_handle); + + if (baton->status != SQLITE_OK) { + baton->message = std::string(sqlite3_errmsg(db->_handle)); + } + else { + db->_handle = NULL; + } +} + +void Database::Work_AfterClose(uv_work_t* req) { + NanScope(); + Baton* baton = static_cast(req->data); + Database* db = baton->db; + + Local argv[1]; + if (baton->status != SQLITE_OK) { + EXCEPTION(NanNew(baton->message.c_str()), baton->status, exception); + argv[0] = exception; + } + else { + db->open = false; + // Leave db->locked to indicate that this db object has reached + // the end of its life. + argv[0] = NanNew(NanNull()); + } + + Local cb = NanNew(baton->callback); + + // Fire callbacks. + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(NanObjectWrapHandle(db), cb, 1, argv); + } + else if (db->open) { + Local args[] = { NanNew("error"), argv[0] }; + EMIT_EVENT(NanObjectWrapHandle(db), 2, args); + } + + if (!db->open) { + Local args[] = { NanNew("close"), argv[0] }; + EMIT_EVENT(NanObjectWrapHandle(db), 1, args); + db->Process(); + } + + delete baton; +} + +NAN_METHOD(Database::Serialize) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + bool before = db->serialize; + db->serialize = true; + + if (!callback.IsEmpty() && callback->IsFunction()) { + TRY_CATCH_CALL(args.This(), callback, 0, NULL); + db->serialize = before; + } + + db->Process(); + + NanReturnValue(args.This()); +} + +NAN_METHOD(Database::Parallelize) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + bool before = db->serialize; + db->serialize = false; + + if (!callback.IsEmpty() && callback->IsFunction()) { + TRY_CATCH_CALL(args.This(), callback, 0, NULL); + db->serialize = before; + } + + db->Process(); + + NanReturnValue(args.This()); +} + +NAN_METHOD(Database::Configure) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + + REQUIRE_ARGUMENTS(2); + + if (args[0]->Equals(NanNew("trace"))) { + Local handle; + Baton* baton = new Baton(db, handle); + db->Schedule(RegisterTraceCallback, baton); + } + else if (args[0]->Equals(NanNew("profile"))) { + Local handle; + Baton* baton = new Baton(db, handle); + db->Schedule(RegisterProfileCallback, baton); + } + else if (args[0]->Equals(NanNew("busyTimeout"))) { + if (!args[1]->IsInt32()) { + return NanThrowTypeError("Value must be an integer"); + } + Local handle; + Baton* baton = new Baton(db, handle); + baton->status = args[1]->Int32Value(); + db->Schedule(SetBusyTimeout, baton); + } + else { + return NanThrowError(Exception::Error(String::Concat( + args[0]->ToString(), + NanNew(" is not a valid configuration option") + ))); + } + + db->Process(); + + NanReturnValue(args.This()); +} + +void Database::SetBusyTimeout(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + + // Abuse the status field for passing the timeout. + sqlite3_busy_timeout(baton->db->_handle, baton->status); + + delete baton; +} + +void Database::RegisterTraceCallback(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + Database* db = baton->db; + + if (db->debug_trace == NULL) { + // Add it. + db->debug_trace = new AsyncTrace(db, TraceCallback); + sqlite3_trace(db->_handle, TraceCallback, db); + } + else { + // Remove it. + sqlite3_trace(db->_handle, NULL, NULL); + db->debug_trace->finish(); + db->debug_trace = NULL; + } + + delete baton; +} + +void Database::TraceCallback(void* db, const char* sql) { + // Note: This function is called in the thread pool. + // Note: Some queries, such as "EXPLAIN" queries, are not sent through this. + static_cast(db)->debug_trace->send(new std::string(sql)); +} + +void Database::TraceCallback(Database* db, std::string* sql) { + // Note: This function is called in the main V8 thread. + NanScope(); + Local argv[] = { + NanNew("trace"), + NanNew(sql->c_str()) + }; + EMIT_EVENT(NanObjectWrapHandle(db), 2, argv); + delete sql; +} + +void Database::RegisterProfileCallback(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + Database* db = baton->db; + + if (db->debug_profile == NULL) { + // Add it. + db->debug_profile = new AsyncProfile(db, ProfileCallback); + sqlite3_profile(db->_handle, ProfileCallback, db); + } + else { + // Remove it. + sqlite3_profile(db->_handle, NULL, NULL); + db->debug_profile->finish(); + db->debug_profile = NULL; + } + + delete baton; +} + +void Database::ProfileCallback(void* db, const char* sql, sqlite3_uint64 nsecs) { + // Note: This function is called in the thread pool. + // Note: Some queries, such as "EXPLAIN" queries, are not sent through this. + ProfileInfo* info = new ProfileInfo(); + info->sql = std::string(sql); + info->nsecs = nsecs; + static_cast(db)->debug_profile->send(info); +} + +void Database::ProfileCallback(Database *db, ProfileInfo* info) { + NanScope(); + Local argv[] = { + NanNew("profile"), + NanNew(info->sql.c_str()), + NanNew((double)info->nsecs / 1000000.0) + }; + EMIT_EVENT(NanObjectWrapHandle(db), 3, argv); + delete info; +} + +void Database::RegisterUpdateCallback(Baton* baton) { + assert(baton->db->open); + assert(baton->db->_handle); + Database* db = baton->db; + + if (db->update_event == NULL) { + // Add it. + db->update_event = new AsyncUpdate(db, UpdateCallback); + sqlite3_update_hook(db->_handle, UpdateCallback, db); + } + else { + // Remove it. + sqlite3_update_hook(db->_handle, NULL, NULL); + db->update_event->finish(); + db->update_event = NULL; + } + + delete baton; +} + +void Database::UpdateCallback(void* db, int type, const char* database, + const char* table, sqlite3_int64 rowid) { + // Note: This function is called in the thread pool. + // Note: Some queries, such as "EXPLAIN" queries, are not sent through this. + UpdateInfo* info = new UpdateInfo(); + info->type = type; + info->database = std::string(database); + info->table = std::string(table); + info->rowid = rowid; + static_cast(db)->update_event->send(info); +} + +void Database::UpdateCallback(Database *db, UpdateInfo* info) { + NanScope(); + + Local argv[] = { + NanNew(sqlite_authorizer_string(info->type)), + NanNew(info->database.c_str()), + NanNew(info->table.c_str()), + NanNew(info->rowid), + }; + EMIT_EVENT(NanObjectWrapHandle(db), 4, argv); + delete info; +} + +NAN_METHOD(Database::Exec) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + + REQUIRE_ARGUMENT_STRING(0, sql); + OPTIONAL_ARGUMENT_FUNCTION(1, callback); + + Baton* baton = new ExecBaton(db, callback, *sql); + db->Schedule(Work_BeginExec, baton, true); + + NanReturnValue(args.This()); +} + +void Database::Work_BeginExec(Baton* baton) { + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Exec, (uv_after_work_cb)Work_AfterExec); + assert(status == 0); +} + +void Database::Work_Exec(uv_work_t* req) { + ExecBaton* baton = static_cast(req->data); + + char* message = NULL; + baton->status = sqlite3_exec( + baton->db->_handle, + baton->sql.c_str(), + NULL, + NULL, + &message + ); + + if (baton->status != SQLITE_OK && message != NULL) { + baton->message = std::string(message); + sqlite3_free(message); + } +} + +void Database::Work_AfterExec(uv_work_t* req) { + NanScope(); + ExecBaton* baton = static_cast(req->data); + Database* db = baton->db; + + Local cb = NanNew(baton->callback); + + if (baton->status != SQLITE_OK) { + EXCEPTION(NanNew(baton->message.c_str()), baton->status, exception); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(NanObjectWrapHandle(db), cb, 1, argv); + } + else { + Local args[] = { NanNew("error"), exception }; + EMIT_EVENT(NanObjectWrapHandle(db), 2, args); + } + } + else if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(db), cb, 1, argv); + } + + db->Process(); + + delete baton; +} + +NAN_METHOD(Database::Wait) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(db, callback); + db->Schedule(Work_Wait, baton, true); + + NanReturnValue(args.This()); +} + +void Database::Work_Wait(Baton* baton) { + NanScope(); + + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(baton->db), cb, 1, argv); + } + + baton->db->Process(); + + delete baton; +} + +NAN_METHOD(Database::LoadExtension) { + NanScope(); + Database* db = ObjectWrap::Unwrap(args.This()); + + REQUIRE_ARGUMENT_STRING(0, filename); + OPTIONAL_ARGUMENT_FUNCTION(1, callback); + + Baton* baton = new LoadExtensionBaton(db, callback, *filename); + db->Schedule(Work_BeginLoadExtension, baton, true); + + NanReturnValue(args.This()); +} + +void Database::Work_BeginLoadExtension(Baton* baton) { + assert(baton->db->locked); + assert(baton->db->open); + assert(baton->db->_handle); + assert(baton->db->pending == 0); + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_LoadExtension, (uv_after_work_cb)Work_AfterLoadExtension); + assert(status == 0); +} + +void Database::Work_LoadExtension(uv_work_t* req) { + LoadExtensionBaton* baton = static_cast(req->data); + + sqlite3_enable_load_extension(baton->db->_handle, 1); + + char* message = NULL; + baton->status = sqlite3_load_extension( + baton->db->_handle, + baton->filename.c_str(), + 0, + &message + ); + + sqlite3_enable_load_extension(baton->db->_handle, 0); + + if (baton->status != SQLITE_OK && message != NULL) { + baton->message = std::string(message); + sqlite3_free(message); + } +} + +void Database::Work_AfterLoadExtension(uv_work_t* req) { + NanScope(); + LoadExtensionBaton* baton = static_cast(req->data); + Database* db = baton->db; + Local cb = NanNew(baton->callback); + + if (baton->status != SQLITE_OK) { + EXCEPTION(NanNew(baton->message.c_str()), baton->status, exception); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(NanObjectWrapHandle(db), cb, 1, argv); + } + else { + Local args[] = { NanNew("error"), exception }; + EMIT_EVENT(NanObjectWrapHandle(db), 2, args); + } + } + else if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(db), cb, 1, argv); + } + + db->Process(); + + delete baton; +} + +void Database::RemoveCallbacks() { + if (debug_trace) { + debug_trace->finish(); + debug_trace = NULL; + } + if (debug_profile) { + debug_profile->finish(); + debug_profile = NULL; + } +} diff --git a/node_modules/sqlite3/src/database.h b/node_modules/sqlite3/src/database.h new file mode 100644 index 0000000..af83ee7 --- /dev/null +++ b/node_modules/sqlite3/src/database.h @@ -0,0 +1,189 @@ + +#ifndef NODE_SQLITE3_SRC_DATABASE_H +#define NODE_SQLITE3_SRC_DATABASE_H + +#include + +#include +#include + +#include +#include "nan.h" +#include "async.h" + +using namespace v8; +using namespace node; + +namespace node_sqlite3 { + +class Database; + + +class Database : public ObjectWrap { +public: + static Persistent constructor_template; + static void Init(Handle target); + + static inline bool HasInstance(Handle val) { + NanScope(); + if (!val->IsObject()) return false; + Local obj = val->ToObject(); + return NanNew(constructor_template)->HasInstance(obj); + } + + struct Baton { + uv_work_t request; + Database* db; + Persistent callback; + int status; + std::string message; + + Baton(Database* db_, Handle cb_) : + db(db_), status(SQLITE_OK) { + db->Ref(); + request.data = this; + NanAssignPersistent(callback, cb_); + } + virtual ~Baton() { + db->Unref(); + NanDisposePersistent(callback); + } + }; + + struct OpenBaton : Baton { + std::string filename; + int mode; + OpenBaton(Database* db_, Handle cb_, const char* filename_, int mode_) : + Baton(db_, cb_), filename(filename_), mode(mode_) {} + }; + + struct ExecBaton : Baton { + std::string sql; + ExecBaton(Database* db_, Handle cb_, const char* sql_) : + Baton(db_, cb_), sql(sql_) {} + }; + + struct LoadExtensionBaton : Baton { + std::string filename; + LoadExtensionBaton(Database* db_, Handle cb_, const char* filename_) : + Baton(db_, cb_), filename(filename_) {} + }; + + typedef void (*Work_Callback)(Baton* baton); + + struct Call { + Call(Work_Callback cb_, Baton* baton_, bool exclusive_ = false) : + callback(cb_), exclusive(exclusive_), baton(baton_) {}; + Work_Callback callback; + bool exclusive; + Baton* baton; + }; + + struct ProfileInfo { + std::string sql; + sqlite3_int64 nsecs; + }; + + struct UpdateInfo { + int type; + std::string database; + std::string table; + sqlite3_int64 rowid; + }; + + bool IsOpen() { return open; } + bool IsLocked() { return locked; } + + typedef Async AsyncTrace; + typedef Async AsyncProfile; + typedef Async AsyncUpdate; + + friend class Statement; + +protected: + Database() : ObjectWrap(), + _handle(NULL), + open(false), + locked(false), + pending(0), + serialize(false), + debug_trace(NULL), + debug_profile(NULL), + update_event(NULL) { + } + + ~Database() { + RemoveCallbacks(); + sqlite3_close(_handle); + _handle = NULL; + open = false; + } + + static NAN_METHOD(New); + static void Work_BeginOpen(Baton* baton); + static void Work_Open(uv_work_t* req); + static void Work_AfterOpen(uv_work_t* req); + + static NAN_GETTER(OpenGetter); + + void Schedule(Work_Callback callback, Baton* baton, bool exclusive = false); + void Process(); + + static NAN_METHOD(Exec); + static void Work_BeginExec(Baton* baton); + static void Work_Exec(uv_work_t* req); + static void Work_AfterExec(uv_work_t* req); + + static NAN_METHOD(Wait); + static void Work_Wait(Baton* baton); + + static NAN_METHOD(Close); + static void Work_BeginClose(Baton* baton); + static void Work_Close(uv_work_t* req); + static void Work_AfterClose(uv_work_t* req); + + static NAN_METHOD(LoadExtension); + static void Work_BeginLoadExtension(Baton* baton); + static void Work_LoadExtension(uv_work_t* req); + static void Work_AfterLoadExtension(uv_work_t* req); + + static NAN_METHOD(Serialize); + static NAN_METHOD(Parallelize); + + static NAN_METHOD(Configure); + + static void SetBusyTimeout(Baton* baton); + + static void RegisterTraceCallback(Baton* baton); + static void TraceCallback(void* db, const char* sql); + static void TraceCallback(Database* db, std::string* sql); + + static void RegisterProfileCallback(Baton* baton); + static void ProfileCallback(void* db, const char* sql, sqlite3_uint64 nsecs); + static void ProfileCallback(Database* db, ProfileInfo* info); + + static void RegisterUpdateCallback(Baton* baton); + static void UpdateCallback(void* db, int type, const char* database, const char* table, sqlite3_int64 rowid); + static void UpdateCallback(Database* db, UpdateInfo* info); + + void RemoveCallbacks(); + +protected: + sqlite3* _handle; + + bool open; + bool locked; + unsigned int pending; + + bool serialize; + + std::queue queue; + + AsyncTrace* debug_trace; + AsyncProfile* debug_profile; + AsyncUpdate* update_event; +}; + +} + +#endif diff --git a/node_modules/sqlite3/src/gcc-preinclude.h b/node_modules/sqlite3/src/gcc-preinclude.h new file mode 100644 index 0000000..c515fa6 --- /dev/null +++ b/node_modules/sqlite3/src/gcc-preinclude.h @@ -0,0 +1,4 @@ + +// https://rjpower9000.wordpress.com/2012/04/09/fun-with-shared-libraries-version-glibc_2-14-not-found/ + +__asm__(".symver memcpy,memcpy@GLIBC_2.2.5"); diff --git a/node_modules/sqlite3/src/macros.h b/node_modules/sqlite3/src/macros.h new file mode 100644 index 0000000..c98a86b --- /dev/null +++ b/node_modules/sqlite3/src/macros.h @@ -0,0 +1,150 @@ +#ifndef NODE_SQLITE3_SRC_MACROS_H +#define NODE_SQLITE3_SRC_MACROS_H + +const char* sqlite_code_string(int code); +const char* sqlite_authorizer_string(int type); + + +#define REQUIRE_ARGUMENTS(n) \ + if (args.Length() < (n)) { \ + return NanThrowTypeError("Expected " #n "arguments"); \ + } + + +#define REQUIRE_ARGUMENT_EXTERNAL(i, var) \ + if (args.Length() <= (i) || !args[i]->IsExternal()) { \ + return NanThrowTypeError("Argument " #i " invalid"); \ + } \ + Local var = Local::Cast(args[i]); + + +#define REQUIRE_ARGUMENT_FUNCTION(i, var) \ + if (args.Length() <= (i) || !args[i]->IsFunction()) { \ + return NanThrowTypeError("Argument " #i " must be a function"); \ + } \ + Local var = Local::Cast(args[i]); + + +#define REQUIRE_ARGUMENT_STRING(i, var) \ + if (args.Length() <= (i) || !args[i]->IsString()) { \ + return NanThrowTypeError("Argument " #i " must be a string"); \ + } \ + String::Utf8Value var(args[i]->ToString()); + + +#define OPTIONAL_ARGUMENT_FUNCTION(i, var) \ + Local var; \ + if (args.Length() > i && !args[i]->IsUndefined()) { \ + if (!args[i]->IsFunction()) { \ + return NanThrowTypeError("Argument " #i " must be a function"); \ + } \ + var = Local::Cast(args[i]); \ + } + + +#define OPTIONAL_ARGUMENT_INTEGER(i, var, default) \ + int var; \ + if (args.Length() <= (i)) { \ + var = (default); \ + } \ + else if (args[i]->IsInt32()) { \ + var = args[i]->Int32Value(); \ + } \ + else { \ + return NanThrowTypeError("Argument " #i " must be an integer"); \ + } + + +#define DEFINE_CONSTANT_INTEGER(target, constant, name) \ + (target)->Set( \ + NanNew(#name), \ + NanNew(constant), \ + static_cast(ReadOnly | DontDelete) \ + ); + +#define DEFINE_CONSTANT_STRING(target, constant, name) \ + (target)->Set( \ + NanNew(#name), \ + NanNew(constant), \ + static_cast(ReadOnly | DontDelete) \ + ); + + +#define NODE_SET_GETTER(target, name, function) \ + (target)->InstanceTemplate() \ + ->SetAccessor(NanNew(name), (function)); + +#define GET_STRING(source, name, property) \ + String::Utf8Value name((source)->Get(NanNew(property))); + +#define GET_INTEGER(source, name, property) \ + int name = (source)->Get(NanNew(property))->Int32Value(); + +#define EXCEPTION(msg, errno, name) \ + Local name = Exception::Error( \ + String::Concat( \ + String::Concat( \ + NanNew(sqlite_code_string(errno)), \ + NanNew(": ") \ + ), \ + (msg) \ + ) \ + ); \ + Local name ##_obj = name->ToObject(); \ + name ##_obj->Set(NanNew("errno"), NanNew(errno)); \ + name ##_obj->Set(NanNew("code"), \ + NanNew(sqlite_code_string(errno))); + + +#define EMIT_EVENT(obj, argc, argv) \ + TRY_CATCH_CALL((obj), \ + Local::Cast((obj)->Get(NanNew("emit"))), \ + argc, argv \ + ); + +#define TRY_CATCH_CALL(context, callback, argc, argv) \ + NanMakeCallback((context), (callback), (argc), (argv)) + +#define WORK_DEFINITION(name) \ + static NAN_METHOD(name); \ + static void Work_Begin##name(Baton* baton); \ + static void Work_##name(uv_work_t* req); \ + static void Work_After##name(uv_work_t* req); + +#define STATEMENT_BEGIN(type) \ + assert(baton); \ + assert(baton->stmt); \ + assert(!baton->stmt->locked); \ + assert(!baton->stmt->finalized); \ + assert(baton->stmt->prepared); \ + baton->stmt->locked = true; \ + baton->stmt->db->pending++; \ + int status = uv_queue_work(uv_default_loop(), \ + &baton->request, Work_##type, (uv_after_work_cb)Work_After##type); \ + assert(status == 0); + +#define STATEMENT_INIT(type) \ + type* baton = static_cast(req->data); \ + Statement* stmt = baton->stmt; + +#define STATEMENT_END() \ + assert(stmt->locked); \ + assert(stmt->db->pending); \ + stmt->locked = false; \ + stmt->db->pending--; \ + stmt->Process(); \ + stmt->db->Process(); \ + delete baton; + +#define DELETE_FIELD(field) \ + if (field != NULL) { \ + switch ((field)->type) { \ + case SQLITE_INTEGER: delete (Values::Integer*)(field); break; \ + case SQLITE_FLOAT: delete (Values::Float*)(field); break; \ + case SQLITE_TEXT: delete (Values::Text*)(field); break; \ + case SQLITE_BLOB: delete (Values::Blob*)(field); break; \ + case SQLITE_NULL: delete (Values::Null*)(field); break; \ + } \ + } + +#endif diff --git a/node_modules/sqlite3/src/node_sqlite3.cc b/node_modules/sqlite3/src/node_sqlite3.cc new file mode 100644 index 0000000..42fbabb --- /dev/null +++ b/node_modules/sqlite3/src/node_sqlite3.cc @@ -0,0 +1,107 @@ +#include +#include + +#include +#include +#include +#include +#include + +#include "macros.h" +#include "database.h" +#include "statement.h" + +using namespace node_sqlite3; + +namespace { + +void RegisterModule(v8::Handle target) { + NanScope(); + Database::Init(target); + Statement::Init(target); + + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_READONLY, OPEN_READONLY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_READWRITE, OPEN_READWRITE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_OPEN_CREATE, OPEN_CREATE); + DEFINE_CONSTANT_STRING(target, SQLITE_VERSION, VERSION); +#ifdef SQLITE_SOURCE_ID + DEFINE_CONSTANT_STRING(target, SQLITE_SOURCE_ID, SOURCE_ID); +#endif + DEFINE_CONSTANT_INTEGER(target, SQLITE_VERSION_NUMBER, VERSION_NUMBER); + + DEFINE_CONSTANT_INTEGER(target, SQLITE_OK, OK); + DEFINE_CONSTANT_INTEGER(target, SQLITE_ERROR, ERROR); + DEFINE_CONSTANT_INTEGER(target, SQLITE_INTERNAL, INTERNAL); + DEFINE_CONSTANT_INTEGER(target, SQLITE_PERM, PERM); + DEFINE_CONSTANT_INTEGER(target, SQLITE_ABORT, ABORT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_BUSY, BUSY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_LOCKED, LOCKED); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOMEM, NOMEM); + DEFINE_CONSTANT_INTEGER(target, SQLITE_READONLY, READONLY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_INTERRUPT, INTERRUPT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_IOERR, IOERR); + DEFINE_CONSTANT_INTEGER(target, SQLITE_CORRUPT, CORRUPT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOTFOUND, NOTFOUND); + DEFINE_CONSTANT_INTEGER(target, SQLITE_FULL, FULL); + DEFINE_CONSTANT_INTEGER(target, SQLITE_CANTOPEN, CANTOPEN); + DEFINE_CONSTANT_INTEGER(target, SQLITE_PROTOCOL, PROTOCOL); + DEFINE_CONSTANT_INTEGER(target, SQLITE_EMPTY, EMPTY); + DEFINE_CONSTANT_INTEGER(target, SQLITE_SCHEMA, SCHEMA); + DEFINE_CONSTANT_INTEGER(target, SQLITE_TOOBIG, TOOBIG); + DEFINE_CONSTANT_INTEGER(target, SQLITE_CONSTRAINT, CONSTRAINT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_MISMATCH, MISMATCH); + DEFINE_CONSTANT_INTEGER(target, SQLITE_MISUSE, MISUSE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOLFS, NOLFS); + DEFINE_CONSTANT_INTEGER(target, SQLITE_AUTH, AUTH); + DEFINE_CONSTANT_INTEGER(target, SQLITE_FORMAT, FORMAT); + DEFINE_CONSTANT_INTEGER(target, SQLITE_RANGE, RANGE); + DEFINE_CONSTANT_INTEGER(target, SQLITE_NOTADB, NOTADB); +} + +} + +const char* sqlite_code_string(int code) { + switch (code) { + case SQLITE_OK: return "SQLITE_OK"; + case SQLITE_ERROR: return "SQLITE_ERROR"; + case SQLITE_INTERNAL: return "SQLITE_INTERNAL"; + case SQLITE_PERM: return "SQLITE_PERM"; + case SQLITE_ABORT: return "SQLITE_ABORT"; + case SQLITE_BUSY: return "SQLITE_BUSY"; + case SQLITE_LOCKED: return "SQLITE_LOCKED"; + case SQLITE_NOMEM: return "SQLITE_NOMEM"; + case SQLITE_READONLY: return "SQLITE_READONLY"; + case SQLITE_INTERRUPT: return "SQLITE_INTERRUPT"; + case SQLITE_IOERR: return "SQLITE_IOERR"; + case SQLITE_CORRUPT: return "SQLITE_CORRUPT"; + case SQLITE_NOTFOUND: return "SQLITE_NOTFOUND"; + case SQLITE_FULL: return "SQLITE_FULL"; + case SQLITE_CANTOPEN: return "SQLITE_CANTOPEN"; + case SQLITE_PROTOCOL: return "SQLITE_PROTOCOL"; + case SQLITE_EMPTY: return "SQLITE_EMPTY"; + case SQLITE_SCHEMA: return "SQLITE_SCHEMA"; + case SQLITE_TOOBIG: return "SQLITE_TOOBIG"; + case SQLITE_CONSTRAINT: return "SQLITE_CONSTRAINT"; + case SQLITE_MISMATCH: return "SQLITE_MISMATCH"; + case SQLITE_MISUSE: return "SQLITE_MISUSE"; + case SQLITE_NOLFS: return "SQLITE_NOLFS"; + case SQLITE_AUTH: return "SQLITE_AUTH"; + case SQLITE_FORMAT: return "SQLITE_FORMAT"; + case SQLITE_RANGE: return "SQLITE_RANGE"; + case SQLITE_NOTADB: return "SQLITE_NOTADB"; + case SQLITE_ROW: return "SQLITE_ROW"; + case SQLITE_DONE: return "SQLITE_DONE"; + default: return "UNKNOWN"; + } +} + +const char* sqlite_authorizer_string(int type) { + switch (type) { + case SQLITE_INSERT: return "insert"; + case SQLITE_UPDATE: return "update"; + case SQLITE_DELETE: return "delete"; + default: return ""; + } +} + +NODE_MODULE(node_sqlite3, RegisterModule) diff --git a/node_modules/sqlite3/src/statement.cc b/node_modules/sqlite3/src/statement.cc new file mode 100644 index 0000000..e60d96d --- /dev/null +++ b/node_modules/sqlite3/src/statement.cc @@ -0,0 +1,900 @@ +#include +#include +#include +#include + +#include "macros.h" +#include "database.h" +#include "statement.h" + +using namespace node_sqlite3; + +Persistent Statement::constructor_template; + +void Statement::Init(Handle target) { + NanScope(); + + Local t = NanNew(New); + + t->InstanceTemplate()->SetInternalFieldCount(1); + t->SetClassName(NanNew("Statement")); + + NODE_SET_PROTOTYPE_METHOD(t, "bind", Bind); + NODE_SET_PROTOTYPE_METHOD(t, "get", Get); + NODE_SET_PROTOTYPE_METHOD(t, "run", Run); + NODE_SET_PROTOTYPE_METHOD(t, "all", All); + NODE_SET_PROTOTYPE_METHOD(t, "each", Each); + NODE_SET_PROTOTYPE_METHOD(t, "reset", Reset); + NODE_SET_PROTOTYPE_METHOD(t, "finalize", Finalize); + + NanAssignPersistent(constructor_template, t); + target->Set(NanNew("Statement"), + t->GetFunction()); +} + +void Statement::Process() { + if (finalized && !queue.empty()) { + return CleanQueue(); + } + + while (prepared && !locked && !queue.empty()) { + Call* call = queue.front(); + queue.pop(); + + call->callback(call->baton); + delete call; + } +} + +void Statement::Schedule(Work_Callback callback, Baton* baton) { + if (finalized) { + queue.push(new Call(callback, baton)); + CleanQueue(); + } + else if (!prepared || locked) { + queue.push(new Call(callback, baton)); + } + else { + callback(baton); + } +} + +template void Statement::Error(T* baton) { + NanScope(); + + Statement* stmt = baton->stmt; + // Fail hard on logic errors. + assert(stmt->status != 0); + EXCEPTION(NanNew(stmt->message.c_str()), stmt->status, exception); + + Local cb = NanNew(baton->callback); + + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { exception }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 1, argv); + } + else { + Local argv[] = { NanNew("error"), exception }; + EMIT_EVENT(NanObjectWrapHandle(stmt), 2, argv); + } +} + +// { Database db, String sql, Array params, Function callback } +NAN_METHOD(Statement::New) { + NanScope(); + + if (!args.IsConstructCall()) { + return NanThrowTypeError("Use the new operator to create new Statement objects"); + } + + int length = args.Length(); + + if (length <= 0 || !Database::HasInstance(args[0])) { + return NanThrowTypeError("Database object expected"); + } + else if (length <= 1 || !args[1]->IsString()) { + return NanThrowTypeError("SQL query expected"); + } + else if (length > 2 && !args[2]->IsUndefined() && !args[2]->IsFunction()) { + return NanThrowTypeError("Callback expected"); + } + + Database* db = ObjectWrap::Unwrap(args[0]->ToObject()); + Local sql = Local::Cast(args[1]); + + args.This()->Set(NanNew("sql"), sql, ReadOnly); + + Statement* stmt = new Statement(db); + stmt->Wrap(args.This()); + + PrepareBaton* baton = new PrepareBaton(db, Local::Cast(args[2]), stmt); + baton->sql = std::string(*String::Utf8Value(sql)); + db->Schedule(Work_BeginPrepare, baton); + + NanReturnValue(args.This()); +} + +void Statement::Work_BeginPrepare(Database::Baton* baton) { + assert(baton->db->open); + baton->db->pending++; + int status = uv_queue_work(uv_default_loop(), + &baton->request, Work_Prepare, (uv_after_work_cb)Work_AfterPrepare); + assert(status == 0); +} + +void Statement::Work_Prepare(uv_work_t* req) { + STATEMENT_INIT(PrepareBaton); + + // In case preparing fails, we use a mutex to make sure we get the associated + // error message. + sqlite3_mutex* mtx = sqlite3_db_mutex(baton->db->_handle); + sqlite3_mutex_enter(mtx); + + stmt->status = sqlite3_prepare_v2( + baton->db->_handle, + baton->sql.c_str(), + baton->sql.size(), + &stmt->_handle, + NULL + ); + + if (stmt->status != SQLITE_OK) { + stmt->message = std::string(sqlite3_errmsg(baton->db->_handle)); + stmt->_handle = NULL; + } + + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterPrepare(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(PrepareBaton); + + if (stmt->status != SQLITE_OK) { + Error(baton); + stmt->Finalize(); + } + else { + stmt->prepared = true; + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 1, argv); + } + } + + STATEMENT_END(); +} + +template Values::Field* + Statement::BindParameter(const Handle source, T pos) { + if (source->IsString() || source->IsRegExp()) { + String::Utf8Value val(source->ToString()); + return new Values::Text(pos, val.length(), *val); + } + else if (source->IsInt32()) { + return new Values::Integer(pos, source->Int32Value()); + } + else if (source->IsNumber()) { + return new Values::Float(pos, source->NumberValue()); + } + else if (source->IsBoolean()) { + return new Values::Integer(pos, source->BooleanValue() ? 1 : 0); + } + else if (source->IsNull()) { + return new Values::Null(pos); + } + else if (Buffer::HasInstance(source)) { + Local buffer = source->ToObject(); + return new Values::Blob(pos, Buffer::Length(buffer), Buffer::Data(buffer)); + } + else if (source->IsDate()) { + return new Values::Float(pos, source->NumberValue()); + } + else { + return NULL; + } +} + +template T* Statement::Bind(_NAN_METHOD_ARGS, int start, int last) { + NanScope(); + + if (last < 0) last = args.Length(); + Local callback; + if (last > start && args[last - 1]->IsFunction()) { + callback = Local::Cast(args[last - 1]); + last--; + } + + T* baton = new T(this, callback); + + if (start < last) { + if (args[start]->IsArray()) { + Local array = Local::Cast(args[start]); + int length = array->Length(); + // Note: bind parameters start with 1. + for (int i = 0, pos = 1; i < length; i++, pos++) { + baton->parameters.push_back(BindParameter(array->Get(i), pos)); + } + } + else if (!args[start]->IsObject() || args[start]->IsRegExp() || args[start]->IsDate() || Buffer::HasInstance(args[start])) { + // Parameters directly in array. + // Note: bind parameters start with 1. + for (int i = start, pos = 1; i < last; i++, pos++) { + baton->parameters.push_back(BindParameter(args[i], pos)); + } + } + else if (args[start]->IsObject()) { + Local object = Local::Cast(args[start]); + Local array = object->GetPropertyNames(); + int length = array->Length(); + for (int i = 0; i < length; i++) { + Local name = array->Get(i); + + if (name->IsInt32()) { + baton->parameters.push_back( + BindParameter(object->Get(name), name->Int32Value())); + } + else { + baton->parameters.push_back(BindParameter(object->Get(name), + *String::Utf8Value(Local::Cast(name)))); + } + } + } + else { + return NULL; + } + } + + return baton; +} + +bool Statement::Bind(const Parameters & parameters) { + if (parameters.size() == 0) { + return true; + } + + sqlite3_reset(_handle); + sqlite3_clear_bindings(_handle); + + Parameters::const_iterator it = parameters.begin(); + Parameters::const_iterator end = parameters.end(); + + for (; it < end; ++it) { + Values::Field* field = *it; + + if (field != NULL) { + int pos; + if (field->index > 0) { + pos = field->index; + } + else { + pos = sqlite3_bind_parameter_index(_handle, field->name.c_str()); + } + + switch (field->type) { + case SQLITE_INTEGER: { + status = sqlite3_bind_int(_handle, pos, + ((Values::Integer*)field)->value); + } break; + case SQLITE_FLOAT: { + status = sqlite3_bind_double(_handle, pos, + ((Values::Float*)field)->value); + } break; + case SQLITE_TEXT: { + status = sqlite3_bind_text(_handle, pos, + ((Values::Text*)field)->value.c_str(), + ((Values::Text*)field)->value.size(), SQLITE_TRANSIENT); + } break; + case SQLITE_BLOB: { + status = sqlite3_bind_blob(_handle, pos, + ((Values::Blob*)field)->value, + ((Values::Blob*)field)->length, SQLITE_TRANSIENT); + } break; + case SQLITE_NULL: { + status = sqlite3_bind_null(_handle, pos); + } break; + } + } + + if (status != SQLITE_OK) { + message = std::string(sqlite3_errmsg(db->_handle)); + return false; + } + } + + return true; +} + +NAN_METHOD(Statement::Bind) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + + Baton* baton = stmt->Bind(args); + if (baton == NULL) { + return NanThrowTypeError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginBind, baton); + NanReturnValue(args.This()); + } +} + +void Statement::Work_BeginBind(Baton* baton) { + STATEMENT_BEGIN(Bind); +} + +void Statement::Work_Bind(uv_work_t* req) { + STATEMENT_INIT(Baton); + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + stmt->Bind(baton->parameters); + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterBind(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(Baton); + + if (stmt->status != SQLITE_OK) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 1, argv); + } + } + + STATEMENT_END(); +} + + + +NAN_METHOD(Statement::Get) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + + Baton* baton = stmt->Bind(args); + if (baton == NULL) { + return NanThrowError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginGet, baton); + NanReturnValue(args.This()); + } +} + +void Statement::Work_BeginGet(Baton* baton) { + STATEMENT_BEGIN(Get); +} + +void Statement::Work_Get(uv_work_t* req) { + STATEMENT_INIT(RowBaton); + + if (stmt->status != SQLITE_DONE || baton->parameters.size()) { + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + + if (stmt->Bind(baton->parameters)) { + stmt->status = sqlite3_step(stmt->_handle); + + if (!(stmt->status == SQLITE_ROW || stmt->status == SQLITE_DONE)) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + } + + sqlite3_mutex_leave(mtx); + + if (stmt->status == SQLITE_ROW) { + // Acquire one result row before returning. + GetRow(&baton->row, stmt->_handle); + } + } +} + +void Statement::Work_AfterGet(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(RowBaton); + + if (stmt->status != SQLITE_ROW && stmt->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + if (stmt->status == SQLITE_ROW) { + // Create the result array from the data we acquired. + Local argv[] = { NanNew(NanNull()), RowToJS(&baton->row) }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 2, argv); + } + else { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 1, argv); + } + } + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::Run) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + + Baton* baton = stmt->Bind(args); + if (baton == NULL) { + return NanThrowError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginRun, baton); + NanReturnValue(args.This()); + } +} + +void Statement::Work_BeginRun(Baton* baton) { + STATEMENT_BEGIN(Run); +} + +void Statement::Work_Run(uv_work_t* req) { + STATEMENT_INIT(RunBaton); + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + + // Make sure that we also reset when there are no parameters. + if (!baton->parameters.size()) { + sqlite3_reset(stmt->_handle); + } + + if (stmt->Bind(baton->parameters)) { + stmt->status = sqlite3_step(stmt->_handle); + + if (!(stmt->status == SQLITE_ROW || stmt->status == SQLITE_DONE)) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + else { + baton->inserted_id = sqlite3_last_insert_rowid(stmt->db->_handle); + baton->changes = sqlite3_changes(stmt->db->_handle); + } + } + + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterRun(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(RunBaton); + + if (stmt->status != SQLITE_ROW && stmt->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + NanObjectWrapHandle(stmt)->Set(NanNew("lastID"), NanNew(baton->inserted_id)); + NanObjectWrapHandle(stmt)->Set(NanNew("changes"), NanNew(baton->changes)); + + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 1, argv); + } + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::All) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + + Baton* baton = stmt->Bind(args); + if (baton == NULL) { + return NanThrowError("Data type is not supported"); + } + else { + stmt->Schedule(Work_BeginAll, baton); + NanReturnValue(args.This()); + } +} + +void Statement::Work_BeginAll(Baton* baton) { + STATEMENT_BEGIN(All); +} + +void Statement::Work_All(uv_work_t* req) { + STATEMENT_INIT(RowsBaton); + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + sqlite3_mutex_enter(mtx); + + // Make sure that we also reset when there are no parameters. + if (!baton->parameters.size()) { + sqlite3_reset(stmt->_handle); + } + + if (stmt->Bind(baton->parameters)) { + while ((stmt->status = sqlite3_step(stmt->_handle)) == SQLITE_ROW) { + Row* row = new Row(); + GetRow(row, stmt->_handle); + baton->rows.push_back(row); + } + + if (stmt->status != SQLITE_DONE) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + } + + sqlite3_mutex_leave(mtx); +} + +void Statement::Work_AfterAll(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(RowsBaton); + + if (stmt->status != SQLITE_DONE) { + Error(baton); + } + else { + // Fire callbacks. + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + if (baton->rows.size()) { + // Create the result array from the data we acquired. + Local result(NanNew(baton->rows.size())); + Rows::const_iterator it = baton->rows.begin(); + Rows::const_iterator end = baton->rows.end(); + for (int i = 0; it < end; ++it, i++) { + result->Set(i, RowToJS(*it)); + delete *it; + } + + Local argv[] = { NanNew(NanNull()), result }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 2, argv); + } + else { + // There were no result rows. + Local argv[] = { + NanNew(NanNull()), + NanNew(0) + }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 2, argv); + } + } + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::Each) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + + int last = args.Length(); + + Local completed; + if (last >= 2 && args[last - 1]->IsFunction() && args[last - 2]->IsFunction()) { + completed = Local::Cast(args[--last]); + } + + EachBaton* baton = stmt->Bind(args, 0, last); + if (baton == NULL) { + return NanThrowError("Data type is not supported"); + } + else { + NanAssignPersistent(baton->completed, completed); + stmt->Schedule(Work_BeginEach, baton); + NanReturnValue(args.This()); + } +} + +void Statement::Work_BeginEach(Baton* baton) { + // Only create the Async object when we're actually going into + // the event loop. This prevents dangling events. + EachBaton* each_baton = static_cast(baton); + each_baton->async = new Async(each_baton->stmt, reinterpret_cast(AsyncEach)); + NanAssignPersistent(each_baton->async->item_cb, each_baton->callback); + NanAssignPersistent(each_baton->async->completed_cb, each_baton->completed); + + STATEMENT_BEGIN(Each); +} + +void Statement::Work_Each(uv_work_t* req) { + STATEMENT_INIT(EachBaton); + + Async* async = baton->async; + + sqlite3_mutex* mtx = sqlite3_db_mutex(stmt->db->_handle); + + int retrieved = 0; + + // Make sure that we also reset when there are no parameters. + if (!baton->parameters.size()) { + sqlite3_reset(stmt->_handle); + } + + if (stmt->Bind(baton->parameters)) { + while (true) { + sqlite3_mutex_enter(mtx); + stmt->status = sqlite3_step(stmt->_handle); + if (stmt->status == SQLITE_ROW) { + sqlite3_mutex_leave(mtx); + Row* row = new Row(); + GetRow(row, stmt->_handle); + NODE_SQLITE3_MUTEX_LOCK(&async->mutex) + async->data.push_back(row); + retrieved++; + NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex) + + uv_async_send(&async->watcher); + } + else { + if (stmt->status != SQLITE_DONE) { + stmt->message = std::string(sqlite3_errmsg(stmt->db->_handle)); + } + sqlite3_mutex_leave(mtx); + break; + } + } + } + + async->completed = true; + uv_async_send(&async->watcher); +} + +void Statement::CloseCallback(uv_handle_t* handle) { + assert(handle != NULL); + assert(handle->data != NULL); + Async* async = static_cast(handle->data); + delete async; +} + +void Statement::AsyncEach(uv_async_t* handle, int status) { + NanScope(); + Async* async = static_cast(handle->data); + + while (true) { + // Get the contents out of the data cache for us to process in the JS callback. + Rows rows; + NODE_SQLITE3_MUTEX_LOCK(&async->mutex) + rows.swap(async->data); + NODE_SQLITE3_MUTEX_UNLOCK(&async->mutex) + + if (rows.empty()) { + break; + } + + Local cb = NanNew(async->item_cb); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[2]; + argv[0] = NanNew(NanNull()); + + Rows::const_iterator it = rows.begin(); + Rows::const_iterator end = rows.end(); + for (int i = 0; it < end; ++it, i++) { + argv[1] = RowToJS(*it); + async->retrieved++; + TRY_CATCH_CALL(NanObjectWrapHandle(async->stmt), cb, 2, argv); + delete *it; + } + } + } + + Local cb = NanNew(async->completed_cb); + if (async->completed) { + if (!cb.IsEmpty() && + cb->IsFunction()) { + Local argv[] = { + NanNew(NanNull()), + NanNew(async->retrieved) + }; + TRY_CATCH_CALL(NanObjectWrapHandle(async->stmt), cb, 2, argv); + } + uv_close((uv_handle_t*)handle, CloseCallback); + } +} + +void Statement::Work_AfterEach(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(EachBaton); + + if (stmt->status != SQLITE_DONE) { + Error(baton); + } + + STATEMENT_END(); +} + +NAN_METHOD(Statement::Reset) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(stmt, callback); + stmt->Schedule(Work_BeginReset, baton); + + NanReturnValue(args.This()); +} + +void Statement::Work_BeginReset(Baton* baton) { + STATEMENT_BEGIN(Reset); +} + +void Statement::Work_Reset(uv_work_t* req) { + STATEMENT_INIT(Baton); + + sqlite3_reset(stmt->_handle); + stmt->status = SQLITE_OK; +} + +void Statement::Work_AfterReset(uv_work_t* req) { + NanScope(); + STATEMENT_INIT(Baton); + + // Fire callbacks. + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + Local argv[] = { NanNew(NanNull()) }; + TRY_CATCH_CALL(NanObjectWrapHandle(stmt), cb, 1, argv); + } + + STATEMENT_END(); +} + +Local Statement::RowToJS(Row* row) { + NanEscapableScope(); + + Local result(NanNew()); + + Row::const_iterator it = row->begin(); + Row::const_iterator end = row->end(); + for (int i = 0; it < end; ++it, i++) { + Values::Field* field = *it; + + Local value; + + switch (field->type) { + case SQLITE_INTEGER: { + value = NanNew(((Values::Integer*)field)->value); + } break; + case SQLITE_FLOAT: { + value = NanNew(((Values::Float*)field)->value); + } break; + case SQLITE_TEXT: { + value = NanNew(((Values::Text*)field)->value.c_str(), ((Values::Text*)field)->value.size()); + } break; + case SQLITE_BLOB: { + value = NanNew(NanNewBufferHandle(((Values::Blob*)field)->value, ((Values::Blob*)field)->length)); + } break; + case SQLITE_NULL: { + value = NanNew(NanNull()); + } break; + } + + result->Set(NanNew(field->name.c_str()), value); + + DELETE_FIELD(field); + } + + return NanEscapeScope(result); +} + +void Statement::GetRow(Row* row, sqlite3_stmt* stmt) { + int rows = sqlite3_column_count(stmt); + + for (int i = 0; i < rows; i++) { + int type = sqlite3_column_type(stmt, i); + const char* name = sqlite3_column_name(stmt, i); + switch (type) { + case SQLITE_INTEGER: { + row->push_back(new Values::Integer(name, sqlite3_column_int64(stmt, i))); + } break; + case SQLITE_FLOAT: { + row->push_back(new Values::Float(name, sqlite3_column_double(stmt, i))); + } break; + case SQLITE_TEXT: { + const char* text = (const char*)sqlite3_column_text(stmt, i); + int length = sqlite3_column_bytes(stmt, i); + row->push_back(new Values::Text(name, length, text)); + } break; + case SQLITE_BLOB: { + const void* blob = sqlite3_column_blob(stmt, i); + int length = sqlite3_column_bytes(stmt, i); + row->push_back(new Values::Blob(name, length, blob)); + } break; + case SQLITE_NULL: { + row->push_back(new Values::Null(name)); + } break; + default: + assert(false); + } + } +} + +NAN_METHOD(Statement::Finalize) { + NanScope(); + Statement* stmt = ObjectWrap::Unwrap(args.This()); + OPTIONAL_ARGUMENT_FUNCTION(0, callback); + + Baton* baton = new Baton(stmt, callback); + stmt->Schedule(Finalize, baton); + + NanReturnValue(NanObjectWrapHandle(stmt->db)); +} + +void Statement::Finalize(Baton* baton) { + NanScope(); + baton->stmt->Finalize(); + + // Fire callback in case there was one. + Local cb = NanNew(baton->callback); + if (!cb.IsEmpty() && cb->IsFunction()) { + TRY_CATCH_CALL(NanObjectWrapHandle(baton->stmt), cb, 0, NULL); + } + + delete baton; +} + +void Statement::Finalize() { + assert(!finalized); + finalized = true; + CleanQueue(); + // Finalize returns the status code of the last operation. We already fired + // error events in case those failed. + sqlite3_finalize(_handle); + _handle = NULL; + db->Unref(); +} + +void Statement::CleanQueue() { + NanScope(); + if (prepared && !queue.empty()) { + // This statement has already been prepared and is now finalized. + // Fire error for all remaining items in the queue. + EXCEPTION(NanNew("Statement is already finalized"), SQLITE_MISUSE, exception); + Local argv[] = { exception }; + bool called = false; + + // Clear out the queue so that this object can get GC'ed. + while (!queue.empty()) { + Call* call = queue.front(); + queue.pop(); + + Local cb = NanNew(call->baton->callback); + + if (prepared && !cb.IsEmpty() && + cb->IsFunction()) { + TRY_CATCH_CALL(NanObjectWrapHandle(this), cb, 1, argv); + called = true; + } + + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } + + // When we couldn't call a callback function, emit an error on the + // Statement object. + if (!called) { + Local args[] = { NanNew("error"), exception }; + EMIT_EVENT(NanObjectWrapHandle(this), 2, args); + } + } + else while (!queue.empty()) { + // Just delete all items in the queue; we already fired an event when + // preparing the statement failed. + Call* call = queue.front(); + queue.pop(); + + // We don't call the actual callback, so we have to make sure that + // the baton gets destroyed. + delete call->baton; + delete call; + } +} diff --git a/node_modules/sqlite3/src/statement.h b/node_modules/sqlite3/src/statement.h new file mode 100644 index 0000000..b79d984 --- /dev/null +++ b/node_modules/sqlite3/src/statement.h @@ -0,0 +1,249 @@ +#ifndef NODE_SQLITE3_SRC_STATEMENT_H +#define NODE_SQLITE3_SRC_STATEMENT_H + +#include + +#include "database.h" +#include "threading.h" + +#include +#include +#include +#include +#include + +#include +#include "nan.h" + +using namespace v8; +using namespace node; + +namespace node_sqlite3 { + +namespace Values { + struct Field { + inline Field(unsigned short _index, unsigned short _type = SQLITE_NULL) : + type(_type), index(_index) {} + inline Field(const char* _name, unsigned short _type = SQLITE_NULL) : + type(_type), index(0), name(_name) {} + + unsigned short type; + unsigned short index; + std::string name; + }; + + struct Integer : Field { + template inline Integer(T _name, int64_t val) : + Field(_name, SQLITE_INTEGER), value(val) {} + int64_t value; + }; + + struct Float : Field { + template inline Float(T _name, double val) : + Field(_name, SQLITE_FLOAT), value(val) {} + double value; + }; + + struct Text : Field { + template inline Text(T _name, size_t len, const char* val) : + Field(_name, SQLITE_TEXT), value(val, len) {} + std::string value; + }; + + struct Blob : Field { + template inline Blob(T _name, size_t len, const void* val) : + Field(_name, SQLITE_BLOB), length(len) { + value = (char*)malloc(len); + memcpy(value, val, len); + } + inline ~Blob() { + free(value); + } + int length; + char* value; + }; + + typedef Field Null; +} + +typedef std::vector Row; +typedef std::vector Rows; +typedef Row Parameters; + + + +class Statement : public ObjectWrap { +public: + static Persistent constructor_template; + + static void Init(Handle target); + static NAN_METHOD(New); + + struct Baton { + uv_work_t request; + Statement* stmt; + Persistent callback; + Parameters parameters; + + Baton(Statement* stmt_, Handle cb_) : stmt(stmt_) { + stmt->Ref(); + request.data = this; + NanAssignPersistent(callback, cb_); + } + virtual ~Baton() { + for (unsigned int i = 0; i < parameters.size(); i++) { + Values::Field* field = parameters[i]; + DELETE_FIELD(field); + } + stmt->Unref(); + NanDisposePersistent(callback); + } + }; + + struct RowBaton : Baton { + RowBaton(Statement* stmt_, Handle cb_) : + Baton(stmt_, cb_) {} + Row row; + }; + + struct RunBaton : Baton { + RunBaton(Statement* stmt_, Handle cb_) : + Baton(stmt_, cb_), inserted_id(0), changes(0) {} + sqlite3_int64 inserted_id; + int changes; + }; + + struct RowsBaton : Baton { + RowsBaton(Statement* stmt_, Handle cb_) : + Baton(stmt_, cb_) {} + Rows rows; + }; + + struct Async; + + struct EachBaton : Baton { + Persistent completed; + Async* async; // Isn't deleted when the baton is deleted. + + EachBaton(Statement* stmt_, Handle cb_) : + Baton(stmt_, cb_) {} + virtual ~EachBaton() { + NanDisposePersistent(completed); + } + }; + + struct PrepareBaton : Database::Baton { + Statement* stmt; + std::string sql; + PrepareBaton(Database* db_, Handle cb_, Statement* stmt_) : + Baton(db_, cb_), stmt(stmt_) { + stmt->Ref(); + } + virtual ~PrepareBaton() { + stmt->Unref(); + if (!db->IsOpen() && db->IsLocked()) { + // The database handle was closed before the statement could be + // prepared. + stmt->Finalize(); + } + } + }; + + typedef void (*Work_Callback)(Baton* baton); + + struct Call { + Call(Work_Callback cb_, Baton* baton_) : callback(cb_), baton(baton_) {}; + Work_Callback callback; + Baton* baton; + }; + + struct Async { + uv_async_t watcher; + Statement* stmt; + Rows data; + NODE_SQLITE3_MUTEX_t; + bool completed; + int retrieved; + + // Store the callbacks here because we don't have + // access to the baton in the async callback. + Persistent item_cb; + Persistent completed_cb; + + Async(Statement* st, uv_async_cb async_cb) : + stmt(st), completed(false), retrieved(0) { + watcher.data = this; + NODE_SQLITE3_MUTEX_INIT + stmt->Ref(); + uv_async_init(uv_default_loop(), &watcher, async_cb); + } + + ~Async() { + stmt->Unref(); + NanDisposePersistent(item_cb); + NanDisposePersistent(completed_cb); + NODE_SQLITE3_MUTEX_DESTROY + } + }; + + Statement(Database* db_) : ObjectWrap(), + db(db_), + _handle(NULL), + status(SQLITE_OK), + prepared(false), + locked(true), + finalized(false) { + db->Ref(); + } + + ~Statement() { + if (!finalized) Finalize(); + } + + WORK_DEFINITION(Bind); + WORK_DEFINITION(Get); + WORK_DEFINITION(Run); + WORK_DEFINITION(All); + WORK_DEFINITION(Each); + WORK_DEFINITION(Reset); + + static NAN_METHOD(Finalize); + +protected: + static void Work_BeginPrepare(Database::Baton* baton); + static void Work_Prepare(uv_work_t* req); + static void Work_AfterPrepare(uv_work_t* req); + + static void AsyncEach(uv_async_t* handle, int status); + static void CloseCallback(uv_handle_t* handle); + + static void Finalize(Baton* baton); + void Finalize(); + + template inline Values::Field* BindParameter(const Handle source, T pos); + template T* Bind(_NAN_METHOD_ARGS, int start = 0, int end = -1); + bool Bind(const Parameters ¶meters); + + static void GetRow(Row* row, sqlite3_stmt* stmt); + static Local RowToJS(Row* row); + void Schedule(Work_Callback callback, Baton* baton); + void Process(); + void CleanQueue(); + template static void Error(T* baton); + +protected: + Database* db; + + sqlite3_stmt* _handle; + int status; + std::string message; + + bool prepared; + bool locked; + bool finalized; + std::queue queue; +}; + +} + +#endif diff --git a/node_modules/sqlite3/src/threading.h b/node_modules/sqlite3/src/threading.h new file mode 100644 index 0000000..fe738a4 --- /dev/null +++ b/node_modules/sqlite3/src/threading.h @@ -0,0 +1,48 @@ +#ifndef NODE_SQLITE3_SRC_THREADING_H +#define NODE_SQLITE3_SRC_THREADING_H + + +#ifdef _WIN32 + +#include + + #define NODE_SQLITE3_MUTEX_t HANDLE mutex; + + #define NODE_SQLITE3_MUTEX_INIT mutex = CreateMutex(NULL, FALSE, NULL); + + #define NODE_SQLITE3_MUTEX_LOCK(m) WaitForSingleObject(*m, INFINITE); + + #define NODE_SQLITE3_MUTEX_UNLOCK(m) ReleaseMutex(*m); + + #define NODE_SQLITE3_MUTEX_DESTROY CloseHandle(mutex); + +#elif defined(NODE_SQLITE3_BOOST_THREADING) + +#include + + #define NODE_SQLITE3_MUTEX_t boost::mutex mutex; + + #define NODE_SQLITE3_MUTEX_INIT + + #define NODE_SQLITE3_MUTEX_LOCK(m) (*m).lock(); + + #define NODE_SQLITE3_MUTEX_UNLOCK(m) (*m).unlock(); + + #define NODE_SQLITE3_MUTEX_DESTROY mutex.unlock(); + +#else + + #define NODE_SQLITE3_MUTEX_t pthread_mutex_t mutex; + + #define NODE_SQLITE3_MUTEX_INIT pthread_mutex_init(&mutex,NULL); + + #define NODE_SQLITE3_MUTEX_LOCK(m) pthread_mutex_lock(m); + + #define NODE_SQLITE3_MUTEX_UNLOCK(m) pthread_mutex_unlock(m); + + #define NODE_SQLITE3_MUTEX_DESTROY pthread_mutex_destroy(&mutex); + +#endif + + +#endif // NODE_SQLITE3_SRC_THREADING_H
    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%0DRL(S`}V(!U=KLe0(8v~!3kyf4le}wHKkkOc_`4s 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