From 5c7e407fe4dac811456606797c63747dd2be887f Mon Sep 17 00:00:00 2001 From: Phara0h Date: Tue, 7 Jul 2020 18:13:18 -0400 Subject: [PATCH] Updated to use prettier instead of beautify (handles MD inside postman description) --- index.js | 11 +- node_modules/.bin/beautify | 1 - node_modules/.bin/css-beautify | 1 - node_modules/.bin/cssbeautify | 1 - node_modules/.bin/editorconfig | 1 - node_modules/.bin/html | 1 - node_modules/.bin/html-beautify | 1 - node_modules/.bin/js-beautify | 1 - node_modules/.bin/mkdirp | 1 - node_modules/.bin/nopt | 1 - node_modules/.bin/semver | 1 - node_modules/abbrev/LICENSE | 46 - node_modules/abbrev/README.md | 23 - node_modules/abbrev/abbrev.js | 61 - node_modules/abbrev/package.json | 59 - node_modules/balanced-match/.npmignore | 5 - node_modules/balanced-match/LICENSE.md | 21 - node_modules/balanced-match/README.md | 91 - node_modules/balanced-match/index.js | 59 - node_modules/balanced-match/package.json | 80 - node_modules/beautify/.npmignore | 2 - node_modules/beautify/.travis.yml | 7 - node_modules/beautify/LICENSE | 21 - node_modules/beautify/README.md | 58 - node_modules/beautify/bin/beautify.js | 89 - node_modules/beautify/index.js | 42 - node_modules/beautify/package.json | 71 - node_modules/beautify/test/mock/test1.json | 1 - node_modules/beautify/test/mock/test2.json | 1 - node_modules/beautify/test/mock2/test3.json | 1 - node_modules/beautify/test/mock2/test4.json | 1 - node_modules/beautify/test/test.html | 10 - node_modules/beautify/test/test.js | 101 - node_modules/beautify/test/test2/test1.json | 3 - node_modules/beautify/test/test2/test2.json | 3 - node_modules/beautify/test/test2/test3.json | 3 - node_modules/beautify/test/test2/test4.json | 3 - node_modules/beautify/test1.json | 1 - node_modules/brace-expansion/LICENSE | 21 - node_modules/brace-expansion/README.md | 129 - node_modules/brace-expansion/index.js | 201 - node_modules/brace-expansion/package.json | 78 - node_modules/buffer-from/LICENSE | 21 - node_modules/buffer-from/index.js | 69 - node_modules/buffer-from/package.json | 55 - node_modules/buffer-from/readme.md | 69 - node_modules/commander/CHANGELOG.md | 408 -- node_modules/commander/LICENSE | 22 - node_modules/commander/Readme.md | 428 -- node_modules/commander/index.js | 1224 ---- node_modules/commander/package.json | 73 - node_modules/commander/typings/index.d.ts | 310 - node_modules/concat-map/.travis.yml | 4 - node_modules/concat-map/LICENSE | 18 - node_modules/concat-map/README.markdown | 62 - node_modules/concat-map/example/map.js | 6 - node_modules/concat-map/index.js | 13 - node_modules/concat-map/package.json | 91 - node_modules/concat-map/test/map.js | 39 - node_modules/concat-stream/LICENSE | 24 - node_modules/concat-stream/index.js | 144 - node_modules/concat-stream/package.json | 87 - node_modules/concat-stream/readme.md | 102 - node_modules/config-chain/LICENCE | 22 - node_modules/config-chain/index.js | 282 - node_modules/config-chain/package.json | 65 - node_modules/config-chain/readme.markdown | 257 - node_modules/core-util-is/LICENSE | 19 - 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 | 65 - node_modules/core-util-is/test.js | 68 - node_modules/cssbeautify/.npmignore | 6 - node_modules/cssbeautify/CONTRIBUTING.md | 24 - node_modules/cssbeautify/README.md | 79 - node_modules/cssbeautify/bin/cssbeautify | 83 - node_modules/cssbeautify/cssbeautify.js | 469 -- .../cssbeautify/cssbeautify.sublime-project | 8 - .../cssbeautify/cssbeautify.sublime-workspace | 179 - node_modules/cssbeautify/package.json | 66 - node_modules/editorconfig/CHANGELOG.md | 14 - node_modules/editorconfig/LICENSE | 19 - node_modules/editorconfig/README.md | 206 - node_modules/editorconfig/bin/editorconfig | 3 - node_modules/editorconfig/package.json | 104 - node_modules/editorconfig/src/cli.d.ts | 1 - node_modules/editorconfig/src/cli.js | 53 - node_modules/editorconfig/src/index.d.ts | 29 - node_modules/editorconfig/src/index.js | 261 - .../editorconfig/src/lib/fnmatch.d.ts | 214 - node_modules/editorconfig/src/lib/fnmatch.js | 1047 --- node_modules/editorconfig/src/lib/ini.d.ts | 14 - node_modules/editorconfig/src/lib/ini.js | 106 - node_modules/fs.realpath/LICENSE | 43 - node_modules/fs.realpath/README.md | 33 - node_modules/fs.realpath/index.js | 66 - node_modules/fs.realpath/old.js | 303 - node_modules/fs.realpath/package.json | 62 - node_modules/glob/LICENSE | 21 - node_modules/glob/README.md | 373 -- node_modules/glob/changelog.md | 67 - node_modules/glob/common.js | 240 - node_modules/glob/glob.js | 790 --- node_modules/glob/package.json | 79 - node_modules/glob/sync.js | 486 -- node_modules/html/.npmignore | 2 - node_modules/html/LICENSE | 10 - node_modules/html/bin/html.js | 39 - node_modules/html/img/after.png | Bin 175741 -> 0 bytes node_modules/html/img/before.png | Bin 151730 -> 0 bytes node_modules/html/img/copyashtml.png | Bin 361625 -> 0 bytes node_modules/html/lib/html.js | 536 -- node_modules/html/package.json | 78 - node_modules/html/readme.md | 61 - node_modules/html/src/html.js | 5 - node_modules/inflight/LICENSE | 15 - node_modules/inflight/README.md | 37 - node_modules/inflight/inflight.js | 54 - node_modules/inflight/package.json | 61 - node_modules/ini/LICENSE | 15 - node_modules/ini/README.md | 102 - node_modules/ini/ini.js | 194 - node_modules/ini/package.json | 66 - node_modules/isarray/.npmignore | 1 - node_modules/isarray/.travis.yml | 4 - node_modules/isarray/Makefile | 6 - node_modules/isarray/README.md | 60 - node_modules/isarray/component.json | 19 - node_modules/isarray/index.js | 5 - node_modules/isarray/package.json | 76 - node_modules/isarray/test.js | 20 - node_modules/js-beautify/CHANGELOG.md | 818 --- node_modules/js-beautify/LICENSE | 9 - node_modules/js-beautify/README.md | 402 -- .../js-beautify/js/bin/css-beautify.js | 4 - .../js-beautify/js/bin/html-beautify.js | 4 - .../js-beautify/js/bin/js-beautify.js | 4 - node_modules/js-beautify/js/index.js | 86 - node_modules/js-beautify/js/lib/beautifier.js | 5902 ----------------- .../js-beautify/js/lib/beautifier.min.js | 2 - .../js-beautify/js/lib/beautify-css.js | 1662 ----- .../js-beautify/js/lib/beautify-html.js | 3138 --------- node_modules/js-beautify/js/lib/beautify.js | 4042 ----------- node_modules/js-beautify/js/lib/cli.js | 692 -- .../javascriptobfuscator_unpacker.js | 132 - .../js/lib/unpackers/myobfuscate_unpacker.js | 119 - .../js/lib/unpackers/p_a_c_k_e_r_unpacker.js | 111 - .../js/lib/unpackers/urlencode_unpacker.js | 104 - node_modules/js-beautify/js/src/cli.js | 692 -- .../js-beautify/js/src/core/directives.js | 62 - .../js-beautify/js/src/core/inputscanner.js | 192 - .../js-beautify/js/src/core/options.js | 193 - .../js-beautify/js/src/core/output.js | 419 -- .../js-beautify/js/src/core/pattern.js | 94 - .../js/src/core/templatablepattern.js | 191 - node_modules/js-beautify/js/src/core/token.js | 54 - .../js-beautify/js/src/core/tokenizer.js | 140 - .../js-beautify/js/src/core/tokenstream.js | 78 - .../js/src/core/whitespacepattern.js | 105 - .../js-beautify/js/src/css/beautifier.js | 470 -- node_modules/js-beautify/js/src/css/index.js | 42 - .../js-beautify/js/src/css/options.js | 46 - .../js-beautify/js/src/css/tokenizer.js | 29 - .../js-beautify/js/src/html/beautifier.js | 840 --- node_modules/js-beautify/js/src/html/index.js | 42 - .../js-beautify/js/src/html/options.js | 91 - .../js-beautify/js/src/html/tokenizer.js | 329 - node_modules/js-beautify/js/src/index.js | 44 - .../js-beautify/js/src/javascript/acorn.js | 57 - .../js/src/javascript/beautifier.js | 1455 ---- .../js-beautify/js/src/javascript/index.js | 42 - .../js-beautify/js/src/javascript/options.js | 93 - .../js/src/javascript/tokenizer.js | 562 -- .../javascriptobfuscator_unpacker.js | 132 - .../js/src/unpackers/myobfuscate_unpacker.js | 119 - .../js/src/unpackers/p_a_c_k_e_r_unpacker.js | 111 - .../js/src/unpackers/urlencode_unpacker.js | 104 - node_modules/js-beautify/package.json | 126 - node_modules/lru-cache/LICENSE | 15 - node_modules/lru-cache/README.md | 158 - node_modules/lru-cache/index.js | 468 -- node_modules/lru-cache/package.json | 74 - node_modules/minimatch/LICENSE | 15 - node_modules/minimatch/README.md | 209 - node_modules/minimatch/minimatch.js | 923 --- node_modules/minimatch/package.json | 66 - node_modules/mkdirp/.travis.yml | 8 - 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_modules/mkdirp/index.js | 98 - node_modules/mkdirp/package.json | 65 - node_modules/mkdirp/readme.markdown | 100 - node_modules/mkdirp/test/chmod.js | 41 - node_modules/mkdirp/test/clobber.js | 38 - node_modules/mkdirp/test/mkdirp.js | 28 - node_modules/mkdirp/test/opts_fs.js | 29 - node_modules/mkdirp/test/opts_fs_sync.js | 27 - node_modules/mkdirp/test/perm.js | 32 - node_modules/mkdirp/test/perm_sync.js | 36 - node_modules/mkdirp/test/race.js | 37 - node_modules/mkdirp/test/rel.js | 32 - node_modules/mkdirp/test/return.js | 25 - node_modules/mkdirp/test/return_sync.js | 24 - node_modules/mkdirp/test/root.js | 19 - node_modules/mkdirp/test/sync.js | 32 - node_modules/mkdirp/test/umask.js | 28 - node_modules/mkdirp/test/umask_sync.js | 32 - node_modules/nopt/.npmignore | 1 - node_modules/nopt/.travis.yml | 8 - node_modules/nopt/CHANGELOG.md | 58 - node_modules/nopt/LICENSE | 15 - node_modules/nopt/README.md | 213 - node_modules/nopt/bin/nopt.js | 54 - node_modules/nopt/examples/my-program.js | 30 - node_modules/nopt/lib/nopt.js | 436 -- node_modules/nopt/package.json | 61 - node_modules/nopt/test/basic.js | 303 - node_modules/once/LICENSE | 15 - node_modules/once/README.md | 79 - node_modules/once/once.js | 42 - node_modules/once/package.json | 70 - node_modules/os-homedir/index.js | 24 - node_modules/os-homedir/license | 21 - node_modules/os-homedir/package.json | 76 - node_modules/os-homedir/readme.md | 31 - node_modules/os-tmpdir/index.js | 25 - node_modules/os-tmpdir/license | 21 - node_modules/os-tmpdir/package.json | 76 - node_modules/os-tmpdir/readme.md | 32 - node_modules/osenv/LICENSE | 15 - node_modules/osenv/README.md | 63 - node_modules/osenv/osenv.js | 72 - node_modules/osenv/package.json | 76 - node_modules/path-is-absolute/index.js | 20 - node_modules/path-is-absolute/license | 21 - node_modules/path-is-absolute/package.json | 78 - node_modules/path-is-absolute/readme.md | 59 - node_modules/process-nextick-args/index.js | 45 - node_modules/process-nextick-args/license.md | 19 - .../process-nextick-args/package.json | 53 - node_modules/process-nextick-args/readme.md | 18 - node_modules/proto-list/LICENSE | 15 - node_modules/proto-list/README.md | 3 - node_modules/proto-list/package.json | 54 - node_modules/proto-list/proto-list.js | 88 - node_modules/proto-list/test/basic.js | 61 - node_modules/pseudomap/LICENSE | 15 - node_modules/pseudomap/README.md | 60 - node_modules/pseudomap/map.js | 9 - node_modules/pseudomap/package.json | 57 - node_modules/pseudomap/pseudomap.js | 113 - node_modules/pseudomap/test/basic.js | 86 - node_modules/readable-stream/.travis.yml | 55 - node_modules/readable-stream/CONTRIBUTING.md | 38 - node_modules/readable-stream/GOVERNANCE.md | 136 - node_modules/readable-stream/LICENSE | 47 - node_modules/readable-stream/README.md | 58 - .../doc/wg-meetings/2015-01-30.md | 60 - .../readable-stream/duplex-browser.js | 1 - node_modules/readable-stream/duplex.js | 1 - .../readable-stream/lib/_stream_duplex.js | 131 - .../lib/_stream_passthrough.js | 47 - .../readable-stream/lib/_stream_readable.js | 1019 --- .../readable-stream/lib/_stream_transform.js | 214 - .../readable-stream/lib/_stream_writable.js | 687 -- .../lib/internal/streams/BufferList.js | 79 - .../lib/internal/streams/destroy.js | 74 - .../lib/internal/streams/stream-browser.js | 1 - .../lib/internal/streams/stream.js | 1 - node_modules/readable-stream/package.json | 84 - node_modules/readable-stream/passthrough.js | 1 - .../readable-stream/readable-browser.js | 7 - node_modules/readable-stream/readable.js | 19 - node_modules/readable-stream/transform.js | 1 - .../readable-stream/writable-browser.js | 1 - node_modules/readable-stream/writable.js | 8 - node_modules/semver/CHANGELOG.md | 39 - node_modules/semver/LICENSE | 15 - node_modules/semver/README.md | 412 -- node_modules/semver/bin/semver | 160 - node_modules/semver/package.json | 63 - node_modules/semver/range.bnf | 16 - node_modules/semver/semver.js | 1483 ----- node_modules/sigmund/LICENSE | 15 - node_modules/sigmund/README.md | 53 - node_modules/sigmund/bench.js | 283 - node_modules/sigmund/package.json | 66 - node_modules/sigmund/sigmund.js | 39 - node_modules/sigmund/test/basic.js | 24 - node_modules/typedarray/.travis.yml | 4 - node_modules/typedarray/LICENSE | 35 - node_modules/typedarray/example/tarray.js | 4 - node_modules/typedarray/index.js | 630 -- node_modules/typedarray/package.json | 86 - node_modules/typedarray/readme.markdown | 61 - .../typedarray/test/server/undef_globals.js | 19 - node_modules/typedarray/test/tarray.js | 10 - node_modules/wrappy/LICENSE | 15 - node_modules/wrappy/README.md | 36 - node_modules/wrappy/package.json | 62 - node_modules/wrappy/wrappy.js | 33 - node_modules/yallist/LICENSE | 15 - node_modules/yallist/README.md | 204 - node_modules/yallist/iterator.js | 7 - node_modules/yallist/package.json | 65 - node_modules/yallist/yallist.js | 370 -- package-lock.json | 265 +- package.json | 4 +- swag.js | 3038 --------- 312 files changed, 12 insertions(+), 53184 deletions(-) delete mode 120000 node_modules/.bin/beautify delete mode 120000 node_modules/.bin/css-beautify delete mode 120000 node_modules/.bin/cssbeautify delete mode 120000 node_modules/.bin/editorconfig delete mode 120000 node_modules/.bin/html delete mode 120000 node_modules/.bin/html-beautify delete mode 120000 node_modules/.bin/js-beautify delete mode 120000 node_modules/.bin/mkdirp delete mode 120000 node_modules/.bin/nopt delete mode 120000 node_modules/.bin/semver delete mode 100644 node_modules/abbrev/LICENSE delete mode 100644 node_modules/abbrev/README.md delete mode 100644 node_modules/abbrev/abbrev.js delete mode 100644 node_modules/abbrev/package.json delete mode 100644 node_modules/balanced-match/.npmignore delete mode 100644 node_modules/balanced-match/LICENSE.md delete mode 100644 node_modules/balanced-match/README.md delete mode 100644 node_modules/balanced-match/index.js delete mode 100644 node_modules/balanced-match/package.json delete mode 100644 node_modules/beautify/.npmignore delete mode 100644 node_modules/beautify/.travis.yml delete mode 100644 node_modules/beautify/LICENSE delete mode 100644 node_modules/beautify/README.md delete mode 100755 node_modules/beautify/bin/beautify.js delete mode 100644 node_modules/beautify/index.js delete mode 100644 node_modules/beautify/package.json delete mode 100644 node_modules/beautify/test/mock/test1.json delete mode 100644 node_modules/beautify/test/mock/test2.json delete mode 100644 node_modules/beautify/test/mock2/test3.json delete mode 100644 node_modules/beautify/test/mock2/test4.json delete mode 100644 node_modules/beautify/test/test.html delete mode 100644 node_modules/beautify/test/test.js delete mode 100644 node_modules/beautify/test/test2/test1.json delete mode 100644 node_modules/beautify/test/test2/test2.json delete mode 100644 node_modules/beautify/test/test2/test3.json delete mode 100644 node_modules/beautify/test/test2/test4.json delete mode 100644 node_modules/beautify/test1.json delete mode 100644 node_modules/brace-expansion/LICENSE delete mode 100644 node_modules/brace-expansion/README.md delete mode 100644 node_modules/brace-expansion/index.js delete mode 100644 node_modules/brace-expansion/package.json delete mode 100644 node_modules/buffer-from/LICENSE delete mode 100644 node_modules/buffer-from/index.js delete mode 100644 node_modules/buffer-from/package.json delete mode 100644 node_modules/buffer-from/readme.md delete mode 100644 node_modules/commander/CHANGELOG.md delete mode 100644 node_modules/commander/LICENSE delete mode 100644 node_modules/commander/Readme.md delete mode 100644 node_modules/commander/index.js delete mode 100644 node_modules/commander/package.json delete mode 100644 node_modules/commander/typings/index.d.ts delete mode 100644 node_modules/concat-map/.travis.yml delete mode 100644 node_modules/concat-map/LICENSE delete mode 100644 node_modules/concat-map/README.markdown delete mode 100644 node_modules/concat-map/example/map.js delete mode 100644 node_modules/concat-map/index.js delete mode 100644 node_modules/concat-map/package.json delete mode 100644 node_modules/concat-map/test/map.js delete mode 100644 node_modules/concat-stream/LICENSE delete mode 100644 node_modules/concat-stream/index.js delete mode 100644 node_modules/concat-stream/package.json delete mode 100644 node_modules/concat-stream/readme.md delete mode 100644 node_modules/config-chain/LICENCE delete mode 100755 node_modules/config-chain/index.js delete mode 100644 node_modules/config-chain/package.json delete mode 100644 node_modules/config-chain/readme.markdown delete mode 100644 node_modules/core-util-is/LICENSE delete mode 100644 node_modules/core-util-is/README.md delete mode 100644 node_modules/core-util-is/float.patch delete mode 100644 node_modules/core-util-is/lib/util.js delete mode 100644 node_modules/core-util-is/package.json delete mode 100644 node_modules/core-util-is/test.js delete mode 100644 node_modules/cssbeautify/.npmignore delete mode 100644 node_modules/cssbeautify/CONTRIBUTING.md delete mode 100644 node_modules/cssbeautify/README.md delete mode 100755 node_modules/cssbeautify/bin/cssbeautify delete mode 100644 node_modules/cssbeautify/cssbeautify.js delete mode 100644 node_modules/cssbeautify/cssbeautify.sublime-project delete mode 100644 node_modules/cssbeautify/cssbeautify.sublime-workspace delete mode 100644 node_modules/cssbeautify/package.json delete mode 100644 node_modules/editorconfig/CHANGELOG.md delete mode 100644 node_modules/editorconfig/LICENSE delete mode 100644 node_modules/editorconfig/README.md delete mode 100755 node_modules/editorconfig/bin/editorconfig delete mode 100644 node_modules/editorconfig/package.json delete mode 100644 node_modules/editorconfig/src/cli.d.ts delete mode 100644 node_modules/editorconfig/src/cli.js delete mode 100644 node_modules/editorconfig/src/index.d.ts delete mode 100644 node_modules/editorconfig/src/index.js delete mode 100644 node_modules/editorconfig/src/lib/fnmatch.d.ts delete mode 100644 node_modules/editorconfig/src/lib/fnmatch.js delete mode 100644 node_modules/editorconfig/src/lib/ini.d.ts delete mode 100644 node_modules/editorconfig/src/lib/ini.js delete mode 100644 node_modules/fs.realpath/LICENSE delete mode 100644 node_modules/fs.realpath/README.md delete mode 100644 node_modules/fs.realpath/index.js delete mode 100644 node_modules/fs.realpath/old.js delete mode 100644 node_modules/fs.realpath/package.json delete mode 100644 node_modules/glob/LICENSE delete mode 100644 node_modules/glob/README.md delete mode 100644 node_modules/glob/changelog.md delete mode 100644 node_modules/glob/common.js delete mode 100644 node_modules/glob/glob.js delete mode 100644 node_modules/glob/package.json delete mode 100644 node_modules/glob/sync.js delete mode 100644 node_modules/html/.npmignore delete mode 100644 node_modules/html/LICENSE delete mode 100755 node_modules/html/bin/html.js delete mode 100644 node_modules/html/img/after.png delete mode 100644 node_modules/html/img/before.png delete mode 100644 node_modules/html/img/copyashtml.png delete mode 100644 node_modules/html/lib/html.js delete mode 100644 node_modules/html/package.json delete mode 100644 node_modules/html/readme.md delete mode 100644 node_modules/html/src/html.js delete mode 100644 node_modules/inflight/LICENSE delete mode 100644 node_modules/inflight/README.md delete mode 100644 node_modules/inflight/inflight.js delete mode 100644 node_modules/inflight/package.json delete mode 100644 node_modules/ini/LICENSE delete mode 100644 node_modules/ini/README.md delete mode 100644 node_modules/ini/ini.js delete mode 100644 node_modules/ini/package.json delete mode 100644 node_modules/isarray/.npmignore delete mode 100644 node_modules/isarray/.travis.yml delete mode 100644 node_modules/isarray/Makefile delete mode 100644 node_modules/isarray/README.md delete mode 100644 node_modules/isarray/component.json delete mode 100644 node_modules/isarray/index.js delete mode 100644 node_modules/isarray/package.json delete mode 100644 node_modules/isarray/test.js delete mode 100644 node_modules/js-beautify/CHANGELOG.md delete mode 100644 node_modules/js-beautify/LICENSE delete mode 100644 node_modules/js-beautify/README.md delete mode 100755 node_modules/js-beautify/js/bin/css-beautify.js delete mode 100755 node_modules/js-beautify/js/bin/html-beautify.js delete mode 100755 node_modules/js-beautify/js/bin/js-beautify.js delete mode 100644 node_modules/js-beautify/js/index.js delete mode 100644 node_modules/js-beautify/js/lib/beautifier.js delete mode 100644 node_modules/js-beautify/js/lib/beautifier.min.js delete mode 100644 node_modules/js-beautify/js/lib/beautify-css.js delete mode 100644 node_modules/js-beautify/js/lib/beautify-html.js delete mode 100644 node_modules/js-beautify/js/lib/beautify.js delete mode 100755 node_modules/js-beautify/js/lib/cli.js delete mode 100644 node_modules/js-beautify/js/lib/unpackers/javascriptobfuscator_unpacker.js delete mode 100644 node_modules/js-beautify/js/lib/unpackers/myobfuscate_unpacker.js delete mode 100644 node_modules/js-beautify/js/lib/unpackers/p_a_c_k_e_r_unpacker.js delete mode 100644 node_modules/js-beautify/js/lib/unpackers/urlencode_unpacker.js delete mode 100755 node_modules/js-beautify/js/src/cli.js delete mode 100644 node_modules/js-beautify/js/src/core/directives.js delete mode 100644 node_modules/js-beautify/js/src/core/inputscanner.js delete mode 100644 node_modules/js-beautify/js/src/core/options.js delete mode 100644 node_modules/js-beautify/js/src/core/output.js delete mode 100644 node_modules/js-beautify/js/src/core/pattern.js delete mode 100644 node_modules/js-beautify/js/src/core/templatablepattern.js delete mode 100644 node_modules/js-beautify/js/src/core/token.js delete mode 100644 node_modules/js-beautify/js/src/core/tokenizer.js delete mode 100644 node_modules/js-beautify/js/src/core/tokenstream.js delete mode 100644 node_modules/js-beautify/js/src/core/whitespacepattern.js delete mode 100644 node_modules/js-beautify/js/src/css/beautifier.js delete mode 100644 node_modules/js-beautify/js/src/css/index.js delete mode 100644 node_modules/js-beautify/js/src/css/options.js delete mode 100644 node_modules/js-beautify/js/src/css/tokenizer.js delete mode 100644 node_modules/js-beautify/js/src/html/beautifier.js delete mode 100644 node_modules/js-beautify/js/src/html/index.js delete mode 100644 node_modules/js-beautify/js/src/html/options.js delete mode 100644 node_modules/js-beautify/js/src/html/tokenizer.js delete mode 100644 node_modules/js-beautify/js/src/index.js delete mode 100644 node_modules/js-beautify/js/src/javascript/acorn.js delete mode 100644 node_modules/js-beautify/js/src/javascript/beautifier.js delete mode 100644 node_modules/js-beautify/js/src/javascript/index.js delete mode 100644 node_modules/js-beautify/js/src/javascript/options.js delete mode 100644 node_modules/js-beautify/js/src/javascript/tokenizer.js delete mode 100644 node_modules/js-beautify/js/src/unpackers/javascriptobfuscator_unpacker.js delete mode 100644 node_modules/js-beautify/js/src/unpackers/myobfuscate_unpacker.js delete mode 100644 node_modules/js-beautify/js/src/unpackers/p_a_c_k_e_r_unpacker.js delete mode 100644 node_modules/js-beautify/js/src/unpackers/urlencode_unpacker.js delete mode 100644 node_modules/js-beautify/package.json delete mode 100644 node_modules/lru-cache/LICENSE delete mode 100644 node_modules/lru-cache/README.md delete mode 100644 node_modules/lru-cache/index.js delete mode 100644 node_modules/lru-cache/package.json delete mode 100644 node_modules/minimatch/LICENSE delete mode 100644 node_modules/minimatch/README.md delete mode 100644 node_modules/minimatch/minimatch.js delete mode 100644 node_modules/minimatch/package.json delete mode 100644 node_modules/mkdirp/.travis.yml delete mode 100644 node_modules/mkdirp/LICENSE delete mode 100755 node_modules/mkdirp/bin/cmd.js delete mode 100644 node_modules/mkdirp/bin/usage.txt delete mode 100644 node_modules/mkdirp/examples/pow.js delete mode 100644 node_modules/mkdirp/index.js delete mode 100644 node_modules/mkdirp/package.json delete mode 100644 node_modules/mkdirp/readme.markdown delete mode 100644 node_modules/mkdirp/test/chmod.js delete mode 100644 node_modules/mkdirp/test/clobber.js delete mode 100644 node_modules/mkdirp/test/mkdirp.js delete mode 100644 node_modules/mkdirp/test/opts_fs.js delete mode 100644 node_modules/mkdirp/test/opts_fs_sync.js delete mode 100644 node_modules/mkdirp/test/perm.js delete mode 100644 node_modules/mkdirp/test/perm_sync.js delete mode 100644 node_modules/mkdirp/test/race.js delete mode 100644 node_modules/mkdirp/test/rel.js delete mode 100644 node_modules/mkdirp/test/return.js delete mode 100644 node_modules/mkdirp/test/return_sync.js delete mode 100644 node_modules/mkdirp/test/root.js delete mode 100644 node_modules/mkdirp/test/sync.js delete mode 100644 node_modules/mkdirp/test/umask.js delete mode 100644 node_modules/mkdirp/test/umask_sync.js delete mode 100644 node_modules/nopt/.npmignore delete mode 100644 node_modules/nopt/.travis.yml delete mode 100644 node_modules/nopt/CHANGELOG.md delete mode 100644 node_modules/nopt/LICENSE delete mode 100644 node_modules/nopt/README.md delete mode 100755 node_modules/nopt/bin/nopt.js delete mode 100755 node_modules/nopt/examples/my-program.js delete mode 100644 node_modules/nopt/lib/nopt.js delete mode 100644 node_modules/nopt/package.json delete mode 100644 node_modules/nopt/test/basic.js delete mode 100644 node_modules/once/LICENSE delete mode 100644 node_modules/once/README.md delete mode 100644 node_modules/once/once.js delete mode 100644 node_modules/once/package.json delete mode 100644 node_modules/os-homedir/index.js delete mode 100644 node_modules/os-homedir/license delete mode 100644 node_modules/os-homedir/package.json delete mode 100644 node_modules/os-homedir/readme.md delete mode 100644 node_modules/os-tmpdir/index.js delete mode 100644 node_modules/os-tmpdir/license delete mode 100644 node_modules/os-tmpdir/package.json delete mode 100644 node_modules/os-tmpdir/readme.md delete mode 100644 node_modules/osenv/LICENSE delete mode 100644 node_modules/osenv/README.md delete mode 100644 node_modules/osenv/osenv.js delete mode 100644 node_modules/osenv/package.json delete mode 100644 node_modules/path-is-absolute/index.js delete mode 100644 node_modules/path-is-absolute/license delete mode 100644 node_modules/path-is-absolute/package.json delete mode 100644 node_modules/path-is-absolute/readme.md delete mode 100644 node_modules/process-nextick-args/index.js delete mode 100644 node_modules/process-nextick-args/license.md delete mode 100644 node_modules/process-nextick-args/package.json delete mode 100644 node_modules/process-nextick-args/readme.md delete mode 100644 node_modules/proto-list/LICENSE delete mode 100644 node_modules/proto-list/README.md delete mode 100644 node_modules/proto-list/package.json delete mode 100644 node_modules/proto-list/proto-list.js delete mode 100644 node_modules/proto-list/test/basic.js delete mode 100644 node_modules/pseudomap/LICENSE delete mode 100644 node_modules/pseudomap/README.md delete mode 100644 node_modules/pseudomap/map.js delete mode 100644 node_modules/pseudomap/package.json delete mode 100644 node_modules/pseudomap/pseudomap.js delete mode 100644 node_modules/pseudomap/test/basic.js delete mode 100644 node_modules/readable-stream/.travis.yml delete mode 100644 node_modules/readable-stream/CONTRIBUTING.md delete mode 100644 node_modules/readable-stream/GOVERNANCE.md delete mode 100644 node_modules/readable-stream/LICENSE delete mode 100644 node_modules/readable-stream/README.md delete mode 100644 node_modules/readable-stream/doc/wg-meetings/2015-01-30.md delete mode 100644 node_modules/readable-stream/duplex-browser.js delete mode 100644 node_modules/readable-stream/duplex.js delete mode 100644 node_modules/readable-stream/lib/_stream_duplex.js delete mode 100644 node_modules/readable-stream/lib/_stream_passthrough.js delete mode 100644 node_modules/readable-stream/lib/_stream_readable.js delete mode 100644 node_modules/readable-stream/lib/_stream_transform.js delete mode 100644 node_modules/readable-stream/lib/_stream_writable.js delete mode 100644 node_modules/readable-stream/lib/internal/streams/BufferList.js delete mode 100644 node_modules/readable-stream/lib/internal/streams/destroy.js delete mode 100644 node_modules/readable-stream/lib/internal/streams/stream-browser.js delete mode 100644 node_modules/readable-stream/lib/internal/streams/stream.js delete mode 100644 node_modules/readable-stream/package.json delete mode 100644 node_modules/readable-stream/passthrough.js delete mode 100644 node_modules/readable-stream/readable-browser.js delete mode 100644 node_modules/readable-stream/readable.js delete mode 100644 node_modules/readable-stream/transform.js delete mode 100644 node_modules/readable-stream/writable-browser.js delete mode 100644 node_modules/readable-stream/writable.js delete mode 100644 node_modules/semver/CHANGELOG.md delete mode 100644 node_modules/semver/LICENSE delete mode 100644 node_modules/semver/README.md delete mode 100755 node_modules/semver/bin/semver delete mode 100644 node_modules/semver/package.json delete mode 100644 node_modules/semver/range.bnf delete mode 100644 node_modules/semver/semver.js delete mode 100644 node_modules/sigmund/LICENSE delete mode 100644 node_modules/sigmund/README.md delete mode 100644 node_modules/sigmund/bench.js delete mode 100644 node_modules/sigmund/package.json delete mode 100644 node_modules/sigmund/sigmund.js delete mode 100644 node_modules/sigmund/test/basic.js delete mode 100644 node_modules/typedarray/.travis.yml delete mode 100644 node_modules/typedarray/LICENSE delete mode 100644 node_modules/typedarray/example/tarray.js delete mode 100644 node_modules/typedarray/index.js delete mode 100644 node_modules/typedarray/package.json delete mode 100644 node_modules/typedarray/readme.markdown delete mode 100644 node_modules/typedarray/test/server/undef_globals.js delete mode 100644 node_modules/typedarray/test/tarray.js delete mode 100644 node_modules/wrappy/LICENSE delete mode 100644 node_modules/wrappy/README.md delete mode 100644 node_modules/wrappy/package.json delete mode 100644 node_modules/wrappy/wrappy.js delete mode 100644 node_modules/yallist/LICENSE delete mode 100644 node_modules/yallist/README.md delete mode 100644 node_modules/yallist/iterator.js delete mode 100644 node_modules/yallist/package.json delete mode 100644 node_modules/yallist/yallist.js delete mode 100644 swag.js diff --git a/index.js b/index.js index 2d20c522..a730f9fd 100755 --- a/index.js +++ b/index.js @@ -2,7 +2,7 @@ const fs = require('fs') // needed to read JSON file from disk const Collection = require('postman-collection').Collection; -const beautify = require('beautify'); +const prettier = require("prettier"); // Load a collection to memory from a JSON file on disk (say, sample-collection.json) var collection = new Collection(JSON.parse(fs.readFileSync(process.argv[2]).toString())).toJSON(); @@ -134,6 +134,7 @@ var getDocs = function (name, description, url, body, headers = []) ` /** * ${setMethodName(name)} - ${description} + * * Path: ${url.path.join('/')}` var vars = []; @@ -151,8 +152,8 @@ var getDocs = function (name, description, url, body, headers = []) docs += ` * @param {Object} body` + } } -} var varsString = ''; @@ -395,7 +396,7 @@ jsFile += ` } ` -console.log(beautify(jsFile, -{ - format: 'js' +console.log(prettier.format(jsFile, { + tabWidth: 2, + singleQuote: true })); diff --git a/node_modules/.bin/beautify b/node_modules/.bin/beautify deleted file mode 120000 index b79d9c58..00000000 --- a/node_modules/.bin/beautify +++ /dev/null @@ -1 +0,0 @@ -../beautify/bin/beautify.js \ No newline at end of file diff --git a/node_modules/.bin/css-beautify b/node_modules/.bin/css-beautify deleted file mode 120000 index d9b8ee28..00000000 --- a/node_modules/.bin/css-beautify +++ /dev/null @@ -1 +0,0 @@ -../js-beautify/js/bin/css-beautify.js \ No newline at end of file diff --git a/node_modules/.bin/cssbeautify b/node_modules/.bin/cssbeautify deleted file mode 120000 index 1f101772..00000000 --- a/node_modules/.bin/cssbeautify +++ /dev/null @@ -1 +0,0 @@ -../cssbeautify/bin/cssbeautify \ No newline at end of file diff --git a/node_modules/.bin/editorconfig b/node_modules/.bin/editorconfig deleted file mode 120000 index a151e0b8..00000000 --- a/node_modules/.bin/editorconfig +++ /dev/null @@ -1 +0,0 @@ -../editorconfig/bin/editorconfig \ No newline at end of file diff --git a/node_modules/.bin/html b/node_modules/.bin/html deleted file mode 120000 index f1f4d196..00000000 --- a/node_modules/.bin/html +++ /dev/null @@ -1 +0,0 @@ -../html/bin/html.js \ No newline at end of file diff --git a/node_modules/.bin/html-beautify b/node_modules/.bin/html-beautify deleted file mode 120000 index c17c69c3..00000000 --- a/node_modules/.bin/html-beautify +++ /dev/null @@ -1 +0,0 @@ -../js-beautify/js/bin/html-beautify.js \ No newline at end of file diff --git a/node_modules/.bin/js-beautify b/node_modules/.bin/js-beautify deleted file mode 120000 index 548ddf4b..00000000 --- a/node_modules/.bin/js-beautify +++ /dev/null @@ -1 +0,0 @@ -../js-beautify/js/bin/js-beautify.js \ No newline at end of file diff --git a/node_modules/.bin/mkdirp b/node_modules/.bin/mkdirp deleted file mode 120000 index 017896ce..00000000 --- a/node_modules/.bin/mkdirp +++ /dev/null @@ -1 +0,0 @@ -../mkdirp/bin/cmd.js \ No newline at end of file diff --git a/node_modules/.bin/nopt b/node_modules/.bin/nopt deleted file mode 120000 index 6b6566ea..00000000 --- a/node_modules/.bin/nopt +++ /dev/null @@ -1 +0,0 @@ -../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver deleted file mode 120000 index 317eb293..00000000 --- a/node_modules/.bin/semver +++ /dev/null @@ -1 +0,0 @@ -../semver/bin/semver \ No newline at end of file diff --git a/node_modules/abbrev/LICENSE b/node_modules/abbrev/LICENSE deleted file mode 100644 index 9bcfa9d7..00000000 --- a/node_modules/abbrev/LICENSE +++ /dev/null @@ -1,46 +0,0 @@ -This software is dual-licensed under the ISC and MIT licenses. -You may use this software under EITHER of the following licenses. - ----------- - -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----------- - -Copyright Isaac Z. Schlueter and 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. diff --git a/node_modules/abbrev/README.md b/node_modules/abbrev/README.md deleted file mode 100644 index 99746fe6..00000000 --- a/node_modules/abbrev/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# 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/abbrev/abbrev.js b/node_modules/abbrev/abbrev.js deleted file mode 100644 index 7b1dc5d6..00000000 --- a/node_modules/abbrev/abbrev.js +++ /dev/null @@ -1,61 +0,0 @@ -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/abbrev/package.json b/node_modules/abbrev/package.json deleted file mode 100644 index c923b8d3..00000000 --- a/node_modules/abbrev/package.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "_args": [ - [ - "abbrev@1.1.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "abbrev@1.1.1", - "_id": "abbrev@1.1.1", - "_inBundle": false, - "_integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "_location": "/abbrev", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "abbrev@1.1.1", - "name": "abbrev", - "escapedName": "abbrev", - "rawSpec": "1.1.1", - "saveSpec": null, - "fetchSpec": "1.1.1" - }, - "_requiredBy": [ - "/nopt" - ], - "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "_spec": "1.1.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "description": "Like ruby's abbrev module, but in js", - "devDependencies": { - "tap": "^10.1" - }, - "files": [ - "abbrev.js" - ], - "homepage": "https://github.com/isaacs/abbrev-js#readme", - "license": "ISC", - "main": "abbrev.js", - "name": "abbrev", - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" - }, - "scripts": { - "postpublish": "git push origin --all; git push origin --tags", - "postversion": "npm publish", - "preversion": "npm test", - "test": "tap test.js --100" - }, - "version": "1.1.1" -} diff --git a/node_modules/balanced-match/.npmignore b/node_modules/balanced-match/.npmignore deleted file mode 100644 index ae5d8c36..00000000 --- a/node_modules/balanced-match/.npmignore +++ /dev/null @@ -1,5 +0,0 @@ -test -.gitignore -.travis.yml -Makefile -example.js diff --git a/node_modules/balanced-match/LICENSE.md b/node_modules/balanced-match/LICENSE.md deleted file mode 100644 index 2cdc8e41..00000000 --- a/node_modules/balanced-match/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -(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/balanced-match/README.md b/node_modules/balanced-match/README.md deleted file mode 100644 index 08e918c0..00000000 --- a/node_modules/balanced-match/README.md +++ /dev/null @@ -1,91 +0,0 @@ -# balanced-match - -Match balanced string pairs, like `{` and `}` or `` and ``. Supports regular expressions as well! - -[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match) -[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match) - -[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match) - -## Example - -Get the first matching pair of braces: - -```js -var balanced = require('balanced-match'); - -console.log(balanced('{', '}', 'pre{in{nested}}post')); -console.log(balanced('{', '}', 'pre{first}between{second}post')); -console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post')); -``` - -The matches are: - -```bash -$ node example.js -{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' } -{ start: 3, - end: 9, - pre: 'pre', - body: 'first', - post: 'between{second}post' } -{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' } -``` - -## API - -### var m = balanced(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -object with those keys: - -* **start** the index of the first match of `a` -* **end** the index of the matching `b` -* **pre** the preamble, `a` and `b` not included -* **body** the match, `a` and `b` not included -* **post** the postscript, `a` and `b` not included - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`. - -### var r = balanced.range(a, b, str) - -For the first non-nested matching pair of `a` and `b` in `str`, return an -array with indexes: `[ , ]`. - -If there's no match, `undefined` will be returned. - -If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install balanced-match -``` - -## 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/balanced-match/index.js b/node_modules/balanced-match/index.js deleted file mode 100644 index 1685a762..00000000 --- a/node_modules/balanced-match/index.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict'; -module.exports = balanced; -function balanced(a, b, str) { - if (a instanceof RegExp) a = maybeMatch(a, str); - if (b instanceof RegExp) b = maybeMatch(b, str); - - var r = range(a, b, str); - - return r && { - start: r[0], - end: r[1], - pre: str.slice(0, r[0]), - body: str.slice(r[0] + a.length, r[1]), - post: str.slice(r[1] + b.length) - }; -} - -function maybeMatch(reg, str) { - var m = str.match(reg); - return m ? m[0] : null; -} - -balanced.range = range; -function range(a, b, str) { - var begs, beg, left, right, result; - var ai = str.indexOf(a); - var bi = str.indexOf(b, ai + 1); - var i = ai; - - if (ai >= 0 && bi > 0) { - begs = []; - left = str.length; - - while (i >= 0 && !result) { - if (i == ai) { - begs.push(i); - ai = str.indexOf(a, i + 1); - } else if (begs.length == 1) { - result = [ begs.pop(), bi ]; - } else { - beg = begs.pop(); - if (beg < left) { - left = beg; - right = bi; - } - - bi = str.indexOf(b, i + 1); - } - - i = ai < bi && ai >= 0 ? ai : bi; - } - - if (begs.length) { - result = [ left, right ]; - } - } - - return result; -} diff --git a/node_modules/balanced-match/package.json b/node_modules/balanced-match/package.json deleted file mode 100644 index 240e280d..00000000 --- a/node_modules/balanced-match/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "_args": [ - [ - "balanced-match@1.0.0", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "balanced-match@1.0.0", - "_id": "balanced-match@1.0.0", - "_inBundle": false, - "_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "_location": "/balanced-match", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "balanced-match@1.0.0", - "name": "balanced-match", - "escapedName": "balanced-match", - "rawSpec": "1.0.0", - "saveSpec": null, - "fetchSpec": "1.0.0" - }, - "_requiredBy": [ - "/brace-expansion" - ], - "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "_spec": "1.0.0", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "bugs": { - "url": "https://github.com/juliangruber/balanced-match/issues" - }, - "dependencies": {}, - "description": "Match balanced character pairs, like \"{\" and \"}\"", - "devDependencies": { - "matcha": "^0.7.0", - "tape": "^4.6.0" - }, - "homepage": "https://github.com/juliangruber/balanced-match", - "keywords": [ - "match", - "regexp", - "test", - "balanced", - "parse" - ], - "license": "MIT", - "main": "index.js", - "name": "balanced-match", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/balanced-match.git" - }, - "scripts": { - "bench": "make bench", - "test": "make test" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "version": "1.0.0" -} diff --git a/node_modules/beautify/.npmignore b/node_modules/beautify/.npmignore deleted file mode 100644 index 93f13619..00000000 --- a/node_modules/beautify/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -npm-debug.log diff --git a/node_modules/beautify/.travis.yml b/node_modules/beautify/.travis.yml deleted file mode 100644 index d8dbc8f9..00000000 --- a/node_modules/beautify/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -sudo: false -node_js: - - "4" - - "5" - - "6" - - "node" diff --git a/node_modules/beautify/LICENSE b/node_modules/beautify/LICENSE deleted file mode 100644 index 895e46c9..00000000 --- a/node_modules/beautify/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Beautify CSS/JS/JSON/HTML/XML from files or from pipe - -Copyright © 2016 Konstantin Gorodinskiy - -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/beautify/README.md b/node_modules/beautify/README.md deleted file mode 100644 index dc5ace60..00000000 --- a/node_modules/beautify/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Beautify -![build](https://travis-ci.org/gko/beautify.svg?branch=master) -[![Dependency Status](https://www.versioneye.com/user/projects/57f1c07b9907da004fa9a784/badge.svg?style=flat-square)](https://www.versioneye.com/user/projects/57f1c07b9907da004fa9a784) -[![npm version](https://badge.fury.io/js/beautify.svg)](https://badge.fury.io/js/beautify) - -Beautify CSS/JS/JSON/HTML/XML formats - -## Installation - -```bash -npm i beautify -g -``` - -## Usage - -beautify [options]: - --h, --help output usage information - --V, --version output the version number - --f, --format input format.(optional) json/xml/html/js/css - --o, --output output file or folder - -examles: -```bash -beautify -o output.html ./test.html -``` - -```bash -curl -L https://raw.githubusercontent.com/gko/beautify/master/test/mock/test1.json | beautify -``` - -```bash -echo 'body{width: "200px"}' | beautify -f css -``` - -You can also use it from node: - -```javascript -const beautify = require('beautify'); - -beautify(`{"a":1}`, {format: 'json'}) -``` - -## Tests - -To run tests you simply need to do: -```bash -npm run test -``` - -## License - -[MIT](http://opensource.org/licenses/MIT) - -Copyright (c) 2016 Konstantin Gorodinskiy \ No newline at end of file diff --git a/node_modules/beautify/bin/beautify.js b/node_modules/beautify/bin/beautify.js deleted file mode 100755 index d9fd19d3..00000000 --- a/node_modules/beautify/bin/beautify.js +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/env node - -'use strict'; - -const app = require('commander'); -const cfg = require('../package.json'); -const beautify = require('../index'); -const path = require('path'); -const fs = require('fs'); - -app.version(cfg.version) - .option('-f, --format ', 'input format.(optional)', /^(css|json|js|html|xml)$/, 'json') - .option('-o, --output ', 'output file or folder') - .description('prettify js/json, html/xml or css') - -app.parse(process.argv); - -let write = (p, data) => new Promise((res, rej) => { - console.log(path.resolve(p)); - fs.writeFile(path.resolve(p), data, 'utf8', err => { - if (err) return rej(err); - - return res(); - }); -}); - -let err = err => console.log(err); -let output = o => { - if (!app.output) { - console.log(o); - } else { - fs.lstat(path.resolve(app.output), (err, stat) => { - if(!err) { - if (stat.isDirectory()) { - Promise.all(app.args.map(f => write(app.output + '/' + path.basename(f), o))) - .catch(err); - } else { - // TODO this one still not very clear - write(app.output, o).catch(err); - } - } else { - // if we have many files it's evident - // that user wants to create folder and not rewrite one file - // with output - if (app.args.length > 1) { - fs.mkdir(path.resolve(app.output), err => { - if (!err) { - Promise.all(app.args.map(f => write(app.output + '/' + path.basename(f), o))) - .catch(err); - } else { - console.log(err); - } - }); - } else { - write(app.output, o).catch(err); - } - } - }); - } -}; - -if(app.args.length) { - fs.readFile(app.args[0], 'utf8', (err, data) => { - if (err) throw err; - - let b = beautify(data, { - format: (app.format||path.extname(app.args[0]).substring(1)).toLowerCase() - }); - - output(b); - }); -} else { - let data = ''; - - process.stdin.resume(); - process.stdin.setEncoding('utf8'); - - process.stdin.on('data', function(chunk) { - data += chunk; - }); - - process.stdin.on('end', function() { - let b = beautify(data, { - format: app.format.toLowerCase() - }); - - output(b); - }); -} diff --git a/node_modules/beautify/index.js b/node_modules/beautify/index.js deleted file mode 100644 index ab2ef026..00000000 --- a/node_modules/beautify/index.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const jsBeautify = require('js-beautify').js_beautify; -const cssbeautify = require('cssbeautify'); -const html = require('html').prettyPrint; - -let files = []; - -let clean = data => { - if (~['"', "'"].indexOf(data[0]) && - ~['"', "'"].indexOf(data[data.length - 1]) && - data[0] === data[data.length - 1] - ) { - return data.substring(1, data.length - 1); - } - - return data; -}; - -let beautify = (data, o) => { - if (!data || !data.length) return ''; - - data = clean(data.trim()); - - switch (o.format) { - case 'css': - return cssbeautify(data, { - indent: ' ', - autosemicolon: true - }); - case 'json': - case 'js': - return jsBeautify(data, { - indent_size: 4 - }); - case 'html': - case 'xml': - return html(data); - } -}; - -module.exports = beautify; \ No newline at end of file diff --git a/node_modules/beautify/package.json b/node_modules/beautify/package.json deleted file mode 100644 index 7ce51b36..00000000 --- a/node_modules/beautify/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "_args": [ - [ - "beautify@0.0.8", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "beautify@0.0.8", - "_id": "beautify@0.0.8", - "_inBundle": false, - "_integrity": "sha1-5P91XCzVZyfeDMwebMXTygxSCI0=", - "_location": "/beautify", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "beautify@0.0.8", - "name": "beautify", - "escapedName": "beautify", - "rawSpec": "0.0.8", - "saveSpec": null, - "fetchSpec": "0.0.8" - }, - "_requiredBy": [ - "/" - ], - "_resolved": "https://registry.npmjs.org/beautify/-/beautify-0.0.8.tgz", - "_spec": "0.0.8", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Konstantin Gorodinskiy", - "email": "main@konstantin.io" - }, - "bin": { - "beautify": "./bin/beautify.js" - }, - "bugs": { - "url": "https://github.com/gko/beautify/issues" - }, - "dependencies": { - "cssbeautify": "^0.3.1", - "html": "^1.0.0", - "js-beautify": "^1.6.4" - }, - "description": "beautify whatever", - "devDependencies": { - "commander": "^2.9.0", - "mocha": "^3.1.0" - }, - "homepage": "https://github.com/gko/beautify#readme", - "keywords": [ - "json", - "js", - "css", - "html", - "xml", - "prettify", - "beautify" - ], - "license": "MIT", - "main": "index.js", - "name": "beautify", - "repository": { - "type": "git", - "url": "git+https://github.com/gko/beautify.git" - }, - "scripts": { - "test": "_mocha test/test.js" - }, - "version": "0.0.8" -} diff --git a/node_modules/beautify/test/mock/test1.json b/node_modules/beautify/test/mock/test1.json deleted file mode 100644 index 0187f3b0..00000000 --- a/node_modules/beautify/test/mock/test1.json +++ /dev/null @@ -1 +0,0 @@ -{"a":1} diff --git a/node_modules/beautify/test/mock/test2.json b/node_modules/beautify/test/mock/test2.json deleted file mode 100644 index 8d21d7b5..00000000 --- a/node_modules/beautify/test/mock/test2.json +++ /dev/null @@ -1 +0,0 @@ -{"b":2} diff --git a/node_modules/beautify/test/mock2/test3.json b/node_modules/beautify/test/mock2/test3.json deleted file mode 100644 index 0187f3b0..00000000 --- a/node_modules/beautify/test/mock2/test3.json +++ /dev/null @@ -1 +0,0 @@ -{"a":1} diff --git a/node_modules/beautify/test/mock2/test4.json b/node_modules/beautify/test/mock2/test4.json deleted file mode 100644 index 8d21d7b5..00000000 --- a/node_modules/beautify/test/mock2/test4.json +++ /dev/null @@ -1 +0,0 @@ -{"b":2} diff --git a/node_modules/beautify/test/test.html b/node_modules/beautify/test/test.html deleted file mode 100644 index ac563463..00000000 --- a/node_modules/beautify/test/test.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - -

test123

- - - \ No newline at end of file diff --git a/node_modules/beautify/test/test.js b/node_modules/beautify/test/test.js deleted file mode 100644 index 64bfc065..00000000 --- a/node_modules/beautify/test/test.js +++ /dev/null @@ -1,101 +0,0 @@ -'use strict'; - -const exec = c => require('child_process').execSync(c).toString(); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -let cmd = `node ${path.resolve(__dirname+'/../bin/beautify')}`; - -describe('CLI', function() { - it('should beautify css', function() { - assert.equal(exec(`echo "html{color:white}body{border: '1px'}" | ${cmd} -f css`), -`html { - color: white; -} - -body { - border: '1px'; -} -` - ); - }); - - it('should add semicolons to css', function() { - assert.equal(exec(`echo "body{color:white}" | ${cmd} -f css`), -`body { - color: white; -} -` - ); - }); - - it('should beautify JSON', function() { - assert.equal(exec(`echo '{"color":"white","a":[1,2,3, {"a":1}]}' | ${cmd}`), -`{ - "color": "white", - "a": [1, 2, 3, { - "a": 1 - }] -} -` - ); - }); - - it('should beautify html', function() { - assert.equal(exec(`echo "

test

" | ${cmd} -f html`), -` - - - - - -

test

- - - -` - ); - }); - - it('should correctly save file', function() { - exec(`echo "

test

" | ${cmd} -f html -o ./test/test.html`); - assert.equal(fs.readFileSync('./test/test.html', 'utf8'), -` - - - - - -

test

- - -` - ); - }); - - it('should correctly update file', function() { - exec(`echo "

test123

" | ${cmd} -f html -o ./test/test.html`); - assert.equal(fs.readFileSync('./test/test.html', 'utf8'), -` - - - - - -

test123

- - -` - ); - }); - - it('should create folder when working with multiple files', function() { - exec(`${cmd} -o ./test/test2 ./test/mock/test1.json ./test/mock/test2.json`); - assert.deepEqual(fs.readdirSync('./test/test2'), ['test1.json', 'test2.json']); - }); - - it('should update folder contents', function() { - exec(`${cmd} -o ./test/test2 ./test/mock2/test3.json ./test/mock2/test4.json`); - assert.deepEqual(fs.readdirSync('./test/test2'), ['test1.json', 'test2.json','test3.json', 'test4.json']); - }); -}); diff --git a/node_modules/beautify/test/test2/test1.json b/node_modules/beautify/test/test2/test1.json deleted file mode 100644 index 6789fb1d..00000000 --- a/node_modules/beautify/test/test2/test1.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a": 1 -} \ No newline at end of file diff --git a/node_modules/beautify/test/test2/test2.json b/node_modules/beautify/test/test2/test2.json deleted file mode 100644 index 6789fb1d..00000000 --- a/node_modules/beautify/test/test2/test2.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a": 1 -} \ No newline at end of file diff --git a/node_modules/beautify/test/test2/test3.json b/node_modules/beautify/test/test2/test3.json deleted file mode 100644 index 6789fb1d..00000000 --- a/node_modules/beautify/test/test2/test3.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a": 1 -} \ No newline at end of file diff --git a/node_modules/beautify/test/test2/test4.json b/node_modules/beautify/test/test2/test4.json deleted file mode 100644 index 6789fb1d..00000000 --- a/node_modules/beautify/test/test2/test4.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "a": 1 -} \ No newline at end of file diff --git a/node_modules/beautify/test1.json b/node_modules/beautify/test1.json deleted file mode 100644 index 929c05d7..00000000 --- a/node_modules/beautify/test1.json +++ /dev/null @@ -1 +0,0 @@ -404: Not Found diff --git a/node_modules/brace-expansion/LICENSE b/node_modules/brace-expansion/LICENSE deleted file mode 100644 index de322667..00000000 --- a/node_modules/brace-expansion/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2013 Julian Gruber - -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/brace-expansion/README.md b/node_modules/brace-expansion/README.md deleted file mode 100644 index 6b4e0e16..00000000 --- a/node_modules/brace-expansion/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# brace-expansion - -[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), -as known from sh/bash, in JavaScript. - -[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) -[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) -[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) - -[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) - -## Example - -```js -var expand = require('brace-expansion'); - -expand('file-{a,b,c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('-v{,,}') -// => ['-v', '-v', '-v'] - -expand('file{0..2}.jpg') -// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] - -expand('file-{a..c}.jpg') -// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] - -expand('file{2..0}.jpg') -// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] - -expand('file{0..4..2}.jpg') -// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] - -expand('file-{a..e..2}.jpg') -// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] - -expand('file{00..10..5}.jpg') -// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] - -expand('{{A..C},{a..c}}') -// => ['A', 'B', 'C', 'a', 'b', 'c'] - -expand('ppp{,config,oe{,conf}}') -// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] -``` - -## API - -```js -var expand = require('brace-expansion'); -``` - -### var expanded = expand(str) - -Return an array of all possible and valid expansions of `str`. If none are -found, `[str]` is returned. - -Valid expansions are: - -```js -/^(.*,)+(.+)?$/ -// {a,b,...} -``` - -A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -A numeric sequence from `x` to `y` inclusive, with optional increment. -If `x` or `y` start with a leading `0`, all the numbers will be padded -to have equal length. Negative numbers and backwards iteration work too. - -```js -/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ -// {x..y[..incr]} -``` - -An alphabetic sequence from `x` to `y` inclusive, with optional increment. -`x` and `y` must be exactly one character, and if given, `incr` must be a -number. - -For compatibility reasons, the string `${` is not eligible for brace expansion. - -## Installation - -With [npm](https://npmjs.org) do: - -```bash -npm install brace-expansion -``` - -## Contributors - -- [Julian Gruber](https://github.com/juliangruber) -- [Isaac Z. Schlueter](https://github.com/isaacs) - -## Sponsors - -This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! - -Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! - -## 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/brace-expansion/index.js b/node_modules/brace-expansion/index.js deleted file mode 100644 index 0478be81..00000000 --- a/node_modules/brace-expansion/index.js +++ /dev/null @@ -1,201 +0,0 @@ -var concatMap = require('concat-map'); -var balanced = require('balanced-match'); - -module.exports = expandTop; - -var escSlash = '\0SLASH'+Math.random()+'\0'; -var escOpen = '\0OPEN'+Math.random()+'\0'; -var escClose = '\0CLOSE'+Math.random()+'\0'; -var escComma = '\0COMMA'+Math.random()+'\0'; -var escPeriod = '\0PERIOD'+Math.random()+'\0'; - -function numeric(str) { - return parseInt(str, 10) == str - ? parseInt(str, 10) - : str.charCodeAt(0); -} - -function escapeBraces(str) { - return str.split('\\\\').join(escSlash) - .split('\\{').join(escOpen) - .split('\\}').join(escClose) - .split('\\,').join(escComma) - .split('\\.').join(escPeriod); -} - -function unescapeBraces(str) { - return str.split(escSlash).join('\\') - .split(escOpen).join('{') - .split(escClose).join('}') - .split(escComma).join(',') - .split(escPeriod).join('.'); -} - - -// Basically just str.split(","), but handling cases -// where we have nested braced sections, which should be -// treated as individual members, like {a,{b,c},d} -function parseCommaParts(str) { - if (!str) - return ['']; - - var parts = []; - var m = balanced('{', '}', str); - - if (!m) - return str.split(','); - - var pre = m.pre; - var body = m.body; - var post = m.post; - var p = pre.split(','); - - p[p.length-1] += '{' + body + '}'; - var postParts = parseCommaParts(post); - if (post.length) { - p[p.length-1] += postParts.shift(); - p.push.apply(p, postParts); - } - - parts.push.apply(parts, p); - - return parts; -} - -function expandTop(str) { - if (!str) - return []; - - // I don't know why Bash 4.3 does this, but it does. - // Anything starting with {} will have the first two bytes preserved - // but *only* at the top level, so {},a}b will not expand to anything, - // but a{},b}c will be expanded to [a}c,abc]. - // One could argue that this is a bug in Bash, but since the goal of - // this module is to match Bash's rules, we escape a leading {} - if (str.substr(0, 2) === '{}') { - str = '\\{\\}' + str.substr(2); - } - - return expand(escapeBraces(str), true).map(unescapeBraces); -} - -function identity(e) { - return e; -} - -function embrace(str) { - return '{' + str + '}'; -} -function isPadded(el) { - return /^-?0\d/.test(el); -} - -function lte(i, y) { - return i <= y; -} -function gte(i, y) { - return i >= y; -} - -function expand(str, isTop) { - var expansions = []; - - var m = balanced('{', '}', str); - if (!m || /\$$/.test(m.pre)) return [str]; - - var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); - var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); - var isSequence = isNumericSequence || isAlphaSequence; - var isOptions = m.body.indexOf(',') >= 0; - if (!isSequence && !isOptions) { - // {a},b} - if (m.post.match(/,.*\}/)) { - str = m.pre + '{' + m.body + escClose + m.post; - return expand(str); - } - return [str]; - } - - var n; - if (isSequence) { - n = m.body.split(/\.\./); - } else { - n = parseCommaParts(m.body); - if (n.length === 1) { - // x{{a,b}}y ==> x{a}y x{b}y - n = expand(n[0], false).map(embrace); - if (n.length === 1) { - var post = m.post.length - ? expand(m.post, false) - : ['']; - return post.map(function(p) { - return m.pre + n[0] + p; - }); - } - } - } - - // at this point, n is the parts, and we know it's not a comma set - // with a single entry. - - // no need to expand pre, since it is guaranteed to be free of brace-sets - var pre = m.pre; - var post = m.post.length - ? expand(m.post, false) - : ['']; - - var N; - - if (isSequence) { - var x = numeric(n[0]); - var y = numeric(n[1]); - var width = Math.max(n[0].length, n[1].length) - var incr = n.length == 3 - ? Math.abs(numeric(n[2])) - : 1; - var test = lte; - var reverse = y < x; - if (reverse) { - incr *= -1; - test = gte; - } - var pad = n.some(isPadded); - - N = []; - - for (var i = x; test(i, y); i += incr) { - var c; - if (isAlphaSequence) { - c = String.fromCharCode(i); - if (c === '\\') - c = ''; - } else { - c = String(i); - if (pad) { - var need = width - c.length; - if (need > 0) { - var z = new Array(need + 1).join('0'); - if (i < 0) - c = '-' + z + c.slice(1); - else - c = z + c; - } - } - } - N.push(c); - } - } else { - N = concatMap(n, function(el) { return expand(el, false) }); - } - - for (var j = 0; j < N.length; j++) { - for (var k = 0; k < post.length; k++) { - var expansion = pre + N[j] + post[k]; - if (!isTop || isSequence || expansion) - expansions.push(expansion); - } - } - - return expansions; -} - diff --git a/node_modules/brace-expansion/package.json b/node_modules/brace-expansion/package.json deleted file mode 100644 index beaba753..00000000 --- a/node_modules/brace-expansion/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "_args": [ - [ - "brace-expansion@1.1.11", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "brace-expansion@1.1.11", - "_id": "brace-expansion@1.1.11", - "_inBundle": false, - "_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "_location": "/brace-expansion", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "brace-expansion@1.1.11", - "name": "brace-expansion", - "escapedName": "brace-expansion", - "rawSpec": "1.1.11", - "saveSpec": null, - "fetchSpec": "1.1.11" - }, - "_requiredBy": [ - "/minimatch" - ], - "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "_spec": "1.1.11", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "bugs": { - "url": "https://github.com/juliangruber/brace-expansion/issues" - }, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "description": "Brace expansion as known from sh/bash", - "devDependencies": { - "matcha": "^0.7.0", - "tape": "^4.6.0" - }, - "homepage": "https://github.com/juliangruber/brace-expansion", - "keywords": [], - "license": "MIT", - "main": "index.js", - "name": "brace-expansion", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/brace-expansion.git" - }, - "scripts": { - "bench": "matcha test/perf/bench.js", - "gentest": "bash test/generate.sh", - "test": "tape test/*.js" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/20..latest", - "firefox/nightly", - "chrome/25..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "version": "1.1.11" -} diff --git a/node_modules/buffer-from/LICENSE b/node_modules/buffer-from/LICENSE deleted file mode 100644 index e4bf1d69..00000000 --- a/node_modules/buffer-from/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016, 2018 Linus Unnebäck - -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/buffer-from/index.js b/node_modules/buffer-from/index.js deleted file mode 100644 index d92a83d0..00000000 --- a/node_modules/buffer-from/index.js +++ /dev/null @@ -1,69 +0,0 @@ -var toString = Object.prototype.toString - -var isModern = ( - typeof Buffer.alloc === 'function' && - typeof Buffer.allocUnsafe === 'function' && - typeof Buffer.from === 'function' -) - -function isArrayBuffer (input) { - return toString.call(input).slice(8, -1) === 'ArrayBuffer' -} - -function fromArrayBuffer (obj, byteOffset, length) { - byteOffset >>>= 0 - - var maxLength = obj.byteLength - byteOffset - - if (maxLength < 0) { - throw new RangeError("'offset' is out of bounds") - } - - if (length === undefined) { - length = maxLength - } else { - length >>>= 0 - - if (length > maxLength) { - throw new RangeError("'length' is out of bounds") - } - } - - return isModern - ? Buffer.from(obj.slice(byteOffset, byteOffset + length)) - : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length))) -} - -function fromString (string, encoding) { - if (typeof encoding !== 'string' || encoding === '') { - encoding = 'utf8' - } - - if (!Buffer.isEncoding(encoding)) { - throw new TypeError('"encoding" must be a valid string encoding') - } - - return isModern - ? Buffer.from(string, encoding) - : new Buffer(string, encoding) -} - -function bufferFrom (value, encodingOrOffset, length) { - if (typeof value === 'number') { - throw new TypeError('"value" argument must not be a number') - } - - if (isArrayBuffer(value)) { - return fromArrayBuffer(value, encodingOrOffset, length) - } - - if (typeof value === 'string') { - return fromString(value, encodingOrOffset) - } - - return isModern - ? Buffer.from(value) - : new Buffer(value) -} - -module.exports = bufferFrom diff --git a/node_modules/buffer-from/package.json b/node_modules/buffer-from/package.json deleted file mode 100644 index e8c1263c..00000000 --- a/node_modules/buffer-from/package.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "_args": [ - [ - "buffer-from@1.1.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "buffer-from@1.1.1", - "_id": "buffer-from@1.1.1", - "_inBundle": false, - "_integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "_location": "/buffer-from", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "buffer-from@1.1.1", - "name": "buffer-from", - "escapedName": "buffer-from", - "rawSpec": "1.1.1", - "saveSpec": null, - "fetchSpec": "1.1.1" - }, - "_requiredBy": [ - "/concat-stream" - ], - "_resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "_spec": "1.1.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "bugs": { - "url": "https://github.com/LinusU/buffer-from/issues" - }, - "description": "A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available.", - "devDependencies": { - "standard": "^7.1.2" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/LinusU/buffer-from#readme", - "keywords": [ - "buffer", - "buffer from" - ], - "license": "MIT", - "name": "buffer-from", - "repository": { - "type": "git", - "url": "git+https://github.com/LinusU/buffer-from.git" - }, - "scripts": { - "test": "standard && node test" - }, - "version": "1.1.1" -} diff --git a/node_modules/buffer-from/readme.md b/node_modules/buffer-from/readme.md deleted file mode 100644 index 9880a558..00000000 --- a/node_modules/buffer-from/readme.md +++ /dev/null @@ -1,69 +0,0 @@ -# Buffer From - -A [ponyfill](https://ponyfill.com) for `Buffer.from`, uses native implementation if available. - -## Installation - -```sh -npm install --save buffer-from -``` - -## Usage - -```js -const bufferFrom = require('buffer-from') - -console.log(bufferFrom([1, 2, 3, 4])) -//=> - -const arr = new Uint8Array([1, 2, 3, 4]) -console.log(bufferFrom(arr.buffer, 1, 2)) -//=> - -console.log(bufferFrom('test', 'utf8')) -//=> - -const buf = bufferFrom('test') -console.log(bufferFrom(buf)) -//=> -``` - -## API - -### bufferFrom(array) - -- `array` <Array> - -Allocates a new `Buffer` using an `array` of octets. - -### bufferFrom(arrayBuffer[, byteOffset[, length]]) - -- `arrayBuffer` <ArrayBuffer> The `.buffer` property of a TypedArray or ArrayBuffer -- `byteOffset` <Integer> Where to start copying from `arrayBuffer`. **Default:** `0` -- `length` <Integer> How many bytes to copy from `arrayBuffer`. **Default:** `arrayBuffer.length - byteOffset` - -When passed a reference to the `.buffer` property of a TypedArray instance, the -newly created `Buffer` will share the same allocated memory as the TypedArray. - -The optional `byteOffset` and `length` arguments specify a memory range within -the `arrayBuffer` that will be shared by the `Buffer`. - -### bufferFrom(buffer) - -- `buffer` <Buffer> An existing `Buffer` to copy data from - -Copies the passed `buffer` data onto a new `Buffer` instance. - -### bufferFrom(string[, encoding]) - -- `string` <String> A string to encode. -- `encoding` <String> The encoding of `string`. **Default:** `'utf8'` - -Creates a new `Buffer` containing the given JavaScript string `string`. If -provided, the `encoding` parameter identifies the character encoding of -`string`. - -## See also - -- [buffer-alloc](https://github.com/LinusU/buffer-alloc) A ponyfill for `Buffer.alloc` -- [buffer-alloc-unsafe](https://github.com/LinusU/buffer-alloc-unsafe) A ponyfill for `Buffer.allocUnsafe` diff --git a/node_modules/commander/CHANGELOG.md b/node_modules/commander/CHANGELOG.md deleted file mode 100644 index 953ef21b..00000000 --- a/node_modules/commander/CHANGELOG.md +++ /dev/null @@ -1,408 +0,0 @@ - -2.20.0 / 2019-04-02 -================== - - * fix: resolve symbolic links completely when hunting for subcommands (#935) - * Update index.d.ts (#930) - * Update Readme.md (#924) - * Remove --save option as it isn't required anymore (#918) - * Add link to the license file (#900) - * Added example of receiving args from options (#858) - * Added missing semicolon (#882) - * Add extension to .eslintrc (#876) - -2.19.0 / 2018-10-02 -================== - - * Removed newline after Options and Commands headers (#864) - * Bugfix - Error output (#862) - * Fix to change default value to string (#856) - -2.18.0 / 2018-09-07 -================== - - * Standardize help output (#853) - * chmod 644 travis.yml (#851) - * add support for execute typescript subcommand via ts-node (#849) - -2.17.1 / 2018-08-07 -================== - - * Fix bug in command emit (#844) - -2.17.0 / 2018-08-03 -================== - - * fixed newline output after help information (#833) - * Fix to emit the action even without command (#778) - * npm update (#823) - -2.16.0 / 2018-06-29 -================== - - * Remove Makefile and `test/run` (#821) - * Make 'npm test' run on Windows (#820) - * Add badge to display install size (#807) - * chore: cache node_modules (#814) - * chore: remove Node.js 4 (EOL), add Node.js 10 (#813) - * fixed typo in readme (#812) - * Fix types (#804) - * Update eslint to resolve vulnerabilities in lodash (#799) - * updated readme with custom event listeners. (#791) - * fix tests (#794) - -2.15.0 / 2018-03-07 -================== - - * Update downloads badge to point to graph of downloads over time instead of duplicating link to npm - * Arguments description - -2.14.1 / 2018-02-07 -================== - - * Fix typing of help function - -2.14.0 / 2018-02-05 -================== - - * only register the option:version event once - * Fixes issue #727: Passing empty string for option on command is set to undefined - * enable eqeqeq rule - * resolves #754 add linter configuration to project - * resolves #560 respect custom name for version option - * document how to override the version flag - * document using options per command - -2.13.0 / 2018-01-09 -================== - - * Do not print default for --no- - * remove trailing spaces in command help - * Update CI's Node.js to LTS and latest version - * typedefs: Command and Option types added to commander namespace - -2.12.2 / 2017-11-28 -================== - - * fix: typings are not shipped - -2.12.1 / 2017-11-23 -================== - - * Move @types/node to dev dependency - -2.12.0 / 2017-11-22 -================== - - * add attributeName() method to Option objects - * Documentation updated for options with --no prefix - * typings: `outputHelp` takes a string as the first parameter - * typings: use overloads - * feat(typings): update to match js api - * Print default value in option help - * Fix translation error - * Fail when using same command and alias (#491) - * feat(typings): add help callback - * fix bug when description is add after command with options (#662) - * Format js code - * Rename History.md to CHANGELOG.md (#668) - * feat(typings): add typings to support TypeScript (#646) - * use current node - -2.11.0 / 2017-07-03 -================== - - * Fix help section order and padding (#652) - * feature: support for signals to subcommands (#632) - * Fixed #37, --help should not display first (#447) - * Fix translation errors. (#570) - * Add package-lock.json - * Remove engines - * Upgrade package version - * Prefix events to prevent conflicts between commands and options (#494) - * Removing dependency on graceful-readlink - * Support setting name in #name function and make it chainable - * Add .vscode directory to .gitignore (Visual Studio Code metadata) - * Updated link to ruby commander in readme files - -2.10.0 / 2017-06-19 -================== - - * Update .travis.yml. drop support for older node.js versions. - * Fix require arguments in README.md - * On SemVer you do not start from 0.0.1 - * Add missing semi colon in readme - * Add save param to npm install - * node v6 travis test - * Update Readme_zh-CN.md - * Allow literal '--' to be passed-through as an argument - * Test subcommand alias help - * link build badge to master branch - * Support the alias of Git style sub-command - * added keyword commander for better search result on npm - * Fix Sub-Subcommands - * test node.js stable - * Fixes TypeError when a command has an option called `--description` - * Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets. - * Add chinese Readme file - -2.9.0 / 2015-10-13 -================== - - * Add option `isDefault` to set default subcommand #415 @Qix- - * Add callback to allow filtering or post-processing of help text #434 @djulien - * Fix `undefined` text in help information close #414 #416 @zhiyelee - -2.8.1 / 2015-04-22 -================== - - * Back out `support multiline description` Close #396 #397 - -2.8.0 / 2015-04-07 -================== - - * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee - * Fix bug in Git-style sub-commands #372 @zhiyelee - * Allow commands to be hidden from help #383 @tonylukasavage - * When git-style sub-commands are in use, yet none are called, display help #382 @claylo - * Add ability to specify arguments syntax for top-level command #258 @rrthomas - * Support multiline descriptions #208 @zxqfox - -2.7.1 / 2015-03-11 -================== - - * Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367. - -2.7.0 / 2015-03-09 -================== - - * Fix git-style bug when installed globally. Close #335 #349 @zhiyelee - * Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage - * Add support for camelCase on `opts()`. Close #353 @nkzawa - * Add node.js 0.12 and io.js to travis.yml - * Allow RegEx options. #337 @palanik - * Fixes exit code when sub-command failing. Close #260 #332 @pirelenito - * git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee - -2.6.0 / 2014-12-30 -================== - - * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee - * Add application description to the help msg. Close #112 @dalssoft - -2.5.1 / 2014-12-15 -================== - - * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee - -2.5.0 / 2014-10-24 -================== - - * add support for variadic arguments. Closes #277 @whitlockjc - -2.4.0 / 2014-10-17 -================== - - * fixed a bug on executing the coercion function of subcommands option. Closes #270 - * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage - * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage - * fixed a bug on subcommand name. Closes #248 @jonathandelgado - * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr - -2.3.0 / 2014-07-16 -================== - - * add command alias'. Closes PR #210 - * fix: Typos. Closes #99 - * fix: Unused fs module. Closes #217 - -2.2.0 / 2014-03-29 -================== - - * add passing of previous option value - * fix: support subcommands on windows. Closes #142 - * Now the defaultValue passed as the second argument of the coercion function. - -2.1.0 / 2013-11-21 -================== - - * add: allow cflag style option params, unit test, fixes #174 - -2.0.0 / 2013-07-18 -================== - - * remove input methods (.prompt, .confirm, etc) - -1.3.2 / 2013-07-18 -================== - - * add support for sub-commands to co-exist with the original command - -1.3.1 / 2013-07-18 -================== - - * add quick .runningCommand hack so you can opt-out of other logic when running a sub command - -1.3.0 / 2013-07-09 -================== - - * add EACCES error handling - * fix sub-command --help - -1.2.0 / 2013-06-13 -================== - - * allow "-" hyphen as an option argument - * support for RegExp coercion - -1.1.1 / 2012-11-20 -================== - - * add more sub-command padding - * fix .usage() when args are present. Closes #106 - -1.1.0 / 2012-11-16 -================== - - * add git-style executable subcommand support. Closes #94 - -1.0.5 / 2012-10-09 -================== - - * fix `--name` clobbering. Closes #92 - * fix examples/help. Closes #89 - -1.0.4 / 2012-09-03 -================== - - * add `outputHelp()` method. - -1.0.3 / 2012-08-30 -================== - - * remove invalid .version() defaulting - -1.0.2 / 2012-08-24 -================== - - * add `--foo=bar` support [arv] - * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus] - -1.0.1 / 2012-08-03 -================== - - * fix issue #56 - * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode()) - -1.0.0 / 2012-07-05 -================== - - * add support for optional option descriptions - * add defaulting of `.version()` to package.json's version - -0.6.1 / 2012-06-01 -================== - - * Added: append (yes or no) on confirmation - * Added: allow node.js v0.7.x - -0.6.0 / 2012-04-10 -================== - - * Added `.prompt(obj, callback)` support. Closes #49 - * Added default support to .choose(). Closes #41 - * Fixed the choice example - -0.5.1 / 2011-12-20 -================== - - * Fixed `password()` for recent nodes. Closes #36 - -0.5.0 / 2011-12-04 -================== - - * Added sub-command option support [itay] - -0.4.3 / 2011-12-04 -================== - - * Fixed custom help ordering. Closes #32 - -0.4.2 / 2011-11-24 -================== - - * Added travis support - * Fixed: line-buffered input automatically trimmed. Closes #31 - -0.4.1 / 2011-11-18 -================== - - * Removed listening for "close" on --help - -0.4.0 / 2011-11-15 -================== - - * Added support for `--`. Closes #24 - -0.3.3 / 2011-11-14 -================== - - * Fixed: wait for close event when writing help info [Jerry Hamlet] - -0.3.2 / 2011-11-01 -================== - - * Fixed long flag definitions with values [felixge] - -0.3.1 / 2011-10-31 -================== - - * Changed `--version` short flag to `-V` from `-v` - * Changed `.version()` so it's configurable [felixge] - -0.3.0 / 2011-10-31 -================== - - * Added support for long flags only. Closes #18 - -0.2.1 / 2011-10-24 -================== - - * "node": ">= 0.4.x < 0.7.0". Closes #20 - -0.2.0 / 2011-09-26 -================== - - * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] - -0.1.0 / 2011-08-24 -================== - - * Added support for custom `--help` output - -0.0.5 / 2011-08-18 -================== - - * Changed: when the user enters nothing prompt for password again - * Fixed issue with passwords beginning with numbers [NuckChorris] - -0.0.4 / 2011-08-15 -================== - - * Fixed `Commander#args` - -0.0.3 / 2011-08-15 -================== - - * Added default option value support - -0.0.2 / 2011-08-15 -================== - - * Added mask support to `Command#password(str[, mask], fn)` - * Added `Command#password(str, fn)` - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/commander/LICENSE b/node_modules/commander/LICENSE deleted file mode 100644 index 10f997ab..00000000 --- a/node_modules/commander/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2011 TJ Holowaychuk - -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/commander/Readme.md b/node_modules/commander/Readme.md deleted file mode 100644 index c846e7a2..00000000 --- a/node_modules/commander/Readme.md +++ /dev/null @@ -1,428 +0,0 @@ -# Commander.js - - -[![Build Status](https://api.travis-ci.org/tj/commander.js.svg?branch=master)](http://travis-ci.org/tj/commander.js) -[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) -[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) -[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) -[![Join the chat at https://gitter.im/tj/commander.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - - The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander). - [API documentation](http://tj.github.com/commander.js/) - - -## Installation - - $ npm install commander - -## Option parsing - -Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .version('0.1.0') - .option('-p, --peppers', 'Add peppers') - .option('-P, --pineapple', 'Add pineapple') - .option('-b, --bbq-sauce', 'Add bbq sauce') - .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') - .parse(process.argv); - -console.log('you ordered a pizza with:'); -if (program.peppers) console.log(' - peppers'); -if (program.pineapple) console.log(' - pineapple'); -if (program.bbqSauce) console.log(' - bbq'); -console.log(' - %s cheese', program.cheese); -``` - -Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. - -Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .option('--no-sauce', 'Remove sauce') - .parse(process.argv); - -console.log('you ordered a pizza'); -if (program.sauce) console.log(' with sauce'); -else console.log(' without sauce'); -``` - -To get string arguments from options you will need to use angle brackets <> for required inputs or square brackets [] for optional inputs. - -e.g. ```.option('-m --myarg [myVar]', 'my super cool description')``` - -Then to access the input if it was passed in. - -e.g. ```var myInput = program.myarg``` - -**NOTE**: If you pass a argument without using brackets the example above will return true and not the value passed in. - - -## Version option - -Calling the `version` implicitly adds the `-V` and `--version` options to the command. -When either of these options is present, the command prints the version number and exits. - - $ ./examples/pizza -V - 0.0.1 - -If you want your program to respond to the `-v` option instead of the `-V` option, simply pass custom flags to the `version` method using the same syntax as the `option` method. - -```js -program - .version('0.0.1', '-v, --version') -``` - -The version flags can be named anything, but the long option is required. - -## Command-specific options - -You can attach options to a command. - -```js -#!/usr/bin/env node - -var program = require('commander'); - -program - .command('rm
') - .option('-r, --recursive', 'Remove recursively') - .action(function (dir, cmd) { - console.log('remove ' + dir + (cmd.recursive ? ' recursively' : '')) - }) - -program.parse(process.argv) -``` - -A command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated. - -## Coercion - -```js -function range(val) { - return val.split('..').map(Number); -} - -function list(val) { - return val.split(','); -} - -function collect(val, memo) { - memo.push(val); - return memo; -} - -function increaseVerbosity(v, total) { - return total + 1; -} - -program - .version('0.1.0') - .usage('[options] ') - .option('-i, --integer ', 'An integer argument', parseInt) - .option('-f, --float ', 'A float argument', parseFloat) - .option('-r, --range ..', 'A range', range) - .option('-l, --list ', 'A list', list) - .option('-o, --optional [value]', 'An optional value') - .option('-c, --collect [value]', 'A repeatable value', collect, []) - .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0) - .parse(process.argv); - -console.log(' int: %j', program.integer); -console.log(' float: %j', program.float); -console.log(' optional: %j', program.optional); -program.range = program.range || []; -console.log(' range: %j..%j', program.range[0], program.range[1]); -console.log(' list: %j', program.list); -console.log(' collect: %j', program.collect); -console.log(' verbosity: %j', program.verbose); -console.log(' args: %j', program.args); -``` - -## Regular Expression -```js -program - .version('0.1.0') - .option('-s --size ', 'Pizza size', /^(large|medium|small)$/i, 'medium') - .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i) - .parse(process.argv); - -console.log(' size: %j', program.size); -console.log(' drink: %j', program.drink); -``` - -## Variadic arguments - - The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to - append `...` to the argument name. Here is an example: - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .version('0.1.0') - .command('rmdir [otherDirs...]') - .action(function (dir, otherDirs) { - console.log('rmdir %s', dir); - if (otherDirs) { - otherDirs.forEach(function (oDir) { - console.log('rmdir %s', oDir); - }); - } - }); - -program.parse(process.argv); -``` - - An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed - to your action as demonstrated above. - -## Specify the argument syntax - -```js -#!/usr/bin/env node - -var program = require('commander'); - -program - .version('0.1.0') - .arguments(' [env]') - .action(function (cmd, env) { - cmdValue = cmd; - envValue = env; - }); - -program.parse(process.argv); - -if (typeof cmdValue === 'undefined') { - console.error('no command given!'); - process.exit(1); -} -console.log('command:', cmdValue); -console.log('environment:', envValue || "no environment given"); -``` -Angled brackets (e.g. ``) indicate required input. Square brackets (e.g. `[env]`) indicate optional input. - -## Git-style sub-commands - -```js -// file: ./examples/pm -var program = require('commander'); - -program - .version('0.1.0') - .command('install [name]', 'install one or more packages') - .command('search [query]', 'search with optional query') - .command('list', 'list packages installed', {isDefault: true}) - .parse(process.argv); -``` - -When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools. -The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`. - -Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the subcommand from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified. - -If the program is designed to be installed globally, make sure the executables have proper modes, like `755`. - -### `--harmony` - -You can enable `--harmony` option in two ways: -* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern. -* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process. - -## Automated --help - - The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: - -``` -$ ./examples/pizza --help -Usage: pizza [options] - -An application for pizzas ordering - -Options: - -h, --help output usage information - -V, --version output the version number - -p, --peppers Add peppers - -P, --pineapple Add pineapple - -b, --bbq Add bbq sauce - -c, --cheese Add the specified type of cheese [marble] - -C, --no-cheese You do not want any cheese -``` - -## Custom help - - You can display arbitrary `-h, --help` information - by listening for "--help". Commander will automatically - exit once you are done so that the remainder of your program - does not execute causing undesired behaviors, for example - in the following executable "stuff" will not output when - `--help` is used. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .version('0.1.0') - .option('-f, --foo', 'enable some foo') - .option('-b, --bar', 'enable some bar') - .option('-B, --baz', 'enable some baz'); - -// must be before .parse() since -// node's emit() is immediate - -program.on('--help', function(){ - console.log('') - console.log('Examples:'); - console.log(' $ custom-help --help'); - console.log(' $ custom-help -h'); -}); - -program.parse(process.argv); - -console.log('stuff'); -``` - -Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run: - -``` -Usage: custom-help [options] - -Options: - -h, --help output usage information - -V, --version output the version number - -f, --foo enable some foo - -b, --bar enable some bar - -B, --baz enable some baz - -Examples: - $ custom-help --help - $ custom-help -h -``` - -## .outputHelp(cb) - -Output help information without exiting. -Optional callback cb allows post-processing of help text before it is displayed. - -If you want to display help by default (e.g. if no command was provided), you can use something like: - -```js -var program = require('commander'); -var colors = require('colors'); - -program - .version('0.1.0') - .command('getstream [url]', 'get stream URL') - .parse(process.argv); - -if (!process.argv.slice(2).length) { - program.outputHelp(make_red); -} - -function make_red(txt) { - return colors.red(txt); //display the help text in red on the console -} -``` - -## .help(cb) - - Output help information and exit immediately. - Optional callback cb allows post-processing of help text before it is displayed. - - -## Custom event listeners - You can execute custom actions by listening to command and option events. - -```js -program.on('option:verbose', function () { - process.env.VERBOSE = this.verbose; -}); - -// error on unknown commands -program.on('command:*', function () { - console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' ')); - process.exit(1); -}); -``` - -## Examples - -```js -var program = require('commander'); - -program - .version('0.1.0') - .option('-C, --chdir ', 'change the working directory') - .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - .option('-T, --no-tests', 'ignore test hook'); - -program - .command('setup [env]') - .description('run setup commands for all envs') - .option("-s, --setup_mode [mode]", "Which setup mode to use") - .action(function(env, options){ - var mode = options.setup_mode || "normal"; - env = env || 'all'; - console.log('setup for %s env(s) with %s mode', env, mode); - }); - -program - .command('exec ') - .alias('ex') - .description('execute the given remote cmd') - .option("-e, --exec_mode ", "Which exec mode to use") - .action(function(cmd, options){ - console.log('exec "%s" using %s mode', cmd, options.exec_mode); - }).on('--help', function() { - console.log(''); - console.log('Examples:'); - console.log(''); - console.log(' $ deploy exec sequential'); - console.log(' $ deploy exec async'); - }); - -program - .command('*') - .action(function(env){ - console.log('deploying "%s"', env); - }); - -program.parse(process.argv); -``` - -More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. - -## License - -[MIT](https://github.com/tj/commander.js/blob/master/LICENSE) diff --git a/node_modules/commander/index.js b/node_modules/commander/index.js deleted file mode 100644 index 06173c1a..00000000 --- a/node_modules/commander/index.js +++ /dev/null @@ -1,1224 +0,0 @@ -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter; -var spawn = require('child_process').spawn; -var path = require('path'); -var dirname = path.dirname; -var basename = path.basename; -var fs = require('fs'); - -/** - * Inherit `Command` from `EventEmitter.prototype`. - */ - -require('util').inherits(Command, EventEmitter); - -/** - * Expose the root command. - */ - -exports = module.exports = new Command(); - -/** - * Expose `Command`. - */ - -exports.Command = Command; - -/** - * Expose `Option`. - */ - -exports.Option = Option; - -/** - * Initialize a new `Option` with the given `flags` and `description`. - * - * @param {String} flags - * @param {String} description - * @api public - */ - -function Option(flags, description) { - this.flags = flags; - this.required = flags.indexOf('<') >= 0; - this.optional = flags.indexOf('[') >= 0; - this.bool = flags.indexOf('-no-') === -1; - flags = flags.split(/[ ,|]+/); - if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); - this.long = flags.shift(); - this.description = description || ''; -} - -/** - * Return option name. - * - * @return {String} - * @api private - */ - -Option.prototype.name = function() { - return this.long - .replace('--', '') - .replace('no-', ''); -}; - -/** - * Return option name, in a camelcase format that can be used - * as a object attribute key. - * - * @return {String} - * @api private - */ - -Option.prototype.attributeName = function() { - return camelcase(this.name()); -}; - -/** - * Check if `arg` matches the short or long flag. - * - * @param {String} arg - * @return {Boolean} - * @api private - */ - -Option.prototype.is = function(arg) { - return this.short === arg || this.long === arg; -}; - -/** - * Initialize a new `Command`. - * - * @param {String} name - * @api public - */ - -function Command(name) { - this.commands = []; - this.options = []; - this._execs = {}; - this._allowUnknownOption = false; - this._args = []; - this._name = name || ''; -} - -/** - * Add command `name`. - * - * The `.action()` callback is invoked when the - * command `name` is specified via __ARGV__, - * and the remaining arguments are applied to the - * function for access. - * - * When the `name` is "*" an un-matched command - * will be passed as the first arg, followed by - * the rest of __ARGV__ remaining. - * - * Examples: - * - * program - * .version('0.0.1') - * .option('-C, --chdir ', 'change the working directory') - * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - * .option('-T, --no-tests', 'ignore test hook') - * - * program - * .command('setup') - * .description('run remote setup commands') - * .action(function() { - * console.log('setup'); - * }); - * - * program - * .command('exec ') - * .description('run the given remote command') - * .action(function(cmd) { - * console.log('exec "%s"', cmd); - * }); - * - * program - * .command('teardown [otherDirs...]') - * .description('run teardown commands') - * .action(function(dir, otherDirs) { - * console.log('dir "%s"', dir); - * if (otherDirs) { - * otherDirs.forEach(function (oDir) { - * console.log('dir "%s"', oDir); - * }); - * } - * }); - * - * program - * .command('*') - * .description('deploy the given env') - * .action(function(env) { - * console.log('deploying "%s"', env); - * }); - * - * program.parse(process.argv); - * - * @param {String} name - * @param {String} [desc] for git-style sub-commands - * @return {Command} the new command - * @api public - */ - -Command.prototype.command = function(name, desc, opts) { - if (typeof desc === 'object' && desc !== null) { - opts = desc; - desc = null; - } - opts = opts || {}; - var args = name.split(/ +/); - var cmd = new Command(args.shift()); - - if (desc) { - cmd.description(desc); - this.executables = true; - this._execs[cmd._name] = true; - if (opts.isDefault) this.defaultExecutable = cmd._name; - } - cmd._noHelp = !!opts.noHelp; - this.commands.push(cmd); - cmd.parseExpectedArgs(args); - cmd.parent = this; - - if (desc) return this; - return cmd; -}; - -/** - * Define argument syntax for the top-level command. - * - * @api public - */ - -Command.prototype.arguments = function(desc) { - return this.parseExpectedArgs(desc.split(/ +/)); -}; - -/** - * Add an implicit `help [cmd]` subcommand - * which invokes `--help` for the given command. - * - * @api private - */ - -Command.prototype.addImplicitHelpCommand = function() { - this.command('help [cmd]', 'display help for [cmd]'); -}; - -/** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @param {Array} args - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parseExpectedArgs = function(args) { - if (!args.length) return; - var self = this; - args.forEach(function(arg) { - var argDetails = { - required: false, - name: '', - variadic: false - }; - - switch (arg[0]) { - case '<': - argDetails.required = true; - argDetails.name = arg.slice(1, -1); - break; - case '[': - argDetails.name = arg.slice(1, -1); - break; - } - - if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') { - argDetails.variadic = true; - argDetails.name = argDetails.name.slice(0, -3); - } - if (argDetails.name) { - self._args.push(argDetails); - } - }); - return this; -}; - -/** - * Register callback `fn` for the command. - * - * Examples: - * - * program - * .command('help') - * .description('display verbose help') - * .action(function() { - * // output help here - * }); - * - * @param {Function} fn - * @return {Command} for chaining - * @api public - */ - -Command.prototype.action = function(fn) { - var self = this; - var listener = function(args, unknown) { - // Parse any so-far unknown options - args = args || []; - unknown = unknown || []; - - var parsed = self.parseOptions(unknown); - - // Output help if necessary - outputHelpIfNecessary(self, parsed.unknown); - - // If there are still any unknown options, then we simply - // die, unless someone asked for help, in which case we give it - // to them, and then we die. - if (parsed.unknown.length > 0) { - self.unknownOption(parsed.unknown[0]); - } - - // Leftover arguments need to be pushed back. Fixes issue #56 - if (parsed.args.length) args = parsed.args.concat(args); - - self._args.forEach(function(arg, i) { - if (arg.required && args[i] == null) { - self.missingArgument(arg.name); - } else if (arg.variadic) { - if (i !== self._args.length - 1) { - self.variadicArgNotLast(arg.name); - } - - args[i] = args.splice(i); - } - }); - - // Always append ourselves to the end of the arguments, - // to make sure we match the number of arguments the user - // expects - if (self._args.length) { - args[self._args.length] = self; - } else { - args.push(self); - } - - fn.apply(self, args); - }; - var parent = this.parent || this; - var name = parent === this ? '*' : this._name; - parent.on('command:' + name, listener); - if (this._alias) parent.on('command:' + this._alias, listener); - return this; -}; - -/** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * Examples: - * - * // simple boolean defaulting to false - * program.option('-p, --pepper', 'add pepper'); - * - * --pepper - * program.pepper - * // => Boolean - * - * // simple boolean defaulting to true - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => false - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @param {String} flags - * @param {String} description - * @param {Function|*} [fn] or default - * @param {*} [defaultValue] - * @return {Command} for chaining - * @api public - */ - -Command.prototype.option = function(flags, description, fn, defaultValue) { - var self = this, - option = new Option(flags, description), - oname = option.name(), - name = option.attributeName(); - - // default as 3rd arg - if (typeof fn !== 'function') { - if (fn instanceof RegExp) { - var regex = fn; - fn = function(val, def) { - var m = regex.exec(val); - return m ? m[0] : def; - }; - } else { - defaultValue = fn; - fn = null; - } - } - - // preassign default value only for --no-*, [optional], or - if (!option.bool || option.optional || option.required) { - // when --no-* we make sure default is true - if (!option.bool) defaultValue = true; - // preassign only if we have a default - if (defaultValue !== undefined) { - self[name] = defaultValue; - option.defaultValue = defaultValue; - } - } - - // register the option - this.options.push(option); - - // when it's passed assign the value - // and conditionally invoke the callback - this.on('option:' + oname, function(val) { - // coercion - if (val !== null && fn) { - val = fn(val, self[name] === undefined ? defaultValue : self[name]); - } - - // unassigned or bool - if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') { - // if no value, bool true, and we have a default, then use it! - if (val == null) { - self[name] = option.bool - ? defaultValue || true - : false; - } else { - self[name] = val; - } - } else if (val !== null) { - // reassign - self[name] = val; - } - }); - - return this; -}; - -/** - * Allow unknown options on the command line. - * - * @param {Boolean} arg if `true` or omitted, no error will be thrown - * for unknown options. - * @api public - */ -Command.prototype.allowUnknownOption = function(arg) { - this._allowUnknownOption = arguments.length === 0 || arg; - return this; -}; - -/** - * Parse `argv`, settings options and invoking commands when defined. - * - * @param {Array} argv - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parse = function(argv) { - // implicit help - if (this.executables) this.addImplicitHelpCommand(); - - // store raw args - this.rawArgs = argv; - - // guess name - this._name = this._name || basename(argv[1], '.js'); - - // github-style sub-commands with no sub-command - if (this.executables && argv.length < 3 && !this.defaultExecutable) { - // this user needs help - argv.push('--help'); - } - - // process argv - var parsed = this.parseOptions(this.normalize(argv.slice(2))); - var args = this.args = parsed.args; - - var result = this.parseArgs(this.args, parsed.unknown); - - // executable sub-commands - var name = result.args[0]; - - var aliasCommand = null; - // check alias of sub commands - if (name) { - aliasCommand = this.commands.filter(function(command) { - return command.alias() === name; - })[0]; - } - - if (this._execs[name] && typeof this._execs[name] !== 'function') { - return this.executeSubCommand(argv, args, parsed.unknown); - } else if (aliasCommand) { - // is alias of a subCommand - args[0] = aliasCommand._name; - return this.executeSubCommand(argv, args, parsed.unknown); - } else if (this.defaultExecutable) { - // use the default subcommand - args.unshift(this.defaultExecutable); - return this.executeSubCommand(argv, args, parsed.unknown); - } - - return result; -}; - -/** - * Execute a sub-command executable. - * - * @param {Array} argv - * @param {Array} args - * @param {Array} unknown - * @api private - */ - -Command.prototype.executeSubCommand = function(argv, args, unknown) { - args = args.concat(unknown); - - if (!args.length) this.help(); - if (args[0] === 'help' && args.length === 1) this.help(); - - // --help - if (args[0] === 'help') { - args[0] = args[1]; - args[1] = '--help'; - } - - // executable - var f = argv[1]; - // name of the subcommand, link `pm-install` - var bin = basename(f, path.extname(f)) + '-' + args[0]; - - // In case of globally installed, get the base dir where executable - // subcommand file should be located at - var baseDir; - - var resolvedLink = fs.realpathSync(f); - - baseDir = dirname(resolvedLink); - - // prefer local `./` to bin in the $PATH - var localBin = path.join(baseDir, bin); - - // whether bin file is a js script with explicit `.js` or `.ts` extension - var isExplicitJS = false; - if (exists(localBin + '.js')) { - bin = localBin + '.js'; - isExplicitJS = true; - } else if (exists(localBin + '.ts')) { - bin = localBin + '.ts'; - isExplicitJS = true; - } else if (exists(localBin)) { - bin = localBin; - } - - args = args.slice(1); - - var proc; - if (process.platform !== 'win32') { - if (isExplicitJS) { - args.unshift(bin); - // add executable arguments to spawn - args = (process.execArgv || []).concat(args); - - proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] }); - } else { - proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] }); - } - } else { - args.unshift(bin); - proc = spawn(process.execPath, args, { stdio: 'inherit' }); - } - - var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP']; - signals.forEach(function(signal) { - process.on(signal, function() { - if (proc.killed === false && proc.exitCode === null) { - proc.kill(signal); - } - }); - }); - proc.on('close', process.exit.bind(process)); - proc.on('error', function(err) { - if (err.code === 'ENOENT') { - console.error('error: %s(1) does not exist, try --help', bin); - } else if (err.code === 'EACCES') { - console.error('error: %s(1) not executable. try chmod or run with root', bin); - } - process.exit(1); - }); - - // Store the reference to the child process - this.runningCommand = proc; -}; - -/** - * Normalize `args`, splitting joined short flags. For example - * the arg "-abc" is equivalent to "-a -b -c". - * This also normalizes equal sign and splits "--abc=def" into "--abc def". - * - * @param {Array} args - * @return {Array} - * @api private - */ - -Command.prototype.normalize = function(args) { - var ret = [], - arg, - lastOpt, - index; - - for (var i = 0, len = args.length; i < len; ++i) { - arg = args[i]; - if (i > 0) { - lastOpt = this.optionFor(args[i - 1]); - } - - if (arg === '--') { - // Honor option terminator - ret = ret.concat(args.slice(i)); - break; - } else if (lastOpt && lastOpt.required) { - ret.push(arg); - } else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') { - arg.slice(1).split('').forEach(function(c) { - ret.push('-' + c); - }); - } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) { - ret.push(arg.slice(0, index), arg.slice(index + 1)); - } else { - ret.push(arg); - } - } - - return ret; -}; - -/** - * Parse command `args`. - * - * When listener(s) are available those - * callbacks are invoked, otherwise the "*" - * event is emitted and those actions are invoked. - * - * @param {Array} args - * @return {Command} for chaining - * @api private - */ - -Command.prototype.parseArgs = function(args, unknown) { - var name; - - if (args.length) { - name = args[0]; - if (this.listeners('command:' + name).length) { - this.emit('command:' + args.shift(), args, unknown); - } else { - this.emit('command:*', args); - } - } else { - outputHelpIfNecessary(this, unknown); - - // If there were no args and we have unknown options, - // then they are extraneous and we need to error. - if (unknown.length > 0) { - this.unknownOption(unknown[0]); - } - if (this.commands.length === 0 && - this._args.filter(function(a) { return a.required; }).length === 0) { - this.emit('command:*'); - } - } - - return this; -}; - -/** - * Return an option matching `arg` if any. - * - * @param {String} arg - * @return {Option} - * @api private - */ - -Command.prototype.optionFor = function(arg) { - for (var i = 0, len = this.options.length; i < len; ++i) { - if (this.options[i].is(arg)) { - return this.options[i]; - } - } -}; - -/** - * Parse options from `argv` returning `argv` - * void of these options. - * - * @param {Array} argv - * @return {Array} - * @api public - */ - -Command.prototype.parseOptions = function(argv) { - var args = [], - len = argv.length, - literal, - option, - arg; - - var unknownOptions = []; - - // parse options - for (var i = 0; i < len; ++i) { - arg = argv[i]; - - // literal args after -- - if (literal) { - args.push(arg); - continue; - } - - if (arg === '--') { - literal = true; - continue; - } - - // find matching Option - option = this.optionFor(arg); - - // option is defined - if (option) { - // requires arg - if (option.required) { - arg = argv[++i]; - if (arg == null) return this.optionMissingArgument(option); - this.emit('option:' + option.name(), arg); - // optional arg - } else if (option.optional) { - arg = argv[i + 1]; - if (arg == null || (arg[0] === '-' && arg !== '-')) { - arg = null; - } else { - ++i; - } - this.emit('option:' + option.name(), arg); - // bool - } else { - this.emit('option:' + option.name()); - } - continue; - } - - // looks like an option - if (arg.length > 1 && arg[0] === '-') { - unknownOptions.push(arg); - - // If the next argument looks like it might be - // an argument for this option, we pass it on. - // If it isn't, then it'll simply be ignored - if ((i + 1) < argv.length && argv[i + 1][0] !== '-') { - unknownOptions.push(argv[++i]); - } - continue; - } - - // arg - args.push(arg); - } - - return { args: args, unknown: unknownOptions }; -}; - -/** - * Return an object containing options as key-value pairs - * - * @return {Object} - * @api public - */ -Command.prototype.opts = function() { - var result = {}, - len = this.options.length; - - for (var i = 0; i < len; i++) { - var key = this.options[i].attributeName(); - result[key] = key === this._versionOptionName ? this._version : this[key]; - } - return result; -}; - -/** - * Argument `name` is missing. - * - * @param {String} name - * @api private - */ - -Command.prototype.missingArgument = function(name) { - console.error("error: missing required argument `%s'", name); - process.exit(1); -}; - -/** - * `Option` is missing an argument, but received `flag` or nothing. - * - * @param {String} option - * @param {String} flag - * @api private - */ - -Command.prototype.optionMissingArgument = function(option, flag) { - if (flag) { - console.error("error: option `%s' argument missing, got `%s'", option.flags, flag); - } else { - console.error("error: option `%s' argument missing", option.flags); - } - process.exit(1); -}; - -/** - * Unknown option `flag`. - * - * @param {String} flag - * @api private - */ - -Command.prototype.unknownOption = function(flag) { - if (this._allowUnknownOption) return; - console.error("error: unknown option `%s'", flag); - process.exit(1); -}; - -/** - * Variadic argument with `name` is not the last argument as required. - * - * @param {String} name - * @api private - */ - -Command.prototype.variadicArgNotLast = function(name) { - console.error("error: variadic arguments must be last `%s'", name); - process.exit(1); -}; - -/** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * @param {String} str - * @param {String} [flags] - * @return {Command} for chaining - * @api public - */ - -Command.prototype.version = function(str, flags) { - if (arguments.length === 0) return this._version; - this._version = str; - flags = flags || '-V, --version'; - var versionOption = new Option(flags, 'output the version number'); - this._versionOptionName = versionOption.long.substr(2) || 'version'; - this.options.push(versionOption); - this.on('option:' + this._versionOptionName, function() { - process.stdout.write(str + '\n'); - process.exit(0); - }); - return this; -}; - -/** - * Set the description to `str`. - * - * @param {String} str - * @param {Object} argsDescription - * @return {String|Command} - * @api public - */ - -Command.prototype.description = function(str, argsDescription) { - if (arguments.length === 0) return this._description; - this._description = str; - this._argsDescription = argsDescription; - return this; -}; - -/** - * Set an alias for the command - * - * @param {String} alias - * @return {String|Command} - * @api public - */ - -Command.prototype.alias = function(alias) { - var command = this; - if (this.commands.length !== 0) { - command = this.commands[this.commands.length - 1]; - } - - if (arguments.length === 0) return command._alias; - - if (alias === command._name) throw new Error('Command alias can\'t be the same as its name'); - - command._alias = alias; - return this; -}; - -/** - * Set / get the command usage `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.usage = function(str) { - var args = this._args.map(function(arg) { - return humanReadableArgName(arg); - }); - - var usage = '[options]' + - (this.commands.length ? ' [command]' : '') + - (this._args.length ? ' ' + args.join(' ') : ''); - - if (arguments.length === 0) return this._usage || usage; - this._usage = str; - - return this; -}; - -/** - * Get or set the name of the command - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.name = function(str) { - if (arguments.length === 0) return this._name; - this._name = str; - return this; -}; - -/** - * Return prepared commands. - * - * @return {Array} - * @api private - */ - -Command.prototype.prepareCommands = function() { - return this.commands.filter(function(cmd) { - return !cmd._noHelp; - }).map(function(cmd) { - var args = cmd._args.map(function(arg) { - return humanReadableArgName(arg); - }).join(' '); - - return [ - cmd._name + - (cmd._alias ? '|' + cmd._alias : '') + - (cmd.options.length ? ' [options]' : '') + - (args ? ' ' + args : ''), - cmd._description - ]; - }); -}; - -/** - * Return the largest command length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestCommandLength = function() { - var commands = this.prepareCommands(); - return commands.reduce(function(max, command) { - return Math.max(max, command[0].length); - }, 0); -}; - -/** - * Return the largest option length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestOptionLength = function() { - var options = [].slice.call(this.options); - options.push({ - flags: '-h, --help' - }); - return options.reduce(function(max, option) { - return Math.max(max, option.flags.length); - }, 0); -}; - -/** - * Return the largest arg length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestArgLength = function() { - return this._args.reduce(function(max, arg) { - return Math.max(max, arg.name.length); - }, 0); -}; - -/** - * Return the pad width. - * - * @return {Number} - * @api private - */ - -Command.prototype.padWidth = function() { - var width = this.largestOptionLength(); - if (this._argsDescription && this._args.length) { - if (this.largestArgLength() > width) { - width = this.largestArgLength(); - } - } - - if (this.commands && this.commands.length) { - if (this.largestCommandLength() > width) { - width = this.largestCommandLength(); - } - } - - return width; -}; - -/** - * Return help for options. - * - * @return {String} - * @api private - */ - -Command.prototype.optionHelp = function() { - var width = this.padWidth(); - - // Append the help information - return this.options.map(function(option) { - return pad(option.flags, width) + ' ' + option.description + - ((option.bool && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : ''); - }).concat([pad('-h, --help', width) + ' ' + 'output usage information']) - .join('\n'); -}; - -/** - * Return command help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.commandHelp = function() { - if (!this.commands.length) return ''; - - var commands = this.prepareCommands(); - var width = this.padWidth(); - - return [ - 'Commands:', - commands.map(function(cmd) { - var desc = cmd[1] ? ' ' + cmd[1] : ''; - return (desc ? pad(cmd[0], width) : cmd[0]) + desc; - }).join('\n').replace(/^/gm, ' '), - '' - ].join('\n'); -}; - -/** - * Return program help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.helpInformation = function() { - var desc = []; - if (this._description) { - desc = [ - this._description, - '' - ]; - - var argsDescription = this._argsDescription; - if (argsDescription && this._args.length) { - var width = this.padWidth(); - desc.push('Arguments:'); - desc.push(''); - this._args.forEach(function(arg) { - desc.push(' ' + pad(arg.name, width) + ' ' + argsDescription[arg.name]); - }); - desc.push(''); - } - } - - var cmdName = this._name; - if (this._alias) { - cmdName = cmdName + '|' + this._alias; - } - var usage = [ - 'Usage: ' + cmdName + ' ' + this.usage(), - '' - ]; - - var cmds = []; - var commandHelp = this.commandHelp(); - if (commandHelp) cmds = [commandHelp]; - - var options = [ - 'Options:', - '' + this.optionHelp().replace(/^/gm, ' '), - '' - ]; - - return usage - .concat(desc) - .concat(options) - .concat(cmds) - .join('\n'); -}; - -/** - * Output help information for this command - * - * @api public - */ - -Command.prototype.outputHelp = function(cb) { - if (!cb) { - cb = function(passthru) { - return passthru; - }; - } - process.stdout.write(cb(this.helpInformation())); - this.emit('--help'); -}; - -/** - * Output help information and exit. - * - * @api public - */ - -Command.prototype.help = function(cb) { - this.outputHelp(cb); - process.exit(); -}; - -/** - * Camel-case the given `flag` - * - * @param {String} flag - * @return {String} - * @api private - */ - -function camelcase(flag) { - return flag.split('-').reduce(function(str, word) { - return str + word[0].toUpperCase() + word.slice(1); - }); -} - -/** - * Pad `str` to `width`. - * - * @param {String} str - * @param {Number} width - * @return {String} - * @api private - */ - -function pad(str, width) { - var len = Math.max(0, width - str.length); - return str + Array(len + 1).join(' '); -} - -/** - * Output help information if necessary - * - * @param {Command} command to output help for - * @param {Array} array of options to search for -h or --help - * @api private - */ - -function outputHelpIfNecessary(cmd, options) { - options = options || []; - for (var i = 0; i < options.length; i++) { - if (options[i] === '--help' || options[i] === '-h') { - cmd.outputHelp(); - process.exit(0); - } - } -} - -/** - * Takes an argument an returns its human readable equivalent for help usage. - * - * @param {Object} arg - * @return {String} - * @api private - */ - -function humanReadableArgName(arg) { - var nameOutput = arg.name + (arg.variadic === true ? '...' : ''); - - return arg.required - ? '<' + nameOutput + '>' - : '[' + nameOutput + ']'; -} - -// for versions before node v0.8 when there weren't `fs.existsSync` -function exists(file) { - try { - if (fs.statSync(file).isFile()) { - return true; - } - } catch (e) { - return false; - } -} diff --git a/node_modules/commander/package.json b/node_modules/commander/package.json deleted file mode 100644 index 6ae3a874..00000000 --- a/node_modules/commander/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "_args": [ - [ - "commander@2.20.0", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "commander@2.20.0", - "_id": "commander@2.20.0", - "_inBundle": false, - "_integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "_location": "/commander", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "commander@2.20.0", - "name": "commander", - "escapedName": "commander", - "rawSpec": "2.20.0", - "saveSpec": null, - "fetchSpec": "2.20.0" - }, - "_requiredBy": [ - "/editorconfig" - ], - "_resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "_spec": "2.20.0", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "bugs": { - "url": "https://github.com/tj/commander.js/issues" - }, - "dependencies": {}, - "description": "the complete solution for node.js command-line programs", - "devDependencies": { - "@types/node": "^10.11.3", - "eslint": "^5.6.1", - "should": "^13.2.3", - "sinon": "^6.3.4", - "standard": "^12.0.1", - "ts-node": "^7.0.1", - "typescript": "^2.9.2" - }, - "files": [ - "index.js", - "typings/index.d.ts" - ], - "homepage": "https://github.com/tj/commander.js#readme", - "keywords": [ - "commander", - "command", - "option", - "parser" - ], - "license": "MIT", - "main": "index", - "name": "commander", - "repository": { - "type": "git", - "url": "git+https://github.com/tj/commander.js.git" - }, - "scripts": { - "lint": "eslint index.js", - "test": "node test/run.js && npm run test-typings", - "test-typings": "tsc -p tsconfig.json" - }, - "typings": "typings/index.d.ts", - "version": "2.20.0" -} diff --git a/node_modules/commander/typings/index.d.ts b/node_modules/commander/typings/index.d.ts deleted file mode 100644 index bcda2771..00000000 --- a/node_modules/commander/typings/index.d.ts +++ /dev/null @@ -1,310 +0,0 @@ -// Type definitions for commander 2.11 -// Project: https://github.com/visionmedia/commander.js -// Definitions by: Alan Agius , Marcelo Dezem , vvakame , Jules Randolph -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -declare namespace local { - - class Option { - flags: string; - required: boolean; - optional: boolean; - bool: boolean; - short?: string; - long: string; - description: string; - - /** - * Initialize a new `Option` with the given `flags` and `description`. - * - * @param {string} flags - * @param {string} [description] - */ - constructor(flags: string, description?: string); - } - - class Command extends NodeJS.EventEmitter { - [key: string]: any; - - args: string[]; - - /** - * Initialize a new `Command`. - * - * @param {string} [name] - */ - constructor(name?: string); - - /** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * @param {string} str - * @param {string} [flags] - * @returns {Command} for chaining - */ - version(str: string, flags?: string): Command; - - /** - * Add command `name`. - * - * The `.action()` callback is invoked when the - * command `name` is specified via __ARGV__, - * and the remaining arguments are applied to the - * function for access. - * - * When the `name` is "*" an un-matched command - * will be passed as the first arg, followed by - * the rest of __ARGV__ remaining. - * - * @example - * program - * .version('0.0.1') - * .option('-C, --chdir ', 'change the working directory') - * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - * .option('-T, --no-tests', 'ignore test hook') - * - * program - * .command('setup') - * .description('run remote setup commands') - * .action(function() { - * console.log('setup'); - * }); - * - * program - * .command('exec ') - * .description('run the given remote command') - * .action(function(cmd) { - * console.log('exec "%s"', cmd); - * }); - * - * program - * .command('teardown [otherDirs...]') - * .description('run teardown commands') - * .action(function(dir, otherDirs) { - * console.log('dir "%s"', dir); - * if (otherDirs) { - * otherDirs.forEach(function (oDir) { - * console.log('dir "%s"', oDir); - * }); - * } - * }); - * - * program - * .command('*') - * .description('deploy the given env') - * .action(function(env) { - * console.log('deploying "%s"', env); - * }); - * - * program.parse(process.argv); - * - * @param {string} name - * @param {string} [desc] for git-style sub-commands - * @param {CommandOptions} [opts] command options - * @returns {Command} the new command - */ - command(name: string, desc?: string, opts?: commander.CommandOptions): Command; - - /** - * Define argument syntax for the top-level command. - * - * @param {string} desc - * @returns {Command} for chaining - */ - arguments(desc: string): Command; - - /** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @param {string[]} args - * @returns {Command} for chaining - */ - parseExpectedArgs(args: string[]): Command; - - /** - * Register callback `fn` for the command. - * - * @example - * program - * .command('help') - * .description('display verbose help') - * .action(function() { - * // output help here - * }); - * - * @param {(...args: any[]) => void} fn - * @returns {Command} for chaining - */ - action(fn: (...args: any[]) => void): Command; - - /** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * @example - * // simple boolean defaulting to false - * program.option('-p, --pepper', 'add pepper'); - * - * --pepper - * program.pepper - * // => Boolean - * - * // simple boolean defaulting to true - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => false - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @param {string} flags - * @param {string} [description] - * @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default - * @param {*} [defaultValue] - * @returns {Command} for chaining - */ - option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command; - option(flags: string, description?: string, defaultValue?: any): Command; - - /** - * Allow unknown options on the command line. - * - * @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options. - * @returns {Command} for chaining - */ - allowUnknownOption(arg?: boolean): Command; - - /** - * Parse `argv`, settings options and invoking commands when defined. - * - * @param {string[]} argv - * @returns {Command} for chaining - */ - parse(argv: string[]): Command; - - /** - * Parse options from `argv` returning `argv` void of these options. - * - * @param {string[]} argv - * @returns {ParseOptionsResult} - */ - parseOptions(argv: string[]): commander.ParseOptionsResult; - - /** - * Return an object containing options as key-value pairs - * - * @returns {{[key: string]: any}} - */ - opts(): { [key: string]: any }; - - /** - * Set the description to `str`. - * - * @param {string} str - * @param {{[argName: string]: string}} argsDescription - * @return {(Command | string)} - */ - description(str: string, argsDescription?: {[argName: string]: string}): Command; - description(): string; - - /** - * Set an alias for the command. - * - * @param {string} alias - * @return {(Command | string)} - */ - alias(alias: string): Command; - alias(): string; - - /** - * Set or get the command usage. - * - * @param {string} str - * @return {(Command | string)} - */ - usage(str: string): Command; - usage(): string; - - /** - * Set the name of the command. - * - * @param {string} str - * @return {Command} - */ - name(str: string): Command; - - /** - * Get the name of the command. - * - * @return {string} - */ - name(): string; - - /** - * Output help information for this command. - * - * @param {(str: string) => string} [cb] - */ - outputHelp(cb?: (str: string) => string): void; - - /** Output help information and exit. - * - * @param {(str: string) => string} [cb] - */ - help(cb?: (str: string) => string): never; - } - -} - -declare namespace commander { - - type Command = local.Command - - type Option = local.Option - - interface CommandOptions { - noHelp?: boolean; - isDefault?: boolean; - } - - interface ParseOptionsResult { - args: string[]; - unknown: string[]; - } - - interface CommanderStatic extends Command { - Command: typeof local.Command; - Option: typeof local.Option; - CommandOptions: CommandOptions; - ParseOptionsResult: ParseOptionsResult; - } - -} - -declare const commander: commander.CommanderStatic; -export = commander; diff --git a/node_modules/concat-map/.travis.yml b/node_modules/concat-map/.travis.yml deleted file mode 100644 index f1d0f13c..00000000 --- a/node_modules/concat-map/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/concat-map/LICENSE b/node_modules/concat-map/LICENSE deleted file mode 100644 index ee27ba4b..00000000 --- a/node_modules/concat-map/LICENSE +++ /dev/null @@ -1,18 +0,0 @@ -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/concat-map/README.markdown b/node_modules/concat-map/README.markdown deleted file mode 100644 index 408f70a1..00000000 --- a/node_modules/concat-map/README.markdown +++ /dev/null @@ -1,62 +0,0 @@ -concat-map -========== - -Concatenative mapdashery. - -[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map) - -[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map) - -example -======= - -``` js -var concatMap = require('concat-map'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); -``` - -*** - -``` -[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ] -``` - -methods -======= - -``` js -var concatMap = require('concat-map') -``` - -concatMap(xs, fn) ------------------ - -Return an array of concatenated elements by calling `fn(x, i)` for each element -`x` and each index `i` in the array `xs`. - -When `fn(x, i)` returns an array, its result will be concatenated with the -result array. If `fn(x, i)` returns anything else, that value will be pushed -onto the end of the result array. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install concat-map -``` - -license -======= - -MIT - -notes -===== - -This module was written while sitting high above the ground in a tree. diff --git a/node_modules/concat-map/example/map.js b/node_modules/concat-map/example/map.js deleted file mode 100644 index 33656217..00000000 --- a/node_modules/concat-map/example/map.js +++ /dev/null @@ -1,6 +0,0 @@ -var concatMap = require('../'); -var xs = [ 1, 2, 3, 4, 5, 6 ]; -var ys = concatMap(xs, function (x) { - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; -}); -console.dir(ys); diff --git a/node_modules/concat-map/index.js b/node_modules/concat-map/index.js deleted file mode 100644 index b29a7812..00000000 --- a/node_modules/concat-map/index.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - var x = fn(xs[i], i); - if (isArray(x)) res.push.apply(res, x); - else res.push(x); - } - return res; -}; - -var isArray = Array.isArray || function (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; diff --git a/node_modules/concat-map/package.json b/node_modules/concat-map/package.json deleted file mode 100644 index fa0e1947..00000000 --- a/node_modules/concat-map/package.json +++ /dev/null @@ -1,91 +0,0 @@ -{ - "_args": [ - [ - "concat-map@0.0.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "concat-map@0.0.1", - "_id": "concat-map@0.0.1", - "_inBundle": false, - "_integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "_location": "/concat-map", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "concat-map@0.0.1", - "name": "concat-map", - "escapedName": "concat-map", - "rawSpec": "0.0.1", - "saveSpec": null, - "fetchSpec": "0.0.1" - }, - "_requiredBy": [ - "/brace-expansion" - ], - "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "_spec": "0.0.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "bugs": { - "url": "https://github.com/substack/node-concat-map/issues" - }, - "description": "concatenative mapdashery", - "devDependencies": { - "tape": "~2.4.0" - }, - "directories": { - "example": "example", - "test": "test" - }, - "homepage": "https://github.com/substack/node-concat-map#readme", - "keywords": [ - "concat", - "concatMap", - "map", - "functional", - "higher-order" - ], - "license": "MIT", - "main": "index.js", - "name": "concat-map", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-concat-map.git" - }, - "scripts": { - "test": "tape test/*.js" - }, - "testling": { - "files": "test/*.js", - "browsers": { - "ie": [ - 6, - 7, - 8, - 9 - ], - "ff": [ - 3.5, - 10, - 15 - ], - "chrome": [ - 10, - 22 - ], - "safari": [ - 5.1 - ], - "opera": [ - 12 - ] - } - }, - "version": "0.0.1" -} diff --git a/node_modules/concat-map/test/map.js b/node_modules/concat-map/test/map.js deleted file mode 100644 index fdbd7022..00000000 --- a/node_modules/concat-map/test/map.js +++ /dev/null @@ -1,39 +0,0 @@ -var concatMap = require('../'); -var test = require('tape'); - -test('empty or not', function (t) { - var xs = [ 1, 2, 3, 4, 5, 6 ]; - var ixes = []; - var ys = concatMap(xs, function (x, ix) { - ixes.push(ix); - return x % 2 ? [ x - 0.1, x, x + 0.1 ] : []; - }); - t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]); - t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]); - t.end(); -}); - -test('always something', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ]; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('scalars', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function (x) { - return x === 'b' ? [ 'B', 'B', 'B' ] : x; - }); - t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]); - t.end(); -}); - -test('undefs', function (t) { - var xs = [ 'a', 'b', 'c', 'd' ]; - var ys = concatMap(xs, function () {}); - t.same(ys, [ undefined, undefined, undefined, undefined ]); - t.end(); -}); diff --git a/node_modules/concat-stream/LICENSE b/node_modules/concat-stream/LICENSE deleted file mode 100644 index 99c130e1..00000000 --- a/node_modules/concat-stream/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -The MIT License - -Copyright (c) 2013 Max Ogden - -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. \ No newline at end of file diff --git a/node_modules/concat-stream/index.js b/node_modules/concat-stream/index.js deleted file mode 100644 index dd672a76..00000000 --- a/node_modules/concat-stream/index.js +++ /dev/null @@ -1,144 +0,0 @@ -var Writable = require('readable-stream').Writable -var inherits = require('inherits') -var bufferFrom = require('buffer-from') - -if (typeof Uint8Array === 'undefined') { - var U8 = require('typedarray').Uint8Array -} else { - var U8 = Uint8Array -} - -function ConcatStream(opts, cb) { - if (!(this instanceof ConcatStream)) return new ConcatStream(opts, cb) - - if (typeof opts === 'function') { - cb = opts - opts = {} - } - if (!opts) opts = {} - - var encoding = opts.encoding - var shouldInferEncoding = false - - if (!encoding) { - shouldInferEncoding = true - } else { - encoding = String(encoding).toLowerCase() - if (encoding === 'u8' || encoding === 'uint8') { - encoding = 'uint8array' - } - } - - Writable.call(this, { objectMode: true }) - - this.encoding = encoding - this.shouldInferEncoding = shouldInferEncoding - - if (cb) this.on('finish', function () { cb(this.getBody()) }) - this.body = [] -} - -module.exports = ConcatStream -inherits(ConcatStream, Writable) - -ConcatStream.prototype._write = function(chunk, enc, next) { - this.body.push(chunk) - next() -} - -ConcatStream.prototype.inferEncoding = function (buff) { - var firstBuffer = buff === undefined ? this.body[0] : buff; - if (Buffer.isBuffer(firstBuffer)) return 'buffer' - if (typeof Uint8Array !== 'undefined' && firstBuffer instanceof Uint8Array) return 'uint8array' - if (Array.isArray(firstBuffer)) return 'array' - if (typeof firstBuffer === 'string') return 'string' - if (Object.prototype.toString.call(firstBuffer) === "[object Object]") return 'object' - return 'buffer' -} - -ConcatStream.prototype.getBody = function () { - if (!this.encoding && this.body.length === 0) return [] - if (this.shouldInferEncoding) this.encoding = this.inferEncoding() - if (this.encoding === 'array') return arrayConcat(this.body) - if (this.encoding === 'string') return stringConcat(this.body) - if (this.encoding === 'buffer') return bufferConcat(this.body) - if (this.encoding === 'uint8array') return u8Concat(this.body) - return this.body -} - -var isArray = Array.isArray || function (arr) { - return Object.prototype.toString.call(arr) == '[object Array]' -} - -function isArrayish (arr) { - return /Array\]$/.test(Object.prototype.toString.call(arr)) -} - -function isBufferish (p) { - return typeof p === 'string' || isArrayish(p) || (p && typeof p.subarray === 'function') -} - -function stringConcat (parts) { - var strings = [] - var needsToString = false - for (var i = 0; i < parts.length; i++) { - var p = parts[i] - if (typeof p === 'string') { - strings.push(p) - } else if (Buffer.isBuffer(p)) { - strings.push(p) - } else if (isBufferish(p)) { - strings.push(bufferFrom(p)) - } else { - strings.push(bufferFrom(String(p))) - } - } - if (Buffer.isBuffer(parts[0])) { - strings = Buffer.concat(strings) - strings = strings.toString('utf8') - } else { - strings = strings.join('') - } - return strings -} - -function bufferConcat (parts) { - var bufs = [] - for (var i = 0; i < parts.length; i++) { - var p = parts[i] - if (Buffer.isBuffer(p)) { - bufs.push(p) - } else if (isBufferish(p)) { - bufs.push(bufferFrom(p)) - } else { - bufs.push(bufferFrom(String(p))) - } - } - return Buffer.concat(bufs) -} - -function arrayConcat (parts) { - var res = [] - for (var i = 0; i < parts.length; i++) { - res.push.apply(res, parts[i]) - } - return res -} - -function u8Concat (parts) { - var len = 0 - for (var i = 0; i < parts.length; i++) { - if (typeof parts[i] === 'string') { - parts[i] = bufferFrom(parts[i]) - } - len += parts[i].length - } - var u8 = new U8(len) - for (var i = 0, offset = 0; i < parts.length; i++) { - var part = parts[i] - for (var j = 0; j < part.length; j++) { - u8[offset++] = part[j] - } - } - return u8 -} diff --git a/node_modules/concat-stream/package.json b/node_modules/concat-stream/package.json deleted file mode 100644 index 06887a07..00000000 --- a/node_modules/concat-stream/package.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "_args": [ - [ - "concat-stream@1.6.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "concat-stream@1.6.2", - "_id": "concat-stream@1.6.2", - "_inBundle": false, - "_integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "_location": "/concat-stream", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "concat-stream@1.6.2", - "name": "concat-stream", - "escapedName": "concat-stream", - "rawSpec": "1.6.2", - "saveSpec": null, - "fetchSpec": "1.6.2" - }, - "_requiredBy": [ - "/html" - ], - "_resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "_spec": "1.6.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Max Ogden", - "email": "max@maxogden.com" - }, - "bugs": { - "url": "http://github.com/maxogden/concat-stream/issues" - }, - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "description": "writable stream that concatenates strings or binary data and calls a callback with the result", - "devDependencies": { - "tape": "^4.6.3" - }, - "engines": [ - "node >= 0.8" - ], - "files": [ - "index.js" - ], - "homepage": "https://github.com/maxogden/concat-stream#readme", - "license": "MIT", - "main": "index.js", - "name": "concat-stream", - "repository": { - "type": "git", - "url": "git+ssh://git@github.com/maxogden/concat-stream.git" - }, - "scripts": { - "test": "tape test/*.js test/server/*.js" - }, - "tags": [ - "stream", - "simple", - "util", - "utility" - ], - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/8..latest", - "firefox/17..latest", - "firefox/nightly", - "chrome/22..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "version": "1.6.2" -} diff --git a/node_modules/concat-stream/readme.md b/node_modules/concat-stream/readme.md deleted file mode 100644 index 7aa19c4f..00000000 --- a/node_modules/concat-stream/readme.md +++ /dev/null @@ -1,102 +0,0 @@ -# concat-stream - -Writable stream that concatenates all the data from a stream and calls a callback with the result. Use this when you want to collect all the data from a stream into a single buffer. - -[![Build Status](https://travis-ci.org/maxogden/concat-stream.svg?branch=master)](https://travis-ci.org/maxogden/concat-stream) - -[![NPM](https://nodei.co/npm/concat-stream.png)](https://nodei.co/npm/concat-stream/) - -### description - -Streams emit many buffers. If you want to collect all of the buffers, and when the stream ends concatenate all of the buffers together and receive a single buffer then this is the module for you. - -Only use this if you know you can fit all of the output of your stream into a single Buffer (e.g. in RAM). - -There are also `objectMode` streams that emit things other than Buffers, and you can concatenate these too. See below for details. - -## Related - -`concat-stream` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one. - -### examples - -#### Buffers - -```js -var fs = require('fs') -var concat = require('concat-stream') - -var readStream = fs.createReadStream('cat.png') -var concatStream = concat(gotPicture) - -readStream.on('error', handleError) -readStream.pipe(concatStream) - -function gotPicture(imageBuffer) { - // imageBuffer is all of `cat.png` as a node.js Buffer -} - -function handleError(err) { - // handle your error appropriately here, e.g.: - console.error(err) // print the error to STDERR - process.exit(1) // exit program with non-zero exit code -} - -``` - -#### Arrays - -```js -var write = concat(function(data) {}) -write.write([1,2,3]) -write.write([4,5,6]) -write.end() -// data will be [1,2,3,4,5,6] in the above callback -``` - -#### Uint8Arrays - -```js -var write = concat(function(data) {}) -var a = new Uint8Array(3) -a[0] = 97; a[1] = 98; a[2] = 99 -write.write(a) -write.write('!') -write.end(Buffer.from('!!1')) -``` - -See `test/` for more examples - -# methods - -```js -var concat = require('concat-stream') -``` - -## var writable = concat(opts={}, cb) - -Return a `writable` stream that will fire `cb(data)` with all of the data that -was written to the stream. Data can be written to `writable` as strings, -Buffers, arrays of byte integers, and Uint8Arrays. - -By default `concat-stream` will give you back the same data type as the type of the first buffer written to the stream. Use `opts.encoding` to set what format `data` should be returned as, e.g. if you if you don't want to rely on the built-in type checking or for some other reason. - -* `string` - get a string -* `buffer` - get back a Buffer -* `array` - get an array of byte integers -* `uint8array`, `u8`, `uint8` - get back a Uint8Array -* `object`, get back an array of Objects - -If you don't specify an encoding, and the types can't be inferred (e.g. you write things that aren't in the list above), it will try to convert concat them into a `Buffer`. - -If nothing is written to `writable` then `data` will be an empty array `[]`. - -# error handling - -`concat-stream` does not handle errors for you, so you must handle errors on whatever streams you pipe into `concat-stream`. This is a general rule when programming with node.js streams: always handle errors on each and every stream. Since `concat-stream` is not itself a stream it does not emit errors. - -We recommend using [`end-of-stream`](https://npmjs.org/end-of-stream) or [`pump`](https://npmjs.org/pump) for writing error tolerant stream code. - -# license - -MIT LICENSE diff --git a/node_modules/config-chain/LICENCE b/node_modules/config-chain/LICENCE deleted file mode 100644 index 171dd970..00000000 --- a/node_modules/config-chain/LICENCE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2011 Dominic Tarr - -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. \ No newline at end of file diff --git a/node_modules/config-chain/index.js b/node_modules/config-chain/index.js deleted file mode 100755 index 0ef3a91f..00000000 --- a/node_modules/config-chain/index.js +++ /dev/null @@ -1,282 +0,0 @@ -var ProtoList = require('proto-list') - , path = require('path') - , fs = require('fs') - , ini = require('ini') - , EE = require('events').EventEmitter - , url = require('url') - , http = require('http') - -var exports = module.exports = function () { - var args = [].slice.call(arguments) - , conf = new ConfigChain() - - while(args.length) { - var a = args.shift() - if(a) conf.push - ( 'string' === typeof a - ? json(a) - : a ) - } - - return conf -} - -//recursively find a file... - -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(__dirname, rel) -} - -var parse = exports.parse = function (content, file, type) { - content = '' + content - // if we don't know what it is, try json and fall back to ini - // if we know what it is, then it must be that. - if (!type) { - try { return JSON.parse(content) } - catch (er) { return ini.parse(content) } - } else if (type === 'json') { - if (this.emit) { - try { return JSON.parse(content) } - catch (er) { this.emit('error', er) } - } else { - return JSON.parse(content) - } - } else { - 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, file, 'json') -} - -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) - obj[k.substring(l)] = env[k] - } - - return obj -} - -exports.ConfigChain = ConfigChain -function ConfigChain () { - EE.apply(this) - ProtoList.apply(this, arguments) - this._awaiting = 0 - this._saving = 0 - this.sources = {} -} - -// multi-inheritance-ish -var extras = { - constructor: { value: ConfigChain } -} -Object.keys(EE.prototype).forEach(function (k) { - extras[k] = Object.getOwnPropertyDescriptor(EE.prototype, k) -}) -ConfigChain.prototype = Object.create(ProtoList.prototype, extras) - -ConfigChain.prototype.del = function (key, where) { - // if not specified where, then delete from the whole chain, scorched - // earth style - if (where) { - var target = this.sources[where] - target = target && target.data - if (!target) { - return this.emit('error', new Error('not found '+where)) - } - delete target[key] - } else { - for (var i = 0, l = this.list.length; i < l; i ++) { - delete this.list[i][key] - } - } - return this -} - -ConfigChain.prototype.set = function (key, value, where) { - var target - - if (where) { - target = this.sources[where] - target = target && target.data - if (!target) { - return this.emit('error', new Error('not found '+where)) - } - } else { - target = this.list[0] - if (!target) { - return this.emit('error', new Error('cannot set, no confs!')) - } - } - target[key] = value - return this -} - -ConfigChain.prototype.get = function (key, where) { - if (where) { - where = this.sources[where] - if (where) where = where.data - if (where && Object.hasOwnProperty.call(where, key)) return where[key] - return undefined - } - return this.list[0][key] -} - -ConfigChain.prototype.save = function (where, type, cb) { - if (typeof type === 'function') cb = type, type = null - var target = this.sources[where] - if (!target || !(target.path || target.source) || !target.data) { - // TODO: maybe save() to a url target could be a PUT or something? - // would be easy to swap out with a reddis type thing, too - return this.emit('error', new Error('bad save target: '+where)) - } - - if (target.source) { - var pref = target.prefix || '' - Object.keys(target.data).forEach(function (k) { - target.source[pref + k] = target.data[k] - }) - return this - } - - var type = type || target.type - var data = target.data - if (target.type === 'json') { - data = JSON.stringify(data) - } else { - data = ini.stringify(data) - } - - this._saving ++ - fs.writeFile(target.path, data, 'utf8', function (er) { - this._saving -- - if (er) { - if (cb) return cb(er) - else return this.emit('error', er) - } - if (this._saving === 0) { - if (cb) cb() - this.emit('save') - } - }.bind(this)) - return this -} - -ConfigChain.prototype.addFile = function (file, type, name) { - name = name || file - var marker = {__source__:name} - this.sources[name] = { path: file, type: type } - this.push(marker) - this._await() - fs.readFile(file, 'utf8', function (er, data) { - if (er) this.emit('error', er) - this.addString(data, file, type, marker) - }.bind(this)) - return this -} - -ConfigChain.prototype.addEnv = function (prefix, env, name) { - name = name || 'env' - var data = exports.env(prefix, env) - this.sources[name] = { data: data, source: env, prefix: prefix } - return this.add(data, name) -} - -ConfigChain.prototype.addUrl = function (req, type, name) { - this._await() - var href = url.format(req) - name = name || href - var marker = {__source__:name} - this.sources[name] = { href: href, type: type } - this.push(marker) - http.request(req, function (res) { - var c = [] - var ct = res.headers['content-type'] - if (!type) { - type = ct.indexOf('json') !== -1 ? 'json' - : ct.indexOf('ini') !== -1 ? 'ini' - : href.match(/\.json$/) ? 'json' - : href.match(/\.ini$/) ? 'ini' - : null - marker.type = type - } - - res.on('data', c.push.bind(c)) - .on('end', function () { - this.addString(Buffer.concat(c), href, type, marker) - }.bind(this)) - .on('error', this.emit.bind(this, 'error')) - - }.bind(this)) - .on('error', this.emit.bind(this, 'error')) - .end() - - return this -} - -ConfigChain.prototype.addString = function (data, file, type, marker) { - data = this.parse(data, file, type) - this.add(data, marker) - return this -} - -ConfigChain.prototype.add = function (data, marker) { - if (marker && typeof marker === 'object') { - var i = this.list.indexOf(marker) - if (i === -1) { - return this.emit('error', new Error('bad marker')) - } - this.splice(i, 1, data) - marker = marker.__source__ - this.sources[marker] = this.sources[marker] || {} - this.sources[marker].data = data - // we were waiting for this. maybe emit 'load' - this._resolve() - } else { - if (typeof marker === 'string') { - this.sources[marker] = this.sources[marker] || {} - this.sources[marker].data = data - } - // trigger the load event if nothing was already going to do so. - this._await() - this.push(data) - process.nextTick(this._resolve.bind(this)) - } - return this -} - -ConfigChain.prototype.parse = exports.parse - -ConfigChain.prototype._await = function () { - this._awaiting++ -} - -ConfigChain.prototype._resolve = function () { - this._awaiting-- - if (this._awaiting === 0) this.emit('load', this) -} diff --git a/node_modules/config-chain/package.json b/node_modules/config-chain/package.json deleted file mode 100644 index c7418f03..00000000 --- a/node_modules/config-chain/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_args": [ - [ - "config-chain@1.1.12", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "config-chain@1.1.12", - "_id": "config-chain@1.1.12", - "_inBundle": false, - "_integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "_location": "/config-chain", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "config-chain@1.1.12", - "name": "config-chain", - "escapedName": "config-chain", - "rawSpec": "1.1.12", - "saveSpec": null, - "fetchSpec": "1.1.12" - }, - "_requiredBy": [ - "/js-beautify" - ], - "_resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "_spec": "1.1.12", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Dominic Tarr", - "email": "dominic.tarr@gmail.com", - "url": "http://dominictarr.com" - }, - "bugs": { - "url": "https://github.com/dominictarr/config-chain/issues" - }, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - }, - "description": "HANDLE CONFIGURATION ONCE AND FOR ALL", - "devDependencies": { - "tap": "0.3.0" - }, - "files": [ - "index.js" - ], - "homepage": "http://github.com/dominictarr/config-chain", - "licenses": [ - { - "type": "MIT", - "url": "https://raw.githubusercontent.com/dominictarr/config-chain/master/LICENCE" - } - ], - "name": "config-chain", - "repository": { - "type": "git", - "url": "git+https://github.com/dominictarr/config-chain.git" - }, - "scripts": { - "test": "tap test/*" - }, - "version": "1.1.12" -} diff --git a/node_modules/config-chain/readme.markdown b/node_modules/config-chain/readme.markdown deleted file mode 100644 index 47f894c7..00000000 --- a/node_modules/config-chain/readme.markdown +++ /dev/null @@ -1,257 +0,0 @@ -# config-chain - -A module for loading custom configurations - -## NOTE: Feature Freeze - -[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges) - -This module is frozen. - -In general, we recommend using [rc](https://github.com/dominictarr/rc) instead, -but as [npm](https://github.com/npmjs/npm) depends on this, it cannot be changed. - - -## Install - -```sh -yarn add config-chain - -# npm users -npm install --save config-chain -``` - -## Usage - -```js -const cc = require('config-chain'); - -console.log(cc.env('TERM_', process.env)); -/* -{ SESSION_ID: 'w1:5F38', - PROGRAM_VERSION: '3.1.2', - PROGRAM: 'iTerm.app' } -*/ -``` - -The `.env` function gets all the keys on the provided object which are -prefixed by the specified prefix, removes the prefix, and puts the values on a new object. - -
- -## Full Usage - -``` js - - // npm install config-chain - - var cc = require('config-chain') - , opts = require('optimist').argv //ALWAYS USE OPTIMIST FOR COMMAND LINE OPTIONS. - , env = opts.env || process.env.YOUR_APP_ENV || 'dev' //SET YOUR ENV LIKE THIS. - - // EACH ARG TO CONFIGURATOR IS LOADED INTO CONFIGURATION CHAIN - // EARLIER ITEMS OVERIDE LATER ITEMS - // PUTS COMMAND LINE OPTS FIRST, AND DEFAULTS LAST! - - //strings are interpereted as filenames. - //will be loaded synchronously - - var conf = - cc( - //OVERRIDE SETTINGS WITH COMMAND LINE OPTS - opts, - - //ENV VARS IF PREFIXED WITH 'myApp_' - - cc.env('myApp_'), //myApp_foo = 'like this' - - //FILE NAMED BY ENV - path.join(__dirname, 'config.' + env + '.json'), - - //IF `env` is PRODUCTION - env === 'prod' - ? path.join(__dirname, 'special.json') //load a special file - : null //NULL IS IGNORED! - - //SUBDIR FOR ENV CONFIG - path.join(__dirname, 'config', env, 'config.json'), - - //SEARCH PARENT DIRECTORIES FROM CURRENT DIR FOR FILE - cc.find('config.json'), - - //PUT DEFAULTS LAST - { - host: 'localhost' - port: 8000 - }) - - var host = conf.get('host') - - // or - - var host = conf.store.host - -``` - -Finally, flexible configurations! 👌 - -## Custom Configuations - -```javascript -var cc = require('config-chain') - -// all the stuff you did before -var config = cc({ - some: 'object' - }, - cc.find('config.json'), - cc.env('myApp_') - ) - // CONFIGS AS A SERVICE, aka "CaaS", aka EVERY DEVOPS DREAM OMG! - .addUrl('http://configurator:1234/my-configs') - // ASYNC FTW! - .addFile('/path/to/file.json') - - // OBJECTS ARE OK TOO, they're SYNC but they still ORDER RIGHT - // BECAUSE PROMISES ARE USED BUT NO, NOT *THOSE* PROMISES, JUST - // ACTUAL PROMISES LIKE YOU MAKE TO YOUR MOM, KEPT OUT OF LOVE - .add({ another: 'object' }) - - // DIE A THOUSAND DEATHS IF THIS EVER HAPPENS!! - .on('error', function (er) { - // IF ONLY THERE WAS SOMETHIGN HARDER THAN THROW - // MY SORROW COULD BE ADEQUATELY EXPRESSED. /o\ - throw er - }) - - // THROW A PARTY IN YOUR FACE WHEN ITS ALL LOADED!! - .on('load', function (config) { - console.awesome('HOLY SHIT!') - }) -``` - -# API Docs - -## cc(...args) - -MAKE A CHAIN AND ADD ALL THE ARGS. - -If the arg is a STRING, then it shall be a JSON FILENAME. - -RETURN THE CHAIN! - -## cc.json(...args) - -Join the args into a JSON filename! - -SYNC I/O! - -## cc.find(relativePath) - -SEEK the RELATIVE PATH by climbing the TREE OF DIRECTORIES. - -RETURN THE FOUND PATH! - -SYNC I/O! - -## cc.parse(content, file, type) - -Parse the content string, and guess the type from either the -specified type or the filename. - -RETURN THE RESULTING OBJECT! - -NO I/O! - -## cc.env(prefix, env=process.env) - -Get all the keys on the provided object which are -prefixed by the specified prefix, removes the prefix, and puts the values on a new object. - -RETURN THE RESULTING OBJECT! - -NO I/O! - -## cc.ConfigChain() - -The ConfigChain class for CRAY CRAY JQUERY STYLE METHOD CHAINING! - -One of these is returned by the main exported function, as well. - -It inherits (prototypically) from -[ProtoList](https://github.com/isaacs/proto-list/), and also inherits -(parasitically) from -[EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter) - -It has all the methods from both, and except where noted, they are -unchanged. - -### LET IT BE KNOWN THAT chain IS AN INSTANCE OF ConfigChain. - -## chain.sources - -A list of all the places where it got stuff. The keys are the names -passed to addFile or addUrl etc, and the value is an object with some -info about the data source. - -## chain.addFile(filename, type, [name=filename]) - -Filename is the name of the file. Name is an arbitrary string to be -used later if you desire. Type is either 'ini' or 'json', and will -try to guess intelligently if omitted. - -Loaded files can be saved later. - -## chain.addUrl(url, type, [name=url]) - -Same as the filename thing, but with a url. - -Can't be saved later. - -## chain.addEnv(prefix, env, [name='env']) - -Add all the keys from the env object that start with the prefix. - -## chain.addString(data, file, type, [name]) - -Parse the string and add it to the set. (Mainly used internally.) - -## chain.add(object, [name]) - -Add the object to the set. - -## chain.root {Object} - -The root from which all the other config objects in the set descend -prototypically. - -Put your defaults here. - -## chain.set(key, value, name) - -Set the key to the value on the named config object. If name is -unset, then set it on the first config object in the set. (That is, -the one with the highest priority, which was added first.) - -## chain.get(key, [name]) - -Get the key from the named config object explicitly, or from the -resolved configs if not specified. - -## chain.save(name, type) - -Write the named config object back to its origin. - -Currently only supported for env and file config types. - -For files, encode the data according to the type. - -## chain.on('save', function () {}) - -When one or more files are saved, emits `save` event when they're all -saved. - -## chain.on('load', function (chain) {}) - -When the config chain has loaded all the specified files and urls and -such, the 'load' event fires. diff --git a/node_modules/core-util-is/LICENSE b/node_modules/core-util-is/LICENSE deleted file mode 100644 index d8d7f943..00000000 --- a/node_modules/core-util-is/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright Node.js 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. diff --git a/node_modules/core-util-is/README.md b/node_modules/core-util-is/README.md deleted file mode 100644 index 5a76b414..00000000 --- a/node_modules/core-util-is/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# core-util-is - -The `util.is*` functions introduced in Node v0.12. diff --git a/node_modules/core-util-is/float.patch b/node_modules/core-util-is/float.patch deleted file mode 100644 index a06d5c05..00000000 --- a/node_modules/core-util-is/float.patch +++ /dev/null @@ -1,604 +0,0 @@ -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/core-util-is/lib/util.js b/node_modules/core-util-is/lib/util.js deleted file mode 100644 index ff4c851c..00000000 --- a/node_modules/core-util-is/lib/util.js +++ /dev/null @@ -1,107 +0,0 @@ -// 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(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -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 objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (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; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} diff --git a/node_modules/core-util-is/package.json b/node_modules/core-util-is/package.json deleted file mode 100644 index d5b71fd1..00000000 --- a/node_modules/core-util-is/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_args": [ - [ - "core-util-is@1.0.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "core-util-is@1.0.2", - "_id": "core-util-is@1.0.2", - "_inBundle": false, - "_integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "_location": "/core-util-is", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "core-util-is@1.0.2", - "name": "core-util-is", - "escapedName": "core-util-is", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/readable-stream" - ], - "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/core-util-is/issues" - }, - "description": "The `util.is*` functions introduced in Node v0.12.", - "devDependencies": { - "tap": "^2.3.0" - }, - "homepage": "https://github.com/isaacs/core-util-is#readme", - "keywords": [ - "util", - "isBuffer", - "isArray", - "isNumber", - "isString", - "isRegExp", - "isThis", - "isThat", - "polyfill" - ], - "license": "MIT", - "main": "lib/util.js", - "name": "core-util-is", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/core-util-is.git" - }, - "scripts": { - "test": "tap test.js" - }, - "version": "1.0.2" -} diff --git a/node_modules/core-util-is/test.js b/node_modules/core-util-is/test.js deleted file mode 100644 index 1a490c65..00000000 --- a/node_modules/core-util-is/test.js +++ /dev/null @@ -1,68 +0,0 @@ -var assert = require('tap'); - -var t = require('./lib/util'); - -assert.equal(t.isArray([]), true); -assert.equal(t.isArray({}), false); - -assert.equal(t.isBoolean(null), false); -assert.equal(t.isBoolean(true), true); -assert.equal(t.isBoolean(false), true); - -assert.equal(t.isNull(null), true); -assert.equal(t.isNull(undefined), false); -assert.equal(t.isNull(false), false); -assert.equal(t.isNull(), false); - -assert.equal(t.isNullOrUndefined(null), true); -assert.equal(t.isNullOrUndefined(undefined), true); -assert.equal(t.isNullOrUndefined(false), false); -assert.equal(t.isNullOrUndefined(), true); - -assert.equal(t.isNumber(null), false); -assert.equal(t.isNumber('1'), false); -assert.equal(t.isNumber(1), true); - -assert.equal(t.isString(null), false); -assert.equal(t.isString('1'), true); -assert.equal(t.isString(1), false); - -assert.equal(t.isSymbol(null), false); -assert.equal(t.isSymbol('1'), false); -assert.equal(t.isSymbol(1), false); -assert.equal(t.isSymbol(Symbol()), true); - -assert.equal(t.isUndefined(null), false); -assert.equal(t.isUndefined(undefined), true); -assert.equal(t.isUndefined(false), false); -assert.equal(t.isUndefined(), true); - -assert.equal(t.isRegExp(null), false); -assert.equal(t.isRegExp('1'), false); -assert.equal(t.isRegExp(new RegExp()), true); - -assert.equal(t.isObject({}), true); -assert.equal(t.isObject([]), true); -assert.equal(t.isObject(new RegExp()), true); -assert.equal(t.isObject(new Date()), true); - -assert.equal(t.isDate(null), false); -assert.equal(t.isDate('1'), false); -assert.equal(t.isDate(new Date()), true); - -assert.equal(t.isError(null), false); -assert.equal(t.isError({ err: true }), false); -assert.equal(t.isError(new Error()), true); - -assert.equal(t.isFunction(null), false); -assert.equal(t.isFunction({ }), false); -assert.equal(t.isFunction(function() {}), true); - -assert.equal(t.isPrimitive(null), true); -assert.equal(t.isPrimitive(''), true); -assert.equal(t.isPrimitive(0), true); -assert.equal(t.isPrimitive(new Date()), false); - -assert.equal(t.isBuffer(null), false); -assert.equal(t.isBuffer({}), false); -assert.equal(t.isBuffer(new Buffer(0)), true); diff --git a/node_modules/cssbeautify/.npmignore b/node_modules/cssbeautify/.npmignore deleted file mode 100644 index f67c6526..00000000 --- a/node_modules/cssbeautify/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -.git -index.html -test/ -assets/ -images/ -/node_modules/ diff --git a/node_modules/cssbeautify/CONTRIBUTING.md b/node_modules/cssbeautify/CONTRIBUTING.md deleted file mode 100644 index 74bf7a04..00000000 --- a/node_modules/cssbeautify/CONTRIBUTING.md +++ /dev/null @@ -1,24 +0,0 @@ -# Contribution Guide - -This page describes how to contribute changes to CSS Beautify. - -Please do **not** create a pull request without reading this guide first. Failure to do so may result in the **rejection** of the pull request. - -## CLA - -Before we can accept any contributions, you need to sign [Contributor License Agreement](http://en.wikipedia.org/wiki/Contributor_License_Agreement). You can do that using Sencha Labs [online CLA](http://www.sencha.com/cla). - -## Coding Policies - -Make sure that your code passes [JSLint](http://jslint.com) checks. - -Make sure your patch does break existing tests (open test/index.html in a web browser). - -If you add a new feature, create a new test associated with that. Feature or enhancement pull request without a corresponding test will **not** be merged. - -## Pull Request - -For the actual contribution, please use [Github pull request](http://help.github.com/pull-requests/) workflow. - -Please do not create a pull request for multiple unrelated commits. It is strongly recommended to create a topic branch and make the commits as atomic as possible for the merge. This makes it easy to review all the changes. - diff --git a/node_modules/cssbeautify/README.md b/node_modules/cssbeautify/README.md deleted file mode 100644 index f7e78a32..00000000 --- a/node_modules/cssbeautify/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# CSS Beautify # - -CSS Beautify is a JavaScript implementation of reindenter and reformatter for styles written in [CSS](http://www.w3.org/Style/CSS/). - -Given the following style: - -```css -menu{color:red} navigation{background-color:#333} -``` - -CSS Beautify will produce: - -```css -menu { - color: red -} - -navigation { - background-color: #333 -} -``` - -Try it online at [cssbeautify.com](http://cssbeautify.com). For the -command-line use, install Node.js [cssbeautify](https://npmjs.org/package/cssbeautify) package. - -For more examples, see also its [test suite](http://cssbeautify.com/test/). - -## Using cssbeautify() function ## - -Since CSS Beautify is written in pure JavaScript, it can run anywhere that JavaScript can run. - -The API is very simple: - -```javascript -var result = cssbeautify(style, options); -``` - -**options** is an optional object to adjust the formatting. Known options so far are: - - * indent is a string used for the indentation of the declaration (default is 4 spaces) - * openbrace defines the placement of open curly brace, either *end-of-line* (default) or *separate-line*. - * autosemicolon always inserts a semicolon after the last ruleset (default is *false*) - -Example call: - -```javascript -var beautified = cssbeautify('menu{opacity:.7}', { - indent: ' ', - openbrace: 'separate-line', - autosemicolon: true -}); -``` - -## Contributing ## - -Contributions are welcomed! Please read the [Contribution Guide](https://github.com/senchalabs/cssbeautify/blob/master/CONTRIBUTING.md) for more info. - -## License ## - -Copyright (C) 2012 Sencha Inc. -Copyright (C) 2011 Sencha Inc. - -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/cssbeautify/bin/cssbeautify b/node_modules/cssbeautify/bin/cssbeautify deleted file mode 100755 index 0f8b9b42..00000000 --- a/node_modules/cssbeautify/bin/cssbeautify +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env node -/* - Copyright (C) 2012 Sencha Inc. - - Author: Ariya Hidayat. - - 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. -*/ - -/*jslint sloppy:true node:true */ - -var fs, cssbeautify, fname, content, options, style; - -fs = require('fs'); -cssbeautify = require('cssbeautify'); - -function showUsage() { - console.log('Usage:'); - console.log(' cssbeautify [options] style.css'); - console.log(); - console.log('Available options:'); - console.log(); - console.log(' -v, --version Shows program version'); - console.log(); - process.exit(1); -} - -if (process.argv.length <= 2) { - showUsage(); -} - -options = {}; - -process.argv.splice(2).forEach(function (entry) { - - if (entry === '-h' || entry === '--help') { - showUsage(); - } else if (entry === '-v' || entry === '--version') { - // Keep in sync with package.json - console.log('CSS Beautify version 0.3.1'); - console.log(); - process.exit(0); - } else if (entry.slice(0, 2) === '--') { - console.log('Error: unknown option ' + entry + '.'); - process.exit(1); - } else if (typeof fname === 'string') { - console.log('Error: more than one input file.'); - process.exit(1); - } else { - fname = entry; - } -}); - -if (typeof fname !== 'string') { - console.log('Error: no input file.'); - process.exit(1); -} - -try { - content = fs.readFileSync(fname, 'utf-8'); - style = cssbeautify(content); - console.log(style); -} catch (e) { - console.log('Error: ' + e.message); - process.exit(1); -} - diff --git a/node_modules/cssbeautify/cssbeautify.js b/node_modules/cssbeautify/cssbeautify.js deleted file mode 100644 index b4ae0961..00000000 --- a/node_modules/cssbeautify/cssbeautify.js +++ /dev/null @@ -1,469 +0,0 @@ -/* - Copyright (C) 2013 Sencha Inc. - Copyright (C) 2012 Sencha Inc. - Copyright (C) 2011 Sencha Inc. - - Author: Ariya Hidayat. - - 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. -*/ - -/*jslint continue: true, indent: 4 */ -/*global exports:true, module:true, window:true */ - -(function () { - - 'use strict'; - - function cssbeautify(style, opt) { - - var options, index = 0, length = style.length, blocks, formatted = '', - ch, ch2, str, state, State, depth, quote, comment, - openbracesuffix = true, - autosemicolon = false, - trimRight; - - options = arguments.length > 1 ? opt : {}; - if (typeof options.indent === 'undefined') { - options.indent = ' '; - } - if (typeof options.openbrace === 'string') { - openbracesuffix = (options.openbrace === 'end-of-line'); - } - if (typeof options.autosemicolon === 'boolean') { - autosemicolon = options.autosemicolon; - } - - function isWhitespace(c) { - return (c === ' ') || (c === '\n') || (c === '\t') || (c === '\r') || (c === '\f'); - } - - function isQuote(c) { - return (c === '\'') || (c === '"'); - } - - // FIXME: handle Unicode characters - function isName(c) { - return (ch >= 'a' && ch <= 'z') || - (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || - '-_*.:#[]'.indexOf(c) >= 0; - } - - function appendIndent() { - var i; - for (i = depth; i > 0; i -= 1) { - formatted += options.indent; - } - } - - function openBlock() { - formatted = trimRight(formatted); - if (openbracesuffix) { - formatted += ' {'; - } else { - formatted += '\n'; - appendIndent(); - formatted += '{'; - } - if (ch2 !== '\n') { - formatted += '\n'; - } - depth += 1; - } - - function closeBlock() { - var last; - depth -= 1; - formatted = trimRight(formatted); - - if (formatted.length > 0 && autosemicolon) { - last = formatted.charAt(formatted.length - 1); - if (last !== ';' && last !== '{') { - formatted += ';'; - } - } - - formatted += '\n'; - appendIndent(); - formatted += '}'; - blocks.push(formatted); - formatted = ''; - } - - if (String.prototype.trimRight) { - trimRight = function (s) { - return s.trimRight(); - }; - } else { - // old Internet Explorer - trimRight = function (s) { - return s.replace(/\s+$/, ''); - }; - } - - State = { - Start: 0, - AtRule: 1, - Block: 2, - Selector: 3, - Ruleset: 4, - Property: 5, - Separator: 6, - Expression: 7, - URL: 8 - }; - - depth = 0; - state = State.Start; - comment = false; - blocks = []; - - // We want to deal with LF (\n) only - style = style.replace(/\r\n/g, '\n'); - - while (index < length) { - ch = style.charAt(index); - ch2 = style.charAt(index + 1); - index += 1; - - // Inside a string literal? - if (isQuote(quote)) { - formatted += ch; - if (ch === quote) { - quote = null; - } - if (ch === '\\' && ch2 === quote) { - // Don't treat escaped character as the closing quote - formatted += ch2; - index += 1; - } - continue; - } - - // Starting a string literal? - if (isQuote(ch)) { - formatted += ch; - quote = ch; - continue; - } - - // Comment - if (comment) { - formatted += ch; - if (ch === '*' && ch2 === '/') { - comment = false; - formatted += ch2; - index += 1; - } - continue; - } - if (ch === '/' && ch2 === '*') { - comment = true; - formatted += ch; - formatted += ch2; - index += 1; - continue; - } - - if (state === State.Start) { - - if (blocks.length === 0) { - if (isWhitespace(ch) && formatted.length === 0) { - continue; - } - } - - // Copy white spaces and control characters - if (ch <= ' ' || ch.charCodeAt(0) >= 128) { - state = State.Start; - formatted += ch; - continue; - } - - // Selector or at-rule - if (isName(ch) || (ch === '@')) { - - // Clear trailing whitespaces and linefeeds. - str = trimRight(formatted); - - if (str.length === 0) { - // If we have empty string after removing all the trailing - // spaces, that means we are right after a block. - // Ensure a blank line as the separator. - if (blocks.length > 0) { - formatted = '\n\n'; - } - } else { - // After finishing a ruleset or directive statement, - // there should be one blank line. - if (str.charAt(str.length - 1) === '}' || - str.charAt(str.length - 1) === ';') { - - formatted = str + '\n\n'; - } else { - // After block comment, keep all the linefeeds but - // start from the first column (remove whitespaces prefix). - while (true) { - ch2 = formatted.charAt(formatted.length - 1); - if (ch2 !== ' ' && ch2.charCodeAt(0) !== 9) { - break; - } - formatted = formatted.substr(0, formatted.length - 1); - } - } - } - formatted += ch; - state = (ch === '@') ? State.AtRule : State.Selector; - continue; - } - } - - if (state === State.AtRule) { - - // ';' terminates a statement. - if (ch === ';') { - formatted += ch; - state = State.Start; - continue; - } - - // '{' starts a block - if (ch === '{') { - str = trimRight(formatted); - openBlock(); - state = (str === '@font-face') ? State.Ruleset : State.Block; - continue; - } - - formatted += ch; - continue; - } - - if (state === State.Block) { - - // Selector - if (isName(ch)) { - - // Clear trailing whitespaces and linefeeds. - str = trimRight(formatted); - - if (str.length === 0) { - // If we have empty string after removing all the trailing - // spaces, that means we are right after a block. - // Ensure a blank line as the separator. - if (blocks.length > 0) { - formatted = '\n\n'; - } - } else { - // Insert blank line if necessary. - if (str.charAt(str.length - 1) === '}') { - formatted = str + '\n\n'; - } else { - // After block comment, keep all the linefeeds but - // start from the first column (remove whitespaces prefix). - while (true) { - ch2 = formatted.charAt(formatted.length - 1); - if (ch2 !== ' ' && ch2.charCodeAt(0) !== 9) { - break; - } - formatted = formatted.substr(0, formatted.length - 1); - } - } - } - - appendIndent(); - formatted += ch; - state = State.Selector; - continue; - } - - // '}' resets the state. - if (ch === '}') { - closeBlock(); - state = State.Start; - continue; - } - - formatted += ch; - continue; - } - - if (state === State.Selector) { - - // '{' starts the ruleset. - if (ch === '{') { - openBlock(); - state = State.Ruleset; - continue; - } - - // '}' resets the state. - if (ch === '}') { - closeBlock(); - state = State.Start; - continue; - } - - formatted += ch; - continue; - } - - if (state === State.Ruleset) { - - // '}' finishes the ruleset. - if (ch === '}') { - closeBlock(); - state = State.Start; - if (depth > 0) { - state = State.Block; - } - continue; - } - - // Make sure there is no blank line or trailing spaces inbetween - if (ch === '\n') { - formatted = trimRight(formatted); - formatted += '\n'; - continue; - } - - // property name - if (!isWhitespace(ch)) { - formatted = trimRight(formatted); - formatted += '\n'; - appendIndent(); - formatted += ch; - state = State.Property; - continue; - } - formatted += ch; - continue; - } - - if (state === State.Property) { - - // ':' concludes the property. - if (ch === ':') { - formatted = trimRight(formatted); - formatted += ': '; - state = State.Expression; - if (isWhitespace(ch2)) { - state = State.Separator; - } - continue; - } - - // '}' finishes the ruleset. - if (ch === '}') { - closeBlock(); - state = State.Start; - if (depth > 0) { - state = State.Block; - } - continue; - } - - formatted += ch; - continue; - } - - if (state === State.Separator) { - - // Non-whitespace starts the expression. - if (!isWhitespace(ch)) { - formatted += ch; - state = State.Expression; - continue; - } - - // Anticipate string literal. - if (isQuote(ch2)) { - state = State.Expression; - } - - continue; - } - - if (state === State.Expression) { - - // '}' finishes the ruleset. - if (ch === '}') { - closeBlock(); - state = State.Start; - if (depth > 0) { - state = State.Block; - } - continue; - } - - // ';' completes the declaration. - if (ch === ';') { - formatted = trimRight(formatted); - formatted += ';\n'; - state = State.Ruleset; - continue; - } - - formatted += ch; - - if (ch === '(') { - if (formatted.charAt(formatted.length - 2) === 'l' && - formatted.charAt(formatted.length - 3) === 'r' && - formatted.charAt(formatted.length - 4) === 'u') { - - // URL starts with '(' and closes with ')'. - state = State.URL; - continue; - } - } - - continue; - } - - if (state === State.URL) { - - - // ')' finishes the URL (only if it is not escaped). - if (ch === ')' && formatted.charAt(formatted.length - 1 !== '\\')) { - formatted += ch; - state = State.Expression; - continue; - } - } - - // The default action is to copy the character (to prevent - // infinite loop). - formatted += ch; - } - - formatted = blocks.join('') + formatted; - - return formatted; - } - - if (typeof exports !== 'undefined') { - // Node.js module. - module.exports = exports = cssbeautify; - } else if (typeof window === 'object') { - // Browser loading. - window.cssbeautify = cssbeautify; - } - -}()); diff --git a/node_modules/cssbeautify/cssbeautify.sublime-project b/node_modules/cssbeautify/cssbeautify.sublime-project deleted file mode 100644 index 89ea1f18..00000000 --- a/node_modules/cssbeautify/cssbeautify.sublime-project +++ /dev/null @@ -1,8 +0,0 @@ -{ - "folders": - [ - { - "path": "/Users/ariyahidayat/dev/sencha/cssbeautify" - } - ] -} diff --git a/node_modules/cssbeautify/cssbeautify.sublime-workspace b/node_modules/cssbeautify/cssbeautify.sublime-workspace deleted file mode 100644 index 0b4baf78..00000000 --- a/node_modules/cssbeautify/cssbeautify.sublime-workspace +++ /dev/null @@ -1,179 +0,0 @@ -{ - "auto_complete": - { - "selected_items": - [ - ] - }, - "buffers": - [ - { - "contents": "/*\n Copyright (C) 2013 Sencha Inc.\n Copyright (C) 2012 Sencha Inc.\n Copyright (C) 2011 Sencha Inc.\n\n Author: Ariya Hidayat.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n*/\n\n/*jslint continue: true, indent: 4 */\n/*global exports:true, module:true, window:true */\n\n(function () {\n\n 'use strict';\n\n function cssbeautify(style, opt) {\n\n var options, index = 0, length = style.length, blocks, formatted = '',\n ch, ch2, str, state, State, depth, quote, comment,\n openbracesuffix = true,\n autosemicolon = false,\n trimRight;\n\n options = arguments.length > 1 ? opt : {};\n if (typeof options.indent === 'undefined') {\n options.indent = ' ';\n }\n if (typeof options.openbrace === 'string') {\n openbracesuffix = (options.openbrace === 'end-of-line');\n }\n if (typeof options.autosemicolon === 'boolean') {\n autosemicolon = options.autosemicolon;\n }\n\n function isWhitespace(c) {\n return (c === ' ') || (c === '\\n') || (c === '\\t') || (c === '\\r') || (c === '\\f');\n }\n\n function isQuote(c) {\n return (c === '\\'') || (c === '\"');\n }\n\n // FIXME: handle Unicode characters\n function isName(c) {\n return (ch >= 'a' && ch <= 'z') ||\n (ch >= 'A' && ch <= 'Z') ||\n (ch >= '0' && ch <= '9') ||\n '-_*.:#'.indexOf(c) >= 0;\n }\n\n function appendIndent() {\n var i;\n for (i = depth; i > 0; i -= 1) {\n formatted += options.indent;\n }\n }\n\n function openBlock() {\n formatted = trimRight(formatted);\n if (openbracesuffix) {\n formatted += ' {';\n } else {\n formatted += '\\n';\n appendIndent();\n formatted += '{';\n }\n if (ch2 !== '\\n') {\n formatted += '\\n';\n }\n depth += 1;\n }\n\n function closeBlock() {\n var ch;\n depth -= 1;\n formatted = trimRight(formatted);\n\n if (autosemicolon) {\n ch = formatted.charAt(formatted.length - 1);\n if (ch !== ';' && ch !== '{') {\n formatted += ';';\n }\n }\n\n formatted += '\\n';\n appendIndent();\n formatted += '}';\n blocks.push(formatted);\n formatted = '';\n }\n\n if (String.prototype.trimRight) {\n trimRight = function (s) {\n return s.trimRight();\n };\n } else {\n // old Internet Explorer\n trimRight = function (s) {\n return s.replace(/\\s+$/, '');\n };\n }\n\n State = {\n Start: 0,\n AtRule: 1,\n Block: 2,\n Selector: 3,\n Ruleset: 4,\n Property: 5,\n Separator: 6,\n Expression: 7,\n URL: 8\n };\n\n depth = 0;\n state = State.Start;\n comment = false;\n blocks = [];\n\n // We want to deal with LF (\\n) only\n style = style.replace(/\\r\\n/g, '\\n');\n\n while (index < length) {\n ch = style.charAt(index);\n ch2 = style.charAt(index + 1);\n index += 1;\n\n // Inside a string literal?\n if (isQuote(quote)) {\n formatted += ch;\n if (ch === quote) {\n quote = null;\n }\n if (ch === '\\\\' && ch2 === quote) {\n // Don't treat escaped character as the closing quote\n formatted += ch2;\n index += 1;\n }\n continue;\n }\n\n // Starting a string literal?\n if (isQuote(ch)) {\n formatted += ch;\n quote = ch;\n continue;\n }\n\n // Comment\n if (comment) {\n formatted += ch;\n if (ch === '*' && ch2 === '/') {\n comment = false;\n formatted += ch2;\n index += 1;\n }\n continue;\n } else {\n if (ch === '/' && ch2 === '*') {\n comment = true;\n formatted += ch;\n formatted += ch2;\n index += 1;\n continue;\n }\n }\n\n if (state === State.Start) {\n\n if (blocks.length === 0) {\n if (isWhitespace(ch) && formatted.length === 0) {\n continue;\n }\n }\n\n // Copy white spaces and control characters\n if (ch <= ' ' || ch.charCodeAt(0) >= 128) {\n state = State.Start;\n formatted += ch;\n continue;\n }\n\n // Selector or at-rule\n if (isName(ch) || (ch === '[') || (ch === '@')) {\n\n // Clear trailing whitespaces and linefeeds.\n str = trimRight(formatted);\n\n if (str.length === 0) {\n // If we have empty string after removing all the trailing\n // spaces, that means we are right after a block.\n // Ensure a blank line as the separator.\n if (blocks.length > 0) {\n formatted = '\\n\\n';\n }\n } else {\n // After finishing a ruleset or directive statement,\n // there should be one blank line.\n if (str.charAt(str.length - 1) === '}' ||\n str.charAt(str.length - 1) === ';') {\n\n formatted = str + '\\n\\n';\n } else {\n // After block comment, keep all the linefeeds but\n // start from the first column (remove whitespaces prefix).\n while (true) {\n ch2 = formatted.charAt(formatted.length - 1);\n if (ch2 !== ' ' && ch2.charCodeAt(0) !== 9) {\n break;\n }\n formatted = formatted.substr(0, formatted.length - 1);\n }\n }\n }\n formatted += ch;\n state = (ch === '@') ? State.AtRule : State.Selector;\n continue;\n }\n }\n\n if (state === State.AtRule) {\n\n // ';' terminates a statement.\n if (ch === ';') {\n formatted += ch;\n state = State.Start;\n continue;\n }\n\n // '{' starts a block\n if (ch === '{') {\n str = trimRight(formatted);\n openBlock();\n state = (str === '@font-face') ? State.Ruleset : State.Block;\n continue;\n }\n\n formatted += ch;\n continue;\n }\n\n if (state === State.Block) {\n\n // Selector\n if (isName(ch)) {\n\n // Clear trailing whitespaces and linefeeds.\n str = trimRight(formatted);\n\n if (str.length === 0) {\n // If we have empty string after removing all the trailing\n // spaces, that means we are right after a block.\n // Ensure a blank line as the separator.\n if (blocks.length > 0) {\n formatted = '\\n\\n';\n }\n } else {\n // Insert blank line if necessary.\n if (str.charAt(str.length - 1) === '}') {\n formatted = str + '\\n\\n';\n } else {\n // After block comment, keep all the linefeeds but\n // start from the first column (remove whitespaces prefix).\n while (true) {\n ch2 = formatted.charAt(formatted.length - 1);\n if (ch2 !== ' ' && ch2.charCodeAt(0) !== 9) {\n break;\n }\n formatted = formatted.substr(0, formatted.length - 1);\n }\n }\n }\n\n appendIndent();\n formatted += ch;\n state = State.Selector;\n continue;\n }\n\n // '}' resets the state.\n if (ch === '}') {\n closeBlock();\n state = State.Start;\n continue;\n }\n\n formatted += ch;\n continue;\n }\n\n if (state === State.Selector) {\n\n // '{' starts the ruleset.\n if (ch === '{') {\n openBlock();\n state = State.Ruleset;\n continue;\n }\n\n // '}' resets the state.\n if (ch === '}') {\n closeBlock();\n state = State.Start;\n continue;\n }\n\n formatted += ch;\n continue;\n }\n\n if (state === State.Ruleset) {\n\n // '}' finishes the ruleset.\n if (ch === '}') {\n closeBlock();\n state = State.Start;\n if (depth > 0) {\n state = State.Block;\n }\n continue;\n }\n\n // Make sure there is no blank line or trailing spaces inbetween\n if (ch === '\\n') {\n formatted = trimRight(formatted);\n formatted += '\\n';\n continue;\n }\n\n // property name\n if (!isWhitespace(ch)) {\n formatted = trimRight(formatted);\n formatted += '\\n';\n appendIndent();\n formatted += ch;\n state = State.Property;\n continue;\n }\n formatted += ch;\n continue;\n }\n\n if (state === State.Property) {\n\n // ':' concludes the property.\n if (ch === ':') {\n formatted = trimRight(formatted);\n formatted += ': ';\n state = State.Expression;\n if (isWhitespace(ch2)) {\n state = State.Separator;\n }\n continue;\n }\n\n // '}' finishes the ruleset.\n if (ch === '}') {\n closeBlock();\n state = State.Start;\n if (depth > 0) {\n state = State.Block;\n }\n continue;\n }\n\n formatted += ch;\n continue;\n }\n\n if (state === State.Separator) {\n\n // Non-whitespace starts the expression.\n if (!isWhitespace(ch)) {\n formatted += ch;\n state = State.Expression;\n continue;\n }\n\n // Anticipate string literal.\n if (isQuote(ch2)) {\n state = State.Expression;\n }\n\n continue;\n }\n\n if (state === State.Expression) {\n\n // '}' finishes the ruleset.\n if (ch === '}') {\n closeBlock();\n state = State.Start;\n if (depth > 0) {\n state = State.Block;\n }\n continue;\n }\n\n // ';' completes the declaration.\n if (ch === ';') {\n formatted = trimRight(formatted);\n formatted += ';\\n';\n state = State.Ruleset;\n continue;\n }\n\n formatted += ch;\n\n if (ch === '(') {\n if (formatted.charAt(formatted.length - 2) === 'l' &&\n formatted.charAt(formatted.length - 3) === 'r' &&\n formatted.charAt(formatted.length - 4) === 'u') {\n\n // URL starts with '(' and closes with ')'.\n state = State.URL;\n continue;\n }\n }\n\n continue;\n }\n\n if (state === State.URL) {\n\n\n // ')' finishes the URL (only if it is not escaped).\n if (ch === ')' && formatted.charAt(formatted.length - 1 !== '\\\\')) {\n formatted += ch;\n state = State.Expression;\n continue;\n }\n }\n\n // The default action is to copy the character (to prevent\n // infinite loop).\n formatted += ch;\n }\n\n formatted = blocks.join('') + formatted;\n\n return formatted;\n }\n\n if (typeof exports !== 'undefined') {\n // Node.js module.\n module.exports = exports = cssbeautify;\n } else if (typeof window === 'object') {\n // Browser loading.\n window.cssbeautify = cssbeautify;\n }\n\n}());\n", - "file": "cssbeautify.js", - "file_size": 15117, - "file_write_time": 1363040172000000, - "settings": - { - "buffer_size": 15117, - "line_ending": "Unix" - } - } - ], - "build_system": "", - "command_palette": - { - "height": 0.0, - "selected_items": - [ - ], - "width": 0.0 - }, - "console": - { - "height": 0.0 - }, - "distraction_free": - { - "menu_visible": true, - "show_minimap": false, - "show_open_files": false, - "show_tabs": false, - "side_bar_visible": false, - "status_bar_visible": false - }, - "file_history": - [ - "/Users/ariyahidayat/dev/sencha/cssbeautify/package.json", - "/Users/ariyahidayat/dev/sencha/cssbeautify/cssbeautify.sublime-workspace", - "/Users/ariyahidayat/dev/sencha/cssbeautify/cssbeautify.js" - ], - "find": - { - "height": 0.0 - }, - "find_in_files": - { - "height": 0.0, - "where_history": - [ - ] - }, - "find_state": - { - "case_sensitive": false, - "find_history": - [ - ], - "highlight": true, - "in_selection": false, - "preserve_case": false, - "regex": false, - "replace_history": - [ - ], - "reverse": false, - "show_context": true, - "use_buffer2": true, - "whole_word": false, - "wrap": true - }, - "groups": - [ - { - "selected": 0, - "sheets": - [ - { - "buffer": 0, - "file": "cssbeautify.js", - "settings": - { - "buffer_size": 15117, - "regions": - { - }, - "selection": - [ - [ - 10743, - 10743 - ] - ], - "settings": - { - "syntax": "Packages/JavaScript/JavaScript.tmLanguage", - "tab_size": 4, - "translate_tabs_to_spaces": true - }, - "translation.x": 0.0, - "translation.y": 0.0, - "zoom_level": 1.0 - }, - "type": "text" - } - ] - } - ], - "incremental_find": - { - "height": 0.0 - }, - "input": - { - "height": 0.0 - }, - "layout": - { - "cells": - [ - [ - 0, - 0, - 1, - 1 - ] - ], - "cols": - [ - 0.0, - 1.0 - ], - "rows": - [ - 0.0, - 1.0 - ] - }, - "menu_visible": true, - "replace": - { - "height": 0.0 - }, - "save_all_on_build": true, - "select_file": - { - "height": 0.0, - "selected_items": - [ - [ - "pac", - "package.json" - ] - ], - "width": 0.0 - }, - "select_project": - { - "height": 0.0, - "selected_items": - [ - ], - "width": 0.0 - }, - "show_minimap": true, - "show_open_files": false, - "show_tabs": true, - "side_bar_visible": true, - "side_bar_width": 206.0, - "status_bar_visible": true -} diff --git a/node_modules/cssbeautify/package.json b/node_modules/cssbeautify/package.json deleted file mode 100644 index c8db449c..00000000 --- a/node_modules/cssbeautify/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_args": [ - [ - "cssbeautify@0.3.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "cssbeautify@0.3.1", - "_id": "cssbeautify@0.3.1", - "_inBundle": false, - "_integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=", - "_location": "/cssbeautify", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "cssbeautify@0.3.1", - "name": "cssbeautify", - "escapedName": "cssbeautify", - "rawSpec": "0.3.1", - "saveSpec": null, - "fetchSpec": "0.3.1" - }, - "_requiredBy": [ - "/beautify" - ], - "_resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz", - "_spec": "0.3.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Ariya Hidayat", - "email": "ariya@sencha.com" - }, - "bin": { - "cssbeautify": "bin/cssbeautify" - }, - "bugs": { - "url": "https://github.com/senchalabs/cssbeautify/issues" - }, - "description": "Reindent and reformat CSS.", - "engines": { - "node": "*" - }, - "homepage": "http://cssbeautify.com", - "keywords": [ - "cssbeautify", - "css", - "formatter" - ], - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/senchalabs/cssbeautify/blob/master/README.md" - } - ], - "main": "cssbeautify.js", - "name": "cssbeautify", - "repository": { - "type": "git", - "url": "git+https://github.com/senchalabs/cssbeautify.git" - }, - "scripts": { - "test": "node test/runner.js" - }, - "version": "0.3.1" -} diff --git a/node_modules/editorconfig/CHANGELOG.md b/node_modules/editorconfig/CHANGELOG.md deleted file mode 100644 index 15898531..00000000 --- a/node_modules/editorconfig/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -## 0.15.3 -- Move @types dependencies to dev dependencies. -- Upgrade dependencies. - -## 0.15.2 -- Fix publish. - -## 0.15.1 -- Update dependencies. - -## 0.15.0 -- Convert source code into TypeScript. Generated type definitions are now provided. -- Remove dependency on Bluebird. -- **Breaking**: Node v4 no longer supported. diff --git a/node_modules/editorconfig/LICENSE b/node_modules/editorconfig/LICENSE deleted file mode 100644 index 85329c84..00000000 --- a/node_modules/editorconfig/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright © 2012 EditorConfig Team - -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/editorconfig/README.md b/node_modules/editorconfig/README.md deleted file mode 100644 index 6ff281a8..00000000 --- a/node_modules/editorconfig/README.md +++ /dev/null @@ -1,206 +0,0 @@ -# EditorConfig JavaScript Core - -[![Build Status](https://travis-ci.org/editorconfig/editorconfig-core-js.svg?branch=master)](https://travis-ci.org/editorconfig/editorconfig-core-js) -[![dependencies Status](https://david-dm.org/editorconfig/editorconfig-core-js/status.svg)](https://david-dm.org/editorconfig/editorconfig-core-js) - -The EditorConfig JavaScript core will provide the same functionality as the -[EditorConfig C Core][] and [EditorConfig Python Core][]. - - -## Installation - -You need [node][] to use this package. - -To install the package locally: - -```bash -$ npm install editorconfig -``` - -To install the package system-wide: - -```bash -$ npm install -g editorconfig -``` - -## Usage - -### in Node.js: - -#### parse(filePath[, options]) - -options is an object with the following defaults: - -```js -{ - config: '.editorconfig', - version: pkg.version, - root: '/' -}; -``` - -Search for `.editorconfig` starting from the current directory to the root directory. - -Example: - -```js -var editorconfig = require('editorconfig'); -var path = require('path'); -var filePath = path.join(__dirname, '/sample.js'); -var promise = editorconfig.parse(filePath); -promise.then(function onFulfilled(result) { - console.log(result); -}); - -/* - { - indent_style: 'space', - indent_size: 2, - end_of_line: 'lf', - charset: 'utf-8', - trim_trailing_whitespace: true, - insert_final_newline: true, - tab_width: 2 - }; -*/ -``` - -#### parseSync(filePath[, options]) - -Synchronous version of `editorconfig.parse()`. - -#### parseString(fileContent) - -The `parse()` function above uses `parseString()` under the hood. If you have your file contents -just pass it to `parseString()` and it'll return the same results as `parse()`. - -#### parseFromFiles(filePath, configs[, options]) - -options is an object with the following defaults: - -```js -{ - config: '.editorconfig', - version: pkg.version, - root: '/' -}; -``` - -Specify the `.editorconfig`. - -Example: - -```js -var editorconfig = require('editorconfig'); -var fs = require('fs'); -var path = require('path'); -var configPath = path.join(__dirname, '/.editorconfig'); -var configs = [ - { - name: configPath, - contents: fs.readFileSync(configPath, 'utf8') - } -]; -var filePath = path.join(__dirname, '/sample.js'); -var promise = editorconfig.parseFromFiles(filePath, configs); -promise.then(function onFulfilled(result) { - console.log(result) -}); - -/* - { - indent_style: 'space', - indent_size: 2, - end_of_line: 'lf', - charset: 'utf-8', - trim_trailing_whitespace: true, - insert_final_newline: true, - tab_width: 2 - }; -*/ -``` - -#### parseFromFilesSync(filePath, configs[, options]) - -Synchronous version of `editorconfig.parseFromFiles()`. - -### in Command Line - -```bash -$ ./bin/editorconfig - - Usage: editorconfig [OPTIONS] FILEPATH1 [FILEPATH2 FILEPATH3 ...] - - EditorConfig Node.js Core Version 0.11.4-development - - FILEPATH can be a hyphen (-) if you want path(s) to be read from stdin. - - Options: - - -h, --help output usage information - -V, --version output the version number - -f Specify conf filename other than ".editorconfig" - -b Specify version (used by devs to test compatibility) -``` - -Example: - -```bash -$ ./bin/editorconfig /home/zoidberg/humans/anatomy.md -charset=utf-8 -insert_final_newline=true -end_of_line=lf -tab_width=8 -trim_trailing_whitespace=sometimes -``` - -## Development - -To install dependencies for this package run this in the package directory: - -```bash -$ npm install -``` - -Next, run the following commands: - -```bash -$ npm run build -$ npm run copy -$ npm link ./dist -``` - -The global editorconfig will now point to the files in your development -repository instead of a globally-installed version from npm. You can now use -editorconfig directly to test your changes. - -If you ever update from the central repository and there are errors, it might -be because you are missing some dependencies. If that happens, just run npm -link again to get the latest dependencies. - -To test the command line interface: - -```bash -$ editorconfig -``` - -# Testing - -[CMake][] must be installed to run the tests. - -To run the tests: - -```bash -$ npm test -``` - -To run the tests with increased verbosity (for debugging test failures): - -```bash -$ npm run-script test-verbose -``` - -[EditorConfig C Core]: https://github.com/editorconfig/editorconfig-core -[EditorConfig Python Core]: https://github.com/editorconfig/editorconfig-core-py -[node]: http://nodejs.org/ -[cmake]: http://www.cmake.org diff --git a/node_modules/editorconfig/bin/editorconfig b/node_modules/editorconfig/bin/editorconfig deleted file mode 100755 index a7792ace..00000000 --- a/node_modules/editorconfig/bin/editorconfig +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -var cli = require('../src/cli') -cli.default(process.argv) diff --git a/node_modules/editorconfig/package.json b/node_modules/editorconfig/package.json deleted file mode 100644 index 680525e0..00000000 --- a/node_modules/editorconfig/package.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "_args": [ - [ - "editorconfig@0.15.3", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "editorconfig@0.15.3", - "_id": "editorconfig@0.15.3", - "_inBundle": false, - "_integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "_location": "/editorconfig", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "editorconfig@0.15.3", - "name": "editorconfig", - "escapedName": "editorconfig", - "rawSpec": "0.15.3", - "saveSpec": null, - "fetchSpec": "0.15.3" - }, - "_requiredBy": [ - "/js-beautify" - ], - "_resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "_spec": "0.15.3", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "EditorConfig Team" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "bugs": { - "url": "https://github.com/editorconfig/editorconfig-core-js/issues" - }, - "contributors": [ - { - "name": "Hong Xu", - "url": "topbug.net" - }, - { - "name": "Jed Mao", - "url": "https://github.com/jedmao/" - }, - { - "name": "Trey Hunner", - "url": "http://treyhunner.com" - } - ], - "dependencies": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - }, - "description": "EditorConfig File Locator and Interpreter for Node.js", - "devDependencies": { - "@types/mocha": "^5.2.6", - "@types/node": "^10.12.29", - "@types/semver": "^5.5.0", - "cpy-cli": "^2.0.0", - "eclint": "^2.8.1", - "mocha": "^5.2.0", - "rimraf": "^2.6.3", - "should": "^13.2.3", - "tslint": "^5.13.1", - "typescript": "^3.3.3333" - }, - "directories": { - "bin": "./bin", - "lib": "./lib" - }, - "homepage": "https://github.com/editorconfig/editorconfig-core-js#readme", - "keywords": [ - "editorconfig", - "core" - ], - "license": "MIT", - "main": "src/index.js", - "name": "editorconfig", - "repository": { - "type": "git", - "url": "git://github.com/editorconfig/editorconfig-core-js.git" - }, - "scripts": { - "build": "tsc", - "clean": "rimraf dist", - "copy": "cpy .npmignore LICENSE README.md CHANGELOG.md dist && cpy bin/* dist/bin && cpy src/lib/fnmatch*.* dist/src/lib", - "eclint": "eclint check --indent_size ignore \"src/**\"", - "lint": "npm run eclint && npm run tslint", - "prebuild": "npm run clean", - "prepub": "npm run lint && npm run build && npm run copy", - "pretest": "npm run lint && npm run build && npm run copy && cmake .", - "pretest:ci": "npm run pretest", - "pub": "npm publish ./dist", - "test": "ctest .", - "test:ci": "ctest -VV --output-on-failure .", - "tslint": "tslint --project tsconfig.json --exclude package.json" - }, - "version": "0.15.3" -} diff --git a/node_modules/editorconfig/src/cli.d.ts b/node_modules/editorconfig/src/cli.d.ts deleted file mode 100644 index b6c6640b..00000000 --- a/node_modules/editorconfig/src/cli.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function cli(args: string[]): void; diff --git a/node_modules/editorconfig/src/cli.js b/node_modules/editorconfig/src/cli.js deleted file mode 100644 index 0589b0c6..00000000 --- a/node_modules/editorconfig/src/cli.js +++ /dev/null @@ -1,53 +0,0 @@ -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// tslint:disable:no-console -var commander_1 = __importDefault(require("commander")); -var editorconfig = __importStar(require("./")); -var package_json_1 = __importDefault(require("../package.json")); -function cli(args) { - commander_1.default.version('EditorConfig Node.js Core Version ' + package_json_1.default.version); - commander_1.default - .usage([ - '[OPTIONS] FILEPATH1 [FILEPATH2 FILEPATH3 ...]', - commander_1.default._version, - 'FILEPATH can be a hyphen (-) if you want path(s) to be read from stdin.', - ].join('\n\n ')) - .option('-f ', 'Specify conf filename other than \'.editorconfig\'') - .option('-b ', 'Specify version (used by devs to test compatibility)') - .option('-v, --version', 'Display version information') - .parse(args); - // Throw away the native -V flag in lieu of the one we've manually specified - // to adhere to testing requirements - commander_1.default.options.shift(); - var files = commander_1.default.args; - if (!files.length) { - commander_1.default.help(); - } - files - .map(function (filePath) { return editorconfig.parse(filePath, { - config: commander_1.default.F, - version: commander_1.default.B, - }); }) - .forEach(function (parsing, i, _a) { - var length = _a.length; - parsing.then(function (parsed) { - if (length > 1) { - console.log("[" + files[i] + "]"); - } - Object.keys(parsed).forEach(function (key) { - console.log(key + "=" + parsed[key]); - }); - }); - }); -} -exports.default = cli; diff --git a/node_modules/editorconfig/src/index.d.ts b/node_modules/editorconfig/src/index.d.ts deleted file mode 100644 index 1a69317d..00000000 --- a/node_modules/editorconfig/src/index.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -/// -import { parseString, ParseStringResult } from './lib/ini'; -export { parseString }; -export interface KnownProps { - end_of_line?: 'lf' | 'crlf' | 'unset'; - indent_style?: 'tab' | 'space' | 'unset'; - indent_size?: number | 'tab' | 'unset'; - insert_final_newline?: true | false | 'unset'; - tab_width?: number | 'unset'; - trim_trailing_whitespace?: true | false | 'unset'; - charset?: string | 'unset'; -} -export interface ECFile { - name: string; - contents: string | Buffer; -} -export interface FileConfig { - name: string; - contents: ParseStringResult; -} -export interface ParseOptions { - config?: string; - version?: string; - root?: string; -} -export declare function parseFromFiles(filepath: string, files: Promise, options?: ParseOptions): Promise; -export declare function parseFromFilesSync(filepath: string, files: ECFile[], options?: ParseOptions): KnownProps; -export declare function parse(_filepath: string, _options?: ParseOptions): Promise; -export declare function parseSync(_filepath: string, _options?: ParseOptions): KnownProps; diff --git a/node_modules/editorconfig/src/index.js b/node_modules/editorconfig/src/index.js deleted file mode 100644 index 60863664..00000000 --- a/node_modules/editorconfig/src/index.js +++ /dev/null @@ -1,261 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var fs = __importStar(require("fs")); -var path = __importStar(require("path")); -var semver = __importStar(require("semver")); -var fnmatch_1 = __importDefault(require("./lib/fnmatch")); -var ini_1 = require("./lib/ini"); -exports.parseString = ini_1.parseString; -var package_json_1 = __importDefault(require("../package.json")); -var knownProps = { - end_of_line: true, - indent_style: true, - indent_size: true, - insert_final_newline: true, - trim_trailing_whitespace: true, - charset: true, -}; -function fnmatch(filepath, glob) { - var matchOptions = { matchBase: true, dot: true, noext: true }; - glob = glob.replace(/\*\*/g, '{*,**/**/**}'); - return fnmatch_1.default(filepath, glob, matchOptions); -} -function getConfigFileNames(filepath, options) { - var paths = []; - do { - filepath = path.dirname(filepath); - paths.push(path.join(filepath, options.config)); - } while (filepath !== options.root); - return paths; -} -function processMatches(matches, version) { - // Set indent_size to 'tab' if indent_size is unspecified and - // indent_style is set to 'tab'. - if ('indent_style' in matches - && matches.indent_style === 'tab' - && !('indent_size' in matches) - && semver.gte(version, '0.10.0')) { - matches.indent_size = 'tab'; - } - // Set tab_width to indent_size if indent_size is specified and - // tab_width is unspecified - if ('indent_size' in matches - && !('tab_width' in matches) - && matches.indent_size !== 'tab') { - matches.tab_width = matches.indent_size; - } - // Set indent_size to tab_width if indent_size is 'tab' - if ('indent_size' in matches - && 'tab_width' in matches - && matches.indent_size === 'tab') { - matches.indent_size = matches.tab_width; - } - return matches; -} -function processOptions(options, filepath) { - if (options === void 0) { options = {}; } - return { - config: options.config || '.editorconfig', - version: options.version || package_json_1.default.version, - root: path.resolve(options.root || path.parse(filepath).root), - }; -} -function buildFullGlob(pathPrefix, glob) { - switch (glob.indexOf('/')) { - case -1: - glob = '**/' + glob; - break; - case 0: - glob = glob.substring(1); - break; - default: - break; - } - return path.join(pathPrefix, glob); -} -function extendProps(props, options) { - if (props === void 0) { props = {}; } - if (options === void 0) { options = {}; } - for (var key in options) { - if (options.hasOwnProperty(key)) { - var value = options[key]; - var key2 = key.toLowerCase(); - var value2 = value; - if (knownProps[key2]) { - value2 = value.toLowerCase(); - } - try { - value2 = JSON.parse(value); - } - catch (e) { } - if (typeof value === 'undefined' || value === null) { - // null and undefined are values specific to JSON (no special meaning - // in editorconfig) & should just be returned as regular strings. - value2 = String(value); - } - props[key2] = value2; - } - } - return props; -} -function parseFromConfigs(configs, filepath, options) { - return processMatches(configs - .reverse() - .reduce(function (matches, file) { - var pathPrefix = path.dirname(file.name); - file.contents.forEach(function (section) { - var glob = section[0]; - var options2 = section[1]; - if (!glob) { - return; - } - var fullGlob = buildFullGlob(pathPrefix, glob); - if (!fnmatch(filepath, fullGlob)) { - return; - } - matches = extendProps(matches, options2); - }); - return matches; - }, {}), options.version); -} -function getConfigsForFiles(files) { - var configs = []; - for (var i in files) { - if (files.hasOwnProperty(i)) { - var file = files[i]; - var contents = ini_1.parseString(file.contents); - configs.push({ - name: file.name, - contents: contents, - }); - if ((contents[0][1].root || '').toLowerCase() === 'true') { - break; - } - } - } - return configs; -} -function readConfigFiles(filepaths) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, Promise.all(filepaths.map(function (name) { return new Promise(function (resolve) { - fs.readFile(name, 'utf8', function (err, data) { - resolve({ - name: name, - contents: err ? '' : data, - }); - }); - }); }))]; - }); - }); -} -function readConfigFilesSync(filepaths) { - var files = []; - var file; - filepaths.forEach(function (filepath) { - try { - file = fs.readFileSync(filepath, 'utf8'); - } - catch (e) { - file = ''; - } - files.push({ - name: filepath, - contents: file, - }); - }); - return files; -} -function opts(filepath, options) { - if (options === void 0) { options = {}; } - var resolvedFilePath = path.resolve(filepath); - return [ - resolvedFilePath, - processOptions(options, resolvedFilePath), - ]; -} -function parseFromFiles(filepath, files, options) { - if (options === void 0) { options = {}; } - return __awaiter(this, void 0, void 0, function () { - var _a, resolvedFilePath, processedOptions; - return __generator(this, function (_b) { - _a = opts(filepath, options), resolvedFilePath = _a[0], processedOptions = _a[1]; - return [2 /*return*/, files.then(getConfigsForFiles) - .then(function (configs) { return parseFromConfigs(configs, resolvedFilePath, processedOptions); })]; - }); - }); -} -exports.parseFromFiles = parseFromFiles; -function parseFromFilesSync(filepath, files, options) { - if (options === void 0) { options = {}; } - var _a = opts(filepath, options), resolvedFilePath = _a[0], processedOptions = _a[1]; - return parseFromConfigs(getConfigsForFiles(files), resolvedFilePath, processedOptions); -} -exports.parseFromFilesSync = parseFromFilesSync; -function parse(_filepath, _options) { - if (_options === void 0) { _options = {}; } - return __awaiter(this, void 0, void 0, function () { - var _a, resolvedFilePath, processedOptions, filepaths; - return __generator(this, function (_b) { - _a = opts(_filepath, _options), resolvedFilePath = _a[0], processedOptions = _a[1]; - filepaths = getConfigFileNames(resolvedFilePath, processedOptions); - return [2 /*return*/, readConfigFiles(filepaths) - .then(getConfigsForFiles) - .then(function (configs) { return parseFromConfigs(configs, resolvedFilePath, processedOptions); })]; - }); - }); -} -exports.parse = parse; -function parseSync(_filepath, _options) { - if (_options === void 0) { _options = {}; } - var _a = opts(_filepath, _options), resolvedFilePath = _a[0], processedOptions = _a[1]; - var filepaths = getConfigFileNames(resolvedFilePath, processedOptions); - var files = readConfigFilesSync(filepaths); - return parseFromConfigs(getConfigsForFiles(files), resolvedFilePath, processedOptions); -} -exports.parseSync = parseSync; diff --git a/node_modules/editorconfig/src/lib/fnmatch.d.ts b/node_modules/editorconfig/src/lib/fnmatch.d.ts deleted file mode 100644 index 5c9bd38a..00000000 --- a/node_modules/editorconfig/src/lib/fnmatch.d.ts +++ /dev/null @@ -1,214 +0,0 @@ -// Type definitions for Minimatch 3.0 -// Project: https://github.com/isaacs/minimatch -// Definitions by: vvakame -// Shant Marouti -// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped - -/** - * Tests a path against the pattern using the options. - */ -declare function M(target: string, pattern: string, options?: M.IOptions): boolean; - -declare namespace M { - /** - * 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. - */ - function match(list: string[], pattern: string, options?: IOptions): string[]; - - /** - * Returns a function that tests its supplied argument, suitable for use with Array.filter - */ - function filter(pattern: string, options?: IOptions): (element: string, indexed: number, array: string[]) => boolean; - - /** - * Make a regular expression object from the pattern. - */ - function makeRe(pattern: string, options?: IOptions): RegExp; - - var Minimatch: IMinimatchStatic; - - interface IOptions { - /** - * Dump a ton of stuff to stderr. - * - * @default false - */ - debug?: boolean; - - /** - * Do not expand {a,b} and {1..3} brace sets. - * - * @default false - */ - nobrace?: boolean; - - /** - * Disable ** matching against multiple folder names. - * - * @default false - */ - noglobstar?: boolean; - - /** - * Allow patterns to match filenames starting with a period, - * even if the pattern does not explicitly have a period in that spot. - * - * @default false - */ - dot?: boolean; - - /** - * Disable "extglob" style patterns like +(a|b). - * - * @default false - */ - noext?: boolean; - - /** - * Perform a case-insensitive match. - * - * @default false - */ - nocase?: boolean; - - /** - * When a match is not found by minimatch.match, - * return a list containing the pattern itself if this option is set. - * Otherwise, an empty list is returned if there are no matches. - * - * @default false - */ - nonull?: boolean; - - /** - * If set, then patterns without slashes will be matched against - * the basename of the path if it contains slashes. - * - * @default false - */ - matchBase?: boolean; - - /** - * Suppress the behavior of treating # - * at the start of a pattern as a comment. - * - * @default false - */ - nocomment?: boolean; - - /** - * Suppress the behavior of treating a leading ! character as negation. - * - * @default false - */ - nonegate?: boolean; - - /** - * Returns from negate expressions the same as if they were not negated. - * (Ie, true on a hit, false on a miss.) - * - * @default false - */ - flipNegate?: boolean; - } - - interface IMinimatchStatic { - new(pattern: string, options?: IOptions): IMinimatch; - prototype: IMinimatch; - } - - interface IMinimatch { - /** - * The original pattern the minimatch object represents. - */ - pattern: string; - - /** - * The options supplied to the constructor. - */ - options: IOptions; - - /** - * A 2-dimensional array of regexp or string expressions. - */ - set: any[][]; // (RegExp | string)[][] - - /** - * A single regular expression expressing the entire pattern. - * Created by the makeRe method. - */ - regexp: RegExp; - - /** - * True if the pattern is negated. - */ - negate: boolean; - - /** - * True if the pattern is a comment. - */ - comment: boolean; - - /** - * True if the pattern is "" - */ - empty: boolean; - - /** - * Generate the regexp member if necessary, and return it. - * Will return false if the pattern is invalid. - */ - makeRe(): RegExp; // regexp or boolean - - /** - * Return true if the filename matches the pattern, or false otherwise. - */ - match(fname: string): boolean; - - /** - * 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. - */ - matchOne(files: string[], pattern: string[], partial: boolean): boolean; - - /** - * Deprecated. For internal use. - * - * @private - */ - debug(): void; - - /** - * Deprecated. For internal use. - * - * @private - */ - make(): void; - - /** - * Deprecated. For internal use. - * - * @private - */ - parseNegate(): void; - - /** - * Deprecated. For internal use. - * - * @private - */ - braceExpand(pattern: string, options: IOptions): void; - - /** - * Deprecated. For internal use. - * - * @private - */ - parse(pattern: string, isSub?: boolean): void; - } -} - -export = M; diff --git a/node_modules/editorconfig/src/lib/fnmatch.js b/node_modules/editorconfig/src/lib/fnmatch.js deleted file mode 100644 index 240ce336..00000000 --- a/node_modules/editorconfig/src/lib/fnmatch.js +++ /dev/null @@ -1,1047 +0,0 @@ -// Based on minimatch.js by isaacs - - var platform = typeof process === "object" ? process.platform : "win32" - - if (module) module.exports = minimatch - else exports.minimatch = minimatch - - 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.monkeyPatch = monkeyPatch - function monkeyPatch () { - var desc = Object.getOwnPropertyDescriptor(String.prototype, "match") - var orig = desc.value - desc.value = function (p) { - if (p instanceof Minimatch) return p.match(this) - return orig.call(this, p) - } - Object.defineProperty(String.prototype, desc) - } - - 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 = {} - - // 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.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) console.error(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) - }) - - if (options.debug) console.error(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - if (options.debug) console.error(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return -1 === s.indexOf(false) - }) - - if (options.debug) console.error(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) !== "{") { - // console.error(pattern) - var prefix = null - for (var i = 0, l = pattern.length; i < l; i ++) { - var c = pattern.charAt(i) - // console.error(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) { - // console.error("no sets") - return [pattern] - } - - var tail = braceExpand(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) { - // console.error("numset", numset[1], numset[2]) - var suf = braceExpand(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 = "" - } - - // console.error("Entering for") - FOR: for (i = 1, l = pattern.length; i < l; i ++) { - var c = pattern.charAt(i) - // console.error("", 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) { - // console.error("didn't close", pattern) - return braceExpand("\\" + pattern, options) - } - - // x{y,z} -> ["xy", "xz"] - // console.error("set", set) - // console.error("suffix", pattern.substr(i)) - var suf = braceExpand(pattern.substr(i), options) - // ["b", "c{d,e}","{f,g}h"] -> - // [["b"], ["cd", "ce"], ["fh", "gh"]] - var addBraces = set.length === 1 - // console.error("set pre-expanded", set) - set = set.map(function (p) { - return braceExpand(p, options) - }) - // console.error("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}(?:$|\\\/))" - : "(?!\\.)" - - 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 - } - stateChar = false - } - } - - for ( var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i ++ ) { - - if (options.debug) { - console.error("%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 "!": - if (options.debug) { - console.error("%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) { - 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. - 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 === "!" ? "(?:(?!" : "(?:" - stateChar = false - continue - - case ")": - if (inClass || !patternListStack.length) { - re += "\\)" - continue - } - - 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 - } - - 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 + "|" - }) - - // console.error("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) { - // console.error("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) - if (options.debug) { - console.error(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 - // console.error(this.pattern, "set", set) - - for (var i = 0, l = set.length; i < l; i ++) { - var pattern = set[i] - var hit = this.matchOne(f, 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 - - if (options.debug) { - console.error("matchOne", - { "this": this - , file: file - , pattern: pattern }) - } - - if (options.matchBase && pattern.length === 1) { - file = path.basename(file.join("/")).split("/") - } - - if (options.debug) { - console.error("matchOne", file.length, pattern.length) - } - - for ( var fi = 0 - , pi = 0 - , fl = file.length - , pl = pattern.length - ; (fi < fl) && (pi < pl) - ; fi ++, pi ++ ) { - - if (options.debug) { - console.error("matchOne loop") - } - var p = pattern[pi] - , f = file[fi] - - if (options.debug) { - console.error(pattern, p, f) - } - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - if (options.debug) - console.error('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) { - if (options.debug) - console.error('** 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] - - if (options.debug) { - console.error('\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)) { - if (options.debug) - console.error('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) === ".")) { - if (options.debug) - console.error("dot detected!", file, fr, pattern, pr) - break WHILE - } - - // ** swallows a segment, and continue. - if (options.debug) - console.error('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 - // console.error("\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 - } - if (options.debug) { - console.error("string match", p, f, hit) - } - } else { - hit = f.match(p) - if (options.debug) { - console.error("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, "\\$&") - } diff --git a/node_modules/editorconfig/src/lib/ini.d.ts b/node_modules/editorconfig/src/lib/ini.d.ts deleted file mode 100644 index fa185688..00000000 --- a/node_modules/editorconfig/src/lib/ini.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/// -import { URL } from 'url'; -/** - * Parses an .ini file - * @param file The location of the .ini file - */ -export declare function parse(file: string | number | Buffer | URL): Promise<[string | null, SectionBody][]>; -export declare function parseSync(file: string | number | Buffer | URL): [string | null, SectionBody][]; -export declare type SectionName = string | null; -export interface SectionBody { - [key: string]: string; -} -export declare type ParseStringResult = Array<[SectionName, SectionBody]>; -export declare function parseString(data: string): ParseStringResult; diff --git a/node_modules/editorconfig/src/lib/ini.js b/node_modules/editorconfig/src/lib/ini.js deleted file mode 100644 index d205909f..00000000 --- a/node_modules/editorconfig/src/lib/ini.js +++ /dev/null @@ -1,106 +0,0 @@ -"use strict"; -// Based on iniparser by shockie -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -var fs = __importStar(require("fs")); -/** - * define the possible values: - * section: [section] - * param: key=value - * comment: ;this is a comment - */ -var regex = { - section: /^\s*\[(([^#;]|\\#|\\;)+)\]\s*([#;].*)?$/, - param: /^\s*([\w\.\-\_]+)\s*[=:]\s*(.*?)\s*([#;].*)?$/, - comment: /^\s*[#;].*$/, -}; -/** - * Parses an .ini file - * @param file The location of the .ini file - */ -function parse(file) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, new Promise(function (resolve, reject) { - fs.readFile(file, 'utf8', function (err, data) { - if (err) { - reject(err); - return; - } - resolve(parseString(data)); - }); - })]; - }); - }); -} -exports.parse = parse; -function parseSync(file) { - return parseString(fs.readFileSync(file, 'utf8')); -} -exports.parseSync = parseSync; -function parseString(data) { - var sectionBody = {}; - var sectionName = null; - var value = [[sectionName, sectionBody]]; - var lines = data.split(/\r\n|\r|\n/); - lines.forEach(function (line) { - var match; - if (regex.comment.test(line)) { - return; - } - if (regex.param.test(line)) { - match = line.match(regex.param); - sectionBody[match[1]] = - match[2]; - } - else if (regex.section.test(line)) { - match = line.match(regex.section); - sectionName = match[1]; - sectionBody = {}; - value.push([sectionName, sectionBody]); - } - }); - return value; -} -exports.parseString = parseString; diff --git a/node_modules/fs.realpath/LICENSE b/node_modules/fs.realpath/LICENSE deleted file mode 100644 index 5bd884c2..00000000 --- a/node_modules/fs.realpath/LICENSE +++ /dev/null @@ -1,43 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ----- - -This library bundles a version of the `fs.realpath` and `fs.realpathSync` -methods from Node.js v0.10 under the terms of the Node.js MIT license. - -Node's license follows, also included at the header of `old.js` which contains -the licensed code: - - 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/fs.realpath/README.md b/node_modules/fs.realpath/README.md deleted file mode 100644 index a42ceac6..00000000 --- a/node_modules/fs.realpath/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# fs.realpath - -A backwards-compatible fs.realpath for Node v6 and above - -In Node v6, the JavaScript implementation of fs.realpath was replaced -with a faster (but less resilient) native implementation. That raises -new and platform-specific errors and cannot handle long or excessively -symlink-looping paths. - -This module handles those cases by detecting the new errors and -falling back to the JavaScript implementation. On versions of Node -prior to v6, it has no effect. - -## USAGE - -```js -var rp = require('fs.realpath') - -// async version -rp.realpath(someLongAndLoopingPath, function (er, real) { - // the ELOOP was handled, but it was a bit slower -}) - -// sync version -var real = rp.realpathSync(someLongAndLoopingPath) - -// monkeypatch at your own risk! -// This replaces the fs.realpath/fs.realpathSync builtins -rp.monkeypatch() - -// un-do the monkeypatching -rp.unmonkeypatch() -``` diff --git a/node_modules/fs.realpath/index.js b/node_modules/fs.realpath/index.js deleted file mode 100644 index b09c7c7e..00000000 --- a/node_modules/fs.realpath/index.js +++ /dev/null @@ -1,66 +0,0 @@ -module.exports = realpath -realpath.realpath = realpath -realpath.sync = realpathSync -realpath.realpathSync = realpathSync -realpath.monkeypatch = monkeypatch -realpath.unmonkeypatch = unmonkeypatch - -var fs = require('fs') -var origRealpath = fs.realpath -var origRealpathSync = fs.realpathSync - -var version = process.version -var ok = /^v[0-5]\./.test(version) -var old = require('./old.js') - -function newError (er) { - return er && er.syscall === 'realpath' && ( - er.code === 'ELOOP' || - er.code === 'ENOMEM' || - er.code === 'ENAMETOOLONG' - ) -} - -function realpath (p, cache, cb) { - if (ok) { - return origRealpath(p, cache, cb) - } - - if (typeof cache === 'function') { - cb = cache - cache = null - } - origRealpath(p, cache, function (er, result) { - if (newError(er)) { - old.realpath(p, cache, cb) - } else { - cb(er, result) - } - }) -} - -function realpathSync (p, cache) { - if (ok) { - return origRealpathSync(p, cache) - } - - try { - return origRealpathSync(p, cache) - } catch (er) { - if (newError(er)) { - return old.realpathSync(p, cache) - } else { - throw er - } - } -} - -function monkeypatch () { - fs.realpath = realpath - fs.realpathSync = realpathSync -} - -function unmonkeypatch () { - fs.realpath = origRealpath - fs.realpathSync = origRealpathSync -} diff --git a/node_modules/fs.realpath/old.js b/node_modules/fs.realpath/old.js deleted file mode 100644 index b40305e7..00000000 --- a/node_modules/fs.realpath/old.js +++ /dev/null @@ -1,303 +0,0 @@ -// 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 pathModule = require('path'); -var isWindows = process.platform === 'win32'; -var fs = require('fs'); - -// JavaScript implementation of realpath, ported from node pre-v6 - -var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG); - -function rethrow() { - // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and - // is fairly slow to generate. - var callback; - if (DEBUG) { - var backtrace = new Error; - callback = debugCallback; - } else - callback = missingCallback; - - return callback; - - function debugCallback(err) { - if (err) { - backtrace.message = err.message; - err = backtrace; - missingCallback(err); - } - } - - function missingCallback(err) { - if (err) { - if (process.throwDeprecation) - throw err; // Forgot a callback but don't know where? Use NODE_DEBUG=fs - else if (!process.noDeprecation) { - var msg = 'fs: missing callback ' + (err.stack || err.message); - if (process.traceDeprecation) - console.trace(msg); - else - console.error(msg); - } - } - } -} - -function maybeCallback(cb) { - return typeof cb === 'function' ? cb : rethrow(); -} - -var normalize = pathModule.normalize; - -// Regexp that finds the next partion of a (partial) path -// result is [base_with_slash, base], e.g. ['somedir/', 'somedir'] -if (isWindows) { - var nextPartRe = /(.*?)(?:[\/\\]+|$)/g; -} else { - var nextPartRe = /(.*?)(?:[\/]+|$)/g; -} - -// Regex to find the device root, including trailing slash. E.g. 'c:\\'. -if (isWindows) { - var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/; -} else { - var splitRootRe = /^[\/]*/; -} - -exports.realpathSync = function realpathSync(p, cache) { - // make p is absolute - p = pathModule.resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return cache[p]; - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstatSync(base); - knownHard[base] = true; - } - } - - // walk down the path, swapping out linked pathparts for their real - // values - // NB: p.length changes. - while (pos < p.length) { - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - continue; - } - - var resolvedLink; - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // some known symbolic link. no need to stat again. - resolvedLink = cache[base]; - } else { - var stat = fs.lstatSync(base); - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - continue; - } - - // read the link if it wasn't read before - // dev/ino always return 0 on windows, so skip the check. - var linkTarget = null; - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - linkTarget = seenLinks[id]; - } - } - if (linkTarget === null) { - fs.statSync(base); - linkTarget = fs.readlinkSync(base); - } - resolvedLink = pathModule.resolve(previous, linkTarget); - // track this, if given a cache. - if (cache) cache[base] = resolvedLink; - if (!isWindows) seenLinks[id] = linkTarget; - } - - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } - - if (cache) cache[original] = p; - - return p; -}; - - -exports.realpath = function realpath(p, cache, cb) { - if (typeof cb !== 'function') { - cb = maybeCallback(cache); - cache = null; - } - - // make p is absolute - p = pathModule.resolve(p); - - if (cache && Object.prototype.hasOwnProperty.call(cache, p)) { - return process.nextTick(cb.bind(null, null, cache[p])); - } - - var original = p, - seenLinks = {}, - knownHard = {}; - - // current character position in p - var pos; - // the partial path so far, including a trailing slash if any - var current; - // the partial path without a trailing slash (except when pointing at a root) - var base; - // the partial path scanned in the previous round, with slash - var previous; - - start(); - - function start() { - // Skip over roots - var m = splitRootRe.exec(p); - pos = m[0].length; - current = m[0]; - base = m[0]; - previous = ''; - - // On windows, check that the root exists. On unix there is no need. - if (isWindows && !knownHard[base]) { - fs.lstat(base, function(err) { - if (err) return cb(err); - knownHard[base] = true; - LOOP(); - }); - } else { - process.nextTick(LOOP); - } - } - - // walk down the path, swapping out linked pathparts for their real - // values - function LOOP() { - // stop if scanned past end of path - if (pos >= p.length) { - if (cache) cache[original] = p; - return cb(null, p); - } - - // find the next part - nextPartRe.lastIndex = pos; - var result = nextPartRe.exec(p); - previous = current; - current += result[0]; - base = previous + result[1]; - pos = nextPartRe.lastIndex; - - // continue if not a symlink - if (knownHard[base] || (cache && cache[base] === base)) { - return process.nextTick(LOOP); - } - - if (cache && Object.prototype.hasOwnProperty.call(cache, base)) { - // known symbolic link. no need to stat again. - return gotResolvedLink(cache[base]); - } - - return fs.lstat(base, gotStat); - } - - function gotStat(err, stat) { - if (err) return cb(err); - - // if not a symlink, skip to the next path part - if (!stat.isSymbolicLink()) { - knownHard[base] = true; - if (cache) cache[base] = base; - return process.nextTick(LOOP); - } - - // stat & read the link if not read before - // call gotTarget as soon as the link target is known - // dev/ino always return 0 on windows, so skip the check. - if (!isWindows) { - var id = stat.dev.toString(32) + ':' + stat.ino.toString(32); - if (seenLinks.hasOwnProperty(id)) { - return gotTarget(null, seenLinks[id], base); - } - } - fs.stat(base, function(err) { - if (err) return cb(err); - - fs.readlink(base, function(err, target) { - if (!isWindows) seenLinks[id] = target; - gotTarget(err, target); - }); - }); - } - - function gotTarget(err, target, base) { - if (err) return cb(err); - - var resolvedLink = pathModule.resolve(previous, target); - if (cache) cache[base] = resolvedLink; - gotResolvedLink(resolvedLink); - } - - function gotResolvedLink(resolvedLink) { - // resolve the link, then start over - p = pathModule.resolve(resolvedLink, p.slice(pos)); - start(); - } -}; diff --git a/node_modules/fs.realpath/package.json b/node_modules/fs.realpath/package.json deleted file mode 100644 index 338d6295..00000000 --- a/node_modules/fs.realpath/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_args": [ - [ - "fs.realpath@1.0.0", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "fs.realpath@1.0.0", - "_id": "fs.realpath@1.0.0", - "_inBundle": false, - "_integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "_location": "/fs.realpath", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "fs.realpath@1.0.0", - "name": "fs.realpath", - "escapedName": "fs.realpath", - "rawSpec": "1.0.0", - "saveSpec": null, - "fetchSpec": "1.0.0" - }, - "_requiredBy": [ - "/glob" - ], - "_resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "_spec": "1.0.0", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/fs.realpath/issues" - }, - "dependencies": {}, - "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails", - "devDependencies": {}, - "files": [ - "old.js", - "index.js" - ], - "homepage": "https://github.com/isaacs/fs.realpath#readme", - "keywords": [ - "realpath", - "fs", - "polyfill" - ], - "license": "ISC", - "main": "index.js", - "name": "fs.realpath", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/fs.realpath.git" - }, - "scripts": { - "test": "tap test/*.js --cov" - }, - "version": "1.0.0" -} diff --git a/node_modules/glob/LICENSE b/node_modules/glob/LICENSE deleted file mode 100644 index 42ca266d..00000000 --- a/node_modules/glob/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -## Glob Logo - -Glob's logo created by Tanya Brassie , licensed -under a Creative Commons Attribution-ShareAlike 4.0 International License -https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/node_modules/glob/README.md b/node_modules/glob/README.md deleted file mode 100644 index e71b967e..00000000 --- a/node_modules/glob/README.md +++ /dev/null @@ -1,373 +0,0 @@ -# Glob - -Match files using the patterns the shell uses, like stars and stuff. - -[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Build Status](https://ci.appveyor.com/api/projects/status/kd7f3yftf7unxlsx?svg=true)](https://ci.appveyor.com/project/isaacs/node-glob) [![Coverage Status](https://coveralls.io/repos/isaacs/node-glob/badge.svg?branch=master&service=github)](https://coveralls.io/github/isaacs/node-glob?branch=master) - -This is a glob implementation in JavaScript. It uses the `minimatch` -library to do its matching. - -![](logo/glob.png) - -## Usage - -Install with npm - -``` -npm i glob -``` - -```javascript -var glob = require("glob") - -// options is optional -glob("**/*.js", options, function (er, files) { - // files is an array of filenames. - // If the `nonull` option is set, and nothing - // was found, then files is ["**/*.js"] - // er is an error object or null. -}) -``` - -## Glob Primer - -"Globs" are the patterns you type when you do stuff like `ls *.js` on -the command line, or put `build/*` in a `.gitignore` file. - -Before parsing the path part patterns, braced sections are expanded -into a set. Braced sections start with `{` and end with `}`, with any -number of comma-delimited sections within. Braced sections may contain -slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. - -The following characters have special magic meaning when used in a -path portion: - -* `*` Matches 0 or more characters in a single path portion -* `?` Matches 1 character -* `[...]` Matches a range of characters, similar to a RegExp range. - If the first character of the range is `!` or `^` then it matches - any character not in the range. -* `!(pattern|pattern|pattern)` Matches anything that does not match - any of the patterns provided. -* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the - patterns provided. -* `+(pattern|pattern|pattern)` Matches one or more occurrences of the - patterns provided. -* `*(a|b|c)` Matches zero or more occurrences of the patterns provided -* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns - provided -* `**` If a "globstar" is alone in a path portion, then it matches - zero or more directories and subdirectories searching for matches. - It does not crawl symlinked directories. - -### Dots - -If a file or directory path portion has a `.` as the first character, -then it will not match any glob pattern unless that pattern's -corresponding path part also has a `.` as its first character. - -For example, the pattern `a/.*/c` would match the file at `a/.b/c`. -However the pattern `a/*/c` would not, because `*` does not start with -a dot character. - -You can make glob treat dots as normal characters by setting -`dot:true` in the options. - -### Basename Matching - -If you set `matchBase:true` in the options, and the pattern has no -slashes in it, then it will seek for any file anywhere in the tree -with a matching basename. For example, `*.js` would match -`test/simple/basic.js`. - -### Empty Sets - -If no matching files are found, then an empty array is returned. This -differs from the shell, where the pattern itself is returned. For -example: - - $ echo a*s*d*f - a*s*d*f - -To get the bash-style behavior, set the `nonull:true` in the options. - -### See Also: - -* `man sh` -* `man bash` (Search for "Pattern Matching") -* `man 3 fnmatch` -* `man 5 gitignore` -* [minimatch documentation](https://github.com/isaacs/minimatch) - -## glob.hasMagic(pattern, [options]) - -Returns `true` if there are any special characters in the pattern, and -`false` otherwise. - -Note that the options affect the results. If `noext:true` is set in -the options object, then `+(a|b)` will not be considered a magic -pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` -then that is considered magical, unless `nobrace:true` is set in the -options. - -## glob(pattern, [options], cb) - -* `pattern` `{String}` Pattern to be matched -* `options` `{Object}` -* `cb` `{Function}` - * `err` `{Error | null}` - * `matches` `{Array}` filenames found matching the pattern - -Perform an asynchronous glob search. - -## glob.sync(pattern, [options]) - -* `pattern` `{String}` Pattern to be matched -* `options` `{Object}` -* return: `{Array}` filenames found matching the pattern - -Perform a synchronous glob search. - -## Class: glob.Glob - -Create a Glob object by instantiating the `glob.Glob` class. - -```javascript -var Glob = require("glob").Glob -var mg = new Glob(pattern, options, cb) -``` - -It's an EventEmitter, and starts walking the filesystem to find matches -immediately. - -### new glob.Glob(pattern, [options], [cb]) - -* `pattern` `{String}` pattern to search for -* `options` `{Object}` -* `cb` `{Function}` Called when an error occurs, or matches are found - * `err` `{Error | null}` - * `matches` `{Array}` filenames found matching the pattern - -Note that if the `sync` flag is set in the options, then matches will -be immediately available on the `g.found` member. - -### Properties - -* `minimatch` The minimatch object that the glob uses. -* `options` The options object passed in. -* `aborted` Boolean which is set to true when calling `abort()`. There - is no way at this time to continue a glob search after aborting, but - you can re-use the statCache to avoid having to duplicate syscalls. -* `cache` Convenience object. Each field has the following possible - values: - * `false` - Path does not exist - * `true` - Path exists - * `'FILE'` - Path exists, and is not a directory - * `'DIR'` - Path exists, and is a directory - * `[file, entries, ...]` - Path exists, is a directory, and the - array value is the results of `fs.readdir` -* `statCache` Cache of `fs.stat` results, to prevent statting the same - path multiple times. -* `symlinks` A record of which paths are symbolic links, which is - relevant in resolving `**` patterns. -* `realpathCache` An optional object which is passed to `fs.realpath` - to minimize unnecessary syscalls. It is stored on the instantiated - Glob object, and may be re-used. - -### Events - -* `end` When the matching is finished, this is emitted with all the - matches found. If the `nonull` option is set, and no match was found, - then the `matches` list contains the original pattern. The matches - are sorted, unless the `nosort` flag is set. -* `match` Every time a match is found, this is emitted with the specific - thing that matched. It is not deduplicated or resolved to a realpath. -* `error` Emitted when an unexpected error is encountered, or whenever - any fs error occurs if `options.strict` is set. -* `abort` When `abort()` is called, this event is raised. - -### Methods - -* `pause` Temporarily stop the search -* `resume` Resume the search -* `abort` Stop the search forever - -### Options - -All the options that can be passed to Minimatch can also be passed to -Glob to change pattern matching behavior. Also, some have been added, -or have glob-specific ramifications. - -All options are false by default, unless otherwise noted. - -All options are added to the Glob object, as well. - -If you are running many `glob` operations, you can pass a Glob object -as the `options` argument to a subsequent operation to shortcut some -`stat` and `readdir` calls. At the very least, you may pass in shared -`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that -parallel glob operations will be sped up by sharing information about -the filesystem. - -* `cwd` The current working directory in which to search. Defaults - to `process.cwd()`. -* `root` The place where patterns starting with `/` will be mounted - onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix - systems, and `C:\` or some such on Windows.) -* `dot` Include `.dot` files in normal matches and `globstar` matches. - Note that an explicit dot in a portion of the pattern will always - match dot files. -* `nomount` By default, a pattern starting with a forward-slash will be - "mounted" onto the root setting, so that a valid filesystem path is - returned. Set this flag to disable that behavior. -* `mark` Add a `/` character to directory matches. Note that this - requires additional stat calls. -* `nosort` Don't sort the results. -* `stat` Set to true to stat *all* results. This reduces performance - somewhat, and is completely unnecessary, unless `readdir` is presumed - to be an untrustworthy indicator of file existence. -* `silent` When an unusual error is encountered when attempting to - read a directory, a warning will be printed to stderr. Set the - `silent` option to true to suppress these warnings. -* `strict` When an unusual error is encountered when attempting to - read a directory, the process will just continue on in search of - other matches. Set the `strict` option to raise an error in these - cases. -* `cache` See `cache` property above. Pass in a previously generated - cache object to save some fs calls. -* `statCache` A cache of results of filesystem information, to prevent - unnecessary stat calls. While it should not normally be necessary - to set this, you may pass the statCache from one glob() call to the - options object of another, if you know that the filesystem will not - change between calls. (See "Race Conditions" below.) -* `symlinks` A cache of known symbolic links. You may pass in a - previously generated `symlinks` object to save `lstat` calls when - resolving `**` matches. -* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. -* `nounique` In some cases, brace-expanded patterns can result in the - same file showing up multiple times in the result set. By default, - this implementation prevents duplicates in the result set. Set this - flag to disable that behavior. -* `nonull` Set to never return an empty set, instead returning a set - containing the pattern itself. This is the default in glob(3). -* `debug` Set to enable debug logging in minimatch and glob. -* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. -* `noglobstar` Do not match `**` against multiple filenames. (Ie, - treat it as a normal `*` instead.) -* `noext` Do not match `+(a|b)` "extglob" patterns. -* `nocase` Perform a case-insensitive match. Note: on - case-insensitive filesystems, non-magic patterns will match by - default, since `stat` and `readdir` will not raise errors. -* `matchBase` Perform a basename-only match if the pattern does not - contain any slash characters. That is, `*.js` would be treated as - equivalent to `**/*.js`, matching all js files in all directories. -* `nodir` Do not match directories, only files. (Note: to match - *only* directories, simply put a `/` at the end of the pattern.) -* `ignore` Add a pattern or an array of glob patterns to exclude matches. - Note: `ignore` patterns are *always* in `dot:true` mode, regardless - of any other settings. -* `follow` Follow symlinked directories when expanding `**` patterns. - Note that this can result in a lot of duplicate references in the - presence of cyclic links. -* `realpath` Set to true to call `fs.realpath` on all of the results. - In the case of a symlink that cannot be resolved, the full absolute - path to the matched entry is returned (though it will usually be a - broken symlink) -* `absolute` Set to true to always receive absolute paths for matched - files. Unlike `realpath`, this also affects the values returned in - the `match` event. - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between node-glob and other -implementations, and are intentional. - -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.3, 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. - -Note that symlinked directories are not crawled as part of a `**`, -though their contents may match against subsequent portions of the -pattern. This prevents infinite loops and duplicates and the like. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then glob returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`glob.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. - -### Comments and Negation - -Previously, this module let you mark a pattern as a "comment" if it -started with a `#` character, or a "negated" pattern if it started -with a `!` character. - -These options were deprecated in version 5, and removed in version 6. - -To specify things that should not match, use the `ignore` option. - -## Windows - -**Please only use forward-slashes in glob expressions.** - -Though windows uses either `/` or `\` as its path separator, only `/` -characters are used by this glob implementation. You must use -forward-slashes **only** in glob expressions. Back-slashes will always -be interpreted as escape characters, not path separators. - -Results from absolute patterns such as `/foo/*` are mounted onto the -root setting using `path.join`. On windows, this will by default result -in `/foo/*` matching `C:\foo\bar.txt`. - -## Race Conditions - -Glob searching, by its very nature, is susceptible to race conditions, -since it relies on directory walking and such. - -As a result, it is possible that a file that exists when glob looks for -it may have been deleted or modified by the time it returns the result. - -As part of its internal implementation, this program caches all stat -and readdir calls that it makes, in order to cut down on system -overhead. However, this also makes it even more susceptible to races, -especially if the cache or statCache objects are reused between glob -calls. - -Users are thus advised not to use a glob result as a guarantee of -filesystem state in the face of rapid changes. For the vast majority -of operations, this is never a problem. - -## Glob Logo -Glob's logo was created by [Tanya Brassie](http://tanyabrassie.com/). Logo files can be found [here](https://github.com/isaacs/node-glob/tree/master/logo). - -The logo is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/). - -## Contributing - -Any change to behavior (including bugfixes) must come with a test. - -Patches that fail tests or reduce performance will be rejected. - -``` -# to run tests -npm test - -# to re-generate test fixtures -npm run test-regen - -# to benchmark against bash/zsh -npm run bench - -# to profile javascript -npm run prof -``` diff --git a/node_modules/glob/changelog.md b/node_modules/glob/changelog.md deleted file mode 100644 index 41636771..00000000 --- a/node_modules/glob/changelog.md +++ /dev/null @@ -1,67 +0,0 @@ -## 7.0 - -- Raise error if `options.cwd` is specified, and not a directory - -## 6.0 - -- Remove comment and negation pattern support -- Ignore patterns are always in `dot:true` mode - -## 5.0 - -- Deprecate comment and negation patterns -- Fix regression in `mark` and `nodir` options from making all cache - keys absolute path. -- Abort if `fs.readdir` returns an error that's unexpected -- Don't emit `match` events for ignored items -- Treat ENOTSUP like ENOTDIR in readdir - -## 4.5 - -- Add `options.follow` to always follow directory symlinks in globstar -- Add `options.realpath` to call `fs.realpath` on all results -- Always cache based on absolute path - -## 4.4 - -- Add `options.ignore` -- Fix handling of broken symlinks - -## 4.3 - -- Bump minimatch to 2.x -- Pass all tests on Windows - -## 4.2 - -- Add `glob.hasMagic` function -- Add `options.nodir` flag - -## 4.1 - -- Refactor sync and async implementations for performance -- Throw if callback provided to sync glob function -- Treat symbolic links in globstar results the same as Bash 4.3 - -## 4.0 - -- Use `^` for dependency versions (bumped major because this breaks - older npm versions) -- Ensure callbacks are only ever called once -- switch to ISC license - -## 3.x - -- Rewrite in JavaScript -- Add support for setting root, cwd, and windows support -- Cache many fs calls -- Add globstar support -- emit match events - -## 2.x - -- Use `glob.h` and `fnmatch.h` from NetBSD - -## 1.x - -- `glob.h` static binding. diff --git a/node_modules/glob/common.js b/node_modules/glob/common.js deleted file mode 100644 index 66651bb3..00000000 --- a/node_modules/glob/common.js +++ /dev/null @@ -1,240 +0,0 @@ -exports.alphasort = alphasort -exports.alphasorti = alphasorti -exports.setopts = setopts -exports.ownProp = ownProp -exports.makeAbs = makeAbs -exports.finish = finish -exports.mark = mark -exports.isIgnored = isIgnored -exports.childrenIgnored = childrenIgnored - -function ownProp (obj, field) { - return Object.prototype.hasOwnProperty.call(obj, field) -} - -var path = require("path") -var minimatch = require("minimatch") -var isAbsolute = require("path-is-absolute") -var Minimatch = minimatch.Minimatch - -function alphasorti (a, b) { - return a.toLowerCase().localeCompare(b.toLowerCase()) -} - -function alphasort (a, b) { - return a.localeCompare(b) -} - -function setupIgnores (self, options) { - self.ignore = options.ignore || [] - - if (!Array.isArray(self.ignore)) - self.ignore = [self.ignore] - - if (self.ignore.length) { - self.ignore = self.ignore.map(ignoreMap) - } -} - -// ignore patterns are always in dot:true mode. -function ignoreMap (pattern) { - var gmatcher = null - if (pattern.slice(-3) === '/**') { - var gpattern = pattern.replace(/(\/\*\*)+$/, '') - gmatcher = new Minimatch(gpattern, { dot: true }) - } - - return { - matcher: new Minimatch(pattern, { dot: true }), - gmatcher: gmatcher - } -} - -function setopts (self, pattern, options) { - if (!options) - options = {} - - // base-matching: just use globstar for that. - if (options.matchBase && -1 === pattern.indexOf("/")) { - if (options.noglobstar) { - throw new Error("base matching requires globstar") - } - pattern = "**/" + pattern - } - - self.silent = !!options.silent - self.pattern = pattern - self.strict = options.strict !== false - self.realpath = !!options.realpath - self.realpathCache = options.realpathCache || Object.create(null) - self.follow = !!options.follow - self.dot = !!options.dot - self.mark = !!options.mark - self.nodir = !!options.nodir - if (self.nodir) - self.mark = true - self.sync = !!options.sync - self.nounique = !!options.nounique - self.nonull = !!options.nonull - self.nosort = !!options.nosort - self.nocase = !!options.nocase - self.stat = !!options.stat - self.noprocess = !!options.noprocess - self.absolute = !!options.absolute - - self.maxLength = options.maxLength || Infinity - self.cache = options.cache || Object.create(null) - self.statCache = options.statCache || Object.create(null) - self.symlinks = options.symlinks || Object.create(null) - - setupIgnores(self, options) - - self.changedCwd = false - var cwd = process.cwd() - if (!ownProp(options, "cwd")) - self.cwd = cwd - else { - self.cwd = path.resolve(options.cwd) - self.changedCwd = self.cwd !== cwd - } - - self.root = options.root || path.resolve(self.cwd, "/") - self.root = path.resolve(self.root) - if (process.platform === "win32") - self.root = self.root.replace(/\\/g, "/") - - // TODO: is an absolute `cwd` supposed to be resolved against `root`? - // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') - self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) - if (process.platform === "win32") - self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") - self.nomount = !!options.nomount - - // disable comments and negation in Minimatch. - // Note that they are not supported in Glob itself anyway. - options.nonegate = true - options.nocomment = true - - self.minimatch = new Minimatch(pattern, options) - self.options = self.minimatch.options -} - -function finish (self) { - var nou = self.nounique - var all = nou ? [] : Object.create(null) - - for (var i = 0, l = self.matches.length; i < l; i ++) { - var matches = self.matches[i] - if (!matches || Object.keys(matches).length === 0) { - if (self.nonull) { - // do like the shell, and spit out the literal glob - var literal = self.minimatch.globSet[i] - if (nou) - all.push(literal) - else - all[literal] = true - } - } else { - // had matches - var m = Object.keys(matches) - if (nou) - all.push.apply(all, m) - else - m.forEach(function (m) { - all[m] = true - }) - } - } - - if (!nou) - all = Object.keys(all) - - if (!self.nosort) - all = all.sort(self.nocase ? alphasorti : alphasort) - - // at *some* point we statted all of these - if (self.mark) { - for (var i = 0; i < all.length; i++) { - all[i] = self._mark(all[i]) - } - if (self.nodir) { - all = all.filter(function (e) { - var notDir = !(/\/$/.test(e)) - var c = self.cache[e] || self.cache[makeAbs(self, e)] - if (notDir && c) - notDir = c !== 'DIR' && !Array.isArray(c) - return notDir - }) - } - } - - if (self.ignore.length) - all = all.filter(function(m) { - return !isIgnored(self, m) - }) - - self.found = all -} - -function mark (self, p) { - var abs = makeAbs(self, p) - var c = self.cache[abs] - var m = p - if (c) { - var isDir = c === 'DIR' || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - var mabs = makeAbs(self, m) - self.statCache[mabs] = self.statCache[abs] - self.cache[mabs] = self.cache[abs] - } - } - - return m -} - -// lotta situps... -function makeAbs (self, f) { - var abs = f - if (f.charAt(0) === '/') { - abs = path.join(self.root, f) - } else if (isAbsolute(f) || f === '') { - abs = f - } else if (self.changedCwd) { - abs = path.resolve(self.cwd, f) - } else { - abs = path.resolve(f) - } - - if (process.platform === 'win32') - abs = abs.replace(/\\/g, '/') - - return abs -} - - -// Return true, if pattern ends with globstar '**', for the accompanying parent directory. -// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents -function isIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) - }) -} - -function childrenIgnored (self, path) { - if (!self.ignore.length) - return false - - return self.ignore.some(function(item) { - return !!(item.gmatcher && item.gmatcher.match(path)) - }) -} diff --git a/node_modules/glob/glob.js b/node_modules/glob/glob.js deleted file mode 100644 index 58dec0f6..00000000 --- a/node_modules/glob/glob.js +++ /dev/null @@ -1,790 +0,0 @@ -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern, false) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern, inGlobStar) -// Get the first [n] items from pattern that are all strings -// Join these together. This is PREFIX. -// If there is no more remaining, then stat(PREFIX) and -// add to matches if it succeeds. END. -// -// If inGlobStar and PREFIX is symlink and points to dir -// set ENTRIES = [] -// else readdir(PREFIX) as ENTRIES -// If fail, END -// -// with ENTRIES -// If pattern[n] is GLOBSTAR -// // handle the case where the globstar match is empty -// // by pruning it out, and testing the resulting pattern -// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// // Mark that this entry is a globstar match -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) -// -// else // not globstar -// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) -// Test ENTRY against pattern[n] -// If fails, continue -// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) -// -// Caveat: -// Cache all stats and readdirs results to minimize syscall. Since all -// we ever care about is existence and directory-ness, we can just keep -// `true` for files, and [children,...] for directories, or `false` for -// things that don't exist. - -module.exports = glob - -var fs = require('fs') -var rp = require('fs.realpath') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var inherits = require('inherits') -var EE = require('events').EventEmitter -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var globSync = require('./sync.js') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var inflight = require('inflight') -var util = require('util') -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -var once = require('once') - -function glob (pattern, options, cb) { - if (typeof options === 'function') cb = options, options = {} - if (!options) options = {} - - if (options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return globSync(pattern, options) - } - - return new Glob(pattern, options, cb) -} - -glob.sync = globSync -var GlobSync = glob.GlobSync = globSync.GlobSync - -// old api surface -glob.glob = glob - -function extend (origin, add) { - if (add === null || typeof add !== 'object') { - return origin - } - - var keys = Object.keys(add) - var i = keys.length - while (i--) { - origin[keys[i]] = add[keys[i]] - } - return origin -} - -glob.hasMagic = function (pattern, options_) { - var options = extend({}, options_) - options.noprocess = true - - var g = new Glob(pattern, options) - var set = g.minimatch.set - - if (!pattern) - return false - - if (set.length > 1) - return true - - for (var j = 0; j < set[0].length; j++) { - if (typeof set[0][j] !== 'string') - return true - } - - return false -} - -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (typeof options === 'function') { - cb = options - options = null - } - - if (options && options.sync) { - if (cb) - throw new TypeError('callback provided to sync glob') - return new GlobSync(pattern, options) - } - - if (!(this instanceof Glob)) - return new Glob(pattern, options, cb) - - setopts(this, pattern, options) - this._didRealPath = false - - // process each pattern in the minimatch set - var n = this.minimatch.set.length - - // The matches are stored as {: true,...} so that - // duplicates are automagically pruned. - // Later, we do an Object.keys() on these. - // Keep them as a list so we can fill in when nonull is set. - this.matches = new Array(n) - - if (typeof cb === 'function') { - cb = once(cb) - this.on('error', cb) - this.on('end', function (matches) { - cb(null, matches) - }) - } - - var self = this - this._processing = 0 - - this._emitQueue = [] - this._processQueue = [] - this.paused = false - - if (this.noprocess) - return this - - if (n === 0) - return done() - - var sync = true - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false, done) - } - sync = false - - function done () { - --self._processing - if (self._processing <= 0) { - if (sync) { - process.nextTick(function () { - self._finish() - }) - } else { - self._finish() - } - } - } -} - -Glob.prototype._finish = function () { - assert(this instanceof Glob) - if (this.aborted) - return - - if (this.realpath && !this._didRealpath) - return this._realpath() - - common.finish(this) - this.emit('end', this.found) -} - -Glob.prototype._realpath = function () { - if (this._didRealpath) - return - - this._didRealpath = true - - var n = this.matches.length - if (n === 0) - return this._finish() - - var self = this - for (var i = 0; i < this.matches.length; i++) - this._realpathSet(i, next) - - function next () { - if (--n === 0) - self._finish() - } -} - -Glob.prototype._realpathSet = function (index, cb) { - var matchset = this.matches[index] - if (!matchset) - return cb() - - var found = Object.keys(matchset) - var self = this - var n = found.length - - if (n === 0) - return cb() - - var set = this.matches[index] = Object.create(null) - found.forEach(function (p, i) { - // If there's a problem with the stat, then it means that - // one or more of the links in the realpath couldn't be - // resolved. just return the abs value in that case. - p = self._makeAbs(p) - rp.realpath(p, self.realpathCache, function (er, real) { - if (!er) - set[real] = true - else if (er.syscall === 'stat') - set[p] = true - else - self.emit('error', er) // srsly wtf right here - - if (--n === 0) { - self.matches[index] = set - cb() - } - }) - }) -} - -Glob.prototype._mark = function (p) { - return common.mark(this, p) -} - -Glob.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit('abort') -} - -Glob.prototype.pause = function () { - if (!this.paused) { - this.paused = true - this.emit('pause') - } -} - -Glob.prototype.resume = function () { - if (this.paused) { - this.emit('resume') - this.paused = false - if (this._emitQueue.length) { - var eq = this._emitQueue.slice(0) - this._emitQueue.length = 0 - for (var i = 0; i < eq.length; i ++) { - var e = eq[i] - this._emitMatch(e[0], e[1]) - } - } - if (this._processQueue.length) { - var pq = this._processQueue.slice(0) - this._processQueue.length = 0 - for (var i = 0; i < pq.length; i ++) { - var p = pq[i] - this._processing-- - this._process(p[0], p[1], p[2], p[3]) - } - } - } -} - -Glob.prototype._process = function (pattern, index, inGlobStar, cb) { - assert(this instanceof Glob) - assert(typeof cb === 'function') - - if (this.aborted) - return - - this._processing++ - if (this.paused) { - this._processQueue.push([pattern, index, inGlobStar, cb]) - return - } - - //console.error('PROCESS %d', this._processing, pattern) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // see if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index, cb) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip _processing - if (childrenIgnored(this, read)) - return cb() - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) -} - -Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - -Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return cb() - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return cb() - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return cb() - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) { - if (prefix !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - this._process([e].concat(remain), index, inGlobStar, cb) - } - cb() -} - -Glob.prototype._emitMatch = function (index, e) { - if (this.aborted) - return - - if (isIgnored(this, e)) - return - - if (this.paused) { - this._emitQueue.push([index, e]) - return - } - - var abs = isAbsolute(e) ? e : this._makeAbs(e) - - if (this.mark) - e = this._mark(e) - - if (this.absolute) - e = abs - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true - - var st = this.statCache[abs] - if (st) - this.emit('stat', e, st) - - this.emit('match', e) -} - -Glob.prototype._readdirInGlobStar = function (abs, cb) { - if (this.aborted) - return - - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false, cb) - - var lstatkey = 'lstat\0' + abs - var self = this - var lstatcb = inflight(lstatkey, lstatcb_) - - if (lstatcb) - fs.lstat(abs, lstatcb) - - function lstatcb_ (er, lstat) { - if (er && er.code === 'ENOENT') - return cb() - - var isSym = lstat && lstat.isSymbolicLink() - self.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) { - self.cache[abs] = 'FILE' - cb() - } else - self._readdir(abs, false, cb) - } -} - -Glob.prototype._readdir = function (abs, inGlobStar, cb) { - if (this.aborted) - return - - cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) - if (!cb) - return - - //console.error('RD %j %j', +inGlobStar, abs) - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs, cb) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return cb() - - if (Array.isArray(c)) - return cb(null, c) - } - - var self = this - fs.readdir(abs, readdirCb(this, abs, cb)) -} - -function readdirCb (self, abs, cb) { - return function (er, entries) { - if (er) - self._readdirError(abs, er, cb) - else - self._readdirEntries(abs, entries, cb) - } -} - -Glob.prototype._readdirEntries = function (abs, entries, cb) { - if (this.aborted) - return - - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - return cb(null, entries) -} - -Glob.prototype._readdirError = function (f, er, cb) { - if (this.aborted) - return - - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - this.emit('error', error) - this.abort() - } - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) { - this.emit('error', er) - // If the error is handled, then we abort - // if not, we threw out of here - this.abort() - } - if (!this.silent) - console.error('glob error', er) - break - } - - return cb() -} - -Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { - var self = this - this._readdir(abs, inGlobStar, function (er, entries) { - self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) - }) -} - - -Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { - //console.error('pgs2', prefix, remain[0], entries) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return cb() - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false, cb) - - var isSym = this.symlinks[abs] - var len = entries.length - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return cb() - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true, cb) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true, cb) - } - - cb() -} - -Glob.prototype._processSimple = function (prefix, index, cb) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var self = this - this._stat(prefix, function (er, exists) { - self._processSimple2(prefix, index, er, exists, cb) - }) -} -Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { - - //console.error('ps2', prefix, exists) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return cb() - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this._emitMatch(index, prefix) - cb() -} - -// Returns either 'DIR', 'FILE', or false -Glob.prototype._stat = function (f, cb) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return cb() - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return cb(null, c) - - if (needDir && c === 'FILE') - return cb() - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (stat !== undefined) { - if (stat === false) - return cb(null, stat) - else { - var type = stat.isDirectory() ? 'DIR' : 'FILE' - if (needDir && type === 'FILE') - return cb() - else - return cb(null, type, stat) - } - } - - var self = this - var statcb = inflight('stat\0' + abs, lstatcb_) - if (statcb) - fs.lstat(abs, statcb) - - function lstatcb_ (er, lstat) { - if (lstat && lstat.isSymbolicLink()) { - // If it's a symlink, then treat it as the target, unless - // the target does not exist, then treat it as a file. - return fs.stat(abs, function (er, stat) { - if (er) - self._stat2(f, abs, null, lstat, cb) - else - self._stat2(f, abs, er, stat, cb) - }) - } else { - self._stat2(f, abs, er, lstat, cb) - } - } -} - -Glob.prototype._stat2 = function (f, abs, er, stat, cb) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return cb() - } - - var needDir = f.slice(-1) === '/' - this.statCache[abs] = stat - - if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) - return cb(null, false, stat) - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - this.cache[abs] = this.cache[abs] || c - - if (needDir && c === 'FILE') - return cb() - - return cb(null, c, stat) -} diff --git a/node_modules/glob/package.json b/node_modules/glob/package.json deleted file mode 100644 index 1598e8b4..00000000 --- a/node_modules/glob/package.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "_args": [ - [ - "glob@7.1.4", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "glob@7.1.4", - "_id": "glob@7.1.4", - "_inBundle": false, - "_integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "_location": "/glob", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "glob@7.1.4", - "name": "glob", - "escapedName": "glob", - "rawSpec": "7.1.4", - "saveSpec": null, - "fetchSpec": "7.1.4" - }, - "_requiredBy": [ - "/js-beautify" - ], - "_resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "_spec": "7.1.4", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/node-glob/issues" - }, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "description": "a little globber", - "devDependencies": { - "mkdirp": "0", - "rimraf": "^2.2.8", - "tap": "^12.0.1", - "tick": "0.0.6" - }, - "engines": { - "node": "*" - }, - "files": [ - "glob.js", - "sync.js", - "common.js" - ], - "homepage": "https://github.com/isaacs/node-glob#readme", - "license": "ISC", - "main": "glob.js", - "name": "glob", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "scripts": { - "bench": "bash benchmark.sh", - "benchclean": "node benchclean.js", - "prepublish": "npm run benchclean", - "prof": "bash prof.sh && cat profile.txt", - "profclean": "rm -f v8.log profile.txt", - "test": "tap test/*.js --cov", - "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js" - }, - "version": "7.1.4" -} diff --git a/node_modules/glob/sync.js b/node_modules/glob/sync.js deleted file mode 100644 index c952134b..00000000 --- a/node_modules/glob/sync.js +++ /dev/null @@ -1,486 +0,0 @@ -module.exports = globSync -globSync.GlobSync = GlobSync - -var fs = require('fs') -var rp = require('fs.realpath') -var minimatch = require('minimatch') -var Minimatch = minimatch.Minimatch -var Glob = require('./glob.js').Glob -var util = require('util') -var path = require('path') -var assert = require('assert') -var isAbsolute = require('path-is-absolute') -var common = require('./common.js') -var alphasort = common.alphasort -var alphasorti = common.alphasorti -var setopts = common.setopts -var ownProp = common.ownProp -var childrenIgnored = common.childrenIgnored -var isIgnored = common.isIgnored - -function globSync (pattern, options) { - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - return new GlobSync(pattern, options).found -} - -function GlobSync (pattern, options) { - if (!pattern) - throw new Error('must provide pattern') - - if (typeof options === 'function' || arguments.length === 3) - throw new TypeError('callback provided to sync glob\n'+ - 'See: https://github.com/isaacs/node-glob/issues/167') - - if (!(this instanceof GlobSync)) - return new GlobSync(pattern, options) - - setopts(this, pattern, options) - - if (this.noprocess) - return this - - var n = this.minimatch.set.length - this.matches = new Array(n) - for (var i = 0; i < n; i ++) { - this._process(this.minimatch.set[i], i, false) - } - this._finish() -} - -GlobSync.prototype._finish = function () { - assert(this instanceof GlobSync) - if (this.realpath) { - var self = this - this.matches.forEach(function (matchset, index) { - var set = self.matches[index] = Object.create(null) - for (var p in matchset) { - try { - p = self._makeAbs(p) - var real = rp.realpathSync(p, self.realpathCache) - set[real] = true - } catch (er) { - if (er.syscall === 'stat') - set[self._makeAbs(p)] = true - else - throw er - } - } - }) - } - common.finish(this) -} - - -GlobSync.prototype._process = function (pattern, index, inGlobStar) { - assert(this instanceof GlobSync) - - // Get the first [n] parts of pattern that are all strings. - var n = 0 - while (typeof pattern[n] === 'string') { - n ++ - } - // now n is the index of the first one that is *not* a string. - - // See if there's anything else - var prefix - switch (n) { - // if not, then this is rather simple - case pattern.length: - this._processSimple(pattern.join('/'), index) - return - - case 0: - // pattern *starts* with some non-trivial item. - // going to readdir(cwd), but not include the prefix in matches. - prefix = null - break - - default: - // pattern has some string bits in the front. - // whatever it starts with, whether that's 'absolute' like /foo/bar, - // or 'relative' like '../baz' - prefix = pattern.slice(0, n).join('/') - break - } - - var remain = pattern.slice(n) - - // get the list of entries. - var read - if (prefix === null) - read = '.' - else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { - if (!prefix || !isAbsolute(prefix)) - prefix = '/' + prefix - read = prefix - } else - read = prefix - - var abs = this._makeAbs(read) - - //if ignored, skip processing - if (childrenIgnored(this, read)) - return - - var isGlobStar = remain[0] === minimatch.GLOBSTAR - if (isGlobStar) - this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) - else - this._processReaddir(prefix, read, abs, remain, index, inGlobStar) -} - - -GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { - var entries = this._readdir(abs, inGlobStar) - - // if the abs isn't a dir, then nothing can match! - if (!entries) - return - - // It will only match dot entries if it starts with a dot, or if - // dot is set. Stuff like @(.foo|.bar) isn't allowed. - var pn = remain[0] - var negate = !!this.minimatch.negate - var rawGlob = pn._glob - var dotOk = this.dot || rawGlob.charAt(0) === '.' - - var matchedEntries = [] - for (var i = 0; i < entries.length; i++) { - var e = entries[i] - if (e.charAt(0) !== '.' || dotOk) { - var m - if (negate && !prefix) { - m = !e.match(pn) - } else { - m = e.match(pn) - } - if (m) - matchedEntries.push(e) - } - } - - var len = matchedEntries.length - // If there are no matched entries, then nothing matches. - if (len === 0) - return - - // if this is the last remaining pattern bit, then no need for - // an additional stat *unless* the user has specified mark or - // stat explicitly. We know they exist, since readdir returned - // them. - - if (remain.length === 1 && !this.mark && !this.stat) { - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - if (prefix) { - if (prefix.slice(-1) !== '/') - e = prefix + '/' + e - else - e = prefix + e - } - - if (e.charAt(0) === '/' && !this.nomount) { - e = path.join(this.root, e) - } - this._emitMatch(index, e) - } - // This was the last one, and no stats were needed - return - } - - // now test all matched entries as stand-ins for that part - // of the pattern. - remain.shift() - for (var i = 0; i < len; i ++) { - var e = matchedEntries[i] - var newPattern - if (prefix) - newPattern = [prefix, e] - else - newPattern = [e] - this._process(newPattern.concat(remain), index, inGlobStar) - } -} - - -GlobSync.prototype._emitMatch = function (index, e) { - if (isIgnored(this, e)) - return - - var abs = this._makeAbs(e) - - if (this.mark) - e = this._mark(e) - - if (this.absolute) { - e = abs - } - - if (this.matches[index][e]) - return - - if (this.nodir) { - var c = this.cache[abs] - if (c === 'DIR' || Array.isArray(c)) - return - } - - this.matches[index][e] = true - - if (this.stat) - this._stat(e) -} - - -GlobSync.prototype._readdirInGlobStar = function (abs) { - // follow all symlinked directories forever - // just proceed as if this is a non-globstar situation - if (this.follow) - return this._readdir(abs, false) - - var entries - var lstat - var stat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er.code === 'ENOENT') { - // lstat failed, doesn't exist - return null - } - } - - var isSym = lstat && lstat.isSymbolicLink() - this.symlinks[abs] = isSym - - // If it's not a symlink or a dir, then it's definitely a regular file. - // don't bother doing a readdir in that case. - if (!isSym && lstat && !lstat.isDirectory()) - this.cache[abs] = 'FILE' - else - entries = this._readdir(abs, false) - - return entries -} - -GlobSync.prototype._readdir = function (abs, inGlobStar) { - var entries - - if (inGlobStar && !ownProp(this.symlinks, abs)) - return this._readdirInGlobStar(abs) - - if (ownProp(this.cache, abs)) { - var c = this.cache[abs] - if (!c || c === 'FILE') - return null - - if (Array.isArray(c)) - return c - } - - try { - return this._readdirEntries(abs, fs.readdirSync(abs)) - } catch (er) { - this._readdirError(abs, er) - return null - } -} - -GlobSync.prototype._readdirEntries = function (abs, entries) { - // if we haven't asked to stat everything, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. - if (!this.mark && !this.stat) { - for (var i = 0; i < entries.length; i ++) { - var e = entries[i] - if (abs === '/') - e = abs + e - else - e = abs + '/' + e - this.cache[e] = true - } - } - - this.cache[abs] = entries - - // mark and cache dir-ness - return entries -} - -GlobSync.prototype._readdirError = function (f, er) { - // handle errors, and cache the information - switch (er.code) { - case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 - case 'ENOTDIR': // totally normal. means it *does* exist. - var abs = this._makeAbs(f) - this.cache[abs] = 'FILE' - if (abs === this.cwdAbs) { - var error = new Error(er.code + ' invalid cwd ' + this.cwd) - error.path = this.cwd - error.code = er.code - throw error - } - break - - case 'ENOENT': // not terribly unusual - case 'ELOOP': - case 'ENAMETOOLONG': - case 'UNKNOWN': - this.cache[this._makeAbs(f)] = false - break - - default: // some unusual error. Treat as failure. - this.cache[this._makeAbs(f)] = false - if (this.strict) - throw er - if (!this.silent) - console.error('glob error', er) - break - } -} - -GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { - - var entries = this._readdir(abs, inGlobStar) - - // no entries means not a dir, so it can never have matches - // foo.txt/** doesn't match foo.txt - if (!entries) - return - - // test without the globstar, and with every child both below - // and replacing the globstar. - var remainWithoutGlobStar = remain.slice(1) - var gspref = prefix ? [ prefix ] : [] - var noGlobStar = gspref.concat(remainWithoutGlobStar) - - // the noGlobStar pattern exits the inGlobStar state - this._process(noGlobStar, index, false) - - var len = entries.length - var isSym = this.symlinks[abs] - - // If it's a symlink, and we're in a globstar, then stop - if (isSym && inGlobStar) - return - - for (var i = 0; i < len; i++) { - var e = entries[i] - if (e.charAt(0) === '.' && !this.dot) - continue - - // these two cases enter the inGlobStar state - var instead = gspref.concat(entries[i], remainWithoutGlobStar) - this._process(instead, index, true) - - var below = gspref.concat(entries[i], remain) - this._process(below, index, true) - } -} - -GlobSync.prototype._processSimple = function (prefix, index) { - // XXX review this. Shouldn't it be doing the mounting etc - // before doing stat? kinda weird? - var exists = this._stat(prefix) - - if (!this.matches[index]) - this.matches[index] = Object.create(null) - - // If it doesn't exist, then just mark the lack of results - if (!exists) - return - - if (prefix && isAbsolute(prefix) && !this.nomount) { - var trail = /[\/\\]$/.test(prefix) - if (prefix.charAt(0) === '/') { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - if (trail) - prefix += '/' - } - } - - if (process.platform === 'win32') - prefix = prefix.replace(/\\/g, '/') - - // Mark this as a match - this._emitMatch(index, prefix) -} - -// Returns either 'DIR', 'FILE', or false -GlobSync.prototype._stat = function (f) { - var abs = this._makeAbs(f) - var needDir = f.slice(-1) === '/' - - if (f.length > this.maxLength) - return false - - if (!this.stat && ownProp(this.cache, abs)) { - var c = this.cache[abs] - - if (Array.isArray(c)) - c = 'DIR' - - // It exists, but maybe not how we need it - if (!needDir || c === 'DIR') - return c - - if (needDir && c === 'FILE') - return false - - // otherwise we have to stat, because maybe c=true - // if we know it exists, but not what it is. - } - - var exists - var stat = this.statCache[abs] - if (!stat) { - var lstat - try { - lstat = fs.lstatSync(abs) - } catch (er) { - if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { - this.statCache[abs] = false - return false - } - } - - if (lstat && lstat.isSymbolicLink()) { - try { - stat = fs.statSync(abs) - } catch (er) { - stat = lstat - } - } else { - stat = lstat - } - } - - this.statCache[abs] = stat - - var c = true - if (stat) - c = stat.isDirectory() ? 'DIR' : 'FILE' - - this.cache[abs] = this.cache[abs] || c - - if (needDir && c === 'FILE') - return false - - return c -} - -GlobSync.prototype._mark = function (p) { - return common.mark(this, p) -} - -GlobSync.prototype._makeAbs = function (f) { - return common.makeAbs(this, f) -} diff --git a/node_modules/html/.npmignore b/node_modules/html/.npmignore deleted file mode 100644 index 91dfed8d..00000000 --- a/node_modules/html/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.DS_Store -node_modules \ No newline at end of file diff --git a/node_modules/html/LICENSE b/node_modules/html/LICENSE deleted file mode 100644 index 366cefba..00000000 --- a/node_modules/html/LICENSE +++ /dev/null @@ -1,10 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2015 Max Ogden and contributors -Copyright (c) 2007-2013 Einar Lielmanis 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. \ No newline at end of file diff --git a/node_modules/html/bin/html.js b/node_modules/html/bin/html.js deleted file mode 100755 index 839cea6c..00000000 --- a/node_modules/html/bin/html.js +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env node - -var html = require("../lib/html") -var fs = require('fs') -var concat = require('concat-stream') - -var args = process.argv.slice(0) -// shift off node and script name -args.shift() -args.shift() - -if (args.length > 0) processFiles(args) -else readStdin() - -function readStdin() { - var stdin = process.openStdin() - stdin.pipe(concat(function concatted (buff) { - process.stdout.write(html.prettyPrint(buff.toString(), {indent_size: 2})) - })) -} - -function processFiles(files) { - if (files.length > 1) { - files.map(function(filename) { - prettifyFile(filename) - }) - return - } - var str = fs.readFileSync(files[0]).toString() - process.stdout.write(prettify(str)) -} - -function prettify(str) { - return html.prettyPrint(str, {indent_size: 2}) -} - -function prettifyFile(filename) { - fs.writeFileSync(filename, prettify(fs.readFileSync(filename).toString())) -} diff --git a/node_modules/html/img/after.png b/node_modules/html/img/after.png deleted file mode 100644 index cf01a7b37241bc45ea0c8f0550d31bd290c733a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175741 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
{j@5c7 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 Vj}K{9fBne#d>x2CSaE=S;U6}LmKFd2 diff --git a/node_modules/html/img/before.png b/node_modules/html/img/before.png deleted file mode 100644 index 03486a4d9c88c1ca9dd1e92b77df52aa19d4c457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151730 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

y6MO0~LGdXTc;;d|ggvM#xTLAPw^-lh%R6nvVv* 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

  • 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 diff --git a/node_modules/html/img/copyashtml.png b/node_modules/html/img/copyashtml.png deleted file mode 100644 index ff943087bc88f719b47d55816025b59d67a19e84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 361625 zcmb@tWmubCvoMMjXp0q!6p9ro9^AdSlORC?l;Tj_f?JCQXo9u4yA^jRTHK+ydm*^X z;n{n?`}_8Loqc|t{7BZCjIFiintRsF+~FE(^0+U_U!tI(;3_J}fKX7-6;V*oh@WFV zL7si6hCcm}xytIgYC2fBdYCwyqez)Kd@`p|v@@|Z2br6gc{=r(i#}1&T5IXL>Z+;; zn>yG5O#ZX+QHeJh7Z8WZpz8eNyEnu*a`xw<+Eb8vWgcmOb4>?Zx#YOGWI3hyxVQvA$bJx#<&>3?=KJt3S{VmZH#>8C*MHHP z{U2KC|CRP1Q?PS&3f3EX4peGt^HwsHV@~ znD%16b%6fDMAn*l!Wm}g65+hrddTtnqN1io^>ptdB&A}{`*Kz?(Z-3orbe}?!qe2# zR86B-&wd*$og~yXZ?Zdh4*civYw0(9secD<(lGxw!hhj9e~bGcbWdO*h5mnMM?wF8 zvHs5?9^&65Zn9%3{!99QV+ZH_-%9-lSPJz2n_7udrzal&rmQ;!`)^d)rQUy&+lyb& zoXFaKa?-l-e>UkKeY}656+T)9gv-K&nEs7b0!D%n!YcOC_)PEL7WS|om}d-KS-VHO z5c;1xI?sVw?>QzpF+lKpgNEsU{)alLj2YLQID3EMllwo_!&2s8);&>M@y$cC5Avb< zHx)&spqpPvJdgaMFF9w1e(>bG_A}?7Jvp(FW6|=jLB%xB2mPnE@0u`Bzffu}Px0j3 zw%uj82K%*YA*Ir9Kb@~`(r2&l4)`;W?RxKc&w7uKM4vyLrE$dn^-JTf9LZY0e8Opq zNb_bkKl>zc`dHJ#wBKkthS3(r?NxX&`1)NoX|{216PBaljk6&uV`X}ql{?sVIUw+R z2I}wd$KqCFGBUE+ChLhjx+eF7A~k|Lin_qn`;=DX?l0puKi}R^@v}^@kC3NI4tHsK-2LR`rf|3|?D`EaPtVZr-_bQ`*h9b5 zmdXhVtljaNmV*0b^`$l8@K*eIyQ<_?TXBo1iQ|3+az+5%Zp(r9oEv)-qv5T)3c1*= z?m48&CHz9(tJh+NV9J^iBI}OG|fS2*@rZ z?-^gPmXp&%Ce>`uHpt$l@zoCPG|E+4O#{ai&h<}(9T#>keOINmua!MC0k{8&%vCBPt}k>&sw5nRXEAJxvZ_N?HJEhHXa)vue@pxME~)!20lJ= zQl!}7rb?8E)xj5@bo`9(Lyylpmko6R3Q~o&x0v^78>!Z2uA@l46J0*jF8<=HXl*&Y z9wFZt3zSG(=}gR$Ryoi^6pXl!jzRV{xn~Y}6sbVPZirV2HzJ@^d6s|OT5ODayzSJ} zr-Xa$bde#uge#XyfjNlI^Gf~8F^wlvG8{NfzSiT+lWfGpJ)V9%=IxZ>p|7y4sEr03XIKvwRWz?Kva z;?KrPiiZyn^j*5m<@^?MJ5u0R;h`xc*q1^86A0M)6r3CR-ok~)X!%E~Jk7Yc(?$d%#nToiQSE?Vai?W~G&^ecg5CITP<&Bdz>#Z%9sh+q*GMqqQa@X6k^c^6(M0Ku4ZKvKj_0#6cxC`Wc)O5YF z+@1JcT3Hl)4{s6NsHi3@he*rw&)!$?a!|A%7ah=-FB1zucT@B*BdgLJ>(r}$Qpg zy7h%!&eX&--s~g7>FH*S;x-kk8q@cf`dZ^%6CMoLLlP1aVq*yWd9m}NMG(AGcsVcG z|8(H^9P5vEVMUU^zav)^G6zEG%PdH6RZl)ReO(9jG?x1uYqWQ?yaL2z4j*|?3hA`w_qZ#-{YK`sTa+nQ2O)VFLR>A0&2Mv@5c6NCArDyFTOKDm=^zJWg3-XEIL z5Ilk1CWM-EAAl8K>cq!I&#aWLPgw=`16WHLP2JVO?tNVuFfCL@r2mtQf_wYV-(l#l zx2)aeE~`$|uY{d}xK+-cg5Mlutha7-5kNY!qm}{!N%vjmKA;S9RawiZtdPrCYt>0p z5}Y7)|H-uBuxFb9J>$bYoOUxNaT4x;O7KX zHgwMSQc2<%-`-osKsA1*8Ah%ul*LQ@%~ceo@6MntW56KKphmxxCy1V^G)`r(Gn3H# z3%0_`(v$6m=Hmr))%0Bujq8ay1Nnq(=W@4OOZCsa<2YIxS30M$gG$j?daI9eJtFxp z>diK?-dK>umLZ*H8_nngb^6vja9{74yE1bo5|o)|ydDs`s#x9x&d4dv5Tkj>##Cmh zxHmJs%9+`@W{3(m+o%@xLIr$N4m$Gf9HLAK&*dSR?KRe9kF_(H_e2@Akl)w%7$M> zAx6d`7K9mav$&dk#gKw$1%F#dnN9|`q1kA{WlZ>#k8ET>(^yUGWacvZU8)yXmOwAV z{a<_*Wxuf!17*gXhj0^P>6GOb#=26y^)UIdOelz)SNdigvRl3&&&SCtO}lV!EG{jD z9V!b_0NJVY^dKU2a^rbRQo~w;Z+&P42w0BT2m_rp_11oS`~>sZI(;Y$zQvP~i04;2 zV=|EKY|Hy@6VSb2OXbX%WK&3bDd`-)JB?EK+ghm%buHw3_3=sfN5D%11D0}=y;?$MS z*_9jJ+t*s=^r!%EoQ@YDe?Z~1i@4OI6wFM^NLGyC$p;$Y2&fgnX*bc$WDV%=_p&$z z5OCWEr_s$5Gnd8oZTd$%zK;x@hI82vwrBQMO%x#zIlTrs!cxr>i&M|dPw7Y3$xpl4 z26v7o|H({$WI1C(N7i8F0PszaeZ9_GR6x$j=@jB&A>^4uF}-sW zgn~fBx)OS4$q?_ShSJxXVHt(mhd#o{Fy!fY3^z0pY8@3ka`NnDFz<~=y}TPcfiJw? zJ87MLm}f#OcV$rZ0}I)Mv&1hs75g?opTzS&n=uQ#C{ciD3G0k^tYSu+X(;xqfqti8 zz7IqX_fIFr{Z<55RNMimhx20kyiVx1nZPvw@q=`imO7)~2?$s2yaK%ZB7^(Qib)i# z=nQgH{}~rBNLNUR5imhvxSue>2)3s>H&eRlHg~ij69qIzX@v!NyH#2J5G5UmH^@1U zB${&UV`A-4rb|Jr{@85TB0#%QVHMf0M_eIAKXpdV*ISiMLKBKM8qDa0((36#H1!}$ zx`{tofQ(f;!hpPIGcIKXcu!x5{)->_RPN2W_uAw6I>P`mb0O18mL)y}a9VifmU#JA zr~+{YnWk6|X^Hgu8&NsY0O$)7xq}R^vI%qhzc)WH6G~%N7(u{UjbmeCHeRhV)L$EQ z9`I>mYeO_ zzZU#f8)Hb1`yw_PUt+<1J6u+x3(<1(P$$FLPywhpjU!iRaf06w;LgqN>;T#RQiX@o zujFALeuEYeGn1R)`Af!B#NYTu?{ANeIHRe=SWZgbruwe2xa_gCEEWX8h)UPsWpY{= ziHW~AJ?&&<5mt$M#3tma-5YBMO=gQb6iIA!0S>MJ^>eNM8Rd75HZ*3b<{*~%(b?I; z;;u>N1B)4WO`>kMDN5z;H}b%3PqfRO0I} z@4DRI43;m=7_^#-MjK#|U2@Wi3}Co(E2%kI&$RMjsv;<@ByOb3oF4dtUOzR*R0yLE zNL6f>F~Rh9gl<(!{ctRSDF+atH+|K(Q*cJfK<4Dz^AzKT%MlvJfrPgJ-#CbA`-JC* zHb-4#aUt?F3hl`;Kc2B%@gb@t=hO{}w5`i)Pt%ds2pGM=SK-p6KE_RML{Z06$RgU$ zQTndYSiwatYgswY>4nNEQn8(TKqvZ4G2ky6?yvA@rue+)U&vAENj1iiI-?Tq2tMi4 zlS!HceS<0Whxxa;6mtD7s)BzEB$H43|L%6 z`x_J;SzHcEi^on;yoo)eo6d~oI|MnEv5EE0Ts+-w^#uTn?@;9w1r)inZb?Q86AFq! zL}?82%lOdv1e|GN?RX>Fcbw6w$R!w$X zxjq<89RA++3R_(a!?$WXLP^X{gP2QP80M?K6nQU_)}3?H;;{u8)UP1nAuR#&7 zuUX_va6lQRVo>JY#Ud?@pf7Ln4`eO98A*oqg0v&2GwYg2`P$x-TZ{*7#K9MvJd#I- z1=n#@(#2bLT~waZO6%6-G@mDHHBu{sO#qQ zyWaHyK^soP{dF$DD~J%VY>i>E{iiElI14Q?Xq6k0#S}-)0i=R{iSeHH+~|v!V3fs! zmVGPsA`*=?B7ZRbT$gg0qR+_itrbG1hld- zIpduGtaPGo1P+;^9H4>$^*J*~IQlE`k(>pN!(WNCj!`V0z~IFGFw%*>A_a?EMq=u| zq+Y}?rd^Kk=tZV&kTapejk?mf$0kD`PU>G57DHj~0p@{UW<1=^WBP?@vCf|$1e+zM zH1z#mIzn#Z4{3?h$Qs=v96x0?wuv%xoxy)(w#h*&z?#RFJ-e=wUV#C@YS1t8MS<(7e;pfhetT%7TNHc)v~O+c=$mZ z<9kBH+dQp|Kyv-tivu2``_o|&d@(VxhRw9Pbc44VwuHJBMBM+jcYMX>i9OEc zzR-)e+6hsmYXSr##Cx^(gz3UHbC~LJ&eRMlbt2rvTd!%XLY~l$ki^w=j{;$&#gZ`o?V&k?J~-@CA;ex_dSnsvd@T z&Vv(~qPDE{FGfJNoOx}s*q4TXLRMzAcN=)6B?`FlZN-!IM5-RzTyF7y-FKf`A1V#M z5kDOFOa{okifL8$wUxR5{B-rqjzCw^S12SC>!nKokR6LF#bfN&kA+2MQs zFMC9(3y^Fs?BEg->}}tMX<#t-^P;&f=`a`Z=KNJrnOOC;-$LWAT#E05SMzF+fN6%e zP=CCM=+#~7)y-vV6!qQTTj(i+gS!>@W_waooe!lDK*mcbut}1*1S~TyE_Un;vfU(ng?;jVXvk!dtc)iEIp6J$V4VrK2%E|yG26cG& zMdz+7?WpJ}1tz82T%`qD{hKSQBdP}*j+>Ou(G9jd+q{x}*i5p?P~I6?i51M6ft@V^ zmc&FgrLDv)A&^-F7!Zqd&*p_FzJl#L8igxK70)UX;DWm%E=qxL^5NoLN(*sL+S>~};^BTHbz2|*Q88YqoH;8|`1OQ|PVyt;U!VZY$D z+FMs4zAFkBZ7CPv2BbR;0(=EFp-6P;#+Za`M=HWO!-u{-C3WtY^kF^mSVJ=qopkz$ z&)M0=S3iXbZ##*9!lyMz4l1844#O9+{c{X-dzVUQpqn+Xh+@rB-DHZUIP`tqDEM)_ z0Q4$4R77Y3M@gCW{rjHd4l#)y#H#ck$A@dCct$R#`IuK%dvntyDIO;_utg_DAj*?uQJvj-PL>-_n^9yR?i?2Eqc)D7_VW>Zr&CWz1dI| ztUmcLn9}m*VFPFyX7jGP&h69DsFCQ&-3X_*HpeupsdGgmwFv$pCsBK#UX|lCM*hk} z6ID+FWwO&nW8~ocbs+L=YYZdT<-^VGEtkh31f!896Jzje7S7PmpFq)vt99r~AePh7 zid0oNn_lHJQi!8C35QV@CZE#WSsq&4>~bIPNze|*G;Iv~>CVj`G>?VsOrS(}t1PuA z2?|X`6%%>@^j$};F<#O$mWx!Ld@qfeDX3b0Pb4v7)J1?wMB=)Mm;Uo6hE68NuehF} zJ4S|yGipA`bO8q{Bj_r|;CC*%v~*KbQ$e3A$9}8TYaYahTG!Zw1d_9hi|OOq+|kB; z7@+l6Bg=u}l2sy>Nb$?0{S@xReArtuMCLjgAHp))o5#~Wcq2SfY1r8dT|%=Ao>)Fs z-vA>`9Ah6lu3Tc=|2QcZTB?+0TKEyYJd8M@C`Q=TTe z{VOZVIS&$g&mYmHMD$&bdu^X@|1)Xfo;DA6);hzGs*=2OUs!8#%k&ZlYf%TCVwqCd zLPgw?c@eQ}G8|5X>q3df4iqrNT54k1YM|97WQy-(MT=Q$ z)y`qmGmte%2J-R`rHsg@Y5*3O74R)7)8EO$ASxWYOr(W>er&v1ozw$M5n2ypPeNn3 zrqNa}*)n(;`WGXK6;GbcrS>Ui^%vV`kzl`(;Esq!_x@Ru9hQJDLj3A`z|7*?xe7Yz zqZo>wqC*nVD$^!3dF}I5kZ|)3F_+UB23yj^*VaRREf2ep86njcYu2FtH+N&w-}$OY zdE`U6gsZWtwn_txPon~Dcl`Elqn$j5nn}g6d&%_zrW-0*vSApytdU{3ZTLz7ETl`e|L=`h}YD;w)YI+7aNoSq?+Sp8Chtzno zf;X${*vE5faYpp13VDrI;g~k7S_(L^*QeX2Gi8QvC@6Tx=v7fE$;h~9fu{?FsPVF= zu~vd0cz_(iD?g4t4Y(CAh}I>+X&@UyC>A8&l=I;kp`jAmmq}eW)FC#9mg4>_R`MU( zXJ5TTatn-gmck>;6s+SH+B3&!!MmnlI00Tz?sLXO0%Vi2TpVrZOv|%MLsyoSmhI-o;>T14{IC`XfdKUOn#RUtVekQtz%ld6RM1hj}xR1FVe3EEpb-7Zs#9F zlwRs-o$1bv2BPBeBVOfL#89<;(tX=0Iuj|`kmmjF)eDJ8DaB{BJ`!Q5iof10@_)>J zZ%<@0PJDAA*7CyJ)=>ASYb$yFD~PTZ@s4+|Sh)D5T{>TuhG{-*Uq6#C{OroaICy7K zv`J8kj#cV83R}Hq>S-3&bJF*;lB?YW%=@qk$&rtU4>=lH{-n(`#3tkGo5k1sddFka zb9p^ukxj3xP>AWep;BI-d~knBLfJ$z4HH zsq>pAW@m}-+2gdKrPP64AA}(m#G3CK-z)Hj!^`)S6O$q*rXUoeykSpe%pY8na2l}~ zHyOnfnZ1URM}A&jGx3SduKD@-AwI8%y&_NH8AaplZQ=6;i+JO$G{)AS%38#I!5rGx z2!wIr&yK)&qCh8TH7LS}<&wiQE0=rujsj64%0^Y_PC3dlrbyq}>sA(JOBZV;s+XKh zDM^V^w$<2{T;CTsrzrTEi8$tV_jK?!a=pZXZ@zn4H&BatgSq?#v6mPqc zgawlMa@idp(>+7thN$0)joj;Bj`ANy%`wAK@{eWVKH**g#q-Prmd4>RYcIqS9yG-M z;+tWxNi!>P7Tb%kQkY~Go-st};4_8*Aym8Ymw6i5f3(@8SUL~Umdf^`DOQx=czs;5 z*)4jO*8D7MEB#Wj?W7*A3Tk3tds7laZdRoPZF8M0?9-O7+se**O%&#Uo9d|%$Oznz z=yzb{@ZadyWU4HbjFSCmstN}7tIKCJjyFcg|)US+X5NDJ@Nmk1iRW;z>^%xqC7%YP|0B}brAotXz4 z)^7@}9Tq=daP}H2MAp@KWaa0;Brw|ZJkBz}_e;Q?59~~)_584p3-VaPWAj|>ygKO1 zKSq^^H{f*g6@K^3d-wNWf{11H^y8h1#4f=`=ftoW^_8b0g+y7y7CGcPzC5F@P9C+R zf_BMZ>5c^A)Qxq#i1fo^)hX$cB{j;B1X&G|p5J;COy*&JAzvtR=xu%_yD<5_2**?N z?!zTMxg>FCLDHVCR3

    4mB|jBj9RNgdx8~ij|nA>p}KaNiU`a*41$akRU#$d zEe3+>+FJJo|82MW!{N}Qo4V%L+iBHkv9YnMO;cG&oBsDUK#(4*QZARz-)!n0EOBp! ztx|&$vvpY@)5;M%`1|xSHO9kBpcxEBz!w{LVd{Lu!Fx$VOkKZD&Cr;yeIat%MI|5G zhN)1fS`#&H(fi`#&|J;V?%}UrzwV)1yOxf7h54C=Q7&H)D#q1pZoJmW))vh6eV#a8 zh4HqSn3!b$eWAW6N!;n}!5^j%E&h*wr>O~64>lDg*`OraB8iDfV4s4Awn2XcO?`WK zF>hrg_F+~&Z&CfaQu|N@g(E)0vQ}=t5y)+@WJpKY>icP56)mJpTFQ{y*^{Bc2Wqd# zV~J%Rzqhpn1{(!pYc;)eslPe_WCsO1fXlwI0#g}npOV~>O1;>H^#y8C!%m3dXD*Z{ z{kVTDnzzq{(|CsiwX?@N$ARQ!=pKgK*iLlG-u=0iOCUWLDuRTx)hrz)Sq-Z%MhJrZ zNhO*-hSy;Fg#JzjI&y7yp#aFFhIs8z+@^b}Ex;Ch-d3UnFAE|c7gUgys)x}_?l@~S z3~#&0zNm8Te5yT7cvTI@tg98WS$vU+SwCHlm;SE(tOwOOmj<>>zgYHT4NrCAAUapE zLE(7&W|N7VR4B85XL6g|lU2tA>Wp*W!ZX_FNcOVIA~e|dV;lE{7=@^4L^NOimvmWR z92AYUv#!dYOinJX{Tp|+Wo=!DCQTo!8_Fha|E38=5{`zoaadZKP=QWQ_QRK#H4x_P za&O_A`K>H3GYNf5;?eSU9k4Pri=SQ~8})6-Wu|E*ewF2j073Ap0*ox~TrH9Nlpj1; zLt)s!r3r?Sr;!{?lVak45tx&+3|*npK142NEj3E0cxub?S8( zkD9!#0c!{zUXd*$r*JiC6Mp>9i#Y8!v*$SOI5i)q`t~{NdOL?L1y&0wL&pSsNv6vT zzb1qSL-%G4b*ooZ&TiKKTnwICCG%0AT6nBo55=tRmfnulSqZ7>*WgSD&pWw3Vnf#o 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 - http://jsbeautifier.org/ - - - You are free to use this in any way you want, in case you find this useful or working for you. - - Usage: - style_html(html_source); - - style_html(html_source, options); - - The options are: - indent_size (default 4) — indentation size, - indent_char (default space) — character to indent with, - max_char (default 70) - maximum amount of characters per line, - brace_style (default "collapse") - "collapse" | "expand" | "end-expand" - put braces on the same line as control statements (default), or put braces on own line (Allman / ANSI style), or just put end braces on own line. - unformatted (defaults to inline tags) - list of tags, that shouldn't be reformatted - indent_scripts (default normal) - "keep"|"separate"|"normal" - - e.g. - - style_html(html_source, { - 'indent_size': 2, - 'indent_char': ' ', - 'max_char': 78, - 'brace_style': 'expand', - 'unformatted': ['a', 'sub', 'sup', 'b', 'i', 'u'] - }); -*/ - -function style_html(html_source, options) { -//Wrapper function to invoke all the necessary constructors and deal with the output. - - var multi_parser, - indent_size, - indent_character, - max_char, - brace_style, - unformatted; - - options = options || {}; - indent_size = options.indent_size || 4; - indent_character = options.indent_char || ' '; - brace_style = options.brace_style || 'collapse'; - max_char = options.max_char == 0 ? Infinity : options.max_char || 70; - unformatted = options.unformatted || ['a', 'span', 'bdo', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'q', 'sub', 'sup', 'tt', 'i', 'b', 'big', 'small', 'u', 's', 'strike', 'font', 'ins', 'del', 'pre', 'address', 'dt', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6']; - - function Parser() { - - this.pos = 0; //Parser position - this.token = ''; - this.current_mode = 'CONTENT'; //reflects the current Parser mode: TAG/CONTENT - this.tags = { //An object to hold tags, their position, and their parent-tags, initiated with default values - parent: 'parent1', - parentcount: 1, - parent1: '' - }; - this.tag_type = ''; - this.token_text = this.last_token = this.last_text = this.token_type = ''; - - this.Utils = { //Uilities made available to the various functions - whitespace: "\n\r\t ".split(''), - single_token: 'br,input,link,meta,!doctype,basefont,base,area,hr,wbr,param,img,isindex,?xml,embed,?php,?,?='.split(','), //all the single tags for HTML - extra_liners: 'head,body,/html'.split(','), //for tags that need a line of whitespace before them - in_array: function (what, arr) { - for (var i=0; i= this.input.length) { - return content.length?content.join(''):['', 'TK_EOF']; - } - - input_char = this.input.charAt(this.pos); - this.pos++; - this.line_char_count++; - - if (this.Utils.in_array(input_char, this.Utils.whitespace)) { - if (content.length) { - space = true; - } - this.line_char_count--; - continue; //don't want to insert unnecessary space - } - else if (space) { - if (this.line_char_count >= this.max_char) { //insert a line when the max_char is reached - content.push('\n'); - for (var i=0; i', 'igm'); - reg_match.lastIndex = this.pos; - var reg_array = reg_match.exec(this.input); - var end_script = reg_array?reg_array.index:this.input.length; //absolute end of script - if(this.pos < end_script) { //get everything in between the script tags - content = this.input.substring(this.pos, end_script); - this.pos = end_script; - } - return content; - } - - this.record_tag = function (tag){ //function to record a tag and its parent in this.tags Object - if (this.tags[tag + 'count']) { //check for the existence of this tag type - this.tags[tag + 'count']++; - this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level - } - else { //otherwise initialize this tag type - this.tags[tag + 'count'] = 1; - this.tags[tag + this.tags[tag + 'count']] = this.indent_level; //and record the present indent level - } - this.tags[tag + this.tags[tag + 'count'] + 'parent'] = this.tags.parent; //set the parent (i.e. in the case of a div this.tags.div1parent) - this.tags.parent = tag + this.tags[tag + 'count']; //and make this the current parent (i.e. in the case of a div 'div1') - } - - this.retrieve_tag = function (tag) { //function to retrieve the opening tag to the corresponding closer - if (this.tags[tag + 'count']) { //if the openener is not in the Object we ignore it - var temp_parent = this.tags.parent; //check to see if it's a closable tag. - while (temp_parent) { //till we reach '' (the initial value); - if (tag + this.tags[tag + 'count'] === temp_parent) { //if this is it use it - break; - } - temp_parent = this.tags[temp_parent + 'parent']; //otherwise keep on climbing up the DOM Tree - } - if (temp_parent) { //if we caught something - this.indent_level = this.tags[tag + this.tags[tag + 'count']]; //set the indent_level accordingly - this.tags.parent = this.tags[temp_parent + 'parent']; //and set the current parent - } - delete this.tags[tag + this.tags[tag + 'count'] + 'parent']; //delete the closed tags parent reference... - delete this.tags[tag + this.tags[tag + 'count']]; //...and the tag itself - if (this.tags[tag + 'count'] == 1) { - delete this.tags[tag + 'count']; - } - else { - this.tags[tag + 'count']--; - } - } - } - - this.get_tag = function () { //function to get a full tag and parse its type - var input_char = '', - content = [], - space = false, - tag_start, tag_end; - - do { - if (this.pos >= this.input.length) { - return content.length?content.join(''):['', 'TK_EOF']; - } - - input_char = this.input.charAt(this.pos); - this.pos++; - this.line_char_count++; - - if (this.Utils.in_array(input_char, this.Utils.whitespace)) { //don't want to insert unnecessary space - space = true; - this.line_char_count--; - continue; - } - - if (input_char === "'" || input_char === '"') { - if (!content[1] || content[1] !== '!') { //if we're in a comment strings don't get treated specially - input_char += this.get_unformatted(input_char); - space = true; - } - } - - if (input_char === '=') { //no space before = - space = false; - } - - if (content.length && content[content.length-1] !== '=' && input_char !== '>' - && space) { //no space after = or before > - if (this.line_char_count >= this.max_char) { - this.print_newline(false, content); - this.line_char_count = 0; - } - else { - content.push(' '); - this.line_char_count++; - } - space = false; - } - if (input_char === '<') { - tag_start = this.pos - 1; - } - content.push(input_char); //inserts character at-a-time (or string) - } while (input_char !== '>'); - - var tag_complete = content.join(''); - var tag_index; - if (tag_complete.indexOf(' ') != -1) { //if there's whitespace, thats where the tag name ends - tag_index = tag_complete.indexOf(' '); - } - else { //otherwise go with the tag ending - tag_index = tag_complete.indexOf('>'); - } - var tag_check = tag_complete.substring(1, tag_index).toLowerCase(); - if (tag_complete.charAt(tag_complete.length-2) === '/' || - this.Utils.in_array(tag_check, this.Utils.single_token)) { //if this tag name is a single tag type (either in the list or has a closing /) - this.tag_type = 'SINGLE'; - } - else if (tag_check === 'script') { //for later script handling - this.record_tag(tag_check); - this.tag_type = 'SCRIPT'; - } - else if (tag_check === 'style') { //for future style handling (for now it justs uses get_content) - this.record_tag(tag_check); - this.tag_type = 'STYLE'; - } - else if (this.Utils.in_array(tag_check, unformatted)) { // do not reformat the "unformatted" tags - var comment = this.get_unformatted('', tag_complete); //...delegate to get_unformatted function - content.push(comment); - // Preserve collapsed whitespace either before or after this tag. - if (tag_start > 0 && this.Utils.in_array(this.input.charAt(tag_start - 1), this.Utils.whitespace)){ - content.splice(0, 0, this.input.charAt(tag_start - 1)); - } - tag_end = this.pos - 1; - if (this.Utils.in_array(this.input.charAt(tag_end + 1), this.Utils.whitespace)){ - content.push(this.input.charAt(tag_end + 1)); - } - this.tag_type = 'SINGLE'; - } - else if (tag_check.charAt(0) === '!') { //peek for so... - var comment = this.get_unformatted('-->', tag_complete); //...delegate to get_unformatted - content.push(comment); - } - this.tag_type = 'START'; - } - else if (tag_check.indexOf('[endif') != -1) {//peek for ', tag_complete); - content.push(comment); - this.tag_type = 'SINGLE'; - } - } - else { - if (tag_check.charAt(0) === '/') { //this tag is a double tag so check for tag-ending - this.retrieve_tag(tag_check.substring(1)); //remove it and all ancestors - this.tag_type = 'END'; - } - else { //otherwise it's a start-tag - this.record_tag(tag_check); //push it on the tag stack - this.tag_type = 'START'; - } - if (this.Utils.in_array(tag_check, this.Utils.extra_liners)) { //check if this double needs an extra line - this.print_newline(true, this.output); - } - } - return content.join(''); //returns fully formatted tag - } - - this.get_unformatted = function (delimiter, orig_tag) { //function to return unformatted content in its entirety - - if (orig_tag && orig_tag.toLowerCase().indexOf(delimiter) != -1) { - return ''; - } - var input_char = ''; - var content = ''; - var space = true; - do { - - if (this.pos >= this.input.length) { - return content; - } - - input_char = this.input.charAt(this.pos); - this.pos++ - - if (this.Utils.in_array(input_char, this.Utils.whitespace)) { - if (!space) { - this.line_char_count--; - continue; - } - if (input_char === '\n' || input_char === '\r') { - content += '\n'; - /* Don't change tab indention for unformatted blocks. If using code for html editing, this will greatly affect
       tags if they are specified in the 'unformatted array'
      -            for (var i=0; i 0) {
      -          this.indent_level--;
      -        }
      -      }
      -    }
      -    return this;
      -  }
      -
      -  /*_____________________--------------------_____________________*/
      -
      -  multi_parser = new Parser(); //wrapping functions Parser
      -  multi_parser.printer(html_source, indent_character, indent_size, max_char, brace_style); //initialize starting values
      -
      -  while (true) {
      -      var t = multi_parser.get_token();
      -      multi_parser.token_text = t[0];
      -      multi_parser.token_type = t[1];
      -
      -    if (multi_parser.token_type === 'TK_EOF') {
      -      break;
      -    }
      -
      -    switch (multi_parser.token_type) {
      -      case 'TK_TAG_START':
      -        multi_parser.print_newline(false, multi_parser.output);
      -        multi_parser.print_token(multi_parser.token_text);
      -        multi_parser.indent();
      -        multi_parser.current_mode = 'CONTENT';
      -        break;
      -      case 'TK_TAG_STYLE':
      -      case 'TK_TAG_SCRIPT':
      -        multi_parser.print_newline(false, multi_parser.output);
      -        multi_parser.print_token(multi_parser.token_text);
      -        multi_parser.current_mode = 'CONTENT';
      -        break;
      -      case 'TK_TAG_END':
      -        //Print new line only if the tag has no content and has child
      -        if (multi_parser.last_token === 'TK_CONTENT' && multi_parser.last_text === '') {
      -            var tag_name = multi_parser.token_text.match(/\w+/)[0];
      -            var tag_extracted_from_last_output = multi_parser.output[multi_parser.output.length -1].match(/<\s*(\w+)/);
      -            if (tag_extracted_from_last_output === null || tag_extracted_from_last_output[1] !== tag_name)
      -                multi_parser.print_newline(true, multi_parser.output);
      -        }
      -        multi_parser.print_token(multi_parser.token_text);
      -        multi_parser.current_mode = 'CONTENT';
      -        break;
      -      case 'TK_TAG_SINGLE':
      -        // Don't add a newline before elements that should remain unformatted.
      -        var tag_check = multi_parser.token_text.match(/^\s*<([a-z]+)/i);
      -        if (!tag_check || !multi_parser.Utils.in_array(tag_check[1], unformatted)){
      -            multi_parser.print_newline(false, multi_parser.output);
      -        }
      -        multi_parser.print_token(multi_parser.token_text);
      -        multi_parser.current_mode = 'CONTENT';
      -        break;
      -      case 'TK_CONTENT':
      -        if (multi_parser.token_text !== '') {
      -          multi_parser.print_token(multi_parser.token_text);
      -        }
      -        multi_parser.current_mode = 'TAG';
      -        break;
      -      case 'TK_STYLE':
      -      case 'TK_SCRIPT':
      -        if (multi_parser.token_text !== '') {
      -          multi_parser.output.push('\n');
      -          var text = multi_parser.token_text;
      -          if (multi_parser.token_type == 'TK_SCRIPT') {
      -            var _beautifier = typeof js_beautify == 'function' && js_beautify;
      -          } else if (multi_parser.token_type == 'TK_STYLE') {
      -            var _beautifier = typeof css_beautify == 'function' && css_beautify;
      -          }
      -
      -          if (options.indent_scripts == "keep") {
      -            var script_indent_level = 0;
      -          } else if (options.indent_scripts == "separate") {
      -            var script_indent_level = -multi_parser.indent_level;
      -          } else {
      -            var script_indent_level = 1;
      -          }
      -
      -          var indentation = multi_parser.get_full_indent(script_indent_level);
      -          if (_beautifier) {
      -            // call the Beautifier if avaliable
      -            text = _beautifier(text.replace(/^\s*/, indentation), options);
      -          } else {
      -            // simply indent the string otherwise
      -            var white = text.match(/^\s*/)[0];
      -            var _level = white.match(/[^\n\r]*$/)[0].split(multi_parser.indent_string).length - 1;
      -            var reindent = multi_parser.get_full_indent(script_indent_level -_level);
      -            text = text.replace(/^\s*/, indentation)
      -                   .replace(/\r\n|\r|\n/g, '\n' + reindent)
      -                   .replace(/\s*$/, '');
      -          }
      -          if (text) {
      -            multi_parser.print_token(text);
      -            multi_parser.print_newline(true, multi_parser.output);
      -          }
      -        }
      -        multi_parser.current_mode = 'TAG';
      -        break;
      -    }
      -    multi_parser.last_token = multi_parser.token_type;
      -    multi_parser.last_text = multi_parser.token_text;
      -  }
      -  return multi_parser.output.join('');
      -}
      -
      -module.exports = {
      -  prettyPrint: style_html
      -};
      \ No newline at end of file
      diff --git a/node_modules/html/package.json b/node_modules/html/package.json
      deleted file mode 100644
      index 73d8b74a..00000000
      --- a/node_modules/html/package.json
      +++ /dev/null
      @@ -1,78 +0,0 @@
      -{
      -  "_args": [
      -    [
      -      "html@1.0.0",
      -      "/Users/joseph.whissel/Documents/GitHub/Postgen"
      -    ]
      -  ],
      -  "_from": "html@1.0.0",
      -  "_id": "html@1.0.0",
      -  "_inBundle": false,
      -  "_integrity": "sha1-pUT6nqVJK/s6LMqCEKEL57WvH2E=",
      -  "_location": "/html",
      -  "_phantomChildren": {},
      -  "_requested": {
      -    "type": "version",
      -    "registry": true,
      -    "raw": "html@1.0.0",
      -    "name": "html",
      -    "escapedName": "html",
      -    "rawSpec": "1.0.0",
      -    "saveSpec": null,
      -    "fetchSpec": "1.0.0"
      -  },
      -  "_requiredBy": [
      -    "/beautify"
      -  ],
      -  "_resolved": "https://registry.npmjs.org/html/-/html-1.0.0.tgz",
      -  "_spec": "1.0.0",
      -  "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen",
      -  "author": {
      -    "name": "Max Ogden",
      -    "email": "max@maxogden.com",
      -    "url": "http://maxogden.com"
      -  },
      -  "bin": {
      -    "html": "./bin/html.js"
      -  },
      -  "bugs": {
      -    "url": "https://github.com/maxogden/commonjs-html-prettyprinter/issues"
      -  },
      -  "contributors": [
      -    {
      -      "name": "Nochum Sossonko",
      -      "email": "nsossonko@hotmail.com"
      -    },
      -    {
      -      "name": "Einar Lielmanis",
      -      "email": "elfz@laacz.lv"
      -    }
      -  ],
      -  "dependencies": {
      -    "concat-stream": "^1.4.7"
      -  },
      -  "description": "HTML pretty printer CLI utility (based on jsbeautifier)",
      -  "devDependencies": {},
      -  "homepage": "https://github.com/maxogden/commonjs-html-prettyprinter",
      -  "keywords": [
      -    "html",
      -    "tabifier",
      -    "beautifier",
      -    "prettyprinter",
      -    "prettifier",
      -    "pretty",
      -    "command",
      -    "shell"
      -  ],
      -  "license": "BSD",
      -  "main": "lib/html.js",
      -  "name": "html",
      -  "repository": {
      -    "type": "git",
      -    "url": "git+https://github.com/maxogden/commonjs-html-prettyprinter.git"
      -  },
      -  "scripts": {
      -    "test": "echo \"Error: no test specified\" && exit 1"
      -  },
      -  "version": "1.0.0"
      -}
      diff --git a/node_modules/html/readme.md b/node_modules/html/readme.md
      deleted file mode 100644
      index 7d9d47d7..00000000
      --- a/node_modules/html/readme.md
      +++ /dev/null
      @@ -1,61 +0,0 @@
      -# html prettyprinter
      -
      -A node port of beautify-html.js by Nochum Sossonko which is based on jsbeautifier by Einar Lielmanis
      -
      -## Installation
      -
      -### from npm (node package manager)
      -``` bash
      -  npm install html
      -```
      -
      -## Usage (command line)
      -
      -```
      -  echo "

      AwesomeComis awesome

      " | html -``` - -returns: - -``` html -

      - - AwesomeCom - - - is awesome - -

      -```` - -`html foo.html` will write the prettified version to `stdout`. - -`html *.html` will *update in place* all matching html files with their prettified versions. - -## Advanced usage - -I find myself constantly using the 'Copy as HTML' feature of the Chrome Inspector: - -![Copy as HTML](https://github.com/maxogden/commonjs-html-prettyprinter/raw/master/img/copyashtml.png) - -The downside is that that usually the HTML that gets copied is pretty ugly: - -![Before pretty printing](https://github.com/maxogden/commonjs-html-prettyprinter/raw/master/img/before.png) - -On OS X you can use `pbpaste` and `pbcopy` to stream your clipboard in and out of unix pipes. With the ugly HTML still in your clipboard run this command: - -`pbpaste | html | pbcopy` - -Now when you paste your clipboard into an editor you will get nice, pretty printed HTML: - -![After pretty printing](https://github.com/maxogden/commonjs-html-prettyprinter/raw/master/img/after.png) - -## Upgrading - -grab the newest `beautify-html.js` from [js-beautifier](https://github.com/einars/js-beautify) and drop it into `lib/` as `html.js`. then add the following code to the bottom of `html.js`: - -```javascript - module.exports = { prettyPrint: style_html } -``` - -BSD LICENSE \ No newline at end of file diff --git a/node_modules/html/src/html.js b/node_modules/html/src/html.js deleted file mode 100644 index c6d2a2f4..00000000 --- a/node_modules/html/src/html.js +++ /dev/null @@ -1,5 +0,0 @@ -//= github://einars/js-beautify/[beautify, beautify-html] - -module.exports = { - prettyPrint: style_html -}; \ No newline at end of file diff --git a/node_modules/inflight/LICENSE b/node_modules/inflight/LICENSE deleted file mode 100644 index 05eeeb88..00000000 --- a/node_modules/inflight/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -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/inflight/README.md b/node_modules/inflight/README.md deleted file mode 100644 index 6dc89291..00000000 --- a/node_modules/inflight/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# inflight - -Add callbacks to requests in flight to avoid async duplication - -## USAGE - -```javascript -var inflight = require('inflight') - -// some request that does some stuff -function req(key, callback) { - // key is any random string. like a url or filename or whatever. - // - // will return either a falsey value, indicating that the - // request for this key is already in flight, or a new callback - // which when called will call all callbacks passed to inflightk - // with the same key - callback = inflight(key, callback) - - // If we got a falsey value back, then there's already a req going - if (!callback) return - - // this is where you'd fetch the url or whatever - // callback is also once()-ified, so it can safely be assigned - // to multiple events etc. First call wins. - setTimeout(function() { - callback(null, key) - }, 100) -} - -// only assigns a single setTimeout -// when it dings, all cbs get called -req('foo', cb1) -req('foo', cb2) -req('foo', cb3) -req('foo', cb4) -``` diff --git a/node_modules/inflight/inflight.js b/node_modules/inflight/inflight.js deleted file mode 100644 index 48202b3c..00000000 --- a/node_modules/inflight/inflight.js +++ /dev/null @@ -1,54 +0,0 @@ -var wrappy = require('wrappy') -var reqs = Object.create(null) -var once = require('once') - -module.exports = wrappy(inflight) - -function inflight (key, cb) { - if (reqs[key]) { - reqs[key].push(cb) - return null - } else { - reqs[key] = [cb] - return makeres(key) - } -} - -function makeres (key) { - return once(function RES () { - var cbs = reqs[key] - var len = cbs.length - var args = slice(arguments) - - // XXX It's somewhat ambiguous whether a new callback added in this - // pass should be queued for later execution if something in the - // list of callbacks throws, or if it should just be discarded. - // However, it's such an edge case that it hardly matters, and either - // choice is likely as surprising as the other. - // As it happens, we do go ahead and schedule it for later execution. - try { - for (var i = 0; i < len; i++) { - cbs[i].apply(null, args) - } - } finally { - if (cbs.length > len) { - // added more in the interim. - // de-zalgo, just in case, but don't call again. - cbs.splice(0, len) - process.nextTick(function () { - RES.apply(null, args) - }) - } else { - delete reqs[key] - } - } - }) -} - -function slice (args) { - var length = args.length - var array = [] - - for (var i = 0; i < length; i++) array[i] = args[i] - return array -} diff --git a/node_modules/inflight/package.json b/node_modules/inflight/package.json deleted file mode 100644 index 07294315..00000000 --- a/node_modules/inflight/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "_args": [ - [ - "inflight@1.0.6", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "inflight@1.0.6", - "_id": "inflight@1.0.6", - "_inBundle": false, - "_integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "_location": "/inflight", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "inflight@1.0.6", - "name": "inflight", - "escapedName": "inflight", - "rawSpec": "1.0.6", - "saveSpec": null, - "fetchSpec": "1.0.6" - }, - "_requiredBy": [ - "/glob" - ], - "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "_spec": "1.0.6", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/inflight/issues" - }, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - }, - "description": "Add callbacks to requests in flight to avoid async duplication", - "devDependencies": { - "tap": "^7.1.2" - }, - "files": [ - "inflight.js" - ], - "homepage": "https://github.com/isaacs/inflight", - "license": "ISC", - "main": "inflight.js", - "name": "inflight", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/inflight.git" - }, - "scripts": { - "test": "tap test.js --100" - }, - "version": "1.0.6" -} diff --git a/node_modules/ini/LICENSE b/node_modules/ini/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/ini/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/ini/README.md b/node_modules/ini/README.md deleted file mode 100644 index 33df2582..00000000 --- a/node_modules/ini/README.md +++ /dev/null @@ -1,102 +0,0 @@ -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: '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, [options]) - -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. - -The `options` object may contain the following: - -* `section` A string which will be the first `section` in the encoded - ini data. Defaults to none. -* `whitespace` Boolean to specify whether to put whitespace around the - `=` character. By default, whitespace is omitted, to be friendly to - some persnickety old parsers that don't tolerate it well. But some - find that it's more human-readable and pretty with the whitespace. - -For backwards compatibility reasons, if a `string` options is passed -in, then it is assumed to be the `section` value. - -### stringify(object, [options]) - -Alias for `encode(object, [options])` - -### 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/ini/ini.js b/node_modules/ini/ini.js deleted file mode 100644 index 590195dd..00000000 --- a/node_modules/ini/ini.js +++ /dev/null @@ -1,194 +0,0 @@ -exports.parse = exports.decode = decode - -exports.stringify = exports.encode = encode - -exports.safe = safe -exports.unsafe = unsafe - -var eol = typeof process !== 'undefined' && - process.platform === 'win32' ? '\r\n' : '\n' - -function encode (obj, opt) { - var children = [] - var out = '' - - if (typeof opt === 'string') { - opt = { - section: opt, - whitespace: false - } - } else { - opt = opt || {} - opt.whitespace = opt.whitespace === true - } - - var separator = opt.whitespace ? ' = ' : '=' - - Object.keys(obj).forEach(function (k, _, __) { - var val = obj[k] - if (val && Array.isArray(val)) { - val.forEach(function (item) { - out += safe(k + '[]') + separator + safe(item) + '\n' - }) - } else if (val && typeof val === 'object') { - children.push(k) - } else { - out += safe(k) + separator + safe(val) + eol - } - }) - - if (opt.section && out.length) { - out = '[' + safe(opt.section) + ']' + eol + out - } - - children.forEach(function (k, _, __) { - var nk = dotSplit(k).join('\\.') - var section = (opt.section ? opt.section + '.' : '') + nk - var child = encode(obj[k], { - section: section, - whitespace: opt.whitespace - }) - if (out.length && child.length) { - out += eol - } - out += child - }) - - return out -} - -function dotSplit (str) { - return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002') - .replace(/\\\./g, '\u0001') - .split(/\./).map(function (part) { - return part.replace(/\1/g, '\\.') - .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001') - }) -} - -function decode (str) { - var out = {} - var p = out - var section = null - // section |key = value - var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i - var lines = str.split(/[\r\n]+/g) - - 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]) - var 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) - var p = out - var l = parts.pop() - var 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 isQuoted (val) { - return (val.charAt(0) === '"' && val.slice(-1) === '"') || - (val.charAt(0) === "'" && val.slice(-1) === "'") -} - -function safe (val) { - return (typeof val !== 'string' || - val.match(/[=\r\n]/) || - val.match(/^\[/) || - (val.length > 1 && - isQuoted(val)) || - val !== val.trim()) - ? JSON.stringify(val) - : val.replace(/;/g, '\\;').replace(/#/g, '\\#') -} - -function unsafe (val, doUnesc) { - val = (val || '').trim() - if (isQuoted(val)) { - // remove the single quotes before calling JSON.parse - if (val.charAt(0) === "'") { - val = val.substr(1, val.length - 2) - } - try { val = JSON.parse(val) } catch (_) {} - } else { - // walk the val to find the first not-escaped ; character - var esc = false - var unesc = '' - for (var i = 0, l = val.length; i < l; i++) { - var c = val.charAt(i) - if (esc) { - if ('\\;#'.indexOf(c) !== -1) { - unesc += c - } else { - unesc += '\\' + c - } - esc = false - } else if (';#'.indexOf(c) !== -1) { - break - } else if (c === '\\') { - esc = true - } else { - unesc += c - } - } - if (esc) { - unesc += '\\' - } - return unesc.trim() - } - return val -} diff --git a/node_modules/ini/package.json b/node_modules/ini/package.json deleted file mode 100644 index a77095ce..00000000 --- a/node_modules/ini/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_args": [ - [ - "ini@1.3.5", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "ini@1.3.5", - "_id": "ini@1.3.5", - "_inBundle": false, - "_integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "_location": "/ini", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "ini@1.3.5", - "name": "ini", - "escapedName": "ini", - "rawSpec": "1.3.5", - "saveSpec": null, - "fetchSpec": "1.3.5" - }, - "_requiredBy": [ - "/config-chain" - ], - "_resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "_spec": "1.3.5", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/ini/issues" - }, - "dependencies": {}, - "description": "An ini encoder/decoder for node", - "devDependencies": { - "standard": "^10.0.3", - "tap": "^10.7.3 || 11" - }, - "engines": { - "node": "*" - }, - "files": [ - "ini.js" - ], - "homepage": "https://github.com/isaacs/ini#readme", - "license": "ISC", - "main": "ini.js", - "name": "ini", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/ini.git" - }, - "scripts": { - "postpublish": "git push origin --all; git push origin --tags", - "postversion": "npm publish", - "pretest": "standard ini.js", - "preversion": "npm test", - "test": "tap test/*.js --100 -J" - }, - "version": "1.3.5" -} diff --git a/node_modules/isarray/.npmignore b/node_modules/isarray/.npmignore deleted file mode 100644 index 3c3629e6..00000000 --- a/node_modules/isarray/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/isarray/.travis.yml b/node_modules/isarray/.travis.yml deleted file mode 100644 index cc4dba29..00000000 --- a/node_modules/isarray/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/node_modules/isarray/Makefile b/node_modules/isarray/Makefile deleted file mode 100644 index 787d56e1..00000000 --- a/node_modules/isarray/Makefile +++ /dev/null @@ -1,6 +0,0 @@ - -test: - @node_modules/.bin/tape test.js - -.PHONY: test - diff --git a/node_modules/isarray/README.md b/node_modules/isarray/README.md deleted file mode 100644 index 16d2c59c..00000000 --- a/node_modules/isarray/README.md +++ /dev/null @@ -1,60 +0,0 @@ - -# isarray - -`Array#isArray` for older browsers. - -[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray) -[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray) - -[![browser support](https://ci.testling.com/juliangruber/isarray.png) -](https://ci.testling.com/juliangruber/isarray) - -## 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/isarray/component.json b/node_modules/isarray/component.json deleted file mode 100644 index 9e31b683..00000000 --- a/node_modules/isarray/component.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "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/isarray/index.js b/node_modules/isarray/index.js deleted file mode 100644 index a57f6349..00000000 --- a/node_modules/isarray/index.js +++ /dev/null @@ -1,5 +0,0 @@ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; -}; diff --git a/node_modules/isarray/package.json b/node_modules/isarray/package.json deleted file mode 100644 index 84be685f..00000000 --- a/node_modules/isarray/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_args": [ - [ - "isarray@1.0.0", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "isarray@1.0.0", - "_id": "isarray@1.0.0", - "_inBundle": false, - "_integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "_location": "/isarray", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "isarray@1.0.0", - "name": "isarray", - "escapedName": "isarray", - "rawSpec": "1.0.0", - "saveSpec": null, - "fetchSpec": "1.0.0" - }, - "_requiredBy": [ - "/readable-stream" - ], - "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "_spec": "1.0.0", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Julian Gruber", - "email": "mail@juliangruber.com", - "url": "http://juliangruber.com" - }, - "bugs": { - "url": "https://github.com/juliangruber/isarray/issues" - }, - "dependencies": {}, - "description": "Array#isArray for older browsers", - "devDependencies": { - "tape": "~2.13.4" - }, - "homepage": "https://github.com/juliangruber/isarray", - "keywords": [ - "browser", - "isarray", - "array" - ], - "license": "MIT", - "main": "index.js", - "name": "isarray", - "repository": { - "type": "git", - "url": "git://github.com/juliangruber/isarray.git" - }, - "scripts": { - "test": "tape test.js" - }, - "testling": { - "files": "test.js", - "browsers": [ - "ie/8..latest", - "firefox/17..latest", - "firefox/nightly", - "chrome/22..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "version": "1.0.0" -} diff --git a/node_modules/isarray/test.js b/node_modules/isarray/test.js deleted file mode 100644 index e0c3444d..00000000 --- a/node_modules/isarray/test.js +++ /dev/null @@ -1,20 +0,0 @@ -var isArray = require('./'); -var test = require('tape'); - -test('is array', function(t){ - t.ok(isArray([])); - t.notOk(isArray({})); - t.notOk(isArray(null)); - t.notOk(isArray(false)); - - var obj = {}; - obj[0] = true; - t.notOk(isArray(obj)); - - var arr = []; - arr.foo = 'bar'; - t.ok(isArray(arr)); - - t.end(); -}); - diff --git a/node_modules/js-beautify/CHANGELOG.md b/node_modules/js-beautify/CHANGELOG.md deleted file mode 100644 index 713b6670..00000000 --- a/node_modules/js-beautify/CHANGELOG.md +++ /dev/null @@ -1,818 +0,0 @@ -# Changelog -## v1.10.2 - -### Description - - -### Closed Issues -* Please update CodeMirror Addon ([#1695](https://github.com/beautify-web/js-beautify/issues/1695)) -* Nested braces indentation ([#223](https://github.com/beautify-web/js-beautify/issues/223)) - - -## v1.10.1 - -### Description - - -### Closed Issues -* javascript fails to format when is first text inside ')) { - unescaped = unescaped.substr(0, unescaped.length - 9); - } - unpacked = unescaped; - } - // throw to terminate the script - unpacked = "// Unpacker warning: be careful when using myobfuscate.com for your projects:\n" + - "// scripts obfuscated by the free online version may call back home.\n" + - "\n//\n" + unpacked; - throw unpacked; - }; // jshint ignore:line - __eval(str); // should throw - } catch (e) { - // well, it failed. we'll just return the original, instead of crashing on user. - if (typeof e === "string") { - str = e; - } - } - eval = __eval; // jshint ignore:line - } - return str; - }, - - starts_with: function(str, what) { - return str.substr(0, what.length) === what; - }, - - ends_with: function(str, what) { - return str.substr(str.length - what.length, what.length) === what; - }, - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - - return t; - } - - -}; diff --git a/node_modules/js-beautify/js/lib/unpackers/p_a_c_k_e_r_unpacker.js b/node_modules/js-beautify/js/lib/unpackers/p_a_c_k_e_r_unpacker.js deleted file mode 100644 index a7421674..00000000 --- a/node_modules/js-beautify/js/lib/unpackers/p_a_c_k_e_r_unpacker.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -// -// Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier -// -// Coincidentally, it can defeat a couple of other eval-based compressors. -// -// usage: -// -// if (P_A_C_K_E_R.detect(some_string)) { -// var unpacked = P_A_C_K_E_R.unpack(some_string); -// } -// -// - -/*jshint strict:false */ - -var P_A_C_K_E_R = { - detect: function(str) { - return (P_A_C_K_E_R.get_chunks(str).length > 0); - }, - - get_chunks: function(str) { - var chunks = str.match(/eval\(\(?function\(.*?(,0,\{\}\)\)|split\('\|'\)\)\))($|\n)/g); - return chunks ? chunks : []; - }, - - unpack: function(str) { - var chunks = P_A_C_K_E_R.get_chunks(str), - chunk; - for (var i = 0; i < chunks.length; i++) { - chunk = chunks[i].replace(/\n$/, ''); - str = str.split(chunk).join(P_A_C_K_E_R.unpack_chunk(chunk)); - } - return str; - }, - - unpack_chunk: function(str) { - var unpacked_source = ''; - var __eval = eval; - if (P_A_C_K_E_R.detect(str)) { - try { - eval = function(s) { // jshint ignore:line - unpacked_source += s; - return unpacked_source; - }; // jshint ignore:line - __eval(str); - if (typeof unpacked_source === 'string' && unpacked_source) { - str = unpacked_source; - } - } catch (e) { - // well, it failed. we'll just return the original, instead of crashing on user. - } - } - eval = __eval; // jshint ignore:line - return str; - }, - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - - var pk1 = "eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))"; - var unpk1 = 'var a=1'; - var pk2 = "eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'foo||b'.split('|'),0,{}))"; - var unpk2 = 'foo b=1'; - var pk_broken = "eval(function(p,a,c,k,e,r){BORKBORK;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))"; - var pk3 = "eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1{}))',3,3,'var||a'.split('|'),0,{}))"; - var unpk3 = 'var a=1{}))'; - - t.test_function(P_A_C_K_E_R.detect, "P_A_C_K_E_R.detect"); - t.expect('', false); - t.expect('var a = b', false); - t.test_function(P_A_C_K_E_R.unpack, "P_A_C_K_E_R.unpack"); - t.expect(pk_broken, pk_broken); - t.expect(pk1, unpk1); - t.expect(pk2, unpk2); - t.expect(pk3, unpk3); - - var filler = '\nfiller\n'; - t.expect(filler + pk1 + "\n" + pk_broken + filler + pk2 + filler, filler + unpk1 + "\n" + pk_broken + filler + unpk2 + filler); - - return t; - } - - -}; diff --git a/node_modules/js-beautify/js/lib/unpackers/urlencode_unpacker.js b/node_modules/js-beautify/js/lib/unpackers/urlencode_unpacker.js deleted file mode 100644 index 0f7a9a29..00000000 --- a/node_modules/js-beautify/js/lib/unpackers/urlencode_unpacker.js +++ /dev/null @@ -1,104 +0,0 @@ -/*global unescape */ -/*jshint curly: false, scripturl: true */ - -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -// -// trivial bookmarklet/escaped script detector for the javascript beautifier -// written by Einar Lielmanis -// -// usage: -// -// if (Urlencoded.detect(some_string)) { -// var unpacked = Urlencoded.unpack(some_string); -// } -// -// - -/*jshint strict:false */ - - -var isNode = (typeof module !== 'undefined' && module.exports); -if (isNode) { - var SanityTest = require(__dirname + '/../../test/sanitytest'); -} - -var Urlencoded = { - detect: function(str) { - // the fact that script doesn't contain any space, but has %20 instead - // should be sufficient check for now. - if (str.indexOf(' ') === -1) { - if (str.indexOf('%2') !== -1) return true; - if (str.replace(/[^%]+/g, '').length > 3) return true; - } - return false; - }, - - unpack: function(str) { - if (Urlencoded.detect(str)) { - if (str.indexOf('%2B') !== -1 || str.indexOf('%2b') !== -1) { - // "+" escaped as "%2B" - return unescape(str.replace(/\+/g, '%20')); - } else { - return unescape(str); - } - } - return str; - }, - - - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - t.test_function(Urlencoded.detect, "Urlencoded.detect"); - t.expect('', false); - t.expect('var a = b', false); - t.expect('var%20a+=+b', true); - t.expect('var%20a=b', true); - t.expect('var%20%21%22', true); - t.expect('javascript:(function(){var%20whatever={init:function(){alert(%22a%22+%22b%22)}};whatever.init()})();', true); - t.test_function(Urlencoded.unpack, 'Urlencoded.unpack'); - - t.expect('javascript:(function(){var%20whatever={init:function(){alert(%22a%22+%22b%22)}};whatever.init()})();', - 'javascript:(function(){var whatever={init:function(){alert("a"+"b")}};whatever.init()})();' - ); - t.expect('', ''); - t.expect('abcd', 'abcd'); - t.expect('var a = b', 'var a = b'); - t.expect('var%20a=b', 'var a=b'); - t.expect('var%20a=b+1', 'var a=b+1'); - t.expect('var%20a=b%2b1', 'var a=b+1'); - return t; - } - - -}; - -if (isNode) { - module.exports = Urlencoded; -} diff --git a/node_modules/js-beautify/js/src/cli.js b/node_modules/js-beautify/js/src/cli.js deleted file mode 100755 index 959fd07e..00000000 --- a/node_modules/js-beautify/js/src/cli.js +++ /dev/null @@ -1,692 +0,0 @@ -#!/usr/bin/env node - -/* - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. - - Js-Beautify Command-line for node.js - ------------------------------------- - - Written by Daniel Stockman (daniel.stockman@gmail.com) - -*/ -/*jshint strict:false */ - -var debug = process.env.DEBUG_JSBEAUTIFY || process.env.JSBEAUTIFY_DEBUG ? function() { - console.error.apply(console, arguments); -} : function() {}; - -var fs = require('fs'), - cc = require('config-chain'), - beautify = require('../index'), - mkdirp = require('mkdirp'), - nopt = require('nopt'), - glob = require('glob'); - -nopt.invalidHandler = function(key, val) { - throw new Error(key + " was invalid with value \"" + val + "\""); -}; - -nopt.typeDefs.brace_style = { - type: "brace_style", - validate: function(data, key, val) { - data[key] = val; - // TODO: expand-strict is obsolete, now identical to expand. Remove in future version - // TODO: collapse-preserve-inline is obselete, now identical to collapse,preserve-inline = true. Remove in future version - var validVals = ["collapse", "collapse-preserve-inline", "expand", "end-expand", "expand-strict", "none", "preserve-inline"]; - var valSplit = val.split(/[^a-zA-Z0-9_\-]+/); //Split will always return at least one parameter - for (var i = 0; i < valSplit.length; i++) { - if (validVals.indexOf(valSplit[i]) === -1) { - return false; - } - } - return true; - } -}; -var path = require('path'), - editorconfig = require('editorconfig'), - knownOpts = { - // Beautifier - "indent_size": Number, - "indent_char": String, - "eol": String, - "indent_level": Number, - "indent_with_tabs": Boolean, - "preserve_newlines": Boolean, - "max_preserve_newlines": Number, - "space_in_paren": Boolean, - "space_in_empty_paren": Boolean, - "jslint_happy": Boolean, - "space_after_anon_function": Boolean, - "space_after_named_function": Boolean, - "brace_style": "brace_style", //See above for validation - "unindent_chained_methods": Boolean, - "break_chained_methods": Boolean, - "keep_array_indentation": Boolean, - "unescape_strings": Boolean, - "wrap_line_length": Number, - "wrap_attributes": ["auto", "force", "force-aligned", "force-expand-multiline", "aligned-multiple", "preserve", "preserve-aligned"], - "wrap_attributes_indent_size": Number, - "e4x": Boolean, - "end_with_newline": Boolean, - "comma_first": Boolean, - "operator_position": ["before-newline", "after-newline", "preserve-newline"], - "indent_empty_lines": Boolean, - "templating": [String, Array], - // CSS-only - "selector_separator_newline": Boolean, - "newline_between_rules": Boolean, - "space_around_combinator": Boolean, - //deprecated - replaced with space_around_combinator, remove in future version - "space_around_selector_separator": Boolean, - // HTML-only - "max_char": Number, // obsolete since 1.3.5 - "inline": [String, Array], - "unformatted": [String, Array], - "content_unformatted": [String, Array], - "indent_inner_html": [Boolean], - "indent_handlebars": [Boolean], - "indent_scripts": ["keep", "separate", "normal"], - "extra_liners": [String, Array], - "unformatted_content_delimiter": String, - // CLI - "version": Boolean, - "help": Boolean, - "files": [path, Array], - "outfile": path, - "replace": Boolean, - "quiet": Boolean, - "type": ["js", "css", "html"], - "config": path, - "editorconfig": Boolean - }, - // dasherizeShorthands provides { "indent-size": ["--indent_size"] } - // translation, allowing more convenient dashes in CLI arguments - shortHands = dasherizeShorthands({ - // Beautifier - "s": ["--indent_size"], - "c": ["--indent_char"], - "e": ["--eol"], - "l": ["--indent_level"], - "t": ["--indent_with_tabs"], - "p": ["--preserve_newlines"], - "m": ["--max_preserve_newlines"], - "P": ["--space_in_paren"], - "Q": ["--space_in_empty_paren"], - "j": ["--jslint_happy"], - "a": ["--space_after_anon_function"], - "b": ["--brace_style"], - "u": ["--unindent_chained_methods"], - "B": ["--break_chained_methods"], - "k": ["--keep_array_indentation"], - "x": ["--unescape_strings"], - "w": ["--wrap_line_length"], - "X": ["--e4x"], - "n": ["--end_with_newline"], - "C": ["--comma_first"], - "O": ["--operator_position"], - // CSS-only - "L": ["--selector_separator_newline"], - "N": ["--newline_between_rules"], - // HTML-only - "A": ["--wrap_attributes"], - "i": ["--wrap_attributes_indent_size"], - "W": ["--max_char"], // obsolete since 1.3.5 - "d": ["--inline"], - "U": ["--unformatted"], - "T": ["--content_unformatted"], - "I": ["--indent_inner_html"], - "H": ["--indent_handlebars"], - "S": ["--indent_scripts"], - "E": ["--extra_liners"], - // non-dasherized hybrid shortcuts - "good-stuff": [ - "--keep_array_indentation", - "--keep_function_indentation", - "--jslint_happy" - ], - "js": ["--type", "js"], - "css": ["--type", "css"], - "html": ["--type", "html"], - // CLI - "v": ["--version"], - "h": ["--help"], - "f": ["--files"], - "file": ["--files"], - "o": ["--outfile"], - "r": ["--replace"], - "q": ["--quiet"] - // no shorthand for "config" - // no shorthand for "editorconfig" - // no shorthand for "indent_empty_lines" - // not shorthad for "templating" - }); - -function verifyExists(fullPath) { - return fs.existsSync(fullPath) ? fullPath : null; -} - -function findRecursive(dir, fileName) { - var fullPath = path.join(dir, fileName); - var nextDir = path.dirname(dir); - var result = verifyExists(fullPath); - - if (!result && (nextDir !== dir)) { - result = findRecursive(nextDir, fileName); - } - - return result; -} - -function getUserHome() { - var user_home = ''; - try { - user_home = process.env.USERPROFILE || process.env.HOME || ''; - } catch (ex) {} - return user_home; -} - -function set_file_editorconfig_opts(file, config) { - try { - var eConfigs = editorconfig.parseSync(file); - - if (eConfigs.indent_style === "tab") { - config.indent_with_tabs = true; - } else if (eConfigs.indent_style === "space") { - config.indent_with_tabs = false; - } - - if (eConfigs.indent_size) { - config.indent_size = eConfigs.indent_size; - } - - if (eConfigs.max_line_length) { - if (eConfigs.max_line_length === "off") { - config.wrap_line_length = 0; - } else { - config.wrap_line_length = parseInt(eConfigs.max_line_length, 10); - } - } - - if (eConfigs.insert_final_newline === true) { - config.end_with_newline = true; - } else if (eConfigs.insert_final_newline === false) { - config.end_with_newline = false; - } - - if (eConfigs.end_of_line) { - if (eConfigs.end_of_line === 'cr') { - config.eol = '\r'; - } else if (eConfigs.end_of_line === 'lf') { - config.eol = '\n'; - } else if (eConfigs.end_of_line === 'crlf') { - config.eol = '\r\n'; - } - } - } catch (e) { - debug(e); - } -} - -// var cli = require('js-beautify/cli'); cli.interpret(); -var interpret = exports.interpret = function(argv, slice) { - var parsed; - try { - parsed = nopt(knownOpts, shortHands, argv, slice); - } catch (ex) { - usage(ex); - // console.error(ex); - // console.error('Run `' + getScriptName() + ' -h` for help.'); - process.exit(1); - } - - - if (parsed.version) { - console.log(require('../../package.json').version); - process.exit(0); - } else if (parsed.help) { - usage(); - process.exit(0); - } - - var cfg; - var configRecursive = findRecursive(process.cwd(), '.jsbeautifyrc'); - var configHome = verifyExists(path.join(getUserHome() || "", ".jsbeautifyrc")); - var configDefault = __dirname + '/../config/defaults.json'; - - try { - cfg = cc( - parsed, - cleanOptions(cc.env('jsbeautify_'), knownOpts), - parsed.config, - configRecursive, - configHome, - configDefault - ).snapshot; - } catch (ex) { - debug(cfg); - // usage(ex); - console.error(ex); - console.error('Error while loading beautifier configuration.'); - console.error('Configuration file chain included:'); - if (parsed.config) { - console.error(parsed.config); - } - if (configRecursive) { - console.error(configRecursive); - } - if (configHome) { - console.error(configHome); - } - console.error(configDefault); - console.error('Run `' + getScriptName() + ' -h` for help.'); - process.exit(1); - } - - try { - // Verify arguments - checkType(cfg); - checkFiles(cfg); - debug(cfg); - - // Process files synchronously to avoid EMFILE error - cfg.files.forEach(processInputSync, { - cfg: cfg - }); - } catch (ex) { - debug(cfg); - // usage(ex); - console.error(ex); - console.error('Run `' + getScriptName() + ' -h` for help.'); - process.exit(1); - } -}; - -// interpret args immediately when called as executable -if (require.main === module) { - interpret(); -} - -function usage(err) { - var scriptName = getScriptName(); - var msg = [ - scriptName + '@' + require('../../package.json').version, - '', - 'CLI Options:', - ' -f, --file Input file(s) (Pass \'-\' for stdin)', - ' -r, --replace Write output in-place, replacing input', - ' -o, --outfile Write output to file (default stdout)', - ' --config Path to config file', - ' --type [js|css|html] ["js"]', - ' -q, --quiet Suppress logging to stdout', - ' -h, --help Show this help', - ' -v, --version Show the version', - '', - 'Beautifier Options:', - ' -s, --indent-size Indentation size [4]', - ' -c, --indent-char Indentation character [" "]', - ' -t, --indent-with-tabs Indent with tabs, overrides -s and -c', - ' -e, --eol Character(s) to use as line terminators.', - ' [first newline in file, otherwise "\\n]', - ' -n, --end-with-newline End output with newline', - ' --indent-empty-lines Keep indentation on empty lines', - ' --templating List of templating languages (auto,none,django,erb,handlebars,php) ["auto"] auto = none in JavaScript, all in html', - ' --editorconfig Use EditorConfig to set up the options' - ]; - - switch (scriptName.split('-').shift()) { - case "js": - msg.push(' -l, --indent-level Initial indentation level [0]'); - msg.push(' -p, --preserve-newlines Preserve line-breaks (--no-preserve-newlines disables)'); - msg.push(' -m, --max-preserve-newlines Number of line-breaks to be preserved in one chunk [10]'); - msg.push(' -P, --space-in-paren Add padding spaces within paren, ie. f( a, b )'); - msg.push(' -E, --space-in-empty-paren Add a single space inside empty paren, ie. f( )'); - msg.push(' -j, --jslint-happy Enable jslint-stricter mode'); - msg.push(' -a, --space-after-anon-function Add a space before an anonymous function\'s parens, ie. function ()'); - msg.push(' --space_after_named_function Add a space before a named function\'s parens, ie. function example ()'); - msg.push(' -b, --brace-style [collapse|expand|end-expand|none][,preserve-inline] [collapse,preserve-inline]'); - msg.push(' -u, --unindent-chained-methods Don\'t indent chained method calls'); - msg.push(' -B, --break-chained-methods Break chained method calls across subsequent lines'); - msg.push(' -k, --keep-array-indentation Preserve array indentation'); - msg.push(' -x, --unescape-strings Decode printable characters encoded in xNN notation'); - msg.push(' -w, --wrap-line-length Wrap lines that exceed N characters [0]'); - msg.push(' -X, --e4x Pass E4X xml literals through untouched'); - msg.push(' --good-stuff Warm the cockles of Crockford\'s heart'); - msg.push(' -C, --comma-first Put commas at the beginning of new line instead of end'); - msg.push(' -O, --operator-position Set operator position (before-newline|after-newline|preserve-newline) [before-newline]'); - break; - case "html": - msg.push(' -b, --brace-style [collapse|expand|end-expand] ["collapse"]'); - msg.push(' -I, --indent-inner-html Indent body and head sections. Default is false.'); - msg.push(' -H, --indent-handlebars Indent handlebars. Default is false.'); - msg.push(' -S, --indent-scripts [keep|separate|normal] ["normal"]'); - msg.push(' -w, --wrap-line-length Wrap lines that exceed N characters [0]'); - msg.push(' -A, --wrap-attributes Wrap html tag attributes to new lines [auto|force|force-aligned|force-expand-multiline|aligned-multiple|preserve|preserve-aligned] ["auto"]'); - msg.push(' -i, --wrap-attributes-indent-size Indent wrapped tags to after N characters [indent-level]'); - msg.push(' -p, --preserve-newlines Preserve line-breaks (--no-preserve-newlines disables)'); - msg.push(' -m, --max-preserve-newlines Number of line-breaks to be preserved in one chunk [10]'); - msg.push(' -U, --unformatted List of tags (defaults to inline) that should not be reformatted'); - msg.push(' -T, --content_unformatted List of tags (defaults to pre) whose content should not be reformatted'); - msg.push(' -E, --extra_liners List of tags (defaults to [head,body,/html] that should have an extra newline'); - msg.push(' --unformatted_content_delimiter Keep text content together between this string [""]'); - break; - case "css": - msg.push(' -L, --selector-separator-newline Add a newline between multiple selectors.'); - msg.push(' -N, --newline-between-rules Add a newline between CSS rules.'); - } - - if (err) { - msg.push(err); - msg.push(''); - console.error(msg.join('\n')); - } else { - console.log(msg.join('\n')); - } -} - -// main iterator, {cfg} passed as thisArg of forEach call - -function processInputSync(filepath) { - var data = null, - config = this.cfg, - outfile = config.outfile, - input; - - // -o passed with no value overwrites - if (outfile === true || config.replace) { - outfile = filepath; - } - - var fileType = getOutputType(outfile, filepath, config.type); - - if (config.editorconfig) { - var editorconfig_filepath = filepath; - - if (editorconfig_filepath === '-') { - if (outfile) { - editorconfig_filepath = outfile; - } else { - editorconfig_filepath = 'stdin.' + fileType; - } - } - - debug("EditorConfig is enabled for ", editorconfig_filepath); - config = cc(config).snapshot; - set_file_editorconfig_opts(editorconfig_filepath, config); - debug(config); - } - - if (filepath === '-') { - input = process.stdin; - - input.setEncoding('utf8'); - - input.on('error', function() { - throw 'Must pipe input or define at least one file.'; - }); - - input.on('data', function(chunk) { - data = data || ''; - data += chunk; - }); - - input.on('end', function() { - if (data === null) { - throw 'Must pipe input or define at least one file.'; - } - makePretty(fileType, data, config, outfile, writePretty); // Where things get beautified - }); - - input.resume(); - - } else { - data = fs.readFileSync(filepath, 'utf8'); - makePretty(fileType, data, config, outfile, writePretty); - } -} - -function makePretty(fileType, code, config, outfile, callback) { - try { - var pretty = beautify[fileType](code, config); - - callback(null, pretty, outfile, config); - } catch (ex) { - callback(ex); - } -} - -function writePretty(err, pretty, outfile, config) { - debug('writing ' + outfile); - if (err) { - console.error(err); - process.exit(1); - } - - if (outfile) { - mkdirp.sync(path.dirname(outfile)); - - if (isFileDifferent(outfile, pretty)) { - try { - fs.writeFileSync(outfile, pretty, 'utf8'); - logToStdout('beautified ' + path.relative(process.cwd(), outfile), config); - } catch (ex) { - onOutputError(ex); - } - } else { - logToStdout('beautified ' + path.relative(process.cwd(), outfile) + ' - unchanged', config); - } - } else { - process.stdout.write(pretty); - } -} - -function isFileDifferent(filePath, expected) { - try { - return fs.readFileSync(filePath, 'utf8') !== expected; - } catch (ex) { - // failing to read is the same as different - return true; - } -} - -// workaround the fact that nopt.clean doesn't return the object passed in :P - -function cleanOptions(data, types) { - nopt.clean(data, types); - return data; -} - -// error handler for output stream that swallows errors silently, -// allowing the loop to continue over unwritable files. - -function onOutputError(err) { - if (err.code === 'EACCES') { - console.error(err.path + " is not writable. Skipping!"); - } else { - console.error(err); - process.exit(0); - } -} - -// turn "--foo_bar" into "foo-bar" - -function dasherizeFlag(str) { - return str.replace(/^\-+/, '').replace(/_/g, '-'); -} - -// translate weird python underscored keys into dashed argv, -// avoiding single character aliases. - -function dasherizeShorthands(hash) { - // operate in-place - Object.keys(hash).forEach(function(key) { - // each key value is an array - var val = hash[key][0]; - // only dasherize one-character shorthands - if (key.length === 1 && val.indexOf('_') > -1) { - hash[dasherizeFlag(val)] = val; - } - }); - - return hash; -} - -function getOutputType(outfile, filepath, configType) { - if (outfile && /\.(js|css|html)$/.test(outfile)) { - return outfile.split('.').pop(); - } else if (filepath !== '-' && /\.(js|css|html)$/.test(filepath)) { - return filepath.split('.').pop(); - } else if (configType) { - return configType; - } else { - throw 'Could not determine appropriate beautifier from file paths: ' + filepath; - } -} - -function getScriptName() { - return path.basename(process.argv[1]); -} - -function checkType(parsed) { - var scriptType = getScriptName().split('-').shift(); - if (!/^(js|css|html)$/.test(scriptType)) { - scriptType = null; - } - - debug("executable type:", scriptType); - - var parsedType = parsed.type; - debug("parsed type:", parsedType); - - if (!parsedType) { - debug("type defaulted:", scriptType); - parsed.type = scriptType; - } -} - -function checkFiles(parsed) { - var argv = parsed.argv; - var isTTY = true; - var file_params = parsed.files || []; - var hadGlob = false; - - try { - isTTY = process.stdin.isTTY; - } catch (ex) { - debug("error querying for isTTY:", ex); - } - - debug('isTTY: ' + isTTY); - - // assume any remaining args are files - file_params = file_params.concat(argv.remain); - - parsed.files = []; - // assume any remaining args are files - file_params.forEach(function(f) { - // strip stdin path eagerly added by nopt in '-f -' case - if (f === '-') { - return; - } - - var foundFiles = []; - var isGlob = glob.hasMagic(f); - - // Input was a glob - if (isGlob) { - hadGlob = true; - foundFiles = glob(f, { - sync: true, - absolute: true, - ignore: ['**/node_modules/**', '**/.git/**'] - }); - } else { - // Input was not a glob, add it to an array so we are able to handle it in the same loop below - try { - testFilePath(f); - } catch (err) { - // if file is not found, and the resolved path indicates stdin marker - if (path.parse(f).base === '-') { - f = '-'; - } else { - throw err; - } - } - foundFiles = [f]; - } - - if (foundFiles && foundFiles.length) { - // Add files to the parsed.files if it didn't exist in the array yet - foundFiles.forEach(function(file) { - var filePath = path.resolve(file); - if (file === '-') { // case of stdin - parsed.files.push(file); - } else if (parsed.files.indexOf(filePath) === -1) { - parsed.files.push(filePath); - } - }); - } - }); - - if ('string' === typeof parsed.outfile && isTTY && !parsed.files.length) { - testFilePath(parsed.outfile); - // use outfile as input when no other files passed in args - parsed.files.push(parsed.outfile); - // operation is now an implicit overwrite - parsed.replace = true; - } - - if (hadGlob || parsed.files.length > 1) { - parsed.replace = true; - } - - if (!parsed.files.length && !hadGlob) { - // read stdin by default - parsed.files.push('-'); - } - - debug('files.length ' + parsed.files.length); - - if (parsed.files.indexOf('-') > -1 && isTTY && !hadGlob) { - throw 'Must pipe input or define at least one file.'; - } - - return parsed; -} - -function testFilePath(filepath) { - try { - if (filepath !== "-") { - fs.statSync(filepath); - } - } catch (err) { - throw 'Unable to open path "' + filepath + '"'; - } -} - -function logToStdout(str, config) { - if (typeof config.quiet === "undefined" || !config.quiet) { - console.log(str); - } -} \ No newline at end of file diff --git a/node_modules/js-beautify/js/src/core/directives.js b/node_modules/js-beautify/js/src/core/directives.js deleted file mode 100644 index 48b161ee..00000000 --- a/node_modules/js-beautify/js/src/core/directives.js +++ /dev/null @@ -1,62 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -function Directives(start_block_pattern, end_block_pattern) { - start_block_pattern = typeof start_block_pattern === 'string' ? start_block_pattern : start_block_pattern.source; - end_block_pattern = typeof end_block_pattern === 'string' ? end_block_pattern : end_block_pattern.source; - this.__directives_block_pattern = new RegExp(start_block_pattern + / beautify( \w+[:]\w+)+ /.source + end_block_pattern, 'g'); - this.__directive_pattern = / (\w+)[:](\w+)/g; - - this.__directives_end_ignore_pattern = new RegExp(start_block_pattern + /\sbeautify\signore:end\s/.source + end_block_pattern, 'g'); -} - -Directives.prototype.get_directives = function(text) { - if (!text.match(this.__directives_block_pattern)) { - return null; - } - - var directives = {}; - this.__directive_pattern.lastIndex = 0; - var directive_match = this.__directive_pattern.exec(text); - - while (directive_match) { - directives[directive_match[1]] = directive_match[2]; - directive_match = this.__directive_pattern.exec(text); - } - - return directives; -}; - -Directives.prototype.readIgnored = function(input) { - return input.readUntilAfter(this.__directives_end_ignore_pattern); -}; - - -module.exports.Directives = Directives; diff --git a/node_modules/js-beautify/js/src/core/inputscanner.js b/node_modules/js-beautify/js/src/core/inputscanner.js deleted file mode 100644 index f99bf59d..00000000 --- a/node_modules/js-beautify/js/src/core/inputscanner.js +++ /dev/null @@ -1,192 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var regexp_has_sticky = RegExp.prototype.hasOwnProperty('sticky'); - -function InputScanner(input_string) { - this.__input = input_string || ''; - this.__input_length = this.__input.length; - this.__position = 0; -} - -InputScanner.prototype.restart = function() { - this.__position = 0; -}; - -InputScanner.prototype.back = function() { - if (this.__position > 0) { - this.__position -= 1; - } -}; - -InputScanner.prototype.hasNext = function() { - return this.__position < this.__input_length; -}; - -InputScanner.prototype.next = function() { - var val = null; - if (this.hasNext()) { - val = this.__input.charAt(this.__position); - this.__position += 1; - } - return val; -}; - -InputScanner.prototype.peek = function(index) { - var val = null; - index = index || 0; - index += this.__position; - if (index >= 0 && index < this.__input_length) { - val = this.__input.charAt(index); - } - return val; -}; - -// This is a JavaScript only helper function (not in python) -// Javascript doesn't have a match method -// and not all implementation support "sticky" flag. -// If they do not support sticky then both this.match() and this.test() method -// must get the match and check the index of the match. -// If sticky is supported and set, this method will use it. -// Otherwise it will check that global is set, and fall back to the slower method. -InputScanner.prototype.__match = function(pattern, index) { - pattern.lastIndex = index; - var pattern_match = pattern.exec(this.__input); - - if (pattern_match && !(regexp_has_sticky && pattern.sticky)) { - if (pattern_match.index !== index) { - pattern_match = null; - } - } - - return pattern_match; -}; - -InputScanner.prototype.test = function(pattern, index) { - index = index || 0; - index += this.__position; - - if (index >= 0 && index < this.__input_length) { - return !!this.__match(pattern, index); - } else { - return false; - } -}; - -InputScanner.prototype.testChar = function(pattern, index) { - // test one character regex match - var val = this.peek(index); - pattern.lastIndex = 0; - return val !== null && pattern.test(val); -}; - -InputScanner.prototype.match = function(pattern) { - var pattern_match = this.__match(pattern, this.__position); - if (pattern_match) { - this.__position += pattern_match[0].length; - } else { - pattern_match = null; - } - return pattern_match; -}; - -InputScanner.prototype.read = function(starting_pattern, until_pattern, until_after) { - var val = ''; - var match; - if (starting_pattern) { - match = this.match(starting_pattern); - if (match) { - val += match[0]; - } - } - if (until_pattern && (match || !starting_pattern)) { - val += this.readUntil(until_pattern, until_after); - } - return val; -}; - -InputScanner.prototype.readUntil = function(pattern, until_after) { - var val = ''; - var match_index = this.__position; - pattern.lastIndex = this.__position; - var pattern_match = pattern.exec(this.__input); - if (pattern_match) { - match_index = pattern_match.index; - if (until_after) { - match_index += pattern_match[0].length; - } - } else { - match_index = this.__input_length; - } - - val = this.__input.substring(this.__position, match_index); - this.__position = match_index; - return val; -}; - -InputScanner.prototype.readUntilAfter = function(pattern) { - return this.readUntil(pattern, true); -}; - -InputScanner.prototype.get_regexp = function(pattern, match_from) { - var result = null; - var flags = 'g'; - if (match_from && regexp_has_sticky) { - flags = 'y'; - } - // strings are converted to regexp - if (typeof pattern === "string" && pattern !== '') { - // result = new RegExp(pattern.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), flags); - result = new RegExp(pattern, flags); - } else if (pattern) { - result = new RegExp(pattern.source, flags); - } - return result; -}; - -InputScanner.prototype.get_literal_regexp = function(literal_string) { - return RegExp(literal_string.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); -}; - -/* css beautifier legacy helpers */ -InputScanner.prototype.peekUntilAfter = function(pattern) { - var start = this.__position; - var val = this.readUntilAfter(pattern); - this.__position = start; - return val; -}; - -InputScanner.prototype.lookBack = function(testVal) { - var start = this.__position - 1; - return start >= testVal.length && this.__input.substring(start - testVal.length, start) - .toLowerCase() === testVal; -}; - -module.exports.InputScanner = InputScanner; diff --git a/node_modules/js-beautify/js/src/core/options.js b/node_modules/js-beautify/js/src/core/options.js deleted file mode 100644 index 4db19d7e..00000000 --- a/node_modules/js-beautify/js/src/core/options.js +++ /dev/null @@ -1,193 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -function Options(options, merge_child_field) { - this.raw_options = _mergeOpts(options, merge_child_field); - - // Support passing the source text back with no change - this.disabled = this._get_boolean('disabled'); - - this.eol = this._get_characters('eol', 'auto'); - this.end_with_newline = this._get_boolean('end_with_newline'); - this.indent_size = this._get_number('indent_size', 4); - this.indent_char = this._get_characters('indent_char', ' '); - this.indent_level = this._get_number('indent_level'); - - this.preserve_newlines = this._get_boolean('preserve_newlines', true); - this.max_preserve_newlines = this._get_number('max_preserve_newlines', 32786); - if (!this.preserve_newlines) { - this.max_preserve_newlines = 0; - } - - this.indent_with_tabs = this._get_boolean('indent_with_tabs', this.indent_char === '\t'); - if (this.indent_with_tabs) { - this.indent_char = '\t'; - - // indent_size behavior changed after 1.8.6 - // It used to be that indent_size would be - // set to 1 for indent_with_tabs. That is no longer needed and - // actually doesn't make sense - why not use spaces? Further, - // that might produce unexpected behavior - tabs being used - // for single-column alignment. So, when indent_with_tabs is true - // and indent_size is 1, reset indent_size to 4. - if (this.indent_size === 1) { - this.indent_size = 4; - } - } - - // Backwards compat with 1.3.x - this.wrap_line_length = this._get_number('wrap_line_length', this._get_number('max_char')); - - this.indent_empty_lines = this._get_boolean('indent_empty_lines'); - - // valid templating languages ['django', 'erb', 'handlebars', 'php'] - // For now, 'auto' = all off for javascript, all on for html (and inline javascript). - // other values ignored - this.templating = this._get_selection_list('templating', ['auto', 'none', 'django', 'erb', 'handlebars', 'php'], ['auto']); -} - -Options.prototype._get_array = function(name, default_value) { - var option_value = this.raw_options[name]; - var result = default_value || []; - if (typeof option_value === 'object') { - if (option_value !== null && typeof option_value.concat === 'function') { - result = option_value.concat(); - } - } else if (typeof option_value === 'string') { - result = option_value.split(/[^a-zA-Z0-9_\/\-]+/); - } - return result; -}; - -Options.prototype._get_boolean = function(name, default_value) { - var option_value = this.raw_options[name]; - var result = option_value === undefined ? !!default_value : !!option_value; - return result; -}; - -Options.prototype._get_characters = function(name, default_value) { - var option_value = this.raw_options[name]; - var result = default_value || ''; - if (typeof option_value === 'string') { - result = option_value.replace(/\\r/, '\r').replace(/\\n/, '\n').replace(/\\t/, '\t'); - } - return result; -}; - -Options.prototype._get_number = function(name, default_value) { - var option_value = this.raw_options[name]; - default_value = parseInt(default_value, 10); - if (isNaN(default_value)) { - default_value = 0; - } - var result = parseInt(option_value, 10); - if (isNaN(result)) { - result = default_value; - } - return result; -}; - -Options.prototype._get_selection = function(name, selection_list, default_value) { - var result = this._get_selection_list(name, selection_list, default_value); - if (result.length !== 1) { - throw new Error( - "Invalid Option Value: The option '" + name + "' can only be one of the following values:\n" + - selection_list + "\nYou passed in: '" + this.raw_options[name] + "'"); - } - - return result[0]; -}; - - -Options.prototype._get_selection_list = function(name, selection_list, default_value) { - if (!selection_list || selection_list.length === 0) { - throw new Error("Selection list cannot be empty."); - } - - default_value = default_value || [selection_list[0]]; - if (!this._is_valid_selection(default_value, selection_list)) { - throw new Error("Invalid Default Value!"); - } - - var result = this._get_array(name, default_value); - if (!this._is_valid_selection(result, selection_list)) { - throw new Error( - "Invalid Option Value: The option '" + name + "' can contain only the following values:\n" + - selection_list + "\nYou passed in: '" + this.raw_options[name] + "'"); - } - - return result; -}; - -Options.prototype._is_valid_selection = function(result, selection_list) { - return result.length && selection_list.length && - !result.some(function(item) { return selection_list.indexOf(item) === -1; }); -}; - - -// merges child options up with the parent options object -// Example: obj = {a: 1, b: {a: 2}} -// mergeOpts(obj, 'b') -// -// Returns: {a: 2} -function _mergeOpts(allOptions, childFieldName) { - var finalOpts = {}; - allOptions = _normalizeOpts(allOptions); - var name; - - for (name in allOptions) { - if (name !== childFieldName) { - finalOpts[name] = allOptions[name]; - } - } - - //merge in the per type settings for the childFieldName - if (childFieldName && allOptions[childFieldName]) { - for (name in allOptions[childFieldName]) { - finalOpts[name] = allOptions[childFieldName][name]; - } - } - return finalOpts; -} - -function _normalizeOpts(options) { - var convertedOpts = {}; - var key; - - for (key in options) { - var newKey = key.replace(/-/g, "_"); - convertedOpts[newKey] = options[key]; - } - return convertedOpts; -} - -module.exports.Options = Options; -module.exports.normalizeOpts = _normalizeOpts; -module.exports.mergeOpts = _mergeOpts; diff --git a/node_modules/js-beautify/js/src/core/output.js b/node_modules/js-beautify/js/src/core/output.js deleted file mode 100644 index 99b4e0e8..00000000 --- a/node_modules/js-beautify/js/src/core/output.js +++ /dev/null @@ -1,419 +0,0 @@ -/*jshint node:true */ -/* - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -function OutputLine(parent) { - this.__parent = parent; - this.__character_count = 0; - // use indent_count as a marker for this.__lines that have preserved indentation - this.__indent_count = -1; - this.__alignment_count = 0; - this.__wrap_point_index = 0; - this.__wrap_point_character_count = 0; - this.__wrap_point_indent_count = -1; - this.__wrap_point_alignment_count = 0; - - this.__items = []; -} - -OutputLine.prototype.clone_empty = function() { - var line = new OutputLine(this.__parent); - line.set_indent(this.__indent_count, this.__alignment_count); - return line; -}; - -OutputLine.prototype.item = function(index) { - if (index < 0) { - return this.__items[this.__items.length + index]; - } else { - return this.__items[index]; - } -}; - -OutputLine.prototype.has_match = function(pattern) { - for (var lastCheckedOutput = this.__items.length - 1; lastCheckedOutput >= 0; lastCheckedOutput--) { - if (this.__items[lastCheckedOutput].match(pattern)) { - return true; - } - } - return false; -}; - -OutputLine.prototype.set_indent = function(indent, alignment) { - if (this.is_empty()) { - this.__indent_count = indent || 0; - this.__alignment_count = alignment || 0; - this.__character_count = this.__parent.get_indent_size(this.__indent_count, this.__alignment_count); - } -}; - -OutputLine.prototype._set_wrap_point = function() { - if (this.__parent.wrap_line_length) { - this.__wrap_point_index = this.__items.length; - this.__wrap_point_character_count = this.__character_count; - this.__wrap_point_indent_count = this.__parent.next_line.__indent_count; - this.__wrap_point_alignment_count = this.__parent.next_line.__alignment_count; - } -}; - -OutputLine.prototype._should_wrap = function() { - return this.__wrap_point_index && - this.__character_count > this.__parent.wrap_line_length && - this.__wrap_point_character_count > this.__parent.next_line.__character_count; -}; - -OutputLine.prototype._allow_wrap = function() { - if (this._should_wrap()) { - this.__parent.add_new_line(); - var next = this.__parent.current_line; - next.set_indent(this.__wrap_point_indent_count, this.__wrap_point_alignment_count); - next.__items = this.__items.slice(this.__wrap_point_index); - this.__items = this.__items.slice(0, this.__wrap_point_index); - - next.__character_count += this.__character_count - this.__wrap_point_character_count; - this.__character_count = this.__wrap_point_character_count; - - if (next.__items[0] === " ") { - next.__items.splice(0, 1); - next.__character_count -= 1; - } - return true; - } - return false; -}; - -OutputLine.prototype.is_empty = function() { - return this.__items.length === 0; -}; - -OutputLine.prototype.last = function() { - if (!this.is_empty()) { - return this.__items[this.__items.length - 1]; - } else { - return null; - } -}; - -OutputLine.prototype.push = function(item) { - this.__items.push(item); - var last_newline_index = item.lastIndexOf('\n'); - if (last_newline_index !== -1) { - this.__character_count = item.length - last_newline_index; - } else { - this.__character_count += item.length; - } -}; - -OutputLine.prototype.pop = function() { - var item = null; - if (!this.is_empty()) { - item = this.__items.pop(); - this.__character_count -= item.length; - } - return item; -}; - - -OutputLine.prototype._remove_indent = function() { - if (this.__indent_count > 0) { - this.__indent_count -= 1; - this.__character_count -= this.__parent.indent_size; - } -}; - -OutputLine.prototype._remove_wrap_indent = function() { - if (this.__wrap_point_indent_count > 0) { - this.__wrap_point_indent_count -= 1; - } -}; -OutputLine.prototype.trim = function() { - while (this.last() === ' ') { - this.__items.pop(); - this.__character_count -= 1; - } -}; - -OutputLine.prototype.toString = function() { - var result = ''; - if (this.is_empty()) { - if (this.__parent.indent_empty_lines) { - result = this.__parent.get_indent_string(this.__indent_count); - } - } else { - result = this.__parent.get_indent_string(this.__indent_count, this.__alignment_count); - result += this.__items.join(''); - } - return result; -}; - -function IndentStringCache(options, baseIndentString) { - this.__cache = ['']; - this.__indent_size = options.indent_size; - this.__indent_string = options.indent_char; - if (!options.indent_with_tabs) { - this.__indent_string = new Array(options.indent_size + 1).join(options.indent_char); - } - - // Set to null to continue support for auto detection of base indent - baseIndentString = baseIndentString || ''; - if (options.indent_level > 0) { - baseIndentString = new Array(options.indent_level + 1).join(this.__indent_string); - } - - this.__base_string = baseIndentString; - this.__base_string_length = baseIndentString.length; -} - -IndentStringCache.prototype.get_indent_size = function(indent, column) { - var result = this.__base_string_length; - column = column || 0; - if (indent < 0) { - result = 0; - } - result += indent * this.__indent_size; - result += column; - return result; -}; - -IndentStringCache.prototype.get_indent_string = function(indent_level, column) { - var result = this.__base_string; - column = column || 0; - if (indent_level < 0) { - indent_level = 0; - result = ''; - } - column += indent_level * this.__indent_size; - this.__ensure_cache(column); - result += this.__cache[column]; - return result; -}; - -IndentStringCache.prototype.__ensure_cache = function(column) { - while (column >= this.__cache.length) { - this.__add_column(); - } -}; - -IndentStringCache.prototype.__add_column = function() { - var column = this.__cache.length; - var indent = 0; - var result = ''; - if (this.__indent_size && column >= this.__indent_size) { - indent = Math.floor(column / this.__indent_size); - column -= indent * this.__indent_size; - result = new Array(indent + 1).join(this.__indent_string); - } - if (column) { - result += new Array(column + 1).join(' '); - } - - this.__cache.push(result); -}; - -function Output(options, baseIndentString) { - this.__indent_cache = new IndentStringCache(options, baseIndentString); - this.raw = false; - this._end_with_newline = options.end_with_newline; - this.indent_size = options.indent_size; - this.wrap_line_length = options.wrap_line_length; - this.indent_empty_lines = options.indent_empty_lines; - this.__lines = []; - this.previous_line = null; - this.current_line = null; - this.next_line = new OutputLine(this); - this.space_before_token = false; - this.non_breaking_space = false; - this.previous_token_wrapped = false; - // initialize - this.__add_outputline(); -} - -Output.prototype.__add_outputline = function() { - this.previous_line = this.current_line; - this.current_line = this.next_line.clone_empty(); - this.__lines.push(this.current_line); -}; - -Output.prototype.get_line_number = function() { - return this.__lines.length; -}; - -Output.prototype.get_indent_string = function(indent, column) { - return this.__indent_cache.get_indent_string(indent, column); -}; - -Output.prototype.get_indent_size = function(indent, column) { - return this.__indent_cache.get_indent_size(indent, column); -}; - -Output.prototype.is_empty = function() { - return !this.previous_line && this.current_line.is_empty(); -}; - -Output.prototype.add_new_line = function(force_newline) { - // never newline at the start of file - // otherwise, newline only if we didn't just add one or we're forced - if (this.is_empty() || - (!force_newline && this.just_added_newline())) { - return false; - } - - // if raw output is enabled, don't print additional newlines, - // but still return True as though you had - if (!this.raw) { - this.__add_outputline(); - } - return true; -}; - -Output.prototype.get_code = function(eol) { - this.trim(true); - - // handle some edge cases where the last tokens - // has text that ends with newline(s) - var last_item = this.current_line.pop(); - if (last_item) { - if (last_item[last_item.length - 1] === '\n') { - last_item = last_item.replace(/\n+$/g, ''); - } - this.current_line.push(last_item); - } - - if (this._end_with_newline) { - this.__add_outputline(); - } - - var sweet_code = this.__lines.join('\n'); - - if (eol !== '\n') { - sweet_code = sweet_code.replace(/[\n]/g, eol); - } - return sweet_code; -}; - -Output.prototype.set_wrap_point = function() { - this.current_line._set_wrap_point(); -}; - -Output.prototype.set_indent = function(indent, alignment) { - indent = indent || 0; - alignment = alignment || 0; - - // Next line stores alignment values - this.next_line.set_indent(indent, alignment); - - // Never indent your first output indent at the start of the file - if (this.__lines.length > 1) { - this.current_line.set_indent(indent, alignment); - return true; - } - - this.current_line.set_indent(); - return false; -}; - -Output.prototype.add_raw_token = function(token) { - for (var x = 0; x < token.newlines; x++) { - this.__add_outputline(); - } - this.current_line.set_indent(-1); - this.current_line.push(token.whitespace_before); - this.current_line.push(token.text); - this.space_before_token = false; - this.non_breaking_space = false; - this.previous_token_wrapped = false; -}; - -Output.prototype.add_token = function(printable_token) { - this.__add_space_before_token(); - this.current_line.push(printable_token); - this.space_before_token = false; - this.non_breaking_space = false; - this.previous_token_wrapped = this.current_line._allow_wrap(); -}; - -Output.prototype.__add_space_before_token = function() { - if (this.space_before_token && !this.just_added_newline()) { - if (!this.non_breaking_space) { - this.set_wrap_point(); - } - this.current_line.push(' '); - } -}; - -Output.prototype.remove_indent = function(index) { - var output_length = this.__lines.length; - while (index < output_length) { - this.__lines[index]._remove_indent(); - index++; - } - this.current_line._remove_wrap_indent(); -}; - -Output.prototype.trim = function(eat_newlines) { - eat_newlines = (eat_newlines === undefined) ? false : eat_newlines; - - this.current_line.trim(); - - while (eat_newlines && this.__lines.length > 1 && - this.current_line.is_empty()) { - this.__lines.pop(); - this.current_line = this.__lines[this.__lines.length - 1]; - this.current_line.trim(); - } - - this.previous_line = this.__lines.length > 1 ? - this.__lines[this.__lines.length - 2] : null; -}; - -Output.prototype.just_added_newline = function() { - return this.current_line.is_empty(); -}; - -Output.prototype.just_added_blankline = function() { - return this.is_empty() || - (this.current_line.is_empty() && this.previous_line.is_empty()); -}; - -Output.prototype.ensure_empty_line_above = function(starts_with, ends_with) { - var index = this.__lines.length - 2; - while (index >= 0) { - var potentialEmptyLine = this.__lines[index]; - if (potentialEmptyLine.is_empty()) { - break; - } else if (potentialEmptyLine.item(0).indexOf(starts_with) !== 0 && - potentialEmptyLine.item(-1) !== ends_with) { - this.__lines.splice(index + 1, 0, new OutputLine(this)); - this.previous_line = this.__lines[this.__lines.length - 2]; - break; - } - index--; - } -}; - -module.exports.Output = Output; diff --git a/node_modules/js-beautify/js/src/core/pattern.js b/node_modules/js-beautify/js/src/core/pattern.js deleted file mode 100644 index efcdd341..00000000 --- a/node_modules/js-beautify/js/src/core/pattern.js +++ /dev/null @@ -1,94 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -function Pattern(input_scanner, parent) { - this._input = input_scanner; - this._starting_pattern = null; - this._match_pattern = null; - this._until_pattern = null; - this._until_after = false; - - if (parent) { - this._starting_pattern = this._input.get_regexp(parent._starting_pattern, true); - this._match_pattern = this._input.get_regexp(parent._match_pattern, true); - this._until_pattern = this._input.get_regexp(parent._until_pattern); - this._until_after = parent._until_after; - } -} - -Pattern.prototype.read = function() { - var result = this._input.read(this._starting_pattern); - if (!this._starting_pattern || result) { - result += this._input.read(this._match_pattern, this._until_pattern, this._until_after); - } - return result; -}; - -Pattern.prototype.read_match = function() { - return this._input.match(this._match_pattern); -}; - -Pattern.prototype.until_after = function(pattern) { - var result = this._create(); - result._until_after = true; - result._until_pattern = this._input.get_regexp(pattern); - result._update(); - return result; -}; - -Pattern.prototype.until = function(pattern) { - var result = this._create(); - result._until_after = false; - result._until_pattern = this._input.get_regexp(pattern); - result._update(); - return result; -}; - -Pattern.prototype.starting_with = function(pattern) { - var result = this._create(); - result._starting_pattern = this._input.get_regexp(pattern, true); - result._update(); - return result; -}; - -Pattern.prototype.matching = function(pattern) { - var result = this._create(); - result._match_pattern = this._input.get_regexp(pattern, true); - result._update(); - return result; -}; - -Pattern.prototype._create = function() { - return new Pattern(this._input, this); -}; - -Pattern.prototype._update = function() {}; - -module.exports.Pattern = Pattern; diff --git a/node_modules/js-beautify/js/src/core/templatablepattern.js b/node_modules/js-beautify/js/src/core/templatablepattern.js deleted file mode 100644 index e8a9d230..00000000 --- a/node_modules/js-beautify/js/src/core/templatablepattern.js +++ /dev/null @@ -1,191 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Pattern = require('./pattern').Pattern; - - -var template_names = { - django: false, - erb: false, - handlebars: false, - php: false -}; - -// This lets templates appear anywhere we would do a readUntil -// The cost is higher but it is pay to play. -function TemplatablePattern(input_scanner, parent) { - Pattern.call(this, input_scanner, parent); - this.__template_pattern = null; - this._disabled = Object.assign({}, template_names); - this._excluded = Object.assign({}, template_names); - - if (parent) { - this.__template_pattern = this._input.get_regexp(parent.__template_pattern); - this._excluded = Object.assign(this._excluded, parent._excluded); - this._disabled = Object.assign(this._disabled, parent._disabled); - } - var pattern = new Pattern(input_scanner); - this.__patterns = { - handlebars_comment: pattern.starting_with(/{{!--/).until_after(/--}}/), - handlebars_unescaped: pattern.starting_with(/{{{/).until_after(/}}}/), - handlebars: pattern.starting_with(/{{/).until_after(/}}/), - php: pattern.starting_with(/<\?(?:[=]|php)/).until_after(/\?>/), - erb: pattern.starting_with(/<%[^%]/).until_after(/[^%]%>/), - // django coflicts with handlebars a bit. - django: pattern.starting_with(/{%/).until_after(/%}/), - django_value: pattern.starting_with(/{{/).until_after(/}}/), - django_comment: pattern.starting_with(/{#/).until_after(/#}/) - }; -} -TemplatablePattern.prototype = new Pattern(); - -TemplatablePattern.prototype._create = function() { - return new TemplatablePattern(this._input, this); -}; - -TemplatablePattern.prototype._update = function() { - this.__set_templated_pattern(); -}; - -TemplatablePattern.prototype.disable = function(language) { - var result = this._create(); - result._disabled[language] = true; - result._update(); - return result; -}; - -TemplatablePattern.prototype.read_options = function(options) { - var result = this._create(); - for (var language in template_names) { - result._disabled[language] = options.templating.indexOf(language) === -1; - } - result._update(); - return result; -}; - -TemplatablePattern.prototype.exclude = function(language) { - var result = this._create(); - result._excluded[language] = true; - result._update(); - return result; -}; - -TemplatablePattern.prototype.read = function() { - var result = ''; - if (this._match_pattern) { - result = this._input.read(this._starting_pattern); - } else { - result = this._input.read(this._starting_pattern, this.__template_pattern); - } - var next = this._read_template(); - while (next) { - if (this._match_pattern) { - next += this._input.read(this._match_pattern); - } else { - next += this._input.readUntil(this.__template_pattern); - } - result += next; - next = this._read_template(); - } - - if (this._until_after) { - result += this._input.readUntilAfter(this._until_pattern); - } - return result; -}; - -TemplatablePattern.prototype.__set_templated_pattern = function() { - var items = []; - - if (!this._disabled.php) { - items.push(this.__patterns.php._starting_pattern.source); - } - if (!this._disabled.handlebars) { - items.push(this.__patterns.handlebars._starting_pattern.source); - } - if (!this._disabled.erb) { - items.push(this.__patterns.erb._starting_pattern.source); - } - if (!this._disabled.django) { - items.push(this.__patterns.django._starting_pattern.source); - items.push(this.__patterns.django_value._starting_pattern.source); - items.push(this.__patterns.django_comment._starting_pattern.source); - } - - if (this._until_pattern) { - items.push(this._until_pattern.source); - } - this.__template_pattern = this._input.get_regexp('(?:' + items.join('|') + ')'); -}; - -TemplatablePattern.prototype._read_template = function() { - var resulting_string = ''; - var c = this._input.peek(); - if (c === '<') { - var peek1 = this._input.peek(1); - //if we're in a comment, do something special - // We treat all comments as literals, even more than preformatted tags - // we just look for the appropriate close tag - if (!this._disabled.php && !this._excluded.php && peek1 === '?') { - resulting_string = resulting_string || - this.__patterns.php.read(); - } - if (!this._disabled.erb && !this._excluded.erb && peek1 === '%') { - resulting_string = resulting_string || - this.__patterns.erb.read(); - } - } else if (c === '{') { - if (!this._disabled.handlebars && !this._excluded.handlebars) { - resulting_string = resulting_string || - this.__patterns.handlebars_comment.read(); - resulting_string = resulting_string || - this.__patterns.handlebars_unescaped.read(); - resulting_string = resulting_string || - this.__patterns.handlebars.read(); - } - if (!this._disabled.django) { - // django coflicts with handlebars a bit. - if (!this._excluded.django && !this._excluded.handlebars) { - resulting_string = resulting_string || - this.__patterns.django_value.read(); - } - if (!this._excluded.django) { - resulting_string = resulting_string || - this.__patterns.django_comment.read(); - resulting_string = resulting_string || - this.__patterns.django.read(); - } - } - } - return resulting_string; -}; - - -module.exports.TemplatablePattern = TemplatablePattern; diff --git a/node_modules/js-beautify/js/src/core/token.js b/node_modules/js-beautify/js/src/core/token.js deleted file mode 100644 index 13f6e901..00000000 --- a/node_modules/js-beautify/js/src/core/token.js +++ /dev/null @@ -1,54 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -function Token(type, text, newlines, whitespace_before) { - this.type = type; - this.text = text; - - // comments_before are - // comments that have a new line before them - // and may or may not have a newline after - // this is a set of comments before - this.comments_before = null; /* inline comment*/ - - - // this.comments_after = new TokenStream(); // no new line before and newline after - this.newlines = newlines || 0; - this.whitespace_before = whitespace_before || ''; - this.parent = null; - this.next = null; - this.previous = null; - this.opened = null; - this.closed = null; - this.directives = null; -} - - -module.exports.Token = Token; diff --git a/node_modules/js-beautify/js/src/core/tokenizer.js b/node_modules/js-beautify/js/src/core/tokenizer.js deleted file mode 100644 index c6bef45e..00000000 --- a/node_modules/js-beautify/js/src/core/tokenizer.js +++ /dev/null @@ -1,140 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var InputScanner = require('../core/inputscanner').InputScanner; -var Token = require('../core/token').Token; -var TokenStream = require('../core/tokenstream').TokenStream; -var WhitespacePattern = require('./whitespacepattern').WhitespacePattern; - -var TOKEN = { - START: 'TK_START', - RAW: 'TK_RAW', - EOF: 'TK_EOF' -}; - -var Tokenizer = function(input_string, options) { - this._input = new InputScanner(input_string); - this._options = options || {}; - this.__tokens = null; - - this._patterns = {}; - this._patterns.whitespace = new WhitespacePattern(this._input); -}; - -Tokenizer.prototype.tokenize = function() { - this._input.restart(); - this.__tokens = new TokenStream(); - - this._reset(); - - var current; - var previous = new Token(TOKEN.START, ''); - var open_token = null; - var open_stack = []; - var comments = new TokenStream(); - - while (previous.type !== TOKEN.EOF) { - current = this._get_next_token(previous, open_token); - while (this._is_comment(current)) { - comments.add(current); - current = this._get_next_token(previous, open_token); - } - - if (!comments.isEmpty()) { - current.comments_before = comments; - comments = new TokenStream(); - } - - current.parent = open_token; - - if (this._is_opening(current)) { - open_stack.push(open_token); - open_token = current; - } else if (open_token && this._is_closing(current, open_token)) { - current.opened = open_token; - open_token.closed = current; - open_token = open_stack.pop(); - current.parent = open_token; - } - - current.previous = previous; - previous.next = current; - - this.__tokens.add(current); - previous = current; - } - - return this.__tokens; -}; - - -Tokenizer.prototype._is_first_token = function() { - return this.__tokens.isEmpty(); -}; - -Tokenizer.prototype._reset = function() {}; - -Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false - this._readWhitespace(); - var resulting_string = this._input.read(/.+/g); - if (resulting_string) { - return this._create_token(TOKEN.RAW, resulting_string); - } else { - return this._create_token(TOKEN.EOF, ''); - } -}; - -Tokenizer.prototype._is_comment = function(current_token) { // jshint unused:false - return false; -}; - -Tokenizer.prototype._is_opening = function(current_token) { // jshint unused:false - return false; -}; - -Tokenizer.prototype._is_closing = function(current_token, open_token) { // jshint unused:false - return false; -}; - -Tokenizer.prototype._create_token = function(type, text) { - var token = new Token(type, text, - this._patterns.whitespace.newline_count, - this._patterns.whitespace.whitespace_before_token); - return token; -}; - -Tokenizer.prototype._readWhitespace = function() { - return this._patterns.whitespace.read(); -}; - - - -module.exports.Tokenizer = Tokenizer; -module.exports.TOKEN = TOKEN; diff --git a/node_modules/js-beautify/js/src/core/tokenstream.js b/node_modules/js-beautify/js/src/core/tokenstream.js deleted file mode 100644 index 88302ffe..00000000 --- a/node_modules/js-beautify/js/src/core/tokenstream.js +++ /dev/null @@ -1,78 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -function TokenStream(parent_token) { - // private - this.__tokens = []; - this.__tokens_length = this.__tokens.length; - this.__position = 0; - this.__parent_token = parent_token; -} - -TokenStream.prototype.restart = function() { - this.__position = 0; -}; - -TokenStream.prototype.isEmpty = function() { - return this.__tokens_length === 0; -}; - -TokenStream.prototype.hasNext = function() { - return this.__position < this.__tokens_length; -}; - -TokenStream.prototype.next = function() { - var val = null; - if (this.hasNext()) { - val = this.__tokens[this.__position]; - this.__position += 1; - } - return val; -}; - -TokenStream.prototype.peek = function(index) { - var val = null; - index = index || 0; - index += this.__position; - if (index >= 0 && index < this.__tokens_length) { - val = this.__tokens[index]; - } - return val; -}; - -TokenStream.prototype.add = function(token) { - if (this.__parent_token) { - token.parent = this.__parent_token; - } - this.__tokens.push(token); - this.__tokens_length += 1; -}; - -module.exports.TokenStream = TokenStream; diff --git a/node_modules/js-beautify/js/src/core/whitespacepattern.js b/node_modules/js-beautify/js/src/core/whitespacepattern.js deleted file mode 100644 index 4faa57e4..00000000 --- a/node_modules/js-beautify/js/src/core/whitespacepattern.js +++ /dev/null @@ -1,105 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Pattern = require('../core/pattern').Pattern; - -function WhitespacePattern(input_scanner, parent) { - Pattern.call(this, input_scanner, parent); - if (parent) { - this._line_regexp = this._input.get_regexp(parent._line_regexp); - } else { - this.__set_whitespace_patterns('', ''); - } - - this.newline_count = 0; - this.whitespace_before_token = ''; -} -WhitespacePattern.prototype = new Pattern(); - -WhitespacePattern.prototype.__set_whitespace_patterns = function(whitespace_chars, newline_chars) { - whitespace_chars += '\\t '; - newline_chars += '\\n\\r'; - - this._match_pattern = this._input.get_regexp( - '[' + whitespace_chars + newline_chars + ']+', true); - this._newline_regexp = this._input.get_regexp( - '\\r\\n|[' + newline_chars + ']'); -}; - -WhitespacePattern.prototype.read = function() { - this.newline_count = 0; - this.whitespace_before_token = ''; - - var resulting_string = this._input.read(this._match_pattern); - if (resulting_string === ' ') { - this.whitespace_before_token = ' '; - } else if (resulting_string) { - var matches = this.__split(this._newline_regexp, resulting_string); - this.newline_count = matches.length - 1; - this.whitespace_before_token = matches[this.newline_count]; - } - - return resulting_string; -}; - -WhitespacePattern.prototype.matching = function(whitespace_chars, newline_chars) { - var result = this._create(); - result.__set_whitespace_patterns(whitespace_chars, newline_chars); - result._update(); - return result; -}; - -WhitespacePattern.prototype._create = function() { - return new WhitespacePattern(this._input, this); -}; - -WhitespacePattern.prototype.__split = function(regexp, input_string) { - regexp.lastIndex = 0; - var start_index = 0; - var result = []; - var next_match = regexp.exec(input_string); - while (next_match) { - result.push(input_string.substring(start_index, next_match.index)); - start_index = next_match.index + next_match[0].length; - next_match = regexp.exec(input_string); - } - - if (start_index < input_string.length) { - result.push(input_string.substring(start_index, input_string.length)); - } else { - result.push(''); - } - - return result; -}; - - - -module.exports.WhitespacePattern = WhitespacePattern; diff --git a/node_modules/js-beautify/js/src/css/beautifier.js b/node_modules/js-beautify/js/src/css/beautifier.js deleted file mode 100644 index aeabb2c6..00000000 --- a/node_modules/js-beautify/js/src/css/beautifier.js +++ /dev/null @@ -1,470 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Options = require('./options').Options; -var Output = require('../core/output').Output; -var InputScanner = require('../core/inputscanner').InputScanner; -var Directives = require('../core/directives').Directives; - -var directives_core = new Directives(/\/\*/, /\*\//); - -var lineBreak = /\r\n|[\r\n]/; -var allLineBreaks = /\r\n|[\r\n]/g; - -// tokenizer -var whitespaceChar = /\s/; -var whitespacePattern = /(?:\s|\n)+/g; -var block_comment_pattern = /\/\*(?:[\s\S]*?)((?:\*\/)|$)/g; -var comment_pattern = /\/\/(?:[^\n\r\u2028\u2029]*)/g; - -function Beautifier(source_text, options) { - this._source_text = source_text || ''; - // Allow the setting of language/file-type specific options - // with inheritance of overall settings - this._options = new Options(options); - this._ch = null; - this._input = null; - - // https://developer.mozilla.org/en-US/docs/Web/CSS/At-rule - this.NESTED_AT_RULE = { - "@page": true, - "@font-face": true, - "@keyframes": true, - // also in CONDITIONAL_GROUP_RULE below - "@media": true, - "@supports": true, - "@document": true - }; - this.CONDITIONAL_GROUP_RULE = { - "@media": true, - "@supports": true, - "@document": true - }; - -} - -Beautifier.prototype.eatString = function(endChars) { - var result = ''; - this._ch = this._input.next(); - while (this._ch) { - result += this._ch; - if (this._ch === "\\") { - result += this._input.next(); - } else if (endChars.indexOf(this._ch) !== -1 || this._ch === "\n") { - break; - } - this._ch = this._input.next(); - } - return result; -}; - -// Skips any white space in the source text from the current position. -// When allowAtLeastOneNewLine is true, will output new lines for each -// newline character found; if the user has preserve_newlines off, only -// the first newline will be output -Beautifier.prototype.eatWhitespace = function(allowAtLeastOneNewLine) { - var result = whitespaceChar.test(this._input.peek()); - var isFirstNewLine = true; - - while (whitespaceChar.test(this._input.peek())) { - this._ch = this._input.next(); - if (allowAtLeastOneNewLine && this._ch === '\n') { - if (this._options.preserve_newlines || isFirstNewLine) { - isFirstNewLine = false; - this._output.add_new_line(true); - } - } - } - return result; -}; - -// Nested pseudo-class if we are insideRule -// and the next special character found opens -// a new block -Beautifier.prototype.foundNestedPseudoClass = function() { - var openParen = 0; - var i = 1; - var ch = this._input.peek(i); - while (ch) { - if (ch === "{") { - return true; - } else if (ch === '(') { - // pseudoclasses can contain () - openParen += 1; - } else if (ch === ')') { - if (openParen === 0) { - return false; - } - openParen -= 1; - } else if (ch === ";" || ch === "}") { - return false; - } - i++; - ch = this._input.peek(i); - } - return false; -}; - -Beautifier.prototype.print_string = function(output_string) { - this._output.set_indent(this._indentLevel); - this._output.non_breaking_space = true; - this._output.add_token(output_string); -}; - -Beautifier.prototype.preserveSingleSpace = function(isAfterSpace) { - if (isAfterSpace) { - this._output.space_before_token = true; - } -}; - -Beautifier.prototype.indent = function() { - this._indentLevel++; -}; - -Beautifier.prototype.outdent = function() { - if (this._indentLevel > 0) { - this._indentLevel--; - } -}; - -/*_____________________--------------------_____________________*/ - -Beautifier.prototype.beautify = function() { - if (this._options.disabled) { - return this._source_text; - } - - var source_text = this._source_text; - var eol = this._options.eol; - if (eol === 'auto') { - eol = '\n'; - if (source_text && lineBreak.test(source_text || '')) { - eol = source_text.match(lineBreak)[0]; - } - } - - - // HACK: newline parsing inconsistent. This brute force normalizes the this._input. - source_text = source_text.replace(allLineBreaks, '\n'); - - // reset - var baseIndentString = source_text.match(/^[\t ]*/)[0]; - - this._output = new Output(this._options, baseIndentString); - this._input = new InputScanner(source_text); - this._indentLevel = 0; - this._nestedLevel = 0; - - this._ch = null; - var parenLevel = 0; - - var insideRule = false; - // This is the value side of a property value pair (blue in the following ex) - // label { content: blue } - var insidePropertyValue = false; - var enteringConditionalGroup = false; - var insideAtExtend = false; - var insideAtImport = false; - var topCharacter = this._ch; - var whitespace; - var isAfterSpace; - var previous_ch; - - while (true) { - whitespace = this._input.read(whitespacePattern); - isAfterSpace = whitespace !== ''; - previous_ch = topCharacter; - this._ch = this._input.next(); - if (this._ch === '\\' && this._input.hasNext()) { - this._ch += this._input.next(); - } - topCharacter = this._ch; - - if (!this._ch) { - break; - } else if (this._ch === '/' && this._input.peek() === '*') { - // /* css comment */ - // Always start block comments on a new line. - // This handles scenarios where a block comment immediately - // follows a property definition on the same line or where - // minified code is being beautified. - this._output.add_new_line(); - this._input.back(); - - var comment = this._input.read(block_comment_pattern); - - // Handle ignore directive - var directives = directives_core.get_directives(comment); - if (directives && directives.ignore === 'start') { - comment += directives_core.readIgnored(this._input); - } - - this.print_string(comment); - - // Ensures any new lines following the comment are preserved - this.eatWhitespace(true); - - // Block comments are followed by a new line so they don't - // share a line with other properties - this._output.add_new_line(); - } else if (this._ch === '/' && this._input.peek() === '/') { - // // single line comment - // Preserves the space before a comment - // on the same line as a rule - this._output.space_before_token = true; - this._input.back(); - this.print_string(this._input.read(comment_pattern)); - - // Ensures any new lines following the comment are preserved - this.eatWhitespace(true); - } else if (this._ch === '@') { - this.preserveSingleSpace(isAfterSpace); - - // deal with less propery mixins @{...} - if (this._input.peek() === '{') { - this.print_string(this._ch + this.eatString('}')); - } else { - this.print_string(this._ch); - - // strip trailing space, if present, for hash property checks - var variableOrRule = this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g); - - if (variableOrRule.match(/[ :]$/)) { - // we have a variable or pseudo-class, add it and insert one space before continuing - variableOrRule = this.eatString(": ").replace(/\s$/, ''); - this.print_string(variableOrRule); - this._output.space_before_token = true; - } - - variableOrRule = variableOrRule.replace(/\s$/, ''); - - if (variableOrRule === 'extend') { - insideAtExtend = true; - } else if (variableOrRule === 'import') { - insideAtImport = true; - } - - // might be a nesting at-rule - if (variableOrRule in this.NESTED_AT_RULE) { - this._nestedLevel += 1; - if (variableOrRule in this.CONDITIONAL_GROUP_RULE) { - enteringConditionalGroup = true; - } - // might be less variable - } else if (!insideRule && parenLevel === 0 && variableOrRule.indexOf(':') !== -1) { - insidePropertyValue = true; - this.indent(); - } - } - } else if (this._ch === '#' && this._input.peek() === '{') { - this.preserveSingleSpace(isAfterSpace); - this.print_string(this._ch + this.eatString('}')); - } else if (this._ch === '{') { - if (insidePropertyValue) { - insidePropertyValue = false; - this.outdent(); - } - this.indent(); - this._output.space_before_token = true; - this.print_string(this._ch); - - // when entering conditional groups, only rulesets are allowed - if (enteringConditionalGroup) { - enteringConditionalGroup = false; - insideRule = (this._indentLevel > this._nestedLevel); - } else { - // otherwise, declarations are also allowed - insideRule = (this._indentLevel >= this._nestedLevel); - } - if (this._options.newline_between_rules && insideRule) { - if (this._output.previous_line && this._output.previous_line.item(-1) !== '{') { - this._output.ensure_empty_line_above('/', ','); - } - } - this.eatWhitespace(true); - this._output.add_new_line(); - } else if (this._ch === '}') { - this.outdent(); - this._output.add_new_line(); - if (previous_ch === '{') { - this._output.trim(true); - } - insideAtImport = false; - insideAtExtend = false; - if (insidePropertyValue) { - this.outdent(); - insidePropertyValue = false; - } - this.print_string(this._ch); - insideRule = false; - if (this._nestedLevel) { - this._nestedLevel--; - } - - this.eatWhitespace(true); - this._output.add_new_line(); - - if (this._options.newline_between_rules && !this._output.just_added_blankline()) { - if (this._input.peek() !== '}') { - this._output.add_new_line(true); - } - } - } else if (this._ch === ":") { - if ((insideRule || enteringConditionalGroup) && !(this._input.lookBack("&") || this.foundNestedPseudoClass()) && !this._input.lookBack("(") && !insideAtExtend && parenLevel === 0) { - // 'property: value' delimiter - // which could be in a conditional group query - this.print_string(':'); - if (!insidePropertyValue) { - insidePropertyValue = true; - this._output.space_before_token = true; - this.eatWhitespace(true); - this.indent(); - } - } else { - // sass/less parent reference don't use a space - // sass nested pseudo-class don't use a space - - // preserve space before pseudoclasses/pseudoelements, as it means "in any child" - if (this._input.lookBack(" ")) { - this._output.space_before_token = true; - } - if (this._input.peek() === ":") { - // pseudo-element - this._ch = this._input.next(); - this.print_string("::"); - } else { - // pseudo-class - this.print_string(':'); - } - } - } else if (this._ch === '"' || this._ch === '\'') { - this.preserveSingleSpace(isAfterSpace); - this.print_string(this._ch + this.eatString(this._ch)); - this.eatWhitespace(true); - } else if (this._ch === ';') { - if (parenLevel === 0) { - if (insidePropertyValue) { - this.outdent(); - insidePropertyValue = false; - } - insideAtExtend = false; - insideAtImport = false; - this.print_string(this._ch); - this.eatWhitespace(true); - - // This maintains single line comments on the same - // line. Block comments are also affected, but - // a new line is always output before one inside - // that section - if (this._input.peek() !== '/') { - this._output.add_new_line(); - } - } else { - this.print_string(this._ch); - this.eatWhitespace(true); - this._output.space_before_token = true; - } - } else if (this._ch === '(') { // may be a url - if (this._input.lookBack("url")) { - this.print_string(this._ch); - this.eatWhitespace(); - parenLevel++; - this.indent(); - this._ch = this._input.next(); - if (this._ch === ')' || this._ch === '"' || this._ch === '\'') { - this._input.back(); - } else if (this._ch) { - this.print_string(this._ch + this.eatString(')')); - if (parenLevel) { - parenLevel--; - this.outdent(); - } - } - } else { - this.preserveSingleSpace(isAfterSpace); - this.print_string(this._ch); - this.eatWhitespace(); - parenLevel++; - this.indent(); - } - } else if (this._ch === ')') { - if (parenLevel) { - parenLevel--; - this.outdent(); - } - this.print_string(this._ch); - } else if (this._ch === ',') { - this.print_string(this._ch); - this.eatWhitespace(true); - if (this._options.selector_separator_newline && !insidePropertyValue && parenLevel === 0 && !insideAtImport) { - this._output.add_new_line(); - } else { - this._output.space_before_token = true; - } - } else if ((this._ch === '>' || this._ch === '+' || this._ch === '~') && !insidePropertyValue && parenLevel === 0) { - //handle combinator spacing - if (this._options.space_around_combinator) { - this._output.space_before_token = true; - this.print_string(this._ch); - this._output.space_before_token = true; - } else { - this.print_string(this._ch); - this.eatWhitespace(); - // squash extra whitespace - if (this._ch && whitespaceChar.test(this._ch)) { - this._ch = ''; - } - } - } else if (this._ch === ']') { - this.print_string(this._ch); - } else if (this._ch === '[') { - this.preserveSingleSpace(isAfterSpace); - this.print_string(this._ch); - } else if (this._ch === '=') { // no whitespace before or after - this.eatWhitespace(); - this.print_string('='); - if (whitespaceChar.test(this._ch)) { - this._ch = ''; - } - } else if (this._ch === '!' && !this._input.lookBack("\\")) { // !important - this.print_string(' '); - this.print_string(this._ch); - } else { - this.preserveSingleSpace(isAfterSpace); - this.print_string(this._ch); - } - } - - var sweetCode = this._output.get_code(eol); - - return sweetCode; -}; - -module.exports.Beautifier = Beautifier; diff --git a/node_modules/js-beautify/js/src/css/index.js b/node_modules/js-beautify/js/src/css/index.js deleted file mode 100644 index 70e16071..00000000 --- a/node_modules/js-beautify/js/src/css/index.js +++ /dev/null @@ -1,42 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Beautifier = require('./beautifier').Beautifier, - Options = require('./options').Options; - -function css_beautify(source_text, options) { - var beautifier = new Beautifier(source_text, options); - return beautifier.beautify(); -} - -module.exports = css_beautify; -module.exports.defaultOptions = function() { - return new Options(); -}; diff --git a/node_modules/js-beautify/js/src/css/options.js b/node_modules/js-beautify/js/src/css/options.js deleted file mode 100644 index 862769eb..00000000 --- a/node_modules/js-beautify/js/src/css/options.js +++ /dev/null @@ -1,46 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var BaseOptions = require('../core/options').Options; - -function Options(options) { - BaseOptions.call(this, options, 'css'); - - this.selector_separator_newline = this._get_boolean('selector_separator_newline', true); - this.newline_between_rules = this._get_boolean('newline_between_rules', true); - var space_around_selector_separator = this._get_boolean('space_around_selector_separator'); - this.space_around_combinator = this._get_boolean('space_around_combinator') || space_around_selector_separator; - -} -Options.prototype = new BaseOptions(); - - - -module.exports.Options = Options; diff --git a/node_modules/js-beautify/js/src/css/tokenizer.js b/node_modules/js-beautify/js/src/css/tokenizer.js deleted file mode 100644 index 648ca950..00000000 --- a/node_modules/js-beautify/js/src/css/tokenizer.js +++ /dev/null @@ -1,29 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; diff --git a/node_modules/js-beautify/js/src/html/beautifier.js b/node_modules/js-beautify/js/src/html/beautifier.js deleted file mode 100644 index b6cc95b8..00000000 --- a/node_modules/js-beautify/js/src/html/beautifier.js +++ /dev/null @@ -1,840 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Options = require('../html/options').Options; -var Output = require('../core/output').Output; -var Tokenizer = require('../html/tokenizer').Tokenizer; -var TOKEN = require('../html/tokenizer').TOKEN; - -var lineBreak = /\r\n|[\r\n]/; -var allLineBreaks = /\r\n|[\r\n]/g; - -var Printer = function(options, base_indent_string) { //handles input/output and some other printing functions - - this.indent_level = 0; - this.alignment_size = 0; - this.max_preserve_newlines = options.max_preserve_newlines; - this.preserve_newlines = options.preserve_newlines; - - this._output = new Output(options, base_indent_string); - -}; - -Printer.prototype.current_line_has_match = function(pattern) { - return this._output.current_line.has_match(pattern); -}; - -Printer.prototype.set_space_before_token = function(value, non_breaking) { - this._output.space_before_token = value; - this._output.non_breaking_space = non_breaking; -}; - -Printer.prototype.set_wrap_point = function() { - this._output.set_indent(this.indent_level, this.alignment_size); - this._output.set_wrap_point(); -}; - - -Printer.prototype.add_raw_token = function(token) { - this._output.add_raw_token(token); -}; - -Printer.prototype.print_preserved_newlines = function(raw_token) { - var newlines = 0; - if (raw_token.type !== TOKEN.TEXT && raw_token.previous.type !== TOKEN.TEXT) { - newlines = raw_token.newlines ? 1 : 0; - } - - if (this.preserve_newlines) { - newlines = raw_token.newlines < this.max_preserve_newlines + 1 ? raw_token.newlines : this.max_preserve_newlines + 1; - } - for (var n = 0; n < newlines; n++) { - this.print_newline(n > 0); - } - - return newlines !== 0; -}; - -Printer.prototype.traverse_whitespace = function(raw_token) { - if (raw_token.whitespace_before || raw_token.newlines) { - if (!this.print_preserved_newlines(raw_token)) { - this._output.space_before_token = true; - } - return true; - } - return false; -}; - -Printer.prototype.previous_token_wrapped = function() { - return this._output.previous_token_wrapped; -}; - -Printer.prototype.print_newline = function(force) { - this._output.add_new_line(force); -}; - -Printer.prototype.print_token = function(token) { - if (token.text) { - this._output.set_indent(this.indent_level, this.alignment_size); - this._output.add_token(token.text); - } -}; - -Printer.prototype.indent = function() { - this.indent_level++; -}; - -Printer.prototype.get_full_indent = function(level) { - level = this.indent_level + (level || 0); - if (level < 1) { - return ''; - } - - return this._output.get_indent_string(level); -}; - -var get_type_attribute = function(start_token) { - var result = null; - var raw_token = start_token.next; - - // Search attributes for a type attribute - while (raw_token.type !== TOKEN.EOF && start_token.closed !== raw_token) { - if (raw_token.type === TOKEN.ATTRIBUTE && raw_token.text === 'type') { - if (raw_token.next && raw_token.next.type === TOKEN.EQUALS && - raw_token.next.next && raw_token.next.next.type === TOKEN.VALUE) { - result = raw_token.next.next.text; - } - break; - } - raw_token = raw_token.next; - } - - return result; -}; - -var get_custom_beautifier_name = function(tag_check, raw_token) { - var typeAttribute = null; - var result = null; - - if (!raw_token.closed) { - return null; - } - - if (tag_check === 'script') { - typeAttribute = 'text/javascript'; - } else if (tag_check === 'style') { - typeAttribute = 'text/css'; - } - - typeAttribute = get_type_attribute(raw_token) || typeAttribute; - - // For script and style tags that have a type attribute, only enable custom beautifiers for matching values - // For those without a type attribute use default; - if (typeAttribute.search('text/css') > -1) { - result = 'css'; - } else if (typeAttribute.search(/(text|application|dojo)\/(x-)?(javascript|ecmascript|jscript|livescript|(ld\+)?json|method|aspect)/) > -1) { - result = 'javascript'; - } else if (typeAttribute.search(/(text|application|dojo)\/(x-)?(html)/) > -1) { - result = 'html'; - } else if (typeAttribute.search(/test\/null/) > -1) { - // Test only mime-type for testing the beautifier when null is passed as beautifing function - result = 'null'; - } - - return result; -}; - -function in_array(what, arr) { - return arr.indexOf(what) !== -1; -} - -function TagFrame(parent, parser_token, indent_level) { - this.parent = parent || null; - this.tag = parser_token ? parser_token.tag_name : ''; - this.indent_level = indent_level || 0; - this.parser_token = parser_token || null; -} - -function TagStack(printer) { - this._printer = printer; - this._current_frame = null; -} - -TagStack.prototype.get_parser_token = function() { - return this._current_frame ? this._current_frame.parser_token : null; -}; - -TagStack.prototype.record_tag = function(parser_token) { //function to record a tag and its parent in this.tags Object - var new_frame = new TagFrame(this._current_frame, parser_token, this._printer.indent_level); - this._current_frame = new_frame; -}; - -TagStack.prototype._try_pop_frame = function(frame) { //function to retrieve the opening tag to the corresponding closer - var parser_token = null; - - if (frame) { - parser_token = frame.parser_token; - this._printer.indent_level = frame.indent_level; - this._current_frame = frame.parent; - } - - return parser_token; -}; - -TagStack.prototype._get_frame = function(tag_list, stop_list) { //function to retrieve the opening tag to the corresponding closer - var frame = this._current_frame; - - while (frame) { //till we reach '' (the initial value); - if (tag_list.indexOf(frame.tag) !== -1) { //if this is it use it - break; - } else if (stop_list && stop_list.indexOf(frame.tag) !== -1) { - frame = null; - break; - } - frame = frame.parent; - } - - return frame; -}; - -TagStack.prototype.try_pop = function(tag, stop_list) { //function to retrieve the opening tag to the corresponding closer - var frame = this._get_frame([tag], stop_list); - return this._try_pop_frame(frame); -}; - -TagStack.prototype.indent_to_tag = function(tag_list) { - var frame = this._get_frame(tag_list); - if (frame) { - this._printer.indent_level = frame.indent_level; - } -}; - -function Beautifier(source_text, options, js_beautify, css_beautify) { - //Wrapper function to invoke all the necessary constructors and deal with the output. - this._source_text = source_text || ''; - options = options || {}; - this._js_beautify = js_beautify; - this._css_beautify = css_beautify; - this._tag_stack = null; - - // Allow the setting of language/file-type specific options - // with inheritance of overall settings - var optionHtml = new Options(options, 'html'); - - this._options = optionHtml; - - this._is_wrap_attributes_force = this._options.wrap_attributes.substr(0, 'force'.length) === 'force'; - this._is_wrap_attributes_force_expand_multiline = (this._options.wrap_attributes === 'force-expand-multiline'); - this._is_wrap_attributes_force_aligned = (this._options.wrap_attributes === 'force-aligned'); - this._is_wrap_attributes_aligned_multiple = (this._options.wrap_attributes === 'aligned-multiple'); - this._is_wrap_attributes_preserve = this._options.wrap_attributes.substr(0, 'preserve'.length) === 'preserve'; - this._is_wrap_attributes_preserve_aligned = (this._options.wrap_attributes === 'preserve-aligned'); -} - -Beautifier.prototype.beautify = function() { - - // if disabled, return the input unchanged. - if (this._options.disabled) { - return this._source_text; - } - - var source_text = this._source_text; - var eol = this._options.eol; - if (this._options.eol === 'auto') { - eol = '\n'; - if (source_text && lineBreak.test(source_text)) { - eol = source_text.match(lineBreak)[0]; - } - } - - // HACK: newline parsing inconsistent. This brute force normalizes the input. - source_text = source_text.replace(allLineBreaks, '\n'); - - var baseIndentString = source_text.match(/^[\t ]*/)[0]; - - var last_token = { - text: '', - type: '' - }; - - var last_tag_token = new TagOpenParserToken(); - - var printer = new Printer(this._options, baseIndentString); - var tokens = new Tokenizer(source_text, this._options).tokenize(); - - this._tag_stack = new TagStack(printer); - - var parser_token = null; - var raw_token = tokens.next(); - while (raw_token.type !== TOKEN.EOF) { - - if (raw_token.type === TOKEN.TAG_OPEN || raw_token.type === TOKEN.COMMENT) { - parser_token = this._handle_tag_open(printer, raw_token, last_tag_token, last_token); - last_tag_token = parser_token; - } else if ((raw_token.type === TOKEN.ATTRIBUTE || raw_token.type === TOKEN.EQUALS || raw_token.type === TOKEN.VALUE) || - (raw_token.type === TOKEN.TEXT && !last_tag_token.tag_complete)) { - parser_token = this._handle_inside_tag(printer, raw_token, last_tag_token, tokens); - } else if (raw_token.type === TOKEN.TAG_CLOSE) { - parser_token = this._handle_tag_close(printer, raw_token, last_tag_token); - } else if (raw_token.type === TOKEN.TEXT) { - parser_token = this._handle_text(printer, raw_token, last_tag_token); - } else { - // This should never happen, but if it does. Print the raw token - printer.add_raw_token(raw_token); - } - - last_token = parser_token; - - raw_token = tokens.next(); - } - var sweet_code = printer._output.get_code(eol); - - return sweet_code; -}; - -Beautifier.prototype._handle_tag_close = function(printer, raw_token, last_tag_token) { - var parser_token = { - text: raw_token.text, - type: raw_token.type - }; - printer.alignment_size = 0; - last_tag_token.tag_complete = true; - - printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true); - if (last_tag_token.is_unformatted) { - printer.add_raw_token(raw_token); - } else { - if (last_tag_token.tag_start_char === '<') { - printer.set_space_before_token(raw_token.text[0] === '/', true); // space before />, no space before > - if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.has_wrapped_attrs) { - printer.print_newline(false); - } - } - printer.print_token(raw_token); - - } - - if (last_tag_token.indent_content && - !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) { - printer.indent(); - - // only indent once per opened tag - last_tag_token.indent_content = false; - } - - if (!last_tag_token.is_inline_element && - !(last_tag_token.is_unformatted || last_tag_token.is_content_unformatted)) { - printer.set_wrap_point(); - } - - return parser_token; -}; - -Beautifier.prototype._handle_inside_tag = function(printer, raw_token, last_tag_token, tokens) { - var wrapped = last_tag_token.has_wrapped_attrs; - var parser_token = { - text: raw_token.text, - type: raw_token.type - }; - - printer.set_space_before_token(raw_token.newlines || raw_token.whitespace_before !== '', true); - if (last_tag_token.is_unformatted) { - printer.add_raw_token(raw_token); - } else if (last_tag_token.tag_start_char === '{' && raw_token.type === TOKEN.TEXT) { - // For the insides of handlebars allow newlines or a single space between open and contents - if (printer.print_preserved_newlines(raw_token)) { - raw_token.newlines = 0; - printer.add_raw_token(raw_token); - } else { - printer.print_token(raw_token); - } - } else { - if (raw_token.type === TOKEN.ATTRIBUTE) { - printer.set_space_before_token(true); - last_tag_token.attr_count += 1; - } else if (raw_token.type === TOKEN.EQUALS) { //no space before = - printer.set_space_before_token(false); - } else if (raw_token.type === TOKEN.VALUE && raw_token.previous.type === TOKEN.EQUALS) { //no space before value - printer.set_space_before_token(false); - } - - if (raw_token.type === TOKEN.ATTRIBUTE && last_tag_token.tag_start_char === '<') { - if (this._is_wrap_attributes_preserve || this._is_wrap_attributes_preserve_aligned) { - printer.traverse_whitespace(raw_token); - wrapped = wrapped || raw_token.newlines !== 0; - } - - - if (this._is_wrap_attributes_force) { - var force_attr_wrap = last_tag_token.attr_count > 1; - if (this._is_wrap_attributes_force_expand_multiline && last_tag_token.attr_count === 1) { - var is_only_attribute = true; - var peek_index = 0; - var peek_token; - do { - peek_token = tokens.peek(peek_index); - if (peek_token.type === TOKEN.ATTRIBUTE) { - is_only_attribute = false; - break; - } - peek_index += 1; - } while (peek_index < 4 && peek_token.type !== TOKEN.EOF && peek_token.type !== TOKEN.TAG_CLOSE); - - force_attr_wrap = !is_only_attribute; - } - - if (force_attr_wrap) { - printer.print_newline(false); - wrapped = true; - } - } - } - printer.print_token(raw_token); - wrapped = wrapped || printer.previous_token_wrapped(); - last_tag_token.has_wrapped_attrs = wrapped; - } - return parser_token; -}; - -Beautifier.prototype._handle_text = function(printer, raw_token, last_tag_token) { - var parser_token = { - text: raw_token.text, - type: 'TK_CONTENT' - }; - if (last_tag_token.custom_beautifier_name) { //check if we need to format javascript - this._print_custom_beatifier_text(printer, raw_token, last_tag_token); - } else if (last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) { - printer.add_raw_token(raw_token); - } else { - printer.traverse_whitespace(raw_token); - printer.print_token(raw_token); - } - return parser_token; -}; - -Beautifier.prototype._print_custom_beatifier_text = function(printer, raw_token, last_tag_token) { - var local = this; - if (raw_token.text !== '') { - - var text = raw_token.text, - _beautifier, - script_indent_level = 1, - pre = '', - post = ''; - if (last_tag_token.custom_beautifier_name === 'javascript' && typeof this._js_beautify === 'function') { - _beautifier = this._js_beautify; - } else if (last_tag_token.custom_beautifier_name === 'css' && typeof this._css_beautify === 'function') { - _beautifier = this._css_beautify; - } else if (last_tag_token.custom_beautifier_name === 'html') { - _beautifier = function(html_source, options) { - var beautifier = new Beautifier(html_source, options, local._js_beautify, local._css_beautify); - return beautifier.beautify(); - }; - } - - if (this._options.indent_scripts === "keep") { - script_indent_level = 0; - } else if (this._options.indent_scripts === "separate") { - script_indent_level = -printer.indent_level; - } - - var indentation = printer.get_full_indent(script_indent_level); - - // if there is at least one empty line at the end of this text, strip it - // we'll be adding one back after the text but before the containing tag. - text = text.replace(/\n[ \t]*$/, ''); - - // Handle the case where content is wrapped in a comment or cdata. - if (last_tag_token.custom_beautifier_name !== 'html' && - text[0] === '<' && text.match(/^(|]]>)$/.exec(text); - - // if we start to wrap but don't finish, print raw - if (!matched) { - printer.add_raw_token(raw_token); - return; - } - - pre = indentation + matched[1] + '\n'; - text = matched[4]; - if (matched[5]) { - post = indentation + matched[5]; - } - - // if there is at least one empty line at the end of this text, strip it - // we'll be adding one back after the text but before the containing tag. - text = text.replace(/\n[ \t]*$/, ''); - - if (matched[2] || matched[3].indexOf('\n') !== -1) { - // if the first line of the non-comment text has spaces - // use that as the basis for indenting in null case. - matched = matched[3].match(/[ \t]+$/); - if (matched) { - raw_token.whitespace_before = matched[0]; - } - } - } - - if (text) { - if (_beautifier) { - - // call the Beautifier if avaliable - var Child_options = function() { - this.eol = '\n'; - }; - Child_options.prototype = this._options.raw_options; - var child_options = new Child_options(); - text = _beautifier(indentation + text, child_options); - } else { - // simply indent the string otherwise - var white = raw_token.whitespace_before; - if (white) { - text = text.replace(new RegExp('\n(' + white + ')?', 'g'), '\n'); - } - - text = indentation + text.replace(/\n/g, '\n' + indentation); - } - } - - if (pre) { - if (!text) { - text = pre + post; - } else { - text = pre + text + '\n' + post; - } - } - - printer.print_newline(false); - if (text) { - raw_token.text = text; - raw_token.whitespace_before = ''; - raw_token.newlines = 0; - printer.add_raw_token(raw_token); - printer.print_newline(true); - } - } -}; - -Beautifier.prototype._handle_tag_open = function(printer, raw_token, last_tag_token, last_token) { - var parser_token = this._get_tag_open_token(raw_token); - - if ((last_tag_token.is_unformatted || last_tag_token.is_content_unformatted) && - raw_token.type === TOKEN.TAG_OPEN && raw_token.text.indexOf(']*)/); - this.tag_check = tag_check_match ? tag_check_match[1] : ''; - } else { - tag_check_match = raw_token.text.match(/^{{[#\^]?([^\s}]+)/); - this.tag_check = tag_check_match ? tag_check_match[1] : ''; - } - this.tag_check = this.tag_check.toLowerCase(); - - if (raw_token.type === TOKEN.COMMENT) { - this.tag_complete = true; - } - - this.is_start_tag = this.tag_check.charAt(0) !== '/'; - this.tag_name = !this.is_start_tag ? this.tag_check.substr(1) : this.tag_check; - this.is_end_tag = !this.is_start_tag || - (raw_token.closed && raw_token.closed.text === '/>'); - - // handlebars tags that don't start with # or ^ are single_tags, and so also start and end. - this.is_end_tag = this.is_end_tag || - (this.tag_start_char === '{' && (this.text.length < 3 || (/[^#\^]/.test(this.text.charAt(2))))); - } -}; - -Beautifier.prototype._get_tag_open_token = function(raw_token) { //function to get a full tag and parse its type - var parser_token = new TagOpenParserToken(this._tag_stack.get_parser_token(), raw_token); - - parser_token.alignment_size = this._options.wrap_attributes_indent_size; - - parser_token.is_end_tag = parser_token.is_end_tag || - in_array(parser_token.tag_check, this._options.void_elements); - - parser_token.is_empty_element = parser_token.tag_complete || - (parser_token.is_start_tag && parser_token.is_end_tag); - - parser_token.is_unformatted = !parser_token.tag_complete && in_array(parser_token.tag_check, this._options.unformatted); - parser_token.is_content_unformatted = !parser_token.is_empty_element && in_array(parser_token.tag_check, this._options.content_unformatted); - parser_token.is_inline_element = in_array(parser_token.tag_name, this._options.inline) || parser_token.tag_start_char === '{'; - - return parser_token; -}; - -Beautifier.prototype._set_tag_position = function(printer, raw_token, parser_token, last_tag_token, last_token) { - - if (!parser_token.is_empty_element) { - if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending - parser_token.start_tag_token = this._tag_stack.try_pop(parser_token.tag_name); //remove it and all ancestors - } else { // it's a start-tag - // check if this tag is starting an element that has optional end element - // and do an ending needed - if (this._do_optional_end_element(parser_token)) { - if (!parser_token.is_inline_element) { - if (parser_token.parent) { - parser_token.parent.multiline_content = true; - } - printer.print_newline(false); - } - - } - - this._tag_stack.record_tag(parser_token); //push it on the tag stack - - if ((parser_token.tag_name === 'script' || parser_token.tag_name === 'style') && - !(parser_token.is_unformatted || parser_token.is_content_unformatted)) { - parser_token.custom_beautifier_name = get_custom_beautifier_name(parser_token.tag_check, raw_token); - } - } - } - - if (in_array(parser_token.tag_check, this._options.extra_liners)) { //check if this double needs an extra line - printer.print_newline(false); - if (!printer._output.just_added_blankline()) { - printer.print_newline(true); - } - } - - if (parser_token.is_empty_element) { //if this tag name is a single tag type (either in the list or has a closing /) - - // if you hit an else case, reset the indent level if you are inside an: - // 'if', 'unless', or 'each' block. - if (parser_token.tag_start_char === '{' && parser_token.tag_check === 'else') { - this._tag_stack.indent_to_tag(['if', 'unless', 'each']); - parser_token.indent_content = true; - // Don't add a newline if opening {{#if}} tag is on the current line - var foundIfOnCurrentLine = printer.current_line_has_match(/{{#if/); - if (!foundIfOnCurrentLine) { - printer.print_newline(false); - } - } - - // Don't add a newline before elements that should remain where they are. - if (parser_token.tag_name === '!--' && last_token.type === TOKEN.TAG_CLOSE && - last_tag_token.is_end_tag && parser_token.text.indexOf('\n') === -1) { - //Do nothing. Leave comments on same line. - } else if (!parser_token.is_inline_element && !parser_token.is_unformatted) { - printer.print_newline(false); - } - } else if (parser_token.is_unformatted || parser_token.is_content_unformatted) { - if (!parser_token.is_inline_element && !parser_token.is_unformatted) { - printer.print_newline(false); - } - } else if (parser_token.is_end_tag) { //this tag is a double tag so check for tag-ending - if ((parser_token.start_tag_token && parser_token.start_tag_token.multiline_content) || - !(parser_token.is_inline_element || - (last_tag_token.is_inline_element) || - (last_token.type === TOKEN.TAG_CLOSE && - parser_token.start_tag_token === last_tag_token) || - (last_token.type === 'TK_CONTENT') - )) { - printer.print_newline(false); - } - } else { // it's a start-tag - parser_token.indent_content = !parser_token.custom_beautifier_name; - - if (parser_token.tag_start_char === '<') { - if (parser_token.tag_name === 'html') { - parser_token.indent_content = this._options.indent_inner_html; - } else if (parser_token.tag_name === 'head') { - parser_token.indent_content = this._options.indent_head_inner_html; - } else if (parser_token.tag_name === 'body') { - parser_token.indent_content = this._options.indent_body_inner_html; - } - } - - if (!parser_token.is_inline_element && last_token.type !== 'TK_CONTENT') { - if (parser_token.parent) { - parser_token.parent.multiline_content = true; - } - printer.print_newline(false); - } - } -}; - -//To be used for

      tag special case: -//var p_closers = ['address', 'article', 'aside', 'blockquote', 'details', 'div', 'dl', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hr', 'main', 'nav', 'ol', 'p', 'pre', 'section', 'table', 'ul']; - -Beautifier.prototype._do_optional_end_element = function(parser_token) { - var result = null; - // NOTE: cases of "if there is no more content in the parent element" - // are handled automatically by the beautifier. - // It assumes parent or ancestor close tag closes all children. - // https://www.w3.org/TR/html5/syntax.html#optional-tags - if (parser_token.is_empty_element || !parser_token.is_start_tag || !parser_token.parent) { - return; - - } else if (parser_token.tag_name === 'body') { - // A head element’s end tag may be omitted if the head element is not immediately followed by a space character or a comment. - result = result || this._tag_stack.try_pop('head'); - - //} else if (parser_token.tag_name === 'body') { - // DONE: A body element’s end tag may be omitted if the body element is not immediately followed by a comment. - - } else if (parser_token.tag_name === 'li') { - // An li element’s end tag may be omitted if the li element is immediately followed by another li element or if there is no more content in the parent element. - result = result || this._tag_stack.try_pop('li', ['ol', 'ul']); - - } else if (parser_token.tag_name === 'dd' || parser_token.tag_name === 'dt') { - // A dd element’s end tag may be omitted if the dd element is immediately followed by another dd element or a dt element, or if there is no more content in the parent element. - // A dt element’s end tag may be omitted if the dt element is immediately followed by another dt element or a dd element. - result = result || this._tag_stack.try_pop('dt', ['dl']); - result = result || this._tag_stack.try_pop('dd', ['dl']); - - //} else if (p_closers.indexOf(parser_token.tag_name) !== -1) { - //TODO: THIS IS A BUG FARM. We are not putting this into 1.8.0 as it is likely to blow up. - //A p element’s end tag may be omitted if the p element is immediately followed by an address, article, aside, blockquote, details, div, dl, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hr, main, nav, ol, p, pre, section, table, or ul element, or if there is no more content in the parent element and the parent element is an HTML element that is not an a, audio, del, ins, map, noscript, or video element, or an autonomous custom element. - //result = result || this._tag_stack.try_pop('p', ['body']); - - } else if (parser_token.tag_name === 'rp' || parser_token.tag_name === 'rt') { - // An rt element’s end tag may be omitted if the rt element is immediately followed by an rt or rp element, or if there is no more content in the parent element. - // An rp element’s end tag may be omitted if the rp element is immediately followed by an rt or rp element, or if there is no more content in the parent element. - result = result || this._tag_stack.try_pop('rt', ['ruby', 'rtc']); - result = result || this._tag_stack.try_pop('rp', ['ruby', 'rtc']); - - } else if (parser_token.tag_name === 'optgroup') { - // An optgroup element’s end tag may be omitted if the optgroup element is immediately followed by another optgroup element, or if there is no more content in the parent element. - // An option element’s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element. - result = result || this._tag_stack.try_pop('optgroup', ['select']); - //result = result || this._tag_stack.try_pop('option', ['select']); - - } else if (parser_token.tag_name === 'option') { - // An option element’s end tag may be omitted if the option element is immediately followed by another option element, or if it is immediately followed by an optgroup element, or if there is no more content in the parent element. - result = result || this._tag_stack.try_pop('option', ['select', 'datalist', 'optgroup']); - - } else if (parser_token.tag_name === 'colgroup') { - // DONE: A colgroup element’s end tag may be omitted if the colgroup element is not immediately followed by a space character or a comment. - // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started. - result = result || this._tag_stack.try_pop('caption', ['table']); - - } else if (parser_token.tag_name === 'thead') { - // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started. - // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started. - result = result || this._tag_stack.try_pop('caption', ['table']); - result = result || this._tag_stack.try_pop('colgroup', ['table']); - - //} else if (parser_token.tag_name === 'caption') { - // DONE: A caption element’s end tag may be omitted if the caption element is not immediately followed by a space character or a comment. - - } else if (parser_token.tag_name === 'tbody' || parser_token.tag_name === 'tfoot') { - // A thead element’s end tag may be omitted if the thead element is immediately followed by a tbody or tfoot element. - // A tbody element’s end tag may be omitted if the tbody element is immediately followed by a tbody or tfoot element, or if there is no more content in the parent element. - // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started. - // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started. - result = result || this._tag_stack.try_pop('caption', ['table']); - result = result || this._tag_stack.try_pop('colgroup', ['table']); - result = result || this._tag_stack.try_pop('thead', ['table']); - result = result || this._tag_stack.try_pop('tbody', ['table']); - - //} else if (parser_token.tag_name === 'tfoot') { - // DONE: A tfoot element’s end tag may be omitted if there is no more content in the parent element. - - } else if (parser_token.tag_name === 'tr') { - // A tr element’s end tag may be omitted if the tr element is immediately followed by another tr element, or if there is no more content in the parent element. - // A colgroup element's end tag may be ommitted if a thead, tfoot, tbody, or tr element is started. - // A caption element's end tag may be ommitted if a colgroup, thead, tfoot, tbody, or tr element is started. - result = result || this._tag_stack.try_pop('caption', ['table']); - result = result || this._tag_stack.try_pop('colgroup', ['table']); - result = result || this._tag_stack.try_pop('tr', ['table', 'thead', 'tbody', 'tfoot']); - - } else if (parser_token.tag_name === 'th' || parser_token.tag_name === 'td') { - // A td element’s end tag may be omitted if the td element is immediately followed by a td or th element, or if there is no more content in the parent element. - // A th element’s end tag may be omitted if the th element is immediately followed by a td or th element, or if there is no more content in the parent element. - result = result || this._tag_stack.try_pop('td', ['table', 'thead', 'tbody', 'tfoot', 'tr']); - result = result || this._tag_stack.try_pop('th', ['table', 'thead', 'tbody', 'tfoot', 'tr']); - } - - // Start element omission not handled currently - // A head element’s start tag may be omitted if the element is empty, or if the first thing inside the head element is an element. - // A tbody element’s start tag may be omitted if the first thing inside the tbody element is a tr element, and if the element is not immediately preceded by a tbody, thead, or tfoot element whose end tag has been omitted. (It can’t be omitted if the element is empty.) - // A colgroup element’s start tag may be omitted if the first thing inside the colgroup element is a col element, and if the element is not immediately preceded by another colgroup element whose end tag has been omitted. (It can’t be omitted if the element is empty.) - - // Fix up the parent of the parser token - parser_token.parent = this._tag_stack.get_parser_token(); - - return result; -}; - -module.exports.Beautifier = Beautifier; diff --git a/node_modules/js-beautify/js/src/html/index.js b/node_modules/js-beautify/js/src/html/index.js deleted file mode 100644 index 9bd9aba3..00000000 --- a/node_modules/js-beautify/js/src/html/index.js +++ /dev/null @@ -1,42 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Beautifier = require('./beautifier').Beautifier, - Options = require('./options').Options; - -function style_html(html_source, options, js_beautify, css_beautify) { - var beautifier = new Beautifier(html_source, options, js_beautify, css_beautify); - return beautifier.beautify(); -} - -module.exports = style_html; -module.exports.defaultOptions = function() { - return new Options(); -}; diff --git a/node_modules/js-beautify/js/src/html/options.js b/node_modules/js-beautify/js/src/html/options.js deleted file mode 100644 index 7df089ac..00000000 --- a/node_modules/js-beautify/js/src/html/options.js +++ /dev/null @@ -1,91 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var BaseOptions = require('../core/options').Options; - -function Options(options) { - BaseOptions.call(this, options, 'html'); - if (this.templating.length === 1 && this.templating[0] === 'auto') { - this.templating = ['django', 'erb', 'handlebars', 'php']; - } - - this.indent_inner_html = this._get_boolean('indent_inner_html'); - this.indent_body_inner_html = this._get_boolean('indent_body_inner_html', true); - this.indent_head_inner_html = this._get_boolean('indent_head_inner_html', true); - - this.indent_handlebars = this._get_boolean('indent_handlebars', true); - this.wrap_attributes = this._get_selection('wrap_attributes', - ['auto', 'force', 'force-aligned', 'force-expand-multiline', 'aligned-multiple', 'preserve', 'preserve-aligned']); - this.wrap_attributes_indent_size = this._get_number('wrap_attributes_indent_size', this.indent_size); - this.extra_liners = this._get_array('extra_liners', ['head', 'body', '/html']); - - // Block vs inline elements - // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements - // https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements - // https://www.w3.org/TR/html5/dom.html#phrasing-content - this.inline = this._get_array('inline', [ - 'a', 'abbr', 'area', 'audio', 'b', 'bdi', 'bdo', 'br', 'button', 'canvas', 'cite', - 'code', 'data', 'datalist', 'del', 'dfn', 'em', 'embed', 'i', 'iframe', 'img', - 'input', 'ins', 'kbd', 'keygen', 'label', 'map', 'mark', 'math', 'meter', 'noscript', - 'object', 'output', 'progress', 'q', 'ruby', 's', 'samp', /* 'script', */ 'select', 'small', - 'span', 'strong', 'sub', 'sup', 'svg', 'template', 'textarea', 'time', 'u', 'var', - 'video', 'wbr', 'text', - // obsolete inline tags - 'acronym', 'big', 'strike', 'tt' - ]); - this.void_elements = this._get_array('void_elements', [ - // HTLM void elements - aka self-closing tags - aka singletons - // https://www.w3.org/html/wg/drafts/html/master/syntax.html#void-elements - 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', - 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr', - // NOTE: Optional tags are too complex for a simple list - // they are hard coded in _do_optional_end_element - - // Doctype and xml elements - '!doctype', '?xml', - - // obsolete tags - // basefont: https://www.computerhope.com/jargon/h/html-basefont-tag.htm - // isndex: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/isindex - 'basefont', 'isindex' - ]); - this.unformatted = this._get_array('unformatted', []); - this.content_unformatted = this._get_array('content_unformatted', [ - 'pre', 'textarea' - ]); - this.unformatted_content_delimiter = this._get_characters('unformatted_content_delimiter'); - this.indent_scripts = this._get_selection('indent_scripts', ['normal', 'keep', 'separate']); - -} -Options.prototype = new BaseOptions(); - - - -module.exports.Options = Options; diff --git a/node_modules/js-beautify/js/src/html/tokenizer.js b/node_modules/js-beautify/js/src/html/tokenizer.js deleted file mode 100644 index 8cd9d70f..00000000 --- a/node_modules/js-beautify/js/src/html/tokenizer.js +++ /dev/null @@ -1,329 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var BaseTokenizer = require('../core/tokenizer').Tokenizer; -var BASETOKEN = require('../core/tokenizer').TOKEN; -var Directives = require('../core/directives').Directives; -var TemplatablePattern = require('../core/templatablepattern').TemplatablePattern; -var Pattern = require('../core/pattern').Pattern; - -var TOKEN = { - TAG_OPEN: 'TK_TAG_OPEN', - TAG_CLOSE: 'TK_TAG_CLOSE', - ATTRIBUTE: 'TK_ATTRIBUTE', - EQUALS: 'TK_EQUALS', - VALUE: 'TK_VALUE', - COMMENT: 'TK_COMMENT', - TEXT: 'TK_TEXT', - UNKNOWN: 'TK_UNKNOWN', - START: BASETOKEN.START, - RAW: BASETOKEN.RAW, - EOF: BASETOKEN.EOF -}; - -var directives_core = new Directives(/<\!--/, /-->/); - -var Tokenizer = function(input_string, options) { - BaseTokenizer.call(this, input_string, options); - this._current_tag_name = ''; - - // Words end at whitespace or when a tag starts - // if we are indenting handlebars, they are considered tags - var templatable_reader = new TemplatablePattern(this._input).read_options(this._options); - var pattern_reader = new Pattern(this._input); - - this.__patterns = { - word: templatable_reader.until(/[\n\r\t <]/), - single_quote: templatable_reader.until_after(/'/), - double_quote: templatable_reader.until_after(/"/), - attribute: templatable_reader.until(/[\n\r\t =\/>]/), - element_name: templatable_reader.until(/[\n\r\t >\/]/), - - handlebars_comment: pattern_reader.starting_with(/{{!--/).until_after(/--}}/), - handlebars: pattern_reader.starting_with(/{{/).until_after(/}}/), - handlebars_open: pattern_reader.until(/[\n\r\t }]/), - handlebars_raw_close: pattern_reader.until(/}}/), - comment: pattern_reader.starting_with(//), - cdata: pattern_reader.starting_with(//), - // https://en.wikipedia.org/wiki/Conditional_comment - conditional_comment: pattern_reader.starting_with(//), - processing: pattern_reader.starting_with(/<\?/).until_after(/\?>/) - }; - - if (this._options.indent_handlebars) { - this.__patterns.word = this.__patterns.word.exclude('handlebars'); - } - - this._unformatted_content_delimiter = null; - - if (this._options.unformatted_content_delimiter) { - var literal_regexp = this._input.get_literal_regexp(this._options.unformatted_content_delimiter); - this.__patterns.unformatted_content_delimiter = - pattern_reader.matching(literal_regexp) - .until_after(literal_regexp); - } -}; -Tokenizer.prototype = new BaseTokenizer(); - -Tokenizer.prototype._is_comment = function(current_token) { // jshint unused:false - return false; //current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.UNKNOWN; -}; - -Tokenizer.prototype._is_opening = function(current_token) { - return current_token.type === TOKEN.TAG_OPEN; -}; - -Tokenizer.prototype._is_closing = function(current_token, open_token) { - return current_token.type === TOKEN.TAG_CLOSE && - (open_token && ( - ((current_token.text === '>' || current_token.text === '/>') && open_token.text[0] === '<') || - (current_token.text === '}}' && open_token.text[0] === '{' && open_token.text[1] === '{'))); -}; - -Tokenizer.prototype._reset = function() { - this._current_tag_name = ''; -}; - -Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false - var token = null; - this._readWhitespace(); - var c = this._input.peek(); - - if (c === null) { - return this._create_token(TOKEN.EOF, ''); - } - - token = token || this._read_open_handlebars(c, open_token); - token = token || this._read_attribute(c, previous_token, open_token); - token = token || this._read_raw_content(c, previous_token, open_token); - token = token || this._read_close(c, open_token); - token = token || this._read_content_word(c); - token = token || this._read_comment_or_cdata(c); - token = token || this._read_processing(c); - token = token || this._read_open(c, open_token); - token = token || this._create_token(TOKEN.UNKNOWN, this._input.next()); - - return token; -}; - -Tokenizer.prototype._read_comment_or_cdata = function(c) { // jshint unused:false - var token = null; - var resulting_string = null; - var directives = null; - - if (c === '<') { - var peek1 = this._input.peek(1); - // We treat all comments as literals, even more than preformatted tags - // we only look for the appropriate closing marker - if (peek1 === '!') { - resulting_string = this.__patterns.comment.read(); - - // only process directive on html comments - if (resulting_string) { - directives = directives_core.get_directives(resulting_string); - if (directives && directives.ignore === 'start') { - resulting_string += directives_core.readIgnored(this._input); - } - } else { - resulting_string = this.__patterns.cdata.read(); - } - } - - if (resulting_string) { - token = this._create_token(TOKEN.COMMENT, resulting_string); - token.directives = directives; - } - } - - return token; -}; - -Tokenizer.prototype._read_processing = function(c) { // jshint unused:false - var token = null; - var resulting_string = null; - var directives = null; - - if (c === '<') { - var peek1 = this._input.peek(1); - if (peek1 === '!' || peek1 === '?') { - resulting_string = this.__patterns.conditional_comment.read(); - resulting_string = resulting_string || this.__patterns.processing.read(); - } - - if (resulting_string) { - token = this._create_token(TOKEN.COMMENT, resulting_string); - token.directives = directives; - } - } - - return token; -}; - -Tokenizer.prototype._read_open = function(c, open_token) { - var resulting_string = null; - var token = null; - if (!open_token) { - if (c === '<') { - - resulting_string = this._input.next(); - if (this._input.peek() === '/') { - resulting_string += this._input.next(); - } - resulting_string += this.__patterns.element_name.read(); - token = this._create_token(TOKEN.TAG_OPEN, resulting_string); - } - } - return token; -}; - -Tokenizer.prototype._read_open_handlebars = function(c, open_token) { - var resulting_string = null; - var token = null; - if (!open_token) { - if (this._options.indent_handlebars && c === '{' && this._input.peek(1) === '{') { - if (this._input.peek(2) === '!') { - resulting_string = this.__patterns.handlebars_comment.read(); - resulting_string = resulting_string || this.__patterns.handlebars.read(); - token = this._create_token(TOKEN.COMMENT, resulting_string); - } else { - resulting_string = this.__patterns.handlebars_open.read(); - token = this._create_token(TOKEN.TAG_OPEN, resulting_string); - } - } - } - return token; -}; - - -Tokenizer.prototype._read_close = function(c, open_token) { - var resulting_string = null; - var token = null; - if (open_token) { - if (open_token.text[0] === '<' && (c === '>' || (c === '/' && this._input.peek(1) === '>'))) { - resulting_string = this._input.next(); - if (c === '/') { // for close tag "/>" - resulting_string += this._input.next(); - } - token = this._create_token(TOKEN.TAG_CLOSE, resulting_string); - } else if (open_token.text[0] === '{' && c === '}' && this._input.peek(1) === '}') { - this._input.next(); - this._input.next(); - token = this._create_token(TOKEN.TAG_CLOSE, '}}'); - } - } - - return token; -}; - -Tokenizer.prototype._read_attribute = function(c, previous_token, open_token) { - var token = null; - var resulting_string = ''; - if (open_token && open_token.text[0] === '<') { - - if (c === '=') { - token = this._create_token(TOKEN.EQUALS, this._input.next()); - } else if (c === '"' || c === "'") { - var content = this._input.next(); - if (c === '"') { - content += this.__patterns.double_quote.read(); - } else { - content += this.__patterns.single_quote.read(); - } - token = this._create_token(TOKEN.VALUE, content); - } else { - resulting_string = this.__patterns.attribute.read(); - - if (resulting_string) { - if (previous_token.type === TOKEN.EQUALS) { - token = this._create_token(TOKEN.VALUE, resulting_string); - } else { - token = this._create_token(TOKEN.ATTRIBUTE, resulting_string); - } - } - } - } - return token; -}; - -Tokenizer.prototype._is_content_unformatted = function(tag_name) { - // void_elements have no content and so cannot have unformatted content - // script and style tags should always be read as unformatted content - // finally content_unformatted and unformatted element contents are unformatted - return this._options.void_elements.indexOf(tag_name) === -1 && - (this._options.content_unformatted.indexOf(tag_name) !== -1 || - this._options.unformatted.indexOf(tag_name) !== -1); -}; - - -Tokenizer.prototype._read_raw_content = function(c, previous_token, open_token) { // jshint unused:false - var resulting_string = ''; - if (open_token && open_token.text[0] === '{') { - resulting_string = this.__patterns.handlebars_raw_close.read(); - } else if (previous_token.type === TOKEN.TAG_CLOSE && (previous_token.opened.text[0] === '<')) { - var tag_name = previous_token.opened.text.substr(1).toLowerCase(); - if (tag_name === 'script' || tag_name === 'style') { - // Script and style tags are allowed to have comments wrapping their content - // or just have regular content. - var token = this._read_comment_or_cdata(c); - if (token) { - token.type = TOKEN.TEXT; - return token; - } - resulting_string = this._input.readUntil(new RegExp('', 'ig')); - } else if (this._is_content_unformatted(tag_name)) { - resulting_string = this._input.readUntil(new RegExp('', 'ig')); - } - } - - if (resulting_string) { - return this._create_token(TOKEN.TEXT, resulting_string); - } - - return null; -}; - -Tokenizer.prototype._read_content_word = function(c) { - var resulting_string = ''; - if (this._options.unformatted_content_delimiter) { - if (c === this._options.unformatted_content_delimiter[0]) { - resulting_string = this.__patterns.unformatted_content_delimiter.read(); - } - } - - if (!resulting_string) { - resulting_string = this.__patterns.word.read(); - } - if (resulting_string) { - return this._create_token(TOKEN.TEXT, resulting_string); - } -}; - -module.exports.Tokenizer = Tokenizer; -module.exports.TOKEN = TOKEN; diff --git a/node_modules/js-beautify/js/src/index.js b/node_modules/js-beautify/js/src/index.js deleted file mode 100644 index 3c0cc3a8..00000000 --- a/node_modules/js-beautify/js/src/index.js +++ /dev/null @@ -1,44 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var js_beautify = require('./javascript/index'); -var css_beautify = require('./css/index'); -var html_beautify = require('./html/index'); - -function style_html(html_source, options, js, css) { - js = js || js_beautify; - css = css || css_beautify; - return html_beautify(html_source, options, js, css); -} -style_html.defaultOptions = html_beautify.defaultOptions; - -module.exports.js = js_beautify; -module.exports.css = css_beautify; -module.exports.html = style_html; diff --git a/node_modules/js-beautify/js/src/javascript/acorn.js b/node_modules/js-beautify/js/src/javascript/acorn.js deleted file mode 100644 index 0442c30e..00000000 --- a/node_modules/js-beautify/js/src/javascript/acorn.js +++ /dev/null @@ -1,57 +0,0 @@ -/* jshint node: true, curly: false */ -// Parts of this section of code is taken from acorn. -// -// Acorn was written by Marijn Haverbeke and released under an MIT -// license. The Unicode regexps (for identifiers and whitespace) were -// taken from [Esprima](http://esprima.org) by Ariya Hidayat. -// -// Git repositories for Acorn are available at -// -// http://marijnhaverbeke.nl/git/acorn -// https://github.com/marijnh/acorn.git - -// ## Character categories - - -'use strict'; - -// acorn used char codes to squeeze the last bit of performance out -// Beautifier is okay without that, so we're using regex -// permit $ (36) and @ (64). @ is used in ES7 decorators. -// 65 through 91 are uppercase letters. -// permit _ (95). -// 97 through 123 are lowercase letters. -var baseASCIIidentifierStartChars = "\\x24\\x40\\x41-\\x5a\\x5f\\x61-\\x7a"; - -// inside an identifier @ is not allowed but 0-9 are. -var baseASCIIidentifierChars = "\\x24\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a"; - -// Big ugly regular expressions that match characters in the -// whitespace, identifier, and identifier-start categories. These -// are only applied when a character is found to actually have a -// code point above 128. -var nonASCIIidentifierStartChars = "\\xaa\\xb5\\xba\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\u02c1\\u02c6-\\u02d1\\u02e0-\\u02e4\\u02ec\\u02ee\\u0370-\\u0374\\u0376\\u0377\\u037a-\\u037d\\u0386\\u0388-\\u038a\\u038c\\u038e-\\u03a1\\u03a3-\\u03f5\\u03f7-\\u0481\\u048a-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05d0-\\u05ea\\u05f0-\\u05f2\\u0620-\\u064a\\u066e\\u066f\\u0671-\\u06d3\\u06d5\\u06e5\\u06e6\\u06ee\\u06ef\\u06fa-\\u06fc\\u06ff\\u0710\\u0712-\\u072f\\u074d-\\u07a5\\u07b1\\u07ca-\\u07ea\\u07f4\\u07f5\\u07fa\\u0800-\\u0815\\u081a\\u0824\\u0828\\u0840-\\u0858\\u08a0\\u08a2-\\u08ac\\u0904-\\u0939\\u093d\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097f\\u0985-\\u098c\\u098f\\u0990\\u0993-\\u09a8\\u09aa-\\u09b0\\u09b2\\u09b6-\\u09b9\\u09bd\\u09ce\\u09dc\\u09dd\\u09df-\\u09e1\\u09f0\\u09f1\\u0a05-\\u0a0a\\u0a0f\\u0a10\\u0a13-\\u0a28\\u0a2a-\\u0a30\\u0a32\\u0a33\\u0a35\\u0a36\\u0a38\\u0a39\\u0a59-\\u0a5c\\u0a5e\\u0a72-\\u0a74\\u0a85-\\u0a8d\\u0a8f-\\u0a91\\u0a93-\\u0aa8\\u0aaa-\\u0ab0\\u0ab2\\u0ab3\\u0ab5-\\u0ab9\\u0abd\\u0ad0\\u0ae0\\u0ae1\\u0b05-\\u0b0c\\u0b0f\\u0b10\\u0b13-\\u0b28\\u0b2a-\\u0b30\\u0b32\\u0b33\\u0b35-\\u0b39\\u0b3d\\u0b5c\\u0b5d\\u0b5f-\\u0b61\\u0b71\\u0b83\\u0b85-\\u0b8a\\u0b8e-\\u0b90\\u0b92-\\u0b95\\u0b99\\u0b9a\\u0b9c\\u0b9e\\u0b9f\\u0ba3\\u0ba4\\u0ba8-\\u0baa\\u0bae-\\u0bb9\\u0bd0\\u0c05-\\u0c0c\\u0c0e-\\u0c10\\u0c12-\\u0c28\\u0c2a-\\u0c33\\u0c35-\\u0c39\\u0c3d\\u0c58\\u0c59\\u0c60\\u0c61\\u0c85-\\u0c8c\\u0c8e-\\u0c90\\u0c92-\\u0ca8\\u0caa-\\u0cb3\\u0cb5-\\u0cb9\\u0cbd\\u0cde\\u0ce0\\u0ce1\\u0cf1\\u0cf2\\u0d05-\\u0d0c\\u0d0e-\\u0d10\\u0d12-\\u0d3a\\u0d3d\\u0d4e\\u0d60\\u0d61\\u0d7a-\\u0d7f\\u0d85-\\u0d96\\u0d9a-\\u0db1\\u0db3-\\u0dbb\\u0dbd\\u0dc0-\\u0dc6\\u0e01-\\u0e30\\u0e32\\u0e33\\u0e40-\\u0e46\\u0e81\\u0e82\\u0e84\\u0e87\\u0e88\\u0e8a\\u0e8d\\u0e94-\\u0e97\\u0e99-\\u0e9f\\u0ea1-\\u0ea3\\u0ea5\\u0ea7\\u0eaa\\u0eab\\u0ead-\\u0eb0\\u0eb2\\u0eb3\\u0ebd\\u0ec0-\\u0ec4\\u0ec6\\u0edc-\\u0edf\\u0f00\\u0f40-\\u0f47\\u0f49-\\u0f6c\\u0f88-\\u0f8c\\u1000-\\u102a\\u103f\\u1050-\\u1055\\u105a-\\u105d\\u1061\\u1065\\u1066\\u106e-\\u1070\\u1075-\\u1081\\u108e\\u10a0-\\u10c5\\u10c7\\u10cd\\u10d0-\\u10fa\\u10fc-\\u1248\\u124a-\\u124d\\u1250-\\u1256\\u1258\\u125a-\\u125d\\u1260-\\u1288\\u128a-\\u128d\\u1290-\\u12b0\\u12b2-\\u12b5\\u12b8-\\u12be\\u12c0\\u12c2-\\u12c5\\u12c8-\\u12d6\\u12d8-\\u1310\\u1312-\\u1315\\u1318-\\u135a\\u1380-\\u138f\\u13a0-\\u13f4\\u1401-\\u166c\\u166f-\\u167f\\u1681-\\u169a\\u16a0-\\u16ea\\u16ee-\\u16f0\\u1700-\\u170c\\u170e-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176c\\u176e-\\u1770\\u1780-\\u17b3\\u17d7\\u17dc\\u1820-\\u1877\\u1880-\\u18a8\\u18aa\\u18b0-\\u18f5\\u1900-\\u191c\\u1950-\\u196d\\u1970-\\u1974\\u1980-\\u19ab\\u19c1-\\u19c7\\u1a00-\\u1a16\\u1a20-\\u1a54\\u1aa7\\u1b05-\\u1b33\\u1b45-\\u1b4b\\u1b83-\\u1ba0\\u1bae\\u1baf\\u1bba-\\u1be5\\u1c00-\\u1c23\\u1c4d-\\u1c4f\\u1c5a-\\u1c7d\\u1ce9-\\u1cec\\u1cee-\\u1cf1\\u1cf5\\u1cf6\\u1d00-\\u1dbf\\u1e00-\\u1f15\\u1f18-\\u1f1d\\u1f20-\\u1f45\\u1f48-\\u1f4d\\u1f50-\\u1f57\\u1f59\\u1f5b\\u1f5d\\u1f5f-\\u1f7d\\u1f80-\\u1fb4\\u1fb6-\\u1fbc\\u1fbe\\u1fc2-\\u1fc4\\u1fc6-\\u1fcc\\u1fd0-\\u1fd3\\u1fd6-\\u1fdb\\u1fe0-\\u1fec\\u1ff2-\\u1ff4\\u1ff6-\\u1ffc\\u2071\\u207f\\u2090-\\u209c\\u2102\\u2107\\u210a-\\u2113\\u2115\\u2119-\\u211d\\u2124\\u2126\\u2128\\u212a-\\u212d\\u212f-\\u2139\\u213c-\\u213f\\u2145-\\u2149\\u214e\\u2160-\\u2188\\u2c00-\\u2c2e\\u2c30-\\u2c5e\\u2c60-\\u2ce4\\u2ceb-\\u2cee\\u2cf2\\u2cf3\\u2d00-\\u2d25\\u2d27\\u2d2d\\u2d30-\\u2d67\\u2d6f\\u2d80-\\u2d96\\u2da0-\\u2da6\\u2da8-\\u2dae\\u2db0-\\u2db6\\u2db8-\\u2dbe\\u2dc0-\\u2dc6\\u2dc8-\\u2dce\\u2dd0-\\u2dd6\\u2dd8-\\u2dde\\u2e2f\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303c\\u3041-\\u3096\\u309d-\\u309f\\u30a1-\\u30fa\\u30fc-\\u30ff\\u3105-\\u312d\\u3131-\\u318e\\u31a0-\\u31ba\\u31f0-\\u31ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\ua000-\\ua48c\\ua4d0-\\ua4fd\\ua500-\\ua60c\\ua610-\\ua61f\\ua62a\\ua62b\\ua640-\\ua66e\\ua67f-\\ua697\\ua6a0-\\ua6ef\\ua717-\\ua71f\\ua722-\\ua788\\ua78b-\\ua78e\\ua790-\\ua793\\ua7a0-\\ua7aa\\ua7f8-\\ua801\\ua803-\\ua805\\ua807-\\ua80a\\ua80c-\\ua822\\ua840-\\ua873\\ua882-\\ua8b3\\ua8f2-\\ua8f7\\ua8fb\\ua90a-\\ua925\\ua930-\\ua946\\ua960-\\ua97c\\ua984-\\ua9b2\\ua9cf\\uaa00-\\uaa28\\uaa40-\\uaa42\\uaa44-\\uaa4b\\uaa60-\\uaa76\\uaa7a\\uaa80-\\uaaaf\\uaab1\\uaab5\\uaab6\\uaab9-\\uaabd\\uaac0\\uaac2\\uaadb-\\uaadd\\uaae0-\\uaaea\\uaaf2-\\uaaf4\\uab01-\\uab06\\uab09-\\uab0e\\uab11-\\uab16\\uab20-\\uab26\\uab28-\\uab2e\\uabc0-\\uabe2\\uac00-\\ud7a3\\ud7b0-\\ud7c6\\ud7cb-\\ud7fb\\uf900-\\ufa6d\\ufa70-\\ufad9\\ufb00-\\ufb06\\ufb13-\\ufb17\\ufb1d\\ufb1f-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40\\ufb41\\ufb43\\ufb44\\ufb46-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uffbe\\uffc2-\\uffc7\\uffca-\\uffcf\\uffd2-\\uffd7\\uffda-\\uffdc"; -var nonASCIIidentifierChars = "\\u0300-\\u036f\\u0483-\\u0487\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u0620-\\u0649\\u0672-\\u06d3\\u06e7-\\u06e8\\u06fb-\\u06fc\\u0730-\\u074a\\u0800-\\u0814\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0840-\\u0857\\u08e4-\\u08fe\\u0900-\\u0903\\u093a-\\u093c\\u093e-\\u094f\\u0951-\\u0957\\u0962-\\u0963\\u0966-\\u096f\\u0981-\\u0983\\u09bc\\u09be-\\u09c4\\u09c7\\u09c8\\u09d7\\u09df-\\u09e0\\u0a01-\\u0a03\\u0a3c\\u0a3e-\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a66-\\u0a71\\u0a75\\u0a81-\\u0a83\\u0abc\\u0abe-\\u0ac5\\u0ac7-\\u0ac9\\u0acb-\\u0acd\\u0ae2-\\u0ae3\\u0ae6-\\u0aef\\u0b01-\\u0b03\\u0b3c\\u0b3e-\\u0b44\\u0b47\\u0b48\\u0b4b-\\u0b4d\\u0b56\\u0b57\\u0b5f-\\u0b60\\u0b66-\\u0b6f\\u0b82\\u0bbe-\\u0bc2\\u0bc6-\\u0bc8\\u0bca-\\u0bcd\\u0bd7\\u0be6-\\u0bef\\u0c01-\\u0c03\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62-\\u0c63\\u0c66-\\u0c6f\\u0c82\\u0c83\\u0cbc\\u0cbe-\\u0cc4\\u0cc6-\\u0cc8\\u0cca-\\u0ccd\\u0cd5\\u0cd6\\u0ce2-\\u0ce3\\u0ce6-\\u0cef\\u0d02\\u0d03\\u0d46-\\u0d48\\u0d57\\u0d62-\\u0d63\\u0d66-\\u0d6f\\u0d82\\u0d83\\u0dca\\u0dcf-\\u0dd4\\u0dd6\\u0dd8-\\u0ddf\\u0df2\\u0df3\\u0e34-\\u0e3a\\u0e40-\\u0e45\\u0e50-\\u0e59\\u0eb4-\\u0eb9\\u0ec8-\\u0ecd\\u0ed0-\\u0ed9\\u0f18\\u0f19\\u0f20-\\u0f29\\u0f35\\u0f37\\u0f39\\u0f41-\\u0f47\\u0f71-\\u0f84\\u0f86-\\u0f87\\u0f8d-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u1000-\\u1029\\u1040-\\u1049\\u1067-\\u106d\\u1071-\\u1074\\u1082-\\u108d\\u108f-\\u109d\\u135d-\\u135f\\u170e-\\u1710\\u1720-\\u1730\\u1740-\\u1750\\u1772\\u1773\\u1780-\\u17b2\\u17dd\\u17e0-\\u17e9\\u180b-\\u180d\\u1810-\\u1819\\u1920-\\u192b\\u1930-\\u193b\\u1951-\\u196d\\u19b0-\\u19c0\\u19c8-\\u19c9\\u19d0-\\u19d9\\u1a00-\\u1a15\\u1a20-\\u1a53\\u1a60-\\u1a7c\\u1a7f-\\u1a89\\u1a90-\\u1a99\\u1b46-\\u1b4b\\u1b50-\\u1b59\\u1b6b-\\u1b73\\u1bb0-\\u1bb9\\u1be6-\\u1bf3\\u1c00-\\u1c22\\u1c40-\\u1c49\\u1c5b-\\u1c7d\\u1cd0-\\u1cd2\\u1d00-\\u1dbe\\u1e01-\\u1f15\\u200c\\u200d\\u203f\\u2040\\u2054\\u20d0-\\u20dc\\u20e1\\u20e5-\\u20f0\\u2d81-\\u2d96\\u2de0-\\u2dff\\u3021-\\u3028\\u3099\\u309a\\ua640-\\ua66d\\ua674-\\ua67d\\ua69f\\ua6f0-\\ua6f1\\ua7f8-\\ua800\\ua806\\ua80b\\ua823-\\ua827\\ua880-\\ua881\\ua8b4-\\ua8c4\\ua8d0-\\ua8d9\\ua8f3-\\ua8f7\\ua900-\\ua909\\ua926-\\ua92d\\ua930-\\ua945\\ua980-\\ua983\\ua9b3-\\ua9c0\\uaa00-\\uaa27\\uaa40-\\uaa41\\uaa4c-\\uaa4d\\uaa50-\\uaa59\\uaa7b\\uaae0-\\uaae9\\uaaf2-\\uaaf3\\uabc0-\\uabe1\\uabec\\uabed\\uabf0-\\uabf9\\ufb20-\\ufb28\\ufe00-\\ufe0f\\ufe20-\\ufe26\\ufe33\\ufe34\\ufe4d-\\ufe4f\\uff10-\\uff19\\uff3f"; -//var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); -//var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); - -var identifierStart = "(?:\\\\u[0-9a-fA-F]{4}|[" + baseASCIIidentifierStartChars + nonASCIIidentifierStartChars + "])"; -var identifierChars = "(?:\\\\u[0-9a-fA-F]{4}|[" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "])*"; - -exports.identifier = new RegExp(identifierStart + identifierChars, 'g'); -exports.identifierStart = new RegExp(identifierStart); -exports.identifierMatch = new RegExp("(?:\\\\u[0-9a-fA-F]{4}|[" + baseASCIIidentifierChars + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "])+"); - -var nonASCIIwhitespace = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/; // jshint ignore:line - -// Whether a single character denotes a newline. - -exports.newline = /[\n\r\u2028\u2029]/; - -// Matches a whole line break (where CRLF is considered a single -// line break). Used to count lines. - -// in javascript, these two differ -// in python they are the same, different methods are called on them -exports.lineBreak = new RegExp('\r\n|' + exports.newline.source); -exports.allLineBreaks = new RegExp(exports.lineBreak.source, 'g'); diff --git a/node_modules/js-beautify/js/src/javascript/beautifier.js b/node_modules/js-beautify/js/src/javascript/beautifier.js deleted file mode 100644 index 6490e4d7..00000000 --- a/node_modules/js-beautify/js/src/javascript/beautifier.js +++ /dev/null @@ -1,1455 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Output = require('../core/output').Output; -var Token = require('../core/token').Token; -var acorn = require('./acorn'); -var Options = require('./options').Options; -var Tokenizer = require('./tokenizer').Tokenizer; -var line_starters = require('./tokenizer').line_starters; -var positionable_operators = require('./tokenizer').positionable_operators; -var TOKEN = require('./tokenizer').TOKEN; - - -function in_array(what, arr) { - return arr.indexOf(what) !== -1; -} - -function ltrim(s) { - return s.replace(/^\s+/g, ''); -} - -function generateMapFromStrings(list) { - var result = {}; - for (var x = 0; x < list.length; x++) { - // make the mapped names underscored instead of dash - result[list[x].replace(/-/g, '_')] = list[x]; - } - return result; -} - -function reserved_word(token, word) { - return token && token.type === TOKEN.RESERVED && token.text === word; -} - -function reserved_array(token, words) { - return token && token.type === TOKEN.RESERVED && in_array(token.text, words); -} -// Unsure of what they mean, but they work. Worth cleaning up in future. -var special_words = ['case', 'return', 'do', 'if', 'throw', 'else', 'await', 'break', 'continue', 'async']; - -var validPositionValues = ['before-newline', 'after-newline', 'preserve-newline']; - -// Generate map from array -var OPERATOR_POSITION = generateMapFromStrings(validPositionValues); - -var OPERATOR_POSITION_BEFORE_OR_PRESERVE = [OPERATOR_POSITION.before_newline, OPERATOR_POSITION.preserve_newline]; - -var MODE = { - BlockStatement: 'BlockStatement', // 'BLOCK' - Statement: 'Statement', // 'STATEMENT' - ObjectLiteral: 'ObjectLiteral', // 'OBJECT', - ArrayLiteral: 'ArrayLiteral', //'[EXPRESSION]', - ForInitializer: 'ForInitializer', //'(FOR-EXPRESSION)', - Conditional: 'Conditional', //'(COND-EXPRESSION)', - Expression: 'Expression' //'(EXPRESSION)' -}; - -function remove_redundant_indentation(output, frame) { - // This implementation is effective but has some issues: - // - can cause line wrap to happen too soon due to indent removal - // after wrap points are calculated - // These issues are minor compared to ugly indentation. - - if (frame.multiline_frame || - frame.mode === MODE.ForInitializer || - frame.mode === MODE.Conditional) { - return; - } - - // remove one indent from each line inside this section - output.remove_indent(frame.start_line_index); -} - -// we could use just string.split, but -// IE doesn't like returning empty strings -function split_linebreaks(s) { - //return s.split(/\x0d\x0a|\x0a/); - - s = s.replace(acorn.allLineBreaks, '\n'); - var out = [], - idx = s.indexOf("\n"); - while (idx !== -1) { - out.push(s.substring(0, idx)); - s = s.substring(idx + 1); - idx = s.indexOf("\n"); - } - if (s.length) { - out.push(s); - } - return out; -} - -function is_array(mode) { - return mode === MODE.ArrayLiteral; -} - -function is_expression(mode) { - return in_array(mode, [MODE.Expression, MODE.ForInitializer, MODE.Conditional]); -} - -function all_lines_start_with(lines, c) { - for (var i = 0; i < lines.length; i++) { - var line = lines[i].trim(); - if (line.charAt(0) !== c) { - return false; - } - } - return true; -} - -function each_line_matches_indent(lines, indent) { - var i = 0, - len = lines.length, - line; - for (; i < len; i++) { - line = lines[i]; - // allow empty lines to pass through - if (line && line.indexOf(indent) !== 0) { - return false; - } - } - return true; -} - - -function Beautifier(source_text, options) { - options = options || {}; - this._source_text = source_text || ''; - - this._output = null; - this._tokens = null; - this._last_last_text = null; - this._flags = null; - this._previous_flags = null; - - this._flag_store = null; - this._options = new Options(options); -} - -Beautifier.prototype.create_flags = function(flags_base, mode) { - var next_indent_level = 0; - if (flags_base) { - next_indent_level = flags_base.indentation_level; - if (!this._output.just_added_newline() && - flags_base.line_indent_level > next_indent_level) { - next_indent_level = flags_base.line_indent_level; - } - } - - var next_flags = { - mode: mode, - parent: flags_base, - last_token: flags_base ? flags_base.last_token : new Token(TOKEN.START_BLOCK, ''), // last token text - last_word: flags_base ? flags_base.last_word : '', // last TOKEN.WORD passed - declaration_statement: false, - declaration_assignment: false, - multiline_frame: false, - inline_frame: false, - if_block: false, - else_block: false, - do_block: false, - do_while: false, - import_block: false, - in_case_statement: false, // switch(..){ INSIDE HERE } - in_case: false, // we're on the exact line with "case 0:" - case_body: false, // the indented case-action block - indentation_level: next_indent_level, - alignment: 0, - line_indent_level: flags_base ? flags_base.line_indent_level : next_indent_level, - start_line_index: this._output.get_line_number(), - ternary_depth: 0 - }; - return next_flags; -}; - -Beautifier.prototype._reset = function(source_text) { - var baseIndentString = source_text.match(/^[\t ]*/)[0]; - - this._last_last_text = ''; // pre-last token text - this._output = new Output(this._options, baseIndentString); - - // If testing the ignore directive, start with output disable set to true - this._output.raw = this._options.test_output_raw; - - - // Stack of parsing/formatting states, including MODE. - // We tokenize, parse, and output in an almost purely a forward-only stream of token input - // and formatted output. This makes the beautifier less accurate than full parsers - // but also far more tolerant of syntax errors. - // - // For example, the default mode is MODE.BlockStatement. If we see a '{' we push a new frame of type - // MODE.BlockStatement on the the stack, even though it could be object literal. If we later - // encounter a ":", we'll switch to to MODE.ObjectLiteral. If we then see a ";", - // most full parsers would die, but the beautifier gracefully falls back to - // MODE.BlockStatement and continues on. - this._flag_store = []; - this.set_mode(MODE.BlockStatement); - var tokenizer = new Tokenizer(source_text, this._options); - this._tokens = tokenizer.tokenize(); - return source_text; -}; - -Beautifier.prototype.beautify = function() { - // if disabled, return the input unchanged. - if (this._options.disabled) { - return this._source_text; - } - - var sweet_code; - var source_text = this._reset(this._source_text); - - var eol = this._options.eol; - if (this._options.eol === 'auto') { - eol = '\n'; - if (source_text && acorn.lineBreak.test(source_text || '')) { - eol = source_text.match(acorn.lineBreak)[0]; - } - } - - var current_token = this._tokens.next(); - while (current_token) { - this.handle_token(current_token); - - this._last_last_text = this._flags.last_token.text; - this._flags.last_token = current_token; - - current_token = this._tokens.next(); - } - - sweet_code = this._output.get_code(eol); - - return sweet_code; -}; - -Beautifier.prototype.handle_token = function(current_token, preserve_statement_flags) { - if (current_token.type === TOKEN.START_EXPR) { - this.handle_start_expr(current_token); - } else if (current_token.type === TOKEN.END_EXPR) { - this.handle_end_expr(current_token); - } else if (current_token.type === TOKEN.START_BLOCK) { - this.handle_start_block(current_token); - } else if (current_token.type === TOKEN.END_BLOCK) { - this.handle_end_block(current_token); - } else if (current_token.type === TOKEN.WORD) { - this.handle_word(current_token); - } else if (current_token.type === TOKEN.RESERVED) { - this.handle_word(current_token); - } else if (current_token.type === TOKEN.SEMICOLON) { - this.handle_semicolon(current_token); - } else if (current_token.type === TOKEN.STRING) { - this.handle_string(current_token); - } else if (current_token.type === TOKEN.EQUALS) { - this.handle_equals(current_token); - } else if (current_token.type === TOKEN.OPERATOR) { - this.handle_operator(current_token); - } else if (current_token.type === TOKEN.COMMA) { - this.handle_comma(current_token); - } else if (current_token.type === TOKEN.BLOCK_COMMENT) { - this.handle_block_comment(current_token, preserve_statement_flags); - } else if (current_token.type === TOKEN.COMMENT) { - this.handle_comment(current_token, preserve_statement_flags); - } else if (current_token.type === TOKEN.DOT) { - this.handle_dot(current_token); - } else if (current_token.type === TOKEN.EOF) { - this.handle_eof(current_token); - } else if (current_token.type === TOKEN.UNKNOWN) { - this.handle_unknown(current_token, preserve_statement_flags); - } else { - this.handle_unknown(current_token, preserve_statement_flags); - } -}; - -Beautifier.prototype.handle_whitespace_and_comments = function(current_token, preserve_statement_flags) { - var newlines = current_token.newlines; - var keep_whitespace = this._options.keep_array_indentation && is_array(this._flags.mode); - - if (current_token.comments_before) { - var comment_token = current_token.comments_before.next(); - while (comment_token) { - // The cleanest handling of inline comments is to treat them as though they aren't there. - // Just continue formatting and the behavior should be logical. - // Also ignore unknown tokens. Again, this should result in better behavior. - this.handle_whitespace_and_comments(comment_token, preserve_statement_flags); - this.handle_token(comment_token, preserve_statement_flags); - comment_token = current_token.comments_before.next(); - } - } - - if (keep_whitespace) { - for (var i = 0; i < newlines; i += 1) { - this.print_newline(i > 0, preserve_statement_flags); - } - } else { - if (this._options.max_preserve_newlines && newlines > this._options.max_preserve_newlines) { - newlines = this._options.max_preserve_newlines; - } - - if (this._options.preserve_newlines) { - if (newlines > 1) { - this.print_newline(false, preserve_statement_flags); - for (var j = 1; j < newlines; j += 1) { - this.print_newline(true, preserve_statement_flags); - } - } - } - } - -}; - -var newline_restricted_tokens = ['async', 'break', 'continue', 'return', 'throw', 'yield']; - -Beautifier.prototype.allow_wrap_or_preserved_newline = function(current_token, force_linewrap) { - force_linewrap = (force_linewrap === undefined) ? false : force_linewrap; - - // Never wrap the first token on a line - if (this._output.just_added_newline()) { - return; - } - - var shouldPreserveOrForce = (this._options.preserve_newlines && current_token.newlines) || force_linewrap; - var operatorLogicApplies = in_array(this._flags.last_token.text, positionable_operators) || - in_array(current_token.text, positionable_operators); - - if (operatorLogicApplies) { - var shouldPrintOperatorNewline = ( - in_array(this._flags.last_token.text, positionable_operators) && - in_array(this._options.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE) - ) || - in_array(current_token.text, positionable_operators); - shouldPreserveOrForce = shouldPreserveOrForce && shouldPrintOperatorNewline; - } - - if (shouldPreserveOrForce) { - this.print_newline(false, true); - } else if (this._options.wrap_line_length) { - if (reserved_array(this._flags.last_token, newline_restricted_tokens)) { - // These tokens should never have a newline inserted - // between them and the following expression. - return; - } - this._output.set_wrap_point(); - } -}; - -Beautifier.prototype.print_newline = function(force_newline, preserve_statement_flags) { - if (!preserve_statement_flags) { - if (this._flags.last_token.text !== ';' && this._flags.last_token.text !== ',' && this._flags.last_token.text !== '=' && (this._flags.last_token.type !== TOKEN.OPERATOR || this._flags.last_token.text === '--' || this._flags.last_token.text === '++')) { - var next_token = this._tokens.peek(); - while (this._flags.mode === MODE.Statement && - !(this._flags.if_block && reserved_word(next_token, 'else')) && - !this._flags.do_block) { - this.restore_mode(); - } - } - } - - if (this._output.add_new_line(force_newline)) { - this._flags.multiline_frame = true; - } -}; - -Beautifier.prototype.print_token_line_indentation = function(current_token) { - if (this._output.just_added_newline()) { - if (this._options.keep_array_indentation && - current_token.newlines && - (current_token.text === '[' || is_array(this._flags.mode))) { - this._output.current_line.set_indent(-1); - this._output.current_line.push(current_token.whitespace_before); - this._output.space_before_token = false; - } else if (this._output.set_indent(this._flags.indentation_level, this._flags.alignment)) { - this._flags.line_indent_level = this._flags.indentation_level; - } - } -}; - -Beautifier.prototype.print_token = function(current_token) { - if (this._output.raw) { - this._output.add_raw_token(current_token); - return; - } - - if (this._options.comma_first && current_token.previous && current_token.previous.type === TOKEN.COMMA && - this._output.just_added_newline()) { - if (this._output.previous_line.last() === ',') { - var popped = this._output.previous_line.pop(); - // if the comma was already at the start of the line, - // pull back onto that line and reprint the indentation - if (this._output.previous_line.is_empty()) { - this._output.previous_line.push(popped); - this._output.trim(true); - this._output.current_line.pop(); - this._output.trim(); - } - - // add the comma in front of the next token - this.print_token_line_indentation(current_token); - this._output.add_token(','); - this._output.space_before_token = true; - } - } - - this.print_token_line_indentation(current_token); - this._output.non_breaking_space = true; - this._output.add_token(current_token.text); - if (this._output.previous_token_wrapped) { - this._flags.multiline_frame = true; - } -}; - -Beautifier.prototype.indent = function() { - this._flags.indentation_level += 1; - this._output.set_indent(this._flags.indentation_level, this._flags.alignment); -}; - -Beautifier.prototype.deindent = function() { - if (this._flags.indentation_level > 0 && - ((!this._flags.parent) || this._flags.indentation_level > this._flags.parent.indentation_level)) { - this._flags.indentation_level -= 1; - this._output.set_indent(this._flags.indentation_level, this._flags.alignment); - } -}; - -Beautifier.prototype.set_mode = function(mode) { - if (this._flags) { - this._flag_store.push(this._flags); - this._previous_flags = this._flags; - } else { - this._previous_flags = this.create_flags(null, mode); - } - - this._flags = this.create_flags(this._previous_flags, mode); - this._output.set_indent(this._flags.indentation_level, this._flags.alignment); -}; - - -Beautifier.prototype.restore_mode = function() { - if (this._flag_store.length > 0) { - this._previous_flags = this._flags; - this._flags = this._flag_store.pop(); - if (this._previous_flags.mode === MODE.Statement) { - remove_redundant_indentation(this._output, this._previous_flags); - } - this._output.set_indent(this._flags.indentation_level, this._flags.alignment); - } -}; - -Beautifier.prototype.start_of_object_property = function() { - return this._flags.parent.mode === MODE.ObjectLiteral && this._flags.mode === MODE.Statement && ( - (this._flags.last_token.text === ':' && this._flags.ternary_depth === 0) || (reserved_array(this._flags.last_token, ['get', 'set']))); -}; - -Beautifier.prototype.start_of_statement = function(current_token) { - var start = false; - start = start || reserved_array(this._flags.last_token, ['var', 'let', 'const']) && current_token.type === TOKEN.WORD; - start = start || reserved_word(this._flags.last_token, 'do'); - start = start || (!(this._flags.parent.mode === MODE.ObjectLiteral && this._flags.mode === MODE.Statement)) && reserved_array(this._flags.last_token, newline_restricted_tokens) && !current_token.newlines; - start = start || reserved_word(this._flags.last_token, 'else') && - !(reserved_word(current_token, 'if') && !current_token.comments_before); - start = start || (this._flags.last_token.type === TOKEN.END_EXPR && (this._previous_flags.mode === MODE.ForInitializer || this._previous_flags.mode === MODE.Conditional)); - start = start || (this._flags.last_token.type === TOKEN.WORD && this._flags.mode === MODE.BlockStatement && - !this._flags.in_case && - !(current_token.text === '--' || current_token.text === '++') && - this._last_last_text !== 'function' && - current_token.type !== TOKEN.WORD && current_token.type !== TOKEN.RESERVED); - start = start || (this._flags.mode === MODE.ObjectLiteral && ( - (this._flags.last_token.text === ':' && this._flags.ternary_depth === 0) || reserved_array(this._flags.last_token, ['get', 'set']))); - - if (start) { - this.set_mode(MODE.Statement); - this.indent(); - - this.handle_whitespace_and_comments(current_token, true); - - // Issue #276: - // If starting a new statement with [if, for, while, do], push to a new line. - // if (a) if (b) if(c) d(); else e(); else f(); - if (!this.start_of_object_property()) { - this.allow_wrap_or_preserved_newline(current_token, - reserved_array(current_token, ['do', 'for', 'if', 'while'])); - } - return true; - } - return false; -}; - -Beautifier.prototype.handle_start_expr = function(current_token) { - // The conditional starts the statement if appropriate. - if (!this.start_of_statement(current_token)) { - this.handle_whitespace_and_comments(current_token); - } - - var next_mode = MODE.Expression; - if (current_token.text === '[') { - - if (this._flags.last_token.type === TOKEN.WORD || this._flags.last_token.text === ')') { - // this is array index specifier, break immediately - // a[x], fn()[x] - if (reserved_array(this._flags.last_token, line_starters)) { - this._output.space_before_token = true; - } - this.print_token(current_token); - this.set_mode(next_mode); - this.indent(); - if (this._options.space_in_paren) { - this._output.space_before_token = true; - } - return; - } - - next_mode = MODE.ArrayLiteral; - if (is_array(this._flags.mode)) { - if (this._flags.last_token.text === '[' || - (this._flags.last_token.text === ',' && (this._last_last_text === ']' || this._last_last_text === '}'))) { - // ], [ goes to new line - // }, [ goes to new line - if (!this._options.keep_array_indentation) { - this.print_newline(); - } - } - } - - if (!in_array(this._flags.last_token.type, [TOKEN.START_EXPR, TOKEN.END_EXPR, TOKEN.WORD, TOKEN.OPERATOR])) { - this._output.space_before_token = true; - } - } else { - if (this._flags.last_token.type === TOKEN.RESERVED) { - if (this._flags.last_token.text === 'for') { - this._output.space_before_token = this._options.space_before_conditional; - next_mode = MODE.ForInitializer; - } else if (in_array(this._flags.last_token.text, ['if', 'while'])) { - this._output.space_before_token = this._options.space_before_conditional; - next_mode = MODE.Conditional; - } else if (in_array(this._flags.last_word, ['await', 'async'])) { - // Should be a space between await and an IIFE, or async and an arrow function - this._output.space_before_token = true; - } else if (this._flags.last_token.text === 'import' && current_token.whitespace_before === '') { - this._output.space_before_token = false; - } else if (in_array(this._flags.last_token.text, line_starters) || this._flags.last_token.text === 'catch') { - this._output.space_before_token = true; - } - } else if (this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) { - // Support of this kind of newline preservation. - // a = (b && - // (c || d)); - if (!this.start_of_object_property()) { - this.allow_wrap_or_preserved_newline(current_token); - } - } else if (this._flags.last_token.type === TOKEN.WORD) { - this._output.space_before_token = false; - - // function name() vs function name () - // function* name() vs function* name () - // async name() vs async name () - // In ES6, you can also define the method properties of an object - // var obj = {a: function() {}} - // It can be abbreviated - // var obj = {a() {}} - // var obj = { a() {}} vs var obj = { a () {}} - // var obj = { * a() {}} vs var obj = { * a () {}} - var peek_back_two = this._tokens.peek(-3); - if (this._options.space_after_named_function && peek_back_two) { - // peek starts at next character so -1 is current token - var peek_back_three = this._tokens.peek(-4); - if (reserved_array(peek_back_two, ['async', 'function']) || - (peek_back_two.text === '*' && reserved_array(peek_back_three, ['async', 'function']))) { - this._output.space_before_token = true; - } else if (this._flags.mode === MODE.ObjectLiteral) { - if ((peek_back_two.text === '{' || peek_back_two.text === ',') || - (peek_back_two.text === '*' && (peek_back_three.text === '{' || peek_back_three.text === ','))) { - this._output.space_before_token = true; - } - } - } - } else { - // Support preserving wrapped arrow function expressions - // a.b('c', - // () => d.e - // ) - this.allow_wrap_or_preserved_newline(current_token); - } - - // function() vs function () - // yield*() vs yield* () - // function*() vs function* () - if ((this._flags.last_token.type === TOKEN.RESERVED && (this._flags.last_word === 'function' || this._flags.last_word === 'typeof')) || - (this._flags.last_token.text === '*' && - (in_array(this._last_last_text, ['function', 'yield']) || - (this._flags.mode === MODE.ObjectLiteral && in_array(this._last_last_text, ['{', ',']))))) { - this._output.space_before_token = this._options.space_after_anon_function; - } - } - - if (this._flags.last_token.text === ';' || this._flags.last_token.type === TOKEN.START_BLOCK) { - this.print_newline(); - } else if (this._flags.last_token.type === TOKEN.END_EXPR || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.END_BLOCK || this._flags.last_token.text === '.' || this._flags.last_token.type === TOKEN.COMMA) { - // do nothing on (( and )( and ][ and ]( and .( - // TODO: Consider whether forcing this is required. Review failing tests when removed. - this.allow_wrap_or_preserved_newline(current_token, current_token.newlines); - } - - this.print_token(current_token); - this.set_mode(next_mode); - if (this._options.space_in_paren) { - this._output.space_before_token = true; - } - - // In all cases, if we newline while inside an expression it should be indented. - this.indent(); -}; - -Beautifier.prototype.handle_end_expr = function(current_token) { - // statements inside expressions are not valid syntax, but... - // statements must all be closed when their container closes - while (this._flags.mode === MODE.Statement) { - this.restore_mode(); - } - - this.handle_whitespace_and_comments(current_token); - - if (this._flags.multiline_frame) { - this.allow_wrap_or_preserved_newline(current_token, - current_token.text === ']' && is_array(this._flags.mode) && !this._options.keep_array_indentation); - } - - if (this._options.space_in_paren) { - if (this._flags.last_token.type === TOKEN.START_EXPR && !this._options.space_in_empty_paren) { - // () [] no inner space in empty parens like these, ever, ref #320 - this._output.trim(); - this._output.space_before_token = false; - } else { - this._output.space_before_token = true; - } - } - this.deindent(); - this.print_token(current_token); - this.restore_mode(); - - remove_redundant_indentation(this._output, this._previous_flags); - - // do {} while () // no statement required after - if (this._flags.do_while && this._previous_flags.mode === MODE.Conditional) { - this._previous_flags.mode = MODE.Expression; - this._flags.do_block = false; - this._flags.do_while = false; - - } -}; - -Beautifier.prototype.handle_start_block = function(current_token) { - this.handle_whitespace_and_comments(current_token); - - // Check if this is should be treated as a ObjectLiteral - var next_token = this._tokens.peek(); - var second_token = this._tokens.peek(1); - if (this._flags.last_word === 'switch' && this._flags.last_token.type === TOKEN.END_EXPR) { - this.set_mode(MODE.BlockStatement); - this._flags.in_case_statement = true; - } else if (this._flags.case_body) { - this.set_mode(MODE.BlockStatement); - } else if (second_token && ( - (in_array(second_token.text, [':', ',']) && in_array(next_token.type, [TOKEN.STRING, TOKEN.WORD, TOKEN.RESERVED])) || - (in_array(next_token.text, ['get', 'set', '...']) && in_array(second_token.type, [TOKEN.WORD, TOKEN.RESERVED])) - )) { - // We don't support TypeScript,but we didn't break it for a very long time. - // We'll try to keep not breaking it. - if (!in_array(this._last_last_text, ['class', 'interface'])) { - this.set_mode(MODE.ObjectLiteral); - } else { - this.set_mode(MODE.BlockStatement); - } - } else if (this._flags.last_token.type === TOKEN.OPERATOR && this._flags.last_token.text === '=>') { - // arrow function: (param1, paramN) => { statements } - this.set_mode(MODE.BlockStatement); - } else if (in_array(this._flags.last_token.type, [TOKEN.EQUALS, TOKEN.START_EXPR, TOKEN.COMMA, TOKEN.OPERATOR]) || - reserved_array(this._flags.last_token, ['return', 'throw', 'import', 'default']) - ) { - // Detecting shorthand function syntax is difficult by scanning forward, - // so check the surrounding context. - // If the block is being returned, imported, export default, passed as arg, - // assigned with = or assigned in a nested object, treat as an ObjectLiteral. - this.set_mode(MODE.ObjectLiteral); - } else { - this.set_mode(MODE.BlockStatement); - } - - var empty_braces = !next_token.comments_before && next_token.text === '}'; - var empty_anonymous_function = empty_braces && this._flags.last_word === 'function' && - this._flags.last_token.type === TOKEN.END_EXPR; - - if (this._options.brace_preserve_inline) // check for inline, set inline_frame if so - { - // search forward for a newline wanted inside this block - var index = 0; - var check_token = null; - this._flags.inline_frame = true; - do { - index += 1; - check_token = this._tokens.peek(index - 1); - if (check_token.newlines) { - this._flags.inline_frame = false; - break; - } - } while (check_token.type !== TOKEN.EOF && - !(check_token.type === TOKEN.END_BLOCK && check_token.opened === current_token)); - } - - if ((this._options.brace_style === "expand" || - (this._options.brace_style === "none" && current_token.newlines)) && - !this._flags.inline_frame) { - if (this._flags.last_token.type !== TOKEN.OPERATOR && - (empty_anonymous_function || - this._flags.last_token.type === TOKEN.EQUALS || - (reserved_array(this._flags.last_token, special_words) && this._flags.last_token.text !== 'else'))) { - this._output.space_before_token = true; - } else { - this.print_newline(false, true); - } - } else { // collapse || inline_frame - if (is_array(this._previous_flags.mode) && (this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.COMMA)) { - if (this._flags.last_token.type === TOKEN.COMMA || this._options.space_in_paren) { - this._output.space_before_token = true; - } - - if (this._flags.last_token.type === TOKEN.COMMA || (this._flags.last_token.type === TOKEN.START_EXPR && this._flags.inline_frame)) { - this.allow_wrap_or_preserved_newline(current_token); - this._previous_flags.multiline_frame = this._previous_flags.multiline_frame || this._flags.multiline_frame; - this._flags.multiline_frame = false; - } - } - if (this._flags.last_token.type !== TOKEN.OPERATOR && this._flags.last_token.type !== TOKEN.START_EXPR) { - if (this._flags.last_token.type === TOKEN.START_BLOCK && !this._flags.inline_frame) { - this.print_newline(); - } else { - this._output.space_before_token = true; - } - } - } - this.print_token(current_token); - this.indent(); - - // Except for specific cases, open braces are followed by a new line. - if (!empty_braces && !(this._options.brace_preserve_inline && this._flags.inline_frame)) { - this.print_newline(); - } -}; - -Beautifier.prototype.handle_end_block = function(current_token) { - // statements must all be closed when their container closes - this.handle_whitespace_and_comments(current_token); - - while (this._flags.mode === MODE.Statement) { - this.restore_mode(); - } - - var empty_braces = this._flags.last_token.type === TOKEN.START_BLOCK; - - if (this._flags.inline_frame && !empty_braces) { // try inline_frame (only set if this._options.braces-preserve-inline) first - this._output.space_before_token = true; - } else if (this._options.brace_style === "expand") { - if (!empty_braces) { - this.print_newline(); - } - } else { - // skip {} - if (!empty_braces) { - if (is_array(this._flags.mode) && this._options.keep_array_indentation) { - // we REALLY need a newline here, but newliner would skip that - this._options.keep_array_indentation = false; - this.print_newline(); - this._options.keep_array_indentation = true; - - } else { - this.print_newline(); - } - } - } - this.restore_mode(); - this.print_token(current_token); -}; - -Beautifier.prototype.handle_word = function(current_token) { - if (current_token.type === TOKEN.RESERVED) { - if (in_array(current_token.text, ['set', 'get']) && this._flags.mode !== MODE.ObjectLiteral) { - current_token.type = TOKEN.WORD; - } else if (current_token.text === 'import' && this._tokens.peek().text === '(') { - current_token.type = TOKEN.WORD; - } else if (in_array(current_token.text, ['as', 'from']) && !this._flags.import_block) { - current_token.type = TOKEN.WORD; - } else if (this._flags.mode === MODE.ObjectLiteral) { - var next_token = this._tokens.peek(); - if (next_token.text === ':') { - current_token.type = TOKEN.WORD; - } - } - } - - if (this.start_of_statement(current_token)) { - // The conditional starts the statement if appropriate. - if (reserved_array(this._flags.last_token, ['var', 'let', 'const']) && current_token.type === TOKEN.WORD) { - this._flags.declaration_statement = true; - } - } else if (current_token.newlines && !is_expression(this._flags.mode) && - (this._flags.last_token.type !== TOKEN.OPERATOR || (this._flags.last_token.text === '--' || this._flags.last_token.text === '++')) && - this._flags.last_token.type !== TOKEN.EQUALS && - (this._options.preserve_newlines || !reserved_array(this._flags.last_token, ['var', 'let', 'const', 'set', 'get']))) { - this.handle_whitespace_and_comments(current_token); - this.print_newline(); - } else { - this.handle_whitespace_and_comments(current_token); - } - - if (this._flags.do_block && !this._flags.do_while) { - if (reserved_word(current_token, 'while')) { - // do {} ## while () - this._output.space_before_token = true; - this.print_token(current_token); - this._output.space_before_token = true; - this._flags.do_while = true; - return; - } else { - // do {} should always have while as the next word. - // if we don't see the expected while, recover - this.print_newline(); - this._flags.do_block = false; - } - } - - // if may be followed by else, or not - // Bare/inline ifs are tricky - // Need to unwind the modes correctly: if (a) if (b) c(); else d(); else e(); - if (this._flags.if_block) { - if (!this._flags.else_block && reserved_word(current_token, 'else')) { - this._flags.else_block = true; - } else { - while (this._flags.mode === MODE.Statement) { - this.restore_mode(); - } - this._flags.if_block = false; - this._flags.else_block = false; - } - } - - if (this._flags.in_case_statement && reserved_array(current_token, ['case', 'default'])) { - this.print_newline(); - if (this._flags.last_token.type !== TOKEN.END_BLOCK && (this._flags.case_body || this._options.jslint_happy)) { - // switch cases following one another - this.deindent(); - } - this._flags.case_body = false; - - this.print_token(current_token); - this._flags.in_case = true; - return; - } - - if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) { - if (!this.start_of_object_property()) { - this.allow_wrap_or_preserved_newline(current_token); - } - } - - if (reserved_word(current_token, 'function')) { - if (in_array(this._flags.last_token.text, ['}', ';']) || - (this._output.just_added_newline() && !(in_array(this._flags.last_token.text, ['(', '[', '{', ':', '=', ',']) || this._flags.last_token.type === TOKEN.OPERATOR))) { - // make sure there is a nice clean space of at least one blank line - // before a new function definition - if (!this._output.just_added_blankline() && !current_token.comments_before) { - this.print_newline(); - this.print_newline(true); - } - } - if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD) { - if (reserved_array(this._flags.last_token, ['get', 'set', 'new', 'export']) || - reserved_array(this._flags.last_token, newline_restricted_tokens)) { - this._output.space_before_token = true; - } else if (reserved_word(this._flags.last_token, 'default') && this._last_last_text === 'export') { - this._output.space_before_token = true; - } else if (this._flags.last_token.text === 'declare') { - // accomodates Typescript declare function formatting - this._output.space_before_token = true; - } else { - this.print_newline(); - } - } else if (this._flags.last_token.type === TOKEN.OPERATOR || this._flags.last_token.text === '=') { - // foo = function - this._output.space_before_token = true; - } else if (!this._flags.multiline_frame && (is_expression(this._flags.mode) || is_array(this._flags.mode))) { - // (function - } else { - this.print_newline(); - } - - this.print_token(current_token); - this._flags.last_word = current_token.text; - return; - } - - var prefix = 'NONE'; - - if (this._flags.last_token.type === TOKEN.END_BLOCK) { - - if (this._previous_flags.inline_frame) { - prefix = 'SPACE'; - } else if (!reserved_array(current_token, ['else', 'catch', 'finally', 'from'])) { - prefix = 'NEWLINE'; - } else { - if (this._options.brace_style === "expand" || - this._options.brace_style === "end-expand" || - (this._options.brace_style === "none" && current_token.newlines)) { - prefix = 'NEWLINE'; - } else { - prefix = 'SPACE'; - this._output.space_before_token = true; - } - } - } else if (this._flags.last_token.type === TOKEN.SEMICOLON && this._flags.mode === MODE.BlockStatement) { - // TODO: Should this be for STATEMENT as well? - prefix = 'NEWLINE'; - } else if (this._flags.last_token.type === TOKEN.SEMICOLON && is_expression(this._flags.mode)) { - prefix = 'SPACE'; - } else if (this._flags.last_token.type === TOKEN.STRING) { - prefix = 'NEWLINE'; - } else if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD || - (this._flags.last_token.text === '*' && - (in_array(this._last_last_text, ['function', 'yield']) || - (this._flags.mode === MODE.ObjectLiteral && in_array(this._last_last_text, ['{', ',']))))) { - prefix = 'SPACE'; - } else if (this._flags.last_token.type === TOKEN.START_BLOCK) { - if (this._flags.inline_frame) { - prefix = 'SPACE'; - } else { - prefix = 'NEWLINE'; - } - } else if (this._flags.last_token.type === TOKEN.END_EXPR) { - this._output.space_before_token = true; - prefix = 'NEWLINE'; - } - - if (reserved_array(current_token, line_starters) && this._flags.last_token.text !== ')') { - if (this._flags.inline_frame || this._flags.last_token.text === 'else' || this._flags.last_token.text === 'export') { - prefix = 'SPACE'; - } else { - prefix = 'NEWLINE'; - } - - } - - if (reserved_array(current_token, ['else', 'catch', 'finally'])) { - if ((!(this._flags.last_token.type === TOKEN.END_BLOCK && this._previous_flags.mode === MODE.BlockStatement) || - this._options.brace_style === "expand" || - this._options.brace_style === "end-expand" || - (this._options.brace_style === "none" && current_token.newlines)) && - !this._flags.inline_frame) { - this.print_newline(); - } else { - this._output.trim(true); - var line = this._output.current_line; - // If we trimmed and there's something other than a close block before us - // put a newline back in. Handles '} // comment' scenario. - if (line.last() !== '}') { - this.print_newline(); - } - this._output.space_before_token = true; - } - } else if (prefix === 'NEWLINE') { - if (reserved_array(this._flags.last_token, special_words)) { - // no newline between 'return nnn' - this._output.space_before_token = true; - } else if (this._flags.last_token.text === 'declare' && reserved_array(current_token, ['var', 'let', 'const'])) { - // accomodates Typescript declare formatting - this._output.space_before_token = true; - } else if (this._flags.last_token.type !== TOKEN.END_EXPR) { - if ((this._flags.last_token.type !== TOKEN.START_EXPR || !reserved_array(current_token, ['var', 'let', 'const'])) && this._flags.last_token.text !== ':') { - // no need to force newline on 'var': for (var x = 0...) - if (reserved_word(current_token, 'if') && reserved_word(current_token.previous, 'else')) { - // no newline for } else if { - this._output.space_before_token = true; - } else { - this.print_newline(); - } - } - } else if (reserved_array(current_token, line_starters) && this._flags.last_token.text !== ')') { - this.print_newline(); - } - } else if (this._flags.multiline_frame && is_array(this._flags.mode) && this._flags.last_token.text === ',' && this._last_last_text === '}') { - this.print_newline(); // }, in lists get a newline treatment - } else if (prefix === 'SPACE') { - this._output.space_before_token = true; - } - if (current_token.previous && (current_token.previous.type === TOKEN.WORD || current_token.previous.type === TOKEN.RESERVED)) { - this._output.space_before_token = true; - } - this.print_token(current_token); - this._flags.last_word = current_token.text; - - if (current_token.type === TOKEN.RESERVED) { - if (current_token.text === 'do') { - this._flags.do_block = true; - } else if (current_token.text === 'if') { - this._flags.if_block = true; - } else if (current_token.text === 'import') { - this._flags.import_block = true; - } else if (this._flags.import_block && reserved_word(current_token, 'from')) { - this._flags.import_block = false; - } - } -}; - -Beautifier.prototype.handle_semicolon = function(current_token) { - if (this.start_of_statement(current_token)) { - // The conditional starts the statement if appropriate. - // Semicolon can be the start (and end) of a statement - this._output.space_before_token = false; - } else { - this.handle_whitespace_and_comments(current_token); - } - - var next_token = this._tokens.peek(); - while (this._flags.mode === MODE.Statement && - !(this._flags.if_block && reserved_word(next_token, 'else')) && - !this._flags.do_block) { - this.restore_mode(); - } - - // hacky but effective for the moment - if (this._flags.import_block) { - this._flags.import_block = false; - } - this.print_token(current_token); -}; - -Beautifier.prototype.handle_string = function(current_token) { - if (this.start_of_statement(current_token)) { - // The conditional starts the statement if appropriate. - // One difference - strings want at least a space before - this._output.space_before_token = true; - } else { - this.handle_whitespace_and_comments(current_token); - if (this._flags.last_token.type === TOKEN.RESERVED || this._flags.last_token.type === TOKEN.WORD || this._flags.inline_frame) { - this._output.space_before_token = true; - } else if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR || this._flags.last_token.type === TOKEN.EQUALS || this._flags.last_token.type === TOKEN.OPERATOR) { - if (!this.start_of_object_property()) { - this.allow_wrap_or_preserved_newline(current_token); - } - } else { - this.print_newline(); - } - } - this.print_token(current_token); -}; - -Beautifier.prototype.handle_equals = function(current_token) { - if (this.start_of_statement(current_token)) { - // The conditional starts the statement if appropriate. - } else { - this.handle_whitespace_and_comments(current_token); - } - - if (this._flags.declaration_statement) { - // just got an '=' in a var-line, different formatting/line-breaking, etc will now be done - this._flags.declaration_assignment = true; - } - this._output.space_before_token = true; - this.print_token(current_token); - this._output.space_before_token = true; -}; - -Beautifier.prototype.handle_comma = function(current_token) { - this.handle_whitespace_and_comments(current_token, true); - - this.print_token(current_token); - this._output.space_before_token = true; - if (this._flags.declaration_statement) { - if (is_expression(this._flags.parent.mode)) { - // do not break on comma, for(var a = 1, b = 2) - this._flags.declaration_assignment = false; - } - - if (this._flags.declaration_assignment) { - this._flags.declaration_assignment = false; - this.print_newline(false, true); - } else if (this._options.comma_first) { - // for comma-first, we want to allow a newline before the comma - // to turn into a newline after the comma, which we will fixup later - this.allow_wrap_or_preserved_newline(current_token); - } - } else if (this._flags.mode === MODE.ObjectLiteral || - (this._flags.mode === MODE.Statement && this._flags.parent.mode === MODE.ObjectLiteral)) { - if (this._flags.mode === MODE.Statement) { - this.restore_mode(); - } - - if (!this._flags.inline_frame) { - this.print_newline(); - } - } else if (this._options.comma_first) { - // EXPR or DO_BLOCK - // for comma-first, we want to allow a newline before the comma - // to turn into a newline after the comma, which we will fixup later - this.allow_wrap_or_preserved_newline(current_token); - } -}; - -Beautifier.prototype.handle_operator = function(current_token) { - var isGeneratorAsterisk = current_token.text === '*' && - (reserved_array(this._flags.last_token, ['function', 'yield']) || - (in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.COMMA, TOKEN.END_BLOCK, TOKEN.SEMICOLON])) - ); - var isUnary = in_array(current_token.text, ['-', '+']) && ( - in_array(this._flags.last_token.type, [TOKEN.START_BLOCK, TOKEN.START_EXPR, TOKEN.EQUALS, TOKEN.OPERATOR]) || - in_array(this._flags.last_token.text, line_starters) || - this._flags.last_token.text === ',' - ); - - if (this.start_of_statement(current_token)) { - // The conditional starts the statement if appropriate. - } else { - var preserve_statement_flags = !isGeneratorAsterisk; - this.handle_whitespace_and_comments(current_token, preserve_statement_flags); - } - - if (reserved_array(this._flags.last_token, special_words)) { - // "return" had a special handling in TK_WORD. Now we need to return the favor - this._output.space_before_token = true; - this.print_token(current_token); - return; - } - - // hack for actionscript's import .*; - if (current_token.text === '*' && this._flags.last_token.type === TOKEN.DOT) { - this.print_token(current_token); - return; - } - - if (current_token.text === '::') { - // no spaces around exotic namespacing syntax operator - this.print_token(current_token); - return; - } - - // Allow line wrapping between operators when operator_position is - // set to before or preserve - if (this._flags.last_token.type === TOKEN.OPERATOR && in_array(this._options.operator_position, OPERATOR_POSITION_BEFORE_OR_PRESERVE)) { - this.allow_wrap_or_preserved_newline(current_token); - } - - if (current_token.text === ':' && this._flags.in_case) { - this.print_token(current_token); - - this._flags.in_case = false; - this._flags.case_body = true; - if (this._tokens.peek().type !== TOKEN.START_BLOCK) { - this.indent(); - this.print_newline(); - } else { - this._output.space_before_token = true; - } - return; - } - - var space_before = true; - var space_after = true; - var in_ternary = false; - if (current_token.text === ':') { - if (this._flags.ternary_depth === 0) { - // Colon is invalid javascript outside of ternary and object, but do our best to guess what was meant. - space_before = false; - } else { - this._flags.ternary_depth -= 1; - in_ternary = true; - } - } else if (current_token.text === '?') { - this._flags.ternary_depth += 1; - } - - // let's handle the operator_position option prior to any conflicting logic - if (!isUnary && !isGeneratorAsterisk && this._options.preserve_newlines && in_array(current_token.text, positionable_operators)) { - var isColon = current_token.text === ':'; - var isTernaryColon = (isColon && in_ternary); - var isOtherColon = (isColon && !in_ternary); - - switch (this._options.operator_position) { - case OPERATOR_POSITION.before_newline: - // if the current token is : and it's not a ternary statement then we set space_before to false - this._output.space_before_token = !isOtherColon; - - this.print_token(current_token); - - if (!isColon || isTernaryColon) { - this.allow_wrap_or_preserved_newline(current_token); - } - - this._output.space_before_token = true; - return; - - case OPERATOR_POSITION.after_newline: - // if the current token is anything but colon, or (via deduction) it's a colon and in a ternary statement, - // then print a newline. - - this._output.space_before_token = true; - - if (!isColon || isTernaryColon) { - if (this._tokens.peek().newlines) { - this.print_newline(false, true); - } else { - this.allow_wrap_or_preserved_newline(current_token); - } - } else { - this._output.space_before_token = false; - } - - this.print_token(current_token); - - this._output.space_before_token = true; - return; - - case OPERATOR_POSITION.preserve_newline: - if (!isOtherColon) { - this.allow_wrap_or_preserved_newline(current_token); - } - - // if we just added a newline, or the current token is : and it's not a ternary statement, - // then we set space_before to false - space_before = !(this._output.just_added_newline() || isOtherColon); - - this._output.space_before_token = space_before; - this.print_token(current_token); - this._output.space_before_token = true; - return; - } - } - - if (isGeneratorAsterisk) { - this.allow_wrap_or_preserved_newline(current_token); - space_before = false; - var next_token = this._tokens.peek(); - space_after = next_token && in_array(next_token.type, [TOKEN.WORD, TOKEN.RESERVED]); - } else if (current_token.text === '...') { - this.allow_wrap_or_preserved_newline(current_token); - space_before = this._flags.last_token.type === TOKEN.START_BLOCK; - space_after = false; - } else if (in_array(current_token.text, ['--', '++', '!', '~']) || isUnary) { - // unary operators (and binary +/- pretending to be unary) special cases - if (this._flags.last_token.type === TOKEN.COMMA || this._flags.last_token.type === TOKEN.START_EXPR) { - this.allow_wrap_or_preserved_newline(current_token); - } - - space_before = false; - space_after = false; - - // http://www.ecma-international.org/ecma-262/5.1/#sec-7.9.1 - // if there is a newline between -- or ++ and anything else we should preserve it. - if (current_token.newlines && (current_token.text === '--' || current_token.text === '++')) { - this.print_newline(false, true); - } - - if (this._flags.last_token.text === ';' && is_expression(this._flags.mode)) { - // for (;; ++i) - // ^^^ - space_before = true; - } - - if (this._flags.last_token.type === TOKEN.RESERVED) { - space_before = true; - } else if (this._flags.last_token.type === TOKEN.END_EXPR) { - space_before = !(this._flags.last_token.text === ']' && (current_token.text === '--' || current_token.text === '++')); - } else if (this._flags.last_token.type === TOKEN.OPERATOR) { - // a++ + ++b; - // a - -b - space_before = in_array(current_token.text, ['--', '-', '++', '+']) && in_array(this._flags.last_token.text, ['--', '-', '++', '+']); - // + and - are not unary when preceeded by -- or ++ operator - // a-- + b - // a * +b - // a - -b - if (in_array(current_token.text, ['+', '-']) && in_array(this._flags.last_token.text, ['--', '++'])) { - space_after = true; - } - } - - - if (((this._flags.mode === MODE.BlockStatement && !this._flags.inline_frame) || this._flags.mode === MODE.Statement) && - (this._flags.last_token.text === '{' || this._flags.last_token.text === ';')) { - // { foo; --i } - // foo(); --bar; - this.print_newline(); - } - } - - this._output.space_before_token = this._output.space_before_token || space_before; - this.print_token(current_token); - this._output.space_before_token = space_after; -}; - -Beautifier.prototype.handle_block_comment = function(current_token, preserve_statement_flags) { - if (this._output.raw) { - this._output.add_raw_token(current_token); - if (current_token.directives && current_token.directives.preserve === 'end') { - // If we're testing the raw output behavior, do not allow a directive to turn it off. - this._output.raw = this._options.test_output_raw; - } - return; - } - - if (current_token.directives) { - this.print_newline(false, preserve_statement_flags); - this.print_token(current_token); - if (current_token.directives.preserve === 'start') { - this._output.raw = true; - } - this.print_newline(false, true); - return; - } - - // inline block - if (!acorn.newline.test(current_token.text) && !current_token.newlines) { - this._output.space_before_token = true; - this.print_token(current_token); - this._output.space_before_token = true; - return; - } else { - this.print_block_commment(current_token, preserve_statement_flags); - } -}; - -Beautifier.prototype.print_block_commment = function(current_token, preserve_statement_flags) { - var lines = split_linebreaks(current_token.text); - var j; // iterator for this case - var javadoc = false; - var starless = false; - var lastIndent = current_token.whitespace_before; - var lastIndentLength = lastIndent.length; - - // block comment starts with a new line - this.print_newline(false, preserve_statement_flags); - - // first line always indented - this.print_token_line_indentation(current_token); - this._output.add_token(lines[0]); - this.print_newline(false, preserve_statement_flags); - - - if (lines.length > 1) { - lines = lines.slice(1); - javadoc = all_lines_start_with(lines, '*'); - starless = each_line_matches_indent(lines, lastIndent); - - if (javadoc) { - this._flags.alignment = 1; - } - - for (j = 0; j < lines.length; j++) { - if (javadoc) { - // javadoc: reformat and re-indent - this.print_token_line_indentation(current_token); - this._output.add_token(ltrim(lines[j])); - } else if (starless && lines[j]) { - // starless: re-indent non-empty content, avoiding trim - this.print_token_line_indentation(current_token); - this._output.add_token(lines[j].substring(lastIndentLength)); - } else { - // normal comments output raw - this._output.current_line.set_indent(-1); - this._output.add_token(lines[j]); - } - - // for comments on their own line or more than one line, make sure there's a new line after - this.print_newline(false, preserve_statement_flags); - } - - this._flags.alignment = 0; - } -}; - - -Beautifier.prototype.handle_comment = function(current_token, preserve_statement_flags) { - if (current_token.newlines) { - this.print_newline(false, preserve_statement_flags); - } else { - this._output.trim(true); - } - - this._output.space_before_token = true; - this.print_token(current_token); - this.print_newline(false, preserve_statement_flags); -}; - -Beautifier.prototype.handle_dot = function(current_token) { - if (this.start_of_statement(current_token)) { - // The conditional starts the statement if appropriate. - } else { - this.handle_whitespace_and_comments(current_token, true); - } - - if (reserved_array(this._flags.last_token, special_words)) { - this._output.space_before_token = false; - } else { - // allow preserved newlines before dots in general - // force newlines on dots after close paren when break_chained - for bar().baz() - this.allow_wrap_or_preserved_newline(current_token, - this._flags.last_token.text === ')' && this._options.break_chained_methods); - } - - // Only unindent chained method dot if this dot starts a new line. - // Otherwise the automatic extra indentation removal will handle the over indent - if (this._options.unindent_chained_methods && this._output.just_added_newline()) { - this.deindent(); - } - - this.print_token(current_token); -}; - -Beautifier.prototype.handle_unknown = function(current_token, preserve_statement_flags) { - this.print_token(current_token); - - if (current_token.text[current_token.text.length - 1] === '\n') { - this.print_newline(false, preserve_statement_flags); - } -}; - -Beautifier.prototype.handle_eof = function(current_token) { - // Unwind any open statements - while (this._flags.mode === MODE.Statement) { - this.restore_mode(); - } - this.handle_whitespace_and_comments(current_token); -}; - -module.exports.Beautifier = Beautifier; diff --git a/node_modules/js-beautify/js/src/javascript/index.js b/node_modules/js-beautify/js/src/javascript/index.js deleted file mode 100644 index ec74608a..00000000 --- a/node_modules/js-beautify/js/src/javascript/index.js +++ /dev/null @@ -1,42 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var Beautifier = require('./beautifier').Beautifier, - Options = require('./options').Options; - -function js_beautify(js_source_text, options) { - var beautifier = new Beautifier(js_source_text, options); - return beautifier.beautify(); -} - -module.exports = js_beautify; -module.exports.defaultOptions = function() { - return new Options(); -}; diff --git a/node_modules/js-beautify/js/src/javascript/options.js b/node_modules/js-beautify/js/src/javascript/options.js deleted file mode 100644 index 1234f239..00000000 --- a/node_modules/js-beautify/js/src/javascript/options.js +++ /dev/null @@ -1,93 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var BaseOptions = require('../core/options').Options; - -var validPositionValues = ['before-newline', 'after-newline', 'preserve-newline']; - -function Options(options) { - BaseOptions.call(this, options, 'js'); - - // compatibility, re - var raw_brace_style = this.raw_options.brace_style || null; - if (raw_brace_style === "expand-strict") { //graceful handling of deprecated option - this.raw_options.brace_style = "expand"; - } else if (raw_brace_style === "collapse-preserve-inline") { //graceful handling of deprecated option - this.raw_options.brace_style = "collapse,preserve-inline"; - } else if (this.raw_options.braces_on_own_line !== undefined) { //graceful handling of deprecated option - this.raw_options.brace_style = this.raw_options.braces_on_own_line ? "expand" : "collapse"; - // } else if (!raw_brace_style) { //Nothing exists to set it - // raw_brace_style = "collapse"; - } - - //preserve-inline in delimited string will trigger brace_preserve_inline, everything - //else is considered a brace_style and the last one only will have an effect - - var brace_style_split = this._get_selection_list('brace_style', ['collapse', 'expand', 'end-expand', 'none', 'preserve-inline']); - - this.brace_preserve_inline = false; //Defaults in case one or other was not specified in meta-option - this.brace_style = "collapse"; - - for (var bs = 0; bs < brace_style_split.length; bs++) { - if (brace_style_split[bs] === "preserve-inline") { - this.brace_preserve_inline = true; - } else { - this.brace_style = brace_style_split[bs]; - } - } - - this.unindent_chained_methods = this._get_boolean('unindent_chained_methods'); - this.break_chained_methods = this._get_boolean('break_chained_methods'); - this.space_in_paren = this._get_boolean('space_in_paren'); - this.space_in_empty_paren = this._get_boolean('space_in_empty_paren'); - this.jslint_happy = this._get_boolean('jslint_happy'); - this.space_after_anon_function = this._get_boolean('space_after_anon_function'); - this.space_after_named_function = this._get_boolean('space_after_named_function'); - this.keep_array_indentation = this._get_boolean('keep_array_indentation'); - this.space_before_conditional = this._get_boolean('space_before_conditional', true); - this.unescape_strings = this._get_boolean('unescape_strings'); - this.e4x = this._get_boolean('e4x'); - this.comma_first = this._get_boolean('comma_first'); - this.operator_position = this._get_selection('operator_position', validPositionValues); - - // For testing of beautify preserve:start directive - this.test_output_raw = this._get_boolean('test_output_raw'); - - // force this._options.space_after_anon_function to true if this._options.jslint_happy - if (this.jslint_happy) { - this.space_after_anon_function = true; - } - -} -Options.prototype = new BaseOptions(); - - - -module.exports.Options = Options; diff --git a/node_modules/js-beautify/js/src/javascript/tokenizer.js b/node_modules/js-beautify/js/src/javascript/tokenizer.js deleted file mode 100644 index 597b2154..00000000 --- a/node_modules/js-beautify/js/src/javascript/tokenizer.js +++ /dev/null @@ -1,562 +0,0 @@ -/*jshint node:true */ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -'use strict'; - -var InputScanner = require('../core/inputscanner').InputScanner; -var BaseTokenizer = require('../core/tokenizer').Tokenizer; -var BASETOKEN = require('../core/tokenizer').TOKEN; -var Directives = require('../core/directives').Directives; -var acorn = require('./acorn'); -var Pattern = require('../core/pattern').Pattern; -var TemplatablePattern = require('../core/templatablepattern').TemplatablePattern; - - -function in_array(what, arr) { - return arr.indexOf(what) !== -1; -} - - -var TOKEN = { - START_EXPR: 'TK_START_EXPR', - END_EXPR: 'TK_END_EXPR', - START_BLOCK: 'TK_START_BLOCK', - END_BLOCK: 'TK_END_BLOCK', - WORD: 'TK_WORD', - RESERVED: 'TK_RESERVED', - SEMICOLON: 'TK_SEMICOLON', - STRING: 'TK_STRING', - EQUALS: 'TK_EQUALS', - OPERATOR: 'TK_OPERATOR', - COMMA: 'TK_COMMA', - BLOCK_COMMENT: 'TK_BLOCK_COMMENT', - COMMENT: 'TK_COMMENT', - DOT: 'TK_DOT', - UNKNOWN: 'TK_UNKNOWN', - START: BASETOKEN.START, - RAW: BASETOKEN.RAW, - EOF: BASETOKEN.EOF -}; - - -var directives_core = new Directives(/\/\*/, /\*\//); - -var number_pattern = /0[xX][0123456789abcdefABCDEF]*|0[oO][01234567]*|0[bB][01]*|\d+n|(?:\.\d+|\d+\.?\d*)(?:[eE][+-]?\d+)?/; - -var digit = /[0-9]/; - -// Dot "." must be distinguished from "..." and decimal -var dot_pattern = /[^\d\.]/; - -var positionable_operators = ( - ">>> === !== " + - "<< && >= ** != == <= >> || " + - "< / - + > : & % ? ^ | *").split(' '); - -// IMPORTANT: this must be sorted longest to shortest or tokenizing many not work. -// Also, you must update possitionable operators separately from punct -var punct = - ">>>= " + - "... >>= <<= === >>> !== **= " + - "=> ^= :: /= << <= == && -= >= >> != -- += ** || ++ %= &= *= |= " + - "= ! ? > < : / ^ - + * & % ~ |"; - -punct = punct.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&"); -punct = punct.replace(/ /g, '|'); - -var punct_pattern = new RegExp(punct); - -// words which should always start on new line. -var line_starters = 'continue,try,throw,return,var,let,const,if,switch,case,default,for,while,break,function,import,export'.split(','); -var reserved_words = line_starters.concat(['do', 'in', 'of', 'else', 'get', 'set', 'new', 'catch', 'finally', 'typeof', 'yield', 'async', 'await', 'from', 'as']); -var reserved_word_pattern = new RegExp('^(?:' + reserved_words.join('|') + ')$'); - -// var template_pattern = /(?:(?:<\?php|<\?=)[\s\S]*?\?>)|(?:<%[\s\S]*?%>)/g; - -var in_html_comment; - -var Tokenizer = function(input_string, options) { - BaseTokenizer.call(this, input_string, options); - - this._patterns.whitespace = this._patterns.whitespace.matching( - /\u00A0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff/.source, - /\u2028\u2029/.source); - - var pattern_reader = new Pattern(this._input); - var templatable = new TemplatablePattern(this._input) - .read_options(this._options); - - this.__patterns = { - template: templatable, - identifier: templatable.starting_with(acorn.identifier).matching(acorn.identifierMatch), - number: pattern_reader.matching(number_pattern), - punct: pattern_reader.matching(punct_pattern), - // comment ends just before nearest linefeed or end of file - comment: pattern_reader.starting_with(/\/\//).until(/[\n\r\u2028\u2029]/), - // /* ... */ comment ends with nearest */ or end of file - block_comment: pattern_reader.starting_with(/\/\*/).until_after(/\*\//), - html_comment_start: pattern_reader.matching(//), - include: pattern_reader.starting_with(/#include/).until_after(acorn.lineBreak), - shebang: pattern_reader.starting_with(/#!/).until_after(acorn.lineBreak), - xml: pattern_reader.matching(/[\s\S]*?<(\/?)([-a-zA-Z:0-9_.]+|{[\s\S]+?}|!\[CDATA\[[\s\S]*?\]\])(\s+{[\s\S]+?}|\s+[-a-zA-Z:0-9_.]+|\s+[-a-zA-Z:0-9_.]+\s*=\s*('[^']*'|"[^"]*"|{[\s\S]+?}))*\s*(\/?)\s*>/), - single_quote: templatable.until(/['\\\n\r\u2028\u2029]/), - double_quote: templatable.until(/["\\\n\r\u2028\u2029]/), - template_text: templatable.until(/[`\\$]/), - template_expression: templatable.until(/[`}\\]/) - }; - -}; -Tokenizer.prototype = new BaseTokenizer(); - -Tokenizer.prototype._is_comment = function(current_token) { - return current_token.type === TOKEN.COMMENT || current_token.type === TOKEN.BLOCK_COMMENT || current_token.type === TOKEN.UNKNOWN; -}; - -Tokenizer.prototype._is_opening = function(current_token) { - return current_token.type === TOKEN.START_BLOCK || current_token.type === TOKEN.START_EXPR; -}; - -Tokenizer.prototype._is_closing = function(current_token, open_token) { - return (current_token.type === TOKEN.END_BLOCK || current_token.type === TOKEN.END_EXPR) && - (open_token && ( - (current_token.text === ']' && open_token.text === '[') || - (current_token.text === ')' && open_token.text === '(') || - (current_token.text === '}' && open_token.text === '{'))); -}; - -Tokenizer.prototype._reset = function() { - in_html_comment = false; -}; - -Tokenizer.prototype._get_next_token = function(previous_token, open_token) { // jshint unused:false - var token = null; - this._readWhitespace(); - var c = this._input.peek(); - - if (c === null) { - return this._create_token(TOKEN.EOF, ''); - } - - token = token || this._read_string(c); - token = token || this._read_word(previous_token); - token = token || this._read_singles(c); - token = token || this._read_comment(c); - token = token || this._read_regexp(c, previous_token); - token = token || this._read_xml(c, previous_token); - token = token || this._read_non_javascript(c); - token = token || this._read_punctuation(); - token = token || this._create_token(TOKEN.UNKNOWN, this._input.next()); - - return token; -}; - -Tokenizer.prototype._read_word = function(previous_token) { - var resulting_string; - resulting_string = this.__patterns.identifier.read(); - if (resulting_string !== '') { - resulting_string = resulting_string.replace(acorn.allLineBreaks, '\n'); - if (!(previous_token.type === TOKEN.DOT || - (previous_token.type === TOKEN.RESERVED && (previous_token.text === 'set' || previous_token.text === 'get'))) && - reserved_word_pattern.test(resulting_string)) { - if (resulting_string === 'in' || resulting_string === 'of') { // hack for 'in' and 'of' operators - return this._create_token(TOKEN.OPERATOR, resulting_string); - } - return this._create_token(TOKEN.RESERVED, resulting_string); - } - return this._create_token(TOKEN.WORD, resulting_string); - } - - resulting_string = this.__patterns.number.read(); - if (resulting_string !== '') { - return this._create_token(TOKEN.WORD, resulting_string); - } -}; - -Tokenizer.prototype._read_singles = function(c) { - var token = null; - if (c === '(' || c === '[') { - token = this._create_token(TOKEN.START_EXPR, c); - } else if (c === ')' || c === ']') { - token = this._create_token(TOKEN.END_EXPR, c); - } else if (c === '{') { - token = this._create_token(TOKEN.START_BLOCK, c); - } else if (c === '}') { - token = this._create_token(TOKEN.END_BLOCK, c); - } else if (c === ';') { - token = this._create_token(TOKEN.SEMICOLON, c); - } else if (c === '.' && dot_pattern.test(this._input.peek(1))) { - token = this._create_token(TOKEN.DOT, c); - } else if (c === ',') { - token = this._create_token(TOKEN.COMMA, c); - } - - if (token) { - this._input.next(); - } - return token; -}; - -Tokenizer.prototype._read_punctuation = function() { - var resulting_string = this.__patterns.punct.read(); - - if (resulting_string !== '') { - if (resulting_string === '=') { - return this._create_token(TOKEN.EQUALS, resulting_string); - } else { - return this._create_token(TOKEN.OPERATOR, resulting_string); - } - } -}; - -Tokenizer.prototype._read_non_javascript = function(c) { - var resulting_string = ''; - - if (c === '#') { - if (this._is_first_token()) { - resulting_string = this.__patterns.shebang.read(); - - if (resulting_string) { - return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\n'); - } - } - - // handles extendscript #includes - resulting_string = this.__patterns.include.read(); - - if (resulting_string) { - return this._create_token(TOKEN.UNKNOWN, resulting_string.trim() + '\n'); - } - - c = this._input.next(); - - // Spidermonkey-specific sharp variables for circular references. Considered obsolete. - var sharp = '#'; - if (this._input.hasNext() && this._input.testChar(digit)) { - do { - c = this._input.next(); - sharp += c; - } while (this._input.hasNext() && c !== '#' && c !== '='); - if (c === '#') { - // - } else if (this._input.peek() === '[' && this._input.peek(1) === ']') { - sharp += '[]'; - this._input.next(); - this._input.next(); - } else if (this._input.peek() === '{' && this._input.peek(1) === '}') { - sharp += '{}'; - this._input.next(); - this._input.next(); - } - return this._create_token(TOKEN.WORD, sharp); - } - - this._input.back(); - - } else if (c === '<' && this._is_first_token()) { - resulting_string = this.__patterns.html_comment_start.read(); - if (resulting_string) { - while (this._input.hasNext() && !this._input.testChar(acorn.newline)) { - resulting_string += this._input.next(); - } - in_html_comment = true; - return this._create_token(TOKEN.COMMENT, resulting_string); - } - } else if (in_html_comment && c === '-') { - resulting_string = this.__patterns.html_comment_end.read(); - if (resulting_string) { - in_html_comment = false; - return this._create_token(TOKEN.COMMENT, resulting_string); - } - } - - return null; -}; - -Tokenizer.prototype._read_comment = function(c) { - var token = null; - if (c === '/') { - var comment = ''; - if (this._input.peek(1) === '*') { - // peek for comment /* ... */ - comment = this.__patterns.block_comment.read(); - var directives = directives_core.get_directives(comment); - if (directives && directives.ignore === 'start') { - comment += directives_core.readIgnored(this._input); - } - comment = comment.replace(acorn.allLineBreaks, '\n'); - token = this._create_token(TOKEN.BLOCK_COMMENT, comment); - token.directives = directives; - } else if (this._input.peek(1) === '/') { - // peek for comment // ... - comment = this.__patterns.comment.read(); - token = this._create_token(TOKEN.COMMENT, comment); - } - } - return token; -}; - -Tokenizer.prototype._read_string = function(c) { - if (c === '`' || c === "'" || c === '"') { - var resulting_string = this._input.next(); - this.has_char_escapes = false; - - if (c === '`') { - resulting_string += this._read_string_recursive('`', true, '${'); - } else { - resulting_string += this._read_string_recursive(c); - } - - if (this.has_char_escapes && this._options.unescape_strings) { - resulting_string = unescape_string(resulting_string); - } - - if (this._input.peek() === c) { - resulting_string += this._input.next(); - } - - resulting_string = resulting_string.replace(acorn.allLineBreaks, '\n'); - - return this._create_token(TOKEN.STRING, resulting_string); - } - - return null; -}; - -Tokenizer.prototype._allow_regexp_or_xml = function(previous_token) { - // regex and xml can only appear in specific locations during parsing - return (previous_token.type === TOKEN.RESERVED && in_array(previous_token.text, ['return', 'case', 'throw', 'else', 'do', 'typeof', 'yield'])) || - (previous_token.type === TOKEN.END_EXPR && previous_token.text === ')' && - previous_token.opened.previous.type === TOKEN.RESERVED && in_array(previous_token.opened.previous.text, ['if', 'while', 'for'])) || - (in_array(previous_token.type, [TOKEN.COMMENT, TOKEN.START_EXPR, TOKEN.START_BLOCK, TOKEN.START, - TOKEN.END_BLOCK, TOKEN.OPERATOR, TOKEN.EQUALS, TOKEN.EOF, TOKEN.SEMICOLON, TOKEN.COMMA - ])); -}; - -Tokenizer.prototype._read_regexp = function(c, previous_token) { - - if (c === '/' && this._allow_regexp_or_xml(previous_token)) { - // handle regexp - // - var resulting_string = this._input.next(); - var esc = false; - - var in_char_class = false; - while (this._input.hasNext() && - ((esc || in_char_class || this._input.peek() !== c) && - !this._input.testChar(acorn.newline))) { - resulting_string += this._input.peek(); - if (!esc) { - esc = this._input.peek() === '\\'; - if (this._input.peek() === '[') { - in_char_class = true; - } else if (this._input.peek() === ']') { - in_char_class = false; - } - } else { - esc = false; - } - this._input.next(); - } - - if (this._input.peek() === c) { - resulting_string += this._input.next(); - - // regexps may have modifiers /regexp/MOD , so fetch those, too - // Only [gim] are valid, but if the user puts in garbage, do what we can to take it. - resulting_string += this._input.read(acorn.identifier); - } - return this._create_token(TOKEN.STRING, resulting_string); - } - return null; -}; - -Tokenizer.prototype._read_xml = function(c, previous_token) { - - if (this._options.e4x && c === "<" && this._allow_regexp_or_xml(previous_token)) { - var xmlStr = ''; - var match = this.__patterns.xml.read_match(); - // handle e4x xml literals - // - if (match) { - // Trim root tag to attempt to - var rootTag = match[2].replace(/^{\s+/, '{').replace(/\s+}$/, '}'); - var isCurlyRoot = rootTag.indexOf('{') === 0; - var depth = 0; - while (match) { - var isEndTag = !!match[1]; - var tagName = match[2]; - var isSingletonTag = (!!match[match.length - 1]) || (tagName.slice(0, 8) === "![CDATA["); - if (!isSingletonTag && - (tagName === rootTag || (isCurlyRoot && tagName.replace(/^{\s+/, '{').replace(/\s+}$/, '}')))) { - if (isEndTag) { - --depth; - } else { - ++depth; - } - } - xmlStr += match[0]; - if (depth <= 0) { - break; - } - match = this.__patterns.xml.read_match(); - } - // if we didn't close correctly, keep unformatted. - if (!match) { - xmlStr += this._input.match(/[\s\S]*/g)[0]; - } - xmlStr = xmlStr.replace(acorn.allLineBreaks, '\n'); - return this._create_token(TOKEN.STRING, xmlStr); - } - } - - return null; -}; - -function unescape_string(s) { - // You think that a regex would work for this - // return s.replace(/\\x([0-9a-f]{2})/gi, function(match, val) { - // return String.fromCharCode(parseInt(val, 16)); - // }) - // However, dealing with '\xff', '\\xff', '\\\xff' makes this more fun. - var out = '', - escaped = 0; - - var input_scan = new InputScanner(s); - var matched = null; - - while (input_scan.hasNext()) { - // Keep any whitespace, non-slash characters - // also keep slash pairs. - matched = input_scan.match(/([\s]|[^\\]|\\\\)+/g); - - if (matched) { - out += matched[0]; - } - - if (input_scan.peek() === '\\') { - input_scan.next(); - if (input_scan.peek() === 'x') { - matched = input_scan.match(/x([0-9A-Fa-f]{2})/g); - } else if (input_scan.peek() === 'u') { - matched = input_scan.match(/u([0-9A-Fa-f]{4})/g); - } else { - out += '\\'; - if (input_scan.hasNext()) { - out += input_scan.next(); - } - continue; - } - - // If there's some error decoding, return the original string - if (!matched) { - return s; - } - - escaped = parseInt(matched[1], 16); - - if (escaped > 0x7e && escaped <= 0xff && matched[0].indexOf('x') === 0) { - // we bail out on \x7f..\xff, - // leaving whole string escaped, - // as it's probably completely binary - return s; - } else if (escaped >= 0x00 && escaped < 0x20) { - // leave 0x00...0x1f escaped - out += '\\' + matched[0]; - continue; - } else if (escaped === 0x22 || escaped === 0x27 || escaped === 0x5c) { - // single-quote, apostrophe, backslash - escape these - out += '\\' + String.fromCharCode(escaped); - } else { - out += String.fromCharCode(escaped); - } - } - } - - return out; -} - -// handle string -// -Tokenizer.prototype._read_string_recursive = function(delimiter, allow_unescaped_newlines, start_sub) { - var current_char; - var pattern; - if (delimiter === '\'') { - pattern = this.__patterns.single_quote; - } else if (delimiter === '"') { - pattern = this.__patterns.double_quote; - } else if (delimiter === '`') { - pattern = this.__patterns.template_text; - } else if (delimiter === '}') { - pattern = this.__patterns.template_expression; - } - - var resulting_string = pattern.read(); - var next = ''; - while (this._input.hasNext()) { - next = this._input.next(); - if (next === delimiter || - (!allow_unescaped_newlines && acorn.newline.test(next))) { - this._input.back(); - break; - } else if (next === '\\' && this._input.hasNext()) { - current_char = this._input.peek(); - - if (current_char === 'x' || current_char === 'u') { - this.has_char_escapes = true; - } else if (current_char === '\r' && this._input.peek(1) === '\n') { - this._input.next(); - } - next += this._input.next(); - } else if (start_sub) { - if (start_sub === '${' && next === '$' && this._input.peek() === '{') { - next += this._input.next(); - } - - if (start_sub === next) { - if (delimiter === '`') { - next += this._read_string_recursive('}', allow_unescaped_newlines, '`'); - } else { - next += this._read_string_recursive('`', allow_unescaped_newlines, '${'); - } - if (this._input.hasNext()) { - next += this._input.next(); - } - } - } - next += pattern.read(); - resulting_string += next; - } - - return resulting_string; -}; - -module.exports.Tokenizer = Tokenizer; -module.exports.TOKEN = TOKEN; -module.exports.positionable_operators = positionable_operators.slice(); -module.exports.line_starters = line_starters.slice(); diff --git a/node_modules/js-beautify/js/src/unpackers/javascriptobfuscator_unpacker.js b/node_modules/js-beautify/js/src/unpackers/javascriptobfuscator_unpacker.js deleted file mode 100644 index c18794cd..00000000 --- a/node_modules/js-beautify/js/src/unpackers/javascriptobfuscator_unpacker.js +++ /dev/null @@ -1,132 +0,0 @@ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -// -// simple unpacker/deobfuscator for scripts messed up with javascriptobfuscator.com -// written by Einar Lielmanis -// -// usage: -// -// if (JavascriptObfuscator.detect(some_string)) { -// var unpacked = JavascriptObfuscator.unpack(some_string); -// } -// -// - -/*jshint strict:false */ - -var JavascriptObfuscator = { - detect: function(str) { - return /^var _0x[a-f0-9]+ ?\= ?\[/.test(str); - }, - - unpack: function(str) { - if (JavascriptObfuscator.detect(str)) { - var matches = /var (_0x[a-f\d]+) ?\= ?\[(.*?)\];/.exec(str); - if (matches) { - var var_name = matches[1]; - var strings = JavascriptObfuscator._smart_split(matches[2]); - str = str.substring(matches[0].length); - for (var k in strings) { - str = str.replace(new RegExp(var_name + '\\[' + k + '\\]', 'g'), - JavascriptObfuscator._fix_quotes(JavascriptObfuscator._unescape(strings[k]))); - } - } - } - return str; - }, - - _fix_quotes: function(str) { - var matches = /^"(.*)"$/.exec(str); - if (matches) { - str = matches[1]; - str = "'" + str.replace(/'/g, "\\'") + "'"; - } - return str; - }, - - _smart_split: function(str) { - var strings = []; - var pos = 0; - while (pos < str.length) { - if (str.charAt(pos) === '"') { - // new word - var word = ''; - pos += 1; - while (pos < str.length) { - if (str.charAt(pos) === '"') { - break; - } - if (str.charAt(pos) === '\\') { - word += '\\'; - pos++; - } - word += str.charAt(pos); - pos++; - } - strings.push('"' + word + '"'); - } - pos += 1; - } - return strings; - }, - - - _unescape: function(str) { - // inefficient if used repeatedly or on small strings, but wonderful on single large chunk of text - for (var i = 32; i < 128; i++) { - str = str.replace(new RegExp('\\\\x' + i.toString(16), 'ig'), String.fromCharCode(i)); - } - str = str.replace(/\\x09/g, "\t"); - return str; - }, - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - - t.test_function(JavascriptObfuscator._smart_split, "JavascriptObfuscator._smart_split"); - t.expect('', []); - t.expect('"a", "b"', ['"a"', '"b"']); - t.expect('"aaa","bbbb"', ['"aaa"', '"bbbb"']); - t.expect('"a", "b\\\""', ['"a"', '"b\\\""']); - t.test_function(JavascriptObfuscator._unescape, 'JavascriptObfuscator._unescape'); - t.expect('\\x40', '@'); - t.expect('\\x10', '\\x10'); - t.expect('\\x1', '\\x1'); - t.expect("\\x61\\x62\\x22\\x63\\x64", 'ab"cd'); - t.test_function(JavascriptObfuscator.detect, 'JavascriptObfuscator.detect'); - t.expect('', false); - t.expect('abcd', false); - t.expect('var _0xaaaa', false); - t.expect('var _0xaaaa = ["a", "b"]', true); - t.expect('var _0xaaaa=["a", "b"]', true); - t.expect('var _0x1234=["a","b"]', true); - return t; - } - - -}; diff --git a/node_modules/js-beautify/js/src/unpackers/myobfuscate_unpacker.js b/node_modules/js-beautify/js/src/unpackers/myobfuscate_unpacker.js deleted file mode 100644 index 0e028ed9..00000000 --- a/node_modules/js-beautify/js/src/unpackers/myobfuscate_unpacker.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -// -// simple unpacker/deobfuscator for scripts messed up with myobfuscate.com -// You really don't want to obfuscate your scripts there: they're tracking -// your unpackings, your script gets turned into something like this, -// as of 2011-04-25: -/* - - var _escape = 'your_script_escaped'; - var _111 = document.createElement('script'); - _111.src = 'http://api.www.myobfuscate.com/?getsrc=ok' + - '&ref=' + encodeURIComponent(document.referrer) + - '&url=' + encodeURIComponent(document.URL); - var 000 = document.getElementsByTagName('head')[0]; - 000.appendChild(_111); - document.write(unescape(_escape)); - -*/ -// -// written by Einar Lielmanis -// -// usage: -// -// if (MyObfuscate.detect(some_string)) { -// var unpacked = MyObfuscate.unpack(some_string); -// } -// -// - -/*jshint strict:false */ - -var MyObfuscate = { - detect: function(str) { - if (/^var _?[0O1lI]{3}\=('|\[).*\)\)\);/.test(str)) { - return true; - } - if (/^function _?[0O1lI]{3}\(_/.test(str) && /eval\(/.test(str)) { - return true; - } - return false; - }, - - unpack: function(str) { - if (MyObfuscate.detect(str)) { - var __eval = eval; - try { - eval = function(unpacked) { // jshint ignore:line - if (MyObfuscate.starts_with(unpacked, 'var _escape')) { - // fetch the urlencoded stuff from the script, - var matches = /'([^']*)'/.exec(unpacked); - var unescaped = unescape(matches[1]); - if (MyObfuscate.starts_with(unescaped, '')) { - unescaped = unescaped.substr(0, unescaped.length - 9); - } - unpacked = unescaped; - } - // throw to terminate the script - unpacked = "// Unpacker warning: be careful when using myobfuscate.com for your projects:\n" + - "// scripts obfuscated by the free online version may call back home.\n" + - "\n//\n" + unpacked; - throw unpacked; - }; // jshint ignore:line - __eval(str); // should throw - } catch (e) { - // well, it failed. we'll just return the original, instead of crashing on user. - if (typeof e === "string") { - str = e; - } - } - eval = __eval; // jshint ignore:line - } - return str; - }, - - starts_with: function(str, what) { - return str.substr(0, what.length) === what; - }, - - ends_with: function(str, what) { - return str.substr(str.length - what.length, what.length) === what; - }, - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - - return t; - } - - -}; diff --git a/node_modules/js-beautify/js/src/unpackers/p_a_c_k_e_r_unpacker.js b/node_modules/js-beautify/js/src/unpackers/p_a_c_k_e_r_unpacker.js deleted file mode 100644 index a7421674..00000000 --- a/node_modules/js-beautify/js/src/unpackers/p_a_c_k_e_r_unpacker.js +++ /dev/null @@ -1,111 +0,0 @@ -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -// -// Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier -// -// Coincidentally, it can defeat a couple of other eval-based compressors. -// -// usage: -// -// if (P_A_C_K_E_R.detect(some_string)) { -// var unpacked = P_A_C_K_E_R.unpack(some_string); -// } -// -// - -/*jshint strict:false */ - -var P_A_C_K_E_R = { - detect: function(str) { - return (P_A_C_K_E_R.get_chunks(str).length > 0); - }, - - get_chunks: function(str) { - var chunks = str.match(/eval\(\(?function\(.*?(,0,\{\}\)\)|split\('\|'\)\)\))($|\n)/g); - return chunks ? chunks : []; - }, - - unpack: function(str) { - var chunks = P_A_C_K_E_R.get_chunks(str), - chunk; - for (var i = 0; i < chunks.length; i++) { - chunk = chunks[i].replace(/\n$/, ''); - str = str.split(chunk).join(P_A_C_K_E_R.unpack_chunk(chunk)); - } - return str; - }, - - unpack_chunk: function(str) { - var unpacked_source = ''; - var __eval = eval; - if (P_A_C_K_E_R.detect(str)) { - try { - eval = function(s) { // jshint ignore:line - unpacked_source += s; - return unpacked_source; - }; // jshint ignore:line - __eval(str); - if (typeof unpacked_source === 'string' && unpacked_source) { - str = unpacked_source; - } - } catch (e) { - // well, it failed. we'll just return the original, instead of crashing on user. - } - } - eval = __eval; // jshint ignore:line - return str; - }, - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - - var pk1 = "eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))"; - var unpk1 = 'var a=1'; - var pk2 = "eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'foo||b'.split('|'),0,{}))"; - var unpk2 = 'foo b=1'; - var pk_broken = "eval(function(p,a,c,k,e,r){BORKBORK;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))"; - var pk3 = "eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1{}))',3,3,'var||a'.split('|'),0,{}))"; - var unpk3 = 'var a=1{}))'; - - t.test_function(P_A_C_K_E_R.detect, "P_A_C_K_E_R.detect"); - t.expect('', false); - t.expect('var a = b', false); - t.test_function(P_A_C_K_E_R.unpack, "P_A_C_K_E_R.unpack"); - t.expect(pk_broken, pk_broken); - t.expect(pk1, unpk1); - t.expect(pk2, unpk2); - t.expect(pk3, unpk3); - - var filler = '\nfiller\n'; - t.expect(filler + pk1 + "\n" + pk_broken + filler + pk2 + filler, filler + unpk1 + "\n" + pk_broken + filler + unpk2 + filler); - - return t; - } - - -}; diff --git a/node_modules/js-beautify/js/src/unpackers/urlencode_unpacker.js b/node_modules/js-beautify/js/src/unpackers/urlencode_unpacker.js deleted file mode 100644 index 0f7a9a29..00000000 --- a/node_modules/js-beautify/js/src/unpackers/urlencode_unpacker.js +++ /dev/null @@ -1,104 +0,0 @@ -/*global unescape */ -/*jshint curly: false, scripturl: true */ - -/* - - The MIT License (MIT) - - Copyright (c) 2007-2018 Einar Lielmanis, Liam Newman, 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. -*/ - -// -// trivial bookmarklet/escaped script detector for the javascript beautifier -// written by Einar Lielmanis -// -// usage: -// -// if (Urlencoded.detect(some_string)) { -// var unpacked = Urlencoded.unpack(some_string); -// } -// -// - -/*jshint strict:false */ - - -var isNode = (typeof module !== 'undefined' && module.exports); -if (isNode) { - var SanityTest = require(__dirname + '/../../test/sanitytest'); -} - -var Urlencoded = { - detect: function(str) { - // the fact that script doesn't contain any space, but has %20 instead - // should be sufficient check for now. - if (str.indexOf(' ') === -1) { - if (str.indexOf('%2') !== -1) return true; - if (str.replace(/[^%]+/g, '').length > 3) return true; - } - return false; - }, - - unpack: function(str) { - if (Urlencoded.detect(str)) { - if (str.indexOf('%2B') !== -1 || str.indexOf('%2b') !== -1) { - // "+" escaped as "%2B" - return unescape(str.replace(/\+/g, '%20')); - } else { - return unescape(str); - } - } - return str; - }, - - - - run_tests: function(sanity_test) { - var t = sanity_test || new SanityTest(); - t.test_function(Urlencoded.detect, "Urlencoded.detect"); - t.expect('', false); - t.expect('var a = b', false); - t.expect('var%20a+=+b', true); - t.expect('var%20a=b', true); - t.expect('var%20%21%22', true); - t.expect('javascript:(function(){var%20whatever={init:function(){alert(%22a%22+%22b%22)}};whatever.init()})();', true); - t.test_function(Urlencoded.unpack, 'Urlencoded.unpack'); - - t.expect('javascript:(function(){var%20whatever={init:function(){alert(%22a%22+%22b%22)}};whatever.init()})();', - 'javascript:(function(){var whatever={init:function(){alert("a"+"b")}};whatever.init()})();' - ); - t.expect('', ''); - t.expect('abcd', 'abcd'); - t.expect('var a = b', 'var a = b'); - t.expect('var%20a=b', 'var a=b'); - t.expect('var%20a=b+1', 'var a=b+1'); - t.expect('var%20a=b%2b1', 'var a=b+1'); - return t; - } - - -}; - -if (isNode) { - module.exports = Urlencoded; -} diff --git a/node_modules/js-beautify/package.json b/node_modules/js-beautify/package.json deleted file mode 100644 index 00b1798d..00000000 --- a/node_modules/js-beautify/package.json +++ /dev/null @@ -1,126 +0,0 @@ -{ - "_args": [ - [ - "js-beautify@1.10.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "js-beautify@1.10.2", - "_id": "js-beautify@1.10.2", - "_inBundle": false, - "_integrity": "sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==", - "_location": "/js-beautify", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "js-beautify@1.10.2", - "name": "js-beautify", - "escapedName": "js-beautify", - "rawSpec": "1.10.2", - "saveSpec": null, - "fetchSpec": "1.10.2" - }, - "_requiredBy": [ - "/beautify" - ], - "_resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.2.tgz", - "_spec": "1.10.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Einar Lielmanis", - "email": "einar@beautifier.io" - }, - "bin": { - "css-beautify": "./js/bin/css-beautify.js", - "html-beautify": "./js/bin/html-beautify.js", - "js-beautify": "./js/bin/js-beautify.js" - }, - "bugs": { - "url": "https://github.com/beautify-web/js-beautify/issues" - }, - "contributors": [ - { - "name": "Vital Batmanov", - "email": "vital76@gmail.com" - }, - { - "name": "Chris J. Shull", - "email": "chrisjshull@gmail.com" - }, - { - "name": "Gian Marco Gherardi", - "email": "gianmarco.gherardi@gmail.com" - }, - { - "name": "Stan", - "email": "stasson@orc.ru" - }, - { - "name": "Vittorio Gambaletta", - "email": "VittGam@vittgam.net" - }, - { - "name": "Daniel Stockman", - "email": "daniel.stockman@gmail.com" - }, - { - "name": "Harutyun Amirjanyan", - "email": "amirjanyan@gmail.com" - }, - { - "name": "Nochum Sossonko", - "email": "nsossonko@hotmail.com" - }, - { - "name": "Liam Newman", - "email": "bitwiseman@beautifier.io" - } - ], - "dependencies": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~0.5.1", - "nopt": "~4.0.1" - }, - "description": "beautifier.io for node", - "devDependencies": { - "benchmark": "^2.1.4", - "codemirror": "^5.48.2", - "jquery": "^3.4.1", - "jshint": "^2.10.2", - "mocha": "^6.1.4", - "mustache": "^3.0.1", - "node-static": "^0.7.11", - "requirejs": "^2.3.6", - "webpack": "^4.36.1", - "webpack-cli": "^3.3.5" - }, - "directories": { - "lib": "js/lib", - "test": "js/test" - }, - "files": [ - "js/bin/", - "js/lib/*.js", - "js/lib/unpackers/", - "js/index.js", - "js/src/**/*" - ], - "homepage": "https://beautifier.io/", - "keywords": [ - "beautify", - "beautifier", - "code-quality" - ], - "license": "MIT", - "main": "js/index.js", - "name": "js-beautify", - "repository": { - "type": "git", - "url": "git://github.com/beautify-web/js-beautify.git" - }, - "scripts": {}, - "version": "1.10.2" -} diff --git a/node_modules/lru-cache/LICENSE b/node_modules/lru-cache/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/lru-cache/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/lru-cache/README.md b/node_modules/lru-cache/README.md deleted file mode 100644 index d660dd57..00000000 --- a/node_modules/lru-cache/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# lru cache - -A cache object that deletes the least-recently-used items. - -[![Build Status](https://travis-ci.org/isaacs/node-lru-cache.svg?branch=master)](https://travis-ci.org/isaacs/node-lru-cache) [![Coverage Status](https://coveralls.io/repos/isaacs/node-lru-cache/badge.svg?service=github)](https://coveralls.io/github/isaacs/node-lru-cache) - -## Installation: - -```javascript -npm install lru-cache --save -``` - -## Usage: - -```javascript -var LRU = require("lru-cache") - , options = { max: 500 - , length: function (n, key) { return n * 2 + key.length } - , 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" - -// non-string keys ARE fully supported -// but note that it must be THE SAME object, not -// just a JSON-equivalent object. -var someObject = { a: 1 } -cache.set(someObject, 'a value') -// Object keys are not toString()-ed -cache.set('[object Object]', 'a different value') -assert.equal(cache.get(someObject), 'a value') -// A similar object with same keys/values won't work, -// because it's a different object identity -assert.equal(cache.get({ a: 1 }), undefined) - -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, key){return n.length}`. The default is - `function(){return 1}`, which is fine if you want to store `max` - like-sized things. The item is passed as the first argument, and - the key is passed as the second argumnet. -* `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. -* `noDisposeOnSet` By default, if you set a `dispose()` method, then - it'll be called whenever a `set()` operation overwrites an existing - key. If you set this option, `dispose()` will only be called when a - key falls out of the cache, not when it is overwritten. - -## API - -* `set(key, value, maxAge)` -* `get(key) => value` - - Both of these will update the "recently used"-ness of the key. - They do what you think. `maxAge` is optional and overrides the - cache `maxAge` option if provided. - - If the key is not found, `get()` will return `undefined`. - - The key and val can be any value. - -* `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.) - -* `rforEach(function(value,key,cache), [thisp])` - - The same as `cache.forEach(...)` but items are iterated over in - reverse order. (ie, less 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. - -* `length` - - Return total length of objects in cache taking into account - `length` options function. - -* `itemCount` - - Return total quantity of objects currently in cache. Note, that - `stale` (see options) items are returned as part of this item - count. - -* `dump()` - - Return an array of the cache entries ready for serialization and usage - with 'destinationCache.load(arr)`. - -* `load(cacheEntriesArray)` - - Loads another cache entries array, obtained with `sourceCache.dump()`, - into the cache. The destination cache is reset before loading new entries - -* `prune()` - - Manually iterates over the entire cache proactively pruning old entries diff --git a/node_modules/lru-cache/index.js b/node_modules/lru-cache/index.js deleted file mode 100644 index bd35b535..00000000 --- a/node_modules/lru-cache/index.js +++ /dev/null @@ -1,468 +0,0 @@ -'use strict' - -module.exports = LRUCache - -// This will be a proper iterable 'Map' in engines that support it, -// or a fakey-fake PseudoMap in older versions. -var Map = require('pseudomap') -var util = require('util') - -// A linked list to keep track of recently-used-ness -var Yallist = require('yallist') - -// use symbols if possible, otherwise just _props -var hasSymbol = typeof Symbol === 'function' && process.env._nodeLRUCacheForceNoSymbol !== '1' -var makeSymbol -if (hasSymbol) { - makeSymbol = function (key) { - return Symbol(key) - } -} else { - makeSymbol = function (key) { - return '_' + key - } -} - -var MAX = makeSymbol('max') -var LENGTH = makeSymbol('length') -var LENGTH_CALCULATOR = makeSymbol('lengthCalculator') -var ALLOW_STALE = makeSymbol('allowStale') -var MAX_AGE = makeSymbol('maxAge') -var DISPOSE = makeSymbol('dispose') -var NO_DISPOSE_ON_SET = makeSymbol('noDisposeOnSet') -var LRU_LIST = makeSymbol('lruList') -var CACHE = makeSymbol('cache') - -function naiveLength () { return 1 } - -// lruList is a yallist where the head is the youngest -// item, and the tail is the oldest. the list contains the Hit -// objects as the entries. -// Each Hit object has a reference to its Yallist.Node. This -// never changes. -// -// cache is a Map (or PseudoMap) that matches the keys to -// the Yallist.Node object. -function LRUCache (options) { - if (!(this instanceof LRUCache)) { - return new LRUCache(options) - } - - if (typeof options === 'number') { - options = { max: options } - } - - if (!options) { - options = {} - } - - var max = this[MAX] = options.max - // Kind of weird to have a default max of Infinity, but oh well. - if (!max || - !(typeof max === 'number') || - max <= 0) { - this[MAX] = Infinity - } - - var lc = options.length || naiveLength - if (typeof lc !== 'function') { - lc = naiveLength - } - this[LENGTH_CALCULATOR] = lc - - this[ALLOW_STALE] = options.stale || false - this[MAX_AGE] = options.maxAge || 0 - this[DISPOSE] = options.dispose - this[NO_DISPOSE_ON_SET] = options.noDisposeOnSet || false - 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 - trim(this) - }, - get: function () { - return this[MAX] - }, - enumerable: true -}) - -Object.defineProperty(LRUCache.prototype, 'allowStale', { - set: function (allowStale) { - this[ALLOW_STALE] = !!allowStale - }, - get: function () { - return this[ALLOW_STALE] - }, - enumerable: true -}) - -Object.defineProperty(LRUCache.prototype, 'maxAge', { - set: function (mA) { - if (!mA || !(typeof mA === 'number') || mA < 0) { - mA = 0 - } - this[MAX_AGE] = mA - trim(this) - }, - get: function () { - return this[MAX_AGE] - }, - enumerable: true -}) - -// resize the cache when the lengthCalculator changes. -Object.defineProperty(LRUCache.prototype, 'lengthCalculator', { - set: function (lC) { - if (typeof lC !== 'function') { - lC = naiveLength - } - if (lC !== this[LENGTH_CALCULATOR]) { - this[LENGTH_CALCULATOR] = lC - this[LENGTH] = 0 - this[LRU_LIST].forEach(function (hit) { - hit.length = this[LENGTH_CALCULATOR](hit.value, hit.key) - this[LENGTH] += hit.length - }, this) - } - trim(this) - }, - get: function () { return this[LENGTH_CALCULATOR] }, - enumerable: true -}) - -Object.defineProperty(LRUCache.prototype, 'length', { - get: function () { return this[LENGTH] }, - enumerable: true -}) - -Object.defineProperty(LRUCache.prototype, 'itemCount', { - get: function () { return this[LRU_LIST].length }, - enumerable: true -}) - -LRUCache.prototype.rforEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this[LRU_LIST].tail; walker !== null;) { - var prev = walker.prev - forEachStep(this, fn, walker, thisp) - walker = prev - } -} - -function forEachStep (self, fn, node, thisp) { - var hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) { - hit = undefined - } - } - if (hit) { - fn.call(thisp, hit.value, hit.key, self) - } -} - -LRUCache.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this[LRU_LIST].head; walker !== null;) { - var next = walker.next - forEachStep(this, fn, walker, thisp) - walker = next - } -} - -LRUCache.prototype.keys = function () { - return this[LRU_LIST].toArray().map(function (k) { - return k.key - }, this) -} - -LRUCache.prototype.values = function () { - return this[LRU_LIST].toArray().map(function (k) { - return k.value - }, this) -} - -LRUCache.prototype.reset = function () { - if (this[DISPOSE] && - this[LRU_LIST] && - this[LRU_LIST].length) { - this[LRU_LIST].forEach(function (hit) { - this[DISPOSE](hit.key, hit.value) - }, this) - } - - this[CACHE] = new Map() // hash of items by key - this[LRU_LIST] = new Yallist() // list of items in order of use recency - this[LENGTH] = 0 // length of items in the list -} - -LRUCache.prototype.dump = function () { - return this[LRU_LIST].map(function (hit) { - if (!isStale(this, hit)) { - return { - k: hit.key, - v: hit.value, - e: hit.now + (hit.maxAge || 0) - } - } - }, this).toArray().filter(function (h) { - return h - }) -} - -LRUCache.prototype.dumpLru = function () { - return this[LRU_LIST] -} - -/* istanbul ignore next */ -LRUCache.prototype.inspect = function (n, opts) { - var str = 'LRUCache {' - var extras = false - - var as = this[ALLOW_STALE] - if (as) { - str += '\n allowStale: true' - extras = true - } - - var max = this[MAX] - if (max && max !== Infinity) { - if (extras) { - str += ',' - } - str += '\n max: ' + util.inspect(max, opts) - extras = true - } - - var maxAge = this[MAX_AGE] - if (maxAge) { - if (extras) { - str += ',' - } - str += '\n maxAge: ' + util.inspect(maxAge, opts) - extras = true - } - - var lc = this[LENGTH_CALCULATOR] - if (lc && lc !== naiveLength) { - if (extras) { - str += ',' - } - str += '\n length: ' + util.inspect(this[LENGTH], opts) - extras = true - } - - var didFirst = false - this[LRU_LIST].forEach(function (item) { - if (didFirst) { - str += ',\n ' - } else { - if (extras) { - str += ',\n' - } - didFirst = true - str += '\n ' - } - var key = util.inspect(item.key).split('\n').join('\n ') - var val = { value: item.value } - if (item.maxAge !== maxAge) { - val.maxAge = item.maxAge - } - if (lc !== naiveLength) { - val.length = item.length - } - if (isStale(this, item)) { - val.stale = true - } - - val = util.inspect(val, opts).split('\n').join('\n ') - str += key + ' => ' + val - }) - - if (didFirst || extras) { - str += '\n' - } - str += '}' - - return str -} - -LRUCache.prototype.set = function (key, value, maxAge) { - maxAge = maxAge || this[MAX_AGE] - - var now = maxAge ? Date.now() : 0 - var len = this[LENGTH_CALCULATOR](value, key) - - if (this[CACHE].has(key)) { - if (len > this[MAX]) { - del(this, this[CACHE].get(key)) - return false - } - - var node = this[CACHE].get(key) - var item = node.value - - // dispose of the old one before overwriting - // split out into 2 ifs for better coverage tracking - if (this[DISPOSE]) { - if (!this[NO_DISPOSE_ON_SET]) { - this[DISPOSE](key, item.value) - } - } - - item.now = now - item.maxAge = maxAge - item.value = value - this[LENGTH] += len - item.length - item.length = len - this.get(key) - trim(this) - return true - } - - var hit = new Entry(key, value, len, now, maxAge) - - // 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[LRU_LIST].unshift(hit) - this[CACHE].set(key, this[LRU_LIST].head) - trim(this) - return true -} - -LRUCache.prototype.has = function (key) { - if (!this[CACHE].has(key)) return false - var hit = this[CACHE].get(key).value - if (isStale(this, hit)) { - 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 node = this[LRU_LIST].tail - if (!node) return null - del(this, node) - return node.value -} - -LRUCache.prototype.del = function (key) { - del(this, this[CACHE].get(key)) -} - -LRUCache.prototype.load = function (arr) { - // reset the cache - this.reset() - - var now = Date.now() - // A previous serialized cache has the most recent items first - for (var l = arr.length - 1; l >= 0; l--) { - var hit = arr[l] - var expiresAt = hit.e || 0 - if (expiresAt === 0) { - // the item was created without expiration in a non aged cache - this.set(hit.k, hit.v) - } else { - var maxAge = expiresAt - now - // dont add already expired items - if (maxAge > 0) { - this.set(hit.k, hit.v, maxAge) - } - } - } -} - -LRUCache.prototype.prune = function () { - var self = this - this[CACHE].forEach(function (value, key) { - get(self, key, false) - }) -} - -function get (self, key, doUse) { - var node = self[CACHE].get(key) - if (node) { - var hit = node.value - if (isStale(self, hit)) { - del(self, node) - if (!self[ALLOW_STALE]) hit = undefined - } else { - if (doUse) { - self[LRU_LIST].unshiftNode(node) - } - } - if (hit) hit = hit.value - } - return hit -} - -function isStale (self, hit) { - if (!hit || (!hit.maxAge && !self[MAX_AGE])) { - return false - } - var stale = false - var diff = Date.now() - hit.now - if (hit.maxAge) { - stale = diff > hit.maxAge - } else { - stale = self[MAX_AGE] && (diff > self[MAX_AGE]) - } - return stale -} - -function trim (self) { - if (self[LENGTH] > self[MAX]) { - for (var walker = self[LRU_LIST].tail; - self[LENGTH] > self[MAX] && walker !== null;) { - // We know that we're about to delete this one, and also - // what the next least recently used key will be, so just - // go ahead and set it now. - var prev = walker.prev - del(self, walker) - walker = prev - } - } -} - -function del (self, node) { - if (node) { - var hit = node.value - if (self[DISPOSE]) { - self[DISPOSE](hit.key, hit.value) - } - self[LENGTH] -= hit.length - self[CACHE].delete(hit.key) - self[LRU_LIST].removeNode(node) - } -} - -// classy, since V8 prefers predictable objects. -function Entry (key, value, length, now, maxAge) { - this.key = key - this.value = value - this.length = length - this.now = now - this.maxAge = maxAge || 0 -} diff --git a/node_modules/lru-cache/package.json b/node_modules/lru-cache/package.json deleted file mode 100644 index 74010743..00000000 --- a/node_modules/lru-cache/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "_args": [ - [ - "lru-cache@4.1.5", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "lru-cache@4.1.5", - "_id": "lru-cache@4.1.5", - "_inBundle": false, - "_integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "_location": "/lru-cache", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "lru-cache@4.1.5", - "name": "lru-cache", - "escapedName": "lru-cache", - "rawSpec": "4.1.5", - "saveSpec": null, - "fetchSpec": "4.1.5" - }, - "_requiredBy": [ - "/editorconfig" - ], - "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "_spec": "4.1.5", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "bugs": { - "url": "https://github.com/isaacs/node-lru-cache/issues" - }, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - }, - "description": "A cache object that deletes the least-recently-used items.", - "devDependencies": { - "benchmark": "^2.1.4", - "standard": "^12.0.1", - "tap": "^12.1.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/isaacs/node-lru-cache#readme", - "keywords": [ - "mru", - "lru", - "cache" - ], - "license": "ISC", - "main": "index.js", - "name": "lru-cache", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-lru-cache.git" - }, - "scripts": { - "coveragerport": "tap --coverage-report=html", - "lintfix": "standard --fix test/*.js index.js", - "postpublish": "git push origin --all; git push origin --tags", - "posttest": "standard test/*.js index.js", - "postversion": "npm publish --tag=legacy", - "preversion": "npm test", - "snap": "TAP_SNAPSHOT=1 tap test/*.js -J", - "test": "tap test/*.js --100 -J" - }, - "version": "4.1.5" -} diff --git a/node_modules/minimatch/LICENSE b/node_modules/minimatch/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/minimatch/README.md b/node_modules/minimatch/README.md deleted file mode 100644 index ad72b813..00000000 --- a/node_modules/minimatch/README.md +++ /dev/null @@ -1,209 +0,0 @@ -# minimatch - -A minimal matching utility. - -[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch) - - -This is the matching library used internally by npm. - -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 instantiating 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. - -### 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 if this option is set. When not 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/minimatch/minimatch.js b/node_modules/minimatch/minimatch.js deleted file mode 100644 index 5b5f8cf4..00000000 --- a/node_modules/minimatch/minimatch.js +++ /dev/null @@ -1,923 +0,0 @@ -module.exports = minimatch -minimatch.Minimatch = Minimatch - -var path = { sep: '/' } -try { - path = require('path') -} catch (er) {} - -var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} -var expand = require('brace-expansion') - -var plTypes = { - '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, - '?': { open: '(?:', close: ')?' }, - '+': { open: '(?:', close: ')+' }, - '*': { open: '(?:', close: ')*' }, - '@': { open: '(?:', close: ')' } -} - -// any single thing other than / -// don't need to escape / when using new RegExp() -var qmark = '[^/]' - -// * => any number of characters -var 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. -var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' - -// not a ^ or / followed by a dot, -// followed by anything, any number of times. -var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' - -// characters that need to be escaped in RegExp. -var 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) - } - - if (typeof pattern !== 'string') { - throw new TypeError('glob pattern string required') - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows support: need to use /, not \ - if (path.sep !== '/') { - pattern = pattern.split(path.sep).join('/') - } - - 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 s.indexOf(false) === -1 - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - var negate = false - var options = this.options - var 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 braceExpand(pattern, options) -} - -Minimatch.prototype.braceExpand = braceExpand - -function braceExpand (pattern, options) { - if (!options) { - if (this instanceof Minimatch) { - options = this.options - } else { - options = {} - } - } - - pattern = typeof pattern === 'undefined' - ? this.pattern : pattern - - if (typeof pattern === 'undefined') { - throw new TypeError('undefined pattern') - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - return expand(pattern) -} - -// 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) { - if (pattern.length > 1024 * 64) { - throw new TypeError('pattern is too long') - } - - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === '**') return GLOBSTAR - if (pattern === '') return '' - - var re = '' - var hasMagic = !!options.nocase - var escaping = false - // ? => one single character - var patternListStack = [] - var negativeLists = [] - var stateChar - var inClass = false - var reClassStart = -1 - var classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - var patternStart = pattern.charAt(0) === '.' ? '' // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' - : '(?!\\.)' - var 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 (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 - } - - patternListStack.push({ - type: stateChar, - start: i - 1, - reStart: re.length, - open: plTypes[stateChar].open, - close: plTypes[stateChar].close - }) - // 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 - var pl = patternListStack.pop() - // negation is (?:(?!js)[^/]*) - // The others are (?:) - re += pl.close - if (pl.type === '!') { - negativeLists.push(pl) - } - pl.reEnd = re.length - 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 - } - - // handle the case where we left a class open. - // "[z-a]" is valid, equivalent to "\[z-a\]" - if (inClass) { - // split where the last [ was, make sure we don't have - // an invalid re. if so, re-walk the contents of the - // would-be class to re-translate any characters that - // were passed through as-is - // TODO: It would probably be faster to determine this - // without a try/catch and a new RegExp, but it's tricky - // to do safely. For now, this is safe and works. - var cs = pattern.substring(classStart + 1, i) - try { - RegExp('[' + cs + ']') - } catch (er) { - // not a valid class! - var sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' - hasMagic = hasMagic || sp[1] - inClass = 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 - 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. - for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + pl.open.length) - this.debug('setting tail', re, pl) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/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, pl, re) - 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 - } - - // Hack to work around lack of negative lookbehind in JS - // A pattern like: *.!(x).!(y|z) needs to ensure that a name - // like 'a.xyz.yz' doesn't match. So, the first negative - // lookahead, has to look ALL the way ahead, to the end of - // the pattern. - for (var n = negativeLists.length - 1; n > -1; n--) { - var nl = negativeLists[n] - - var nlBefore = re.slice(0, nl.reStart) - var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) - var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) - var nlAfter = re.slice(nl.reEnd) - - nlLast += nlAfter - - // Handle nested stuff like *(*.js|!(*.json)), where open parens - // mean that we should *not* include the ) in the bit that is considered - // "after" the negated section. - var openParensBefore = nlBefore.split('(').length - 1 - var cleanAfter = nlAfter - for (i = 0; i < openParensBefore; i++) { - cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') - } - nlAfter = cleanAfter - - var dollar = '' - if (nlAfter === '' && isSub !== SUBPARSE) { - dollar = '$' - } - var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast - re = newRe - } - - // 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' : '' - try { - var regExp = new RegExp('^' + re + '$', flags) - } catch (er) { - // If it was an invalid regular expression, then it can't match - // anything. This trick looks for a character after the end of - // the string, which is of course impossible, except in multi-line - // mode, but it's not a /m regex. - return new RegExp('$.') - } - - 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) { - this.regexp = false - return this.regexp - } - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - var 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 { - this.regexp = new RegExp(re, flags) - } catch (ex) { - this.regexp = false - } - return this.regexp -} - -minimatch.match = function (list, pattern, options) { - options = options || {} - var mm = new Minimatch(pattern, options) - list = list.filter(function (f) { - return mm.match(f) - }) - if (mm.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 \ - if (path.sep !== '/') { - f = f.split(path.sep).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) - - // Find the basename of the path by looking for the last non-empty segment - var filename - var i - for (i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (i = 0; i < set.length; i++) { - var pattern = set[i] - var file = f - if (options.matchBase && pattern.length === 1) { - file = [filename] - } - 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] - var 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 - var 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 (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 - } - - // ** 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, '\\$&') -} diff --git a/node_modules/minimatch/package.json b/node_modules/minimatch/package.json deleted file mode 100644 index e166e6b5..00000000 --- a/node_modules/minimatch/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_args": [ - [ - "minimatch@3.0.4", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "minimatch@3.0.4", - "_id": "minimatch@3.0.4", - "_inBundle": false, - "_integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "_location": "/minimatch", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "minimatch@3.0.4", - "name": "minimatch", - "escapedName": "minimatch", - "rawSpec": "3.0.4", - "saveSpec": null, - "fetchSpec": "3.0.4" - }, - "_requiredBy": [ - "/glob" - ], - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "_spec": "3.0.4", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "bugs": { - "url": "https://github.com/isaacs/minimatch/issues" - }, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "description": "a glob matcher in javascript", - "devDependencies": { - "tap": "^10.3.2" - }, - "engines": { - "node": "*" - }, - "files": [ - "minimatch.js" - ], - "homepage": "https://github.com/isaacs/minimatch#readme", - "license": "ISC", - "main": "minimatch.js", - "name": "minimatch", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/minimatch.git" - }, - "scripts": { - "postpublish": "git push origin --all; git push origin --tags", - "postversion": "npm publish", - "preversion": "npm test", - "test": "tap test/*.js --cov" - }, - "version": "3.0.4" -} diff --git a/node_modules/mkdirp/.travis.yml b/node_modules/mkdirp/.travis.yml deleted file mode 100644 index 74c57bf1..00000000 --- a/node_modules/mkdirp/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" - - "0.12" - - "iojs" -before_install: - - npm install -g npm@~1.4.6 diff --git a/node_modules/mkdirp/LICENSE b/node_modules/mkdirp/LICENSE deleted file mode 100644 index 432d1aeb..00000000 --- a/node_modules/mkdirp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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/mkdirp/bin/cmd.js b/node_modules/mkdirp/bin/cmd.js deleted file mode 100755 index d95de15a..00000000 --- a/node_modules/mkdirp/bin/cmd.js +++ /dev/null @@ -1,33 +0,0 @@ -#!/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/mkdirp/bin/usage.txt b/node_modules/mkdirp/bin/usage.txt deleted file mode 100644 index f952aa2c..00000000 --- a/node_modules/mkdirp/bin/usage.txt +++ /dev/null @@ -1,12 +0,0 @@ -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/mkdirp/examples/pow.js b/node_modules/mkdirp/examples/pow.js deleted file mode 100644 index e6924212..00000000 --- a/node_modules/mkdirp/examples/pow.js +++ /dev/null @@ -1,6 +0,0 @@ -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/mkdirp/index.js b/node_modules/mkdirp/index.js deleted file mode 100644 index 6ce241b5..00000000 --- a/node_modules/mkdirp/index.js +++ /dev/null @@ -1,98 +0,0 @@ -var path = require('path'); -var fs = require('fs'); -var _0777 = parseInt('0777', 8); - -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/mkdirp/package.json b/node_modules/mkdirp/package.json deleted file mode 100644 index 3df18dea..00000000 --- a/node_modules/mkdirp/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_args": [ - [ - "mkdirp@0.5.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "mkdirp@0.5.1", - "_id": "mkdirp@0.5.1", - "_inBundle": false, - "_integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "_location": "/mkdirp", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "mkdirp@0.5.1", - "name": "mkdirp", - "escapedName": "mkdirp", - "rawSpec": "0.5.1", - "saveSpec": null, - "fetchSpec": "0.5.1" - }, - "_requiredBy": [ - "/js-beautify" - ], - "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "_spec": "0.5.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "bugs": { - "url": "https://github.com/substack/node-mkdirp/issues" - }, - "dependencies": { - "minimist": "0.0.8" - }, - "description": "Recursively mkdir, like `mkdir -p`", - "devDependencies": { - "mock-fs": "2 >=2.7.0", - "tap": "1" - }, - "homepage": "https://github.com/substack/node-mkdirp#readme", - "keywords": [ - "mkdir", - "directory" - ], - "license": "MIT", - "main": "index.js", - "name": "mkdirp", - "repository": { - "type": "git", - "url": "git+https://github.com/substack/node-mkdirp.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "version": "0.5.1" -} diff --git a/node_modules/mkdirp/readme.markdown b/node_modules/mkdirp/readme.markdown deleted file mode 100644 index 3cc13153..00000000 --- a/node_modules/mkdirp/readme.markdown +++ /dev/null @@ -1,100 +0,0 @@ -# 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/mkdirp/test/chmod.js b/node_modules/mkdirp/test/chmod.js deleted file mode 100644 index 6a404b93..00000000 --- a/node_modules/mkdirp/test/chmod.js +++ /dev/null @@ -1,41 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); -var _0744 = parseInt('0744', 8); - -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/mkdirp/test/clobber.js b/node_modules/mkdirp/test/clobber.js deleted file mode 100644 index 2433b9ad..00000000 --- a/node_modules/mkdirp/test/clobber.js +++ /dev/null @@ -1,38 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/mkdirp.js b/node_modules/mkdirp/test/mkdirp.js deleted file mode 100644 index eaa8921c..00000000 --- a/node_modules/mkdirp/test/mkdirp.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/opts_fs.js b/node_modules/mkdirp/test/opts_fs.js deleted file mode 100644 index 97186b62..00000000 --- a/node_modules/mkdirp/test/opts_fs.js +++ /dev/null @@ -1,29 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var test = require('tap').test; -var mockfs = require('mock-fs'); -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/opts_fs_sync.js b/node_modules/mkdirp/test/opts_fs_sync.js deleted file mode 100644 index 6c370aa6..00000000 --- a/node_modules/mkdirp/test/opts_fs_sync.js +++ /dev/null @@ -1,27 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var test = require('tap').test; -var mockfs = require('mock-fs'); -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/perm.js b/node_modules/mkdirp/test/perm.js deleted file mode 100644 index fbce44b8..00000000 --- a/node_modules/mkdirp/test/perm.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/perm_sync.js b/node_modules/mkdirp/test/perm_sync.js deleted file mode 100644 index 398229fe..00000000 --- a/node_modules/mkdirp/test/perm_sync.js +++ /dev/null @@ -1,36 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/race.js b/node_modules/mkdirp/test/race.js deleted file mode 100644 index b0b9e183..00000000 --- a/node_modules/mkdirp/test/race.js +++ /dev/null @@ -1,37 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -test('race', function (t) { - t.plan(10); - 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); - - mk(file); - - 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'); - }); - }) - }); - } -}); diff --git a/node_modules/mkdirp/test/rel.js b/node_modules/mkdirp/test/rel.js deleted file mode 100644 index 4ddb3427..00000000 --- a/node_modules/mkdirp/test/rel.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/return.js b/node_modules/mkdirp/test/return.js deleted file mode 100644 index bce68e56..00000000 --- a/node_modules/mkdirp/test/return.js +++ /dev/null @@ -1,25 +0,0 @@ -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/mkdirp/test/return_sync.js b/node_modules/mkdirp/test/return_sync.js deleted file mode 100644 index 7c222d35..00000000 --- a/node_modules/mkdirp/test/return_sync.js +++ /dev/null @@ -1,24 +0,0 @@ -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/mkdirp/test/root.js b/node_modules/mkdirp/test/root.js deleted file mode 100644 index 9e7d079d..00000000 --- a/node_modules/mkdirp/test/root.js +++ /dev/null @@ -1,19 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/sync.js b/node_modules/mkdirp/test/sync.js deleted file mode 100644 index 8c8dc938..00000000 --- a/node_modules/mkdirp/test/sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/umask.js b/node_modules/mkdirp/test/umask.js deleted file mode 100644 index 2033c63a..00000000 --- a/node_modules/mkdirp/test/umask.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/mkdirp/test/umask_sync.js b/node_modules/mkdirp/test/umask_sync.js deleted file mode 100644 index 11a76147..00000000 --- a/node_modules/mkdirp/test/umask_sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var exists = fs.exists || path.exists; -var test = require('tap').test; -var _0777 = parseInt('0777', 8); -var _0755 = parseInt('0755', 8); - -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/nopt/.npmignore b/node_modules/nopt/.npmignore deleted file mode 100644 index 3c3629e6..00000000 --- a/node_modules/nopt/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/nopt/.travis.yml b/node_modules/nopt/.travis.yml deleted file mode 100644 index a1cef591..00000000 --- a/node_modules/nopt/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - '0.12' - - '4' - - '6' - - '7' -before_install: - - npm install -g npm@latest diff --git a/node_modules/nopt/CHANGELOG.md b/node_modules/nopt/CHANGELOG.md deleted file mode 100644 index 82a09fb4..00000000 --- a/node_modules/nopt/CHANGELOG.md +++ /dev/null @@ -1,58 +0,0 @@ -### v4.0.1 (2016-12-14) - -#### WHOOPS - -* [`fb9b1ce`](https://github.com/npm/nopt/commit/fb9b1ce57b3c69b4f7819015be87719204f77ef6) - Merged so many patches at once that the code fencing - ([@adius](https://github.com/adius)) added got broken. Sorry, - ([@adius](https://github.com/adius))! - ([@othiym23](https://github.com/othiym23)) - -### v4.0.0 (2016-12-13) - -#### BREAKING CHANGES - -* [`651d447`](https://github.com/npm/nopt/commit/651d4473946096d341a480bbe56793de3fc706aa) - When parsing String-typed arguments, if the next value is `""`, don't simply - swallow it. ([@samjonester](https://github.com/samjonester)) - -#### PERFORMANCE TWEAKS - -* [`3370ce8`](https://github.com/npm/nopt/commit/3370ce87a7618ba228883861db84ddbcdff252a9) - Simplify initialization. ([@elidoran](https://github.com/elidoran)) -* [`356e58e`](https://github.com/npm/nopt/commit/356e58e3b3b431a4b1af7fd7bdee44c2c0526a09) - Store `Array.isArray(types[arg])` for reuse. - ([@elidoran](https://github.com/elidoran)) -* [`0d95e90`](https://github.com/npm/nopt/commit/0d95e90515844f266015b56d2c80b94e5d14a07e) - Interpret single-item type arrays as a single type. - ([@samjonester](https://github.com/samjonester)) -* [`07c69d3`](https://github.com/npm/nopt/commit/07c69d38b5186450941fbb505550becb78a0e925) - Simplify key-value extraction. ([@elidoran](https://github.com/elidoran)) -* [`39b6e5c`](https://github.com/npm/nopt/commit/39b6e5c65ac47f60cd43a1fbeece5cd4c834c254) - Only call `Date.parse(val)` once. ([@elidoran](https://github.com/elidoran)) -* [`934943d`](https://github.com/npm/nopt/commit/934943dffecb55123a2b15959fe2a359319a5dbd) - Use `osenv.home()` to find a user's home directory instead of assuming it's - always `$HOME`. ([@othiym23](https://github.com/othiym23)) - -#### TEST & CI IMPROVEMENTS - -* [`326ffff`](https://github.com/npm/nopt/commit/326ffff7f78a00bcd316adecf69075f8a8093619) - Fix `/tmp` test to work on Windows. - ([@elidoran](https://github.com/elidoran)) -* [`c89d31a`](https://github.com/npm/nopt/commit/c89d31a49d14f2238bc6672db08da697bbc57f1b) - Only run Windows tests on Windows, only run Unix tests on a Unix. - ([@elidoran](https://github.com/elidoran)) -* [`affd3d1`](https://github.com/npm/nopt/commit/affd3d1d0addffa93006397b2013b18447339366) - Refresh Travis to run the tests against the currently-supported batch of npm - versions. ([@helio](https://github.com/helio)-frota) -* [`55f9449`](https://github.com/npm/nopt/commit/55f94497d163ed4d16dd55fd6c4fb95cc440e66d) - `tap@8.0.1` ([@othiym23](https://github.com/othiym23)) - -#### DOC TWEAKS - -* [`5271229`](https://github.com/npm/nopt/commit/5271229ee7c810217dd51616c086f5d9ab224581) - Use JavaScript code block for syntax highlighting. - ([@adius](https://github.com/adius)) -* [`c0d156f`](https://github.com/npm/nopt/commit/c0d156f229f9994c5dfcec4a8886eceff7a07682) - The code sample in the README had `many2: [ oneThing ]`, and now it has - `many2: [ two, things ]`. ([@silkentrance](https://github.com/silkentrance)) diff --git a/node_modules/nopt/LICENSE b/node_modules/nopt/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/nopt/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/nopt/README.md b/node_modules/nopt/README.md deleted file mode 100644 index a99531c0..00000000 --- a/node_modules/nopt/README.md +++ /dev/null @@ -1,213 +0,0 @@ -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 hit the limit of your frustration just trying to -manage them all, and defer it 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 - -```javascript -// 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 - , "many1" : [String, Array] - , "many2" : [path, 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: - -```console -$ 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 --many1 5 --many1 null --many1 foo -{ many1: ["5", "null", "foo"] } - -$ node my-program.js --many2 foo --many2 bar -{ many2: ["/path/to/foo", "path/to/bar"] } -``` - -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 values for -known 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/nopt/bin/nopt.js b/node_modules/nopt/bin/nopt.js deleted file mode 100755 index 3232d4c5..00000000 --- a/node_modules/nopt/bin/nopt.js +++ /dev/null @@ -1,54 +0,0 @@ -#!/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/nopt/examples/my-program.js b/node_modules/nopt/examples/my-program.js deleted file mode 100755 index 142447e1..00000000 --- a/node_modules/nopt/examples/my-program.js +++ /dev/null @@ -1,30 +0,0 @@ -#!/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/nopt/lib/nopt.js b/node_modules/nopt/lib/nopt.js deleted file mode 100644 index 1fb11351..00000000 --- a/node_modules/nopt/lib/nopt.js +++ /dev/null @@ -1,436 +0,0 @@ -// 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") - , osenv = require("osenv") - -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 - , argv = { - remain: [], - cooked: args, - original: args.slice(0) - } - - parse(args, data, argv.remain, types, shorthands) - // now data is full - clean(data, types, exports.typeDefs) - data.argv = argv - 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 isWin = process.platform === 'win32' - , homePattern = isWin ? /^~(\/|\\)/ : /^~\// - , home = osenv.home() - - if (home && val.match(homePattern)) { - data[k] = path.resolve(home, val.substr(2)) - } else { - data[k] = path.resolve(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) { - var s = Date.parse(val) - debug("validate Date %j %j %j", k, val, s) - 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 && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (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) { - var at = arg.indexOf('=') - if (at > -1) { - hadEq = true - var v = arg.substr(at + 1) - arg = arg.substr(0, at) - args.splice(i, 1, 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 argType = types[arg] - var isTypeArray = Array.isArray(argType) - if (isTypeArray && argType.length === 1) { - isTypeArray = false - argType = argType[0] - } - - var isArray = argType === Array || - isTypeArray && argType.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' || - argType === Boolean || - isTypeArray && argType.indexOf(Boolean) !== -1 || - (typeof argType === 'undefined' && !hadEq) || - (la === "false" && - (argType === null || - isTypeArray && ~argType.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 (isTypeArray && la) { - if (~argType.indexOf(la)) { - // an explicit type - val = la - i ++ - } else if ( la === "null" && ~argType.indexOf(null) ) { - // null allowed - val = null - i ++ - } else if ( !la.match(/^-{2,}[^-]/) && - !isNaN(la) && - ~argType.indexOf(Number) ) { - // number - val = +la - i ++ - } else if ( !la.match(/^-[^-]/) && ~argType.indexOf(String) ) { - // string - val = la - i ++ - } - } - - if (isArray) (data[arg] = data[arg] || []).push(val) - else data[arg] = val - - continue - } - - if (argType === String) { - if (la === undefined) { - la = "" - } else if (la.match(/^-{1,2}[^-]+/)) { - la = "" - i -- - } - } - - 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/nopt/package.json b/node_modules/nopt/package.json deleted file mode 100644 index 60524f7d..00000000 --- a/node_modules/nopt/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "_args": [ - [ - "nopt@4.0.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "nopt@4.0.1", - "_id": "nopt@4.0.1", - "_inBundle": false, - "_integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "_location": "/nopt", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "nopt@4.0.1", - "name": "nopt", - "escapedName": "nopt", - "rawSpec": "4.0.1", - "saveSpec": null, - "fetchSpec": "4.0.1" - }, - "_requiredBy": [ - "/js-beautify" - ], - "_resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "_spec": "4.0.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bin": { - "nopt": "./bin/nopt.js" - }, - "bugs": { - "url": "https://github.com/npm/nopt/issues" - }, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", - "devDependencies": { - "tap": "^8.0.1" - }, - "homepage": "https://github.com/npm/nopt#readme", - "license": "ISC", - "main": "lib/nopt.js", - "name": "nopt", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/nopt.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "version": "4.0.1" -} diff --git a/node_modules/nopt/test/basic.js b/node_modules/nopt/test/basic.js deleted file mode 100644 index 5c18ac0f..00000000 --- a/node_modules/nopt/test/basic.js +++ /dev/null @@ -1,303 +0,0 @@ -var nopt = require("../") - , test = require('tap').test - , isWin = process.platform === 'win32' - -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() -}) - -// https://github.com/npm/nopt/issues/65 -test("Empty String should not swallow next flag", function (t) { - var parsed = nopt({ empty: String, foo: String }, {}, ["--empty", "--foo"], 0) - t.same(parsed.empty, "") - t.same(parsed.foo, "") - t.end() -}) - -// https://github.com/npm/nopt/issues/66 -test("Empty String should not be true when type is single item Array", function (t) { - var parsed = nopt({ 'foo': [String] }, {}, ["--foo"], 0) - t.same(parsed.foo, "") - t.end() -}) - -test("~ path is resolved to " + (isWin ? '%USERPROFILE%' : '$HOME'), function (t) { - var path = require("path") - , the - - if (isWin) { - the = { - key: 'USERPROFILE', - dir: 'C:\\temp', - val: '~\\val' - } - } else { - the = { - key: 'HOME', - dir: '/tmp', - val: '~/val' - } - } - if (!process.env[the.key]) process.env[the.key] = v.dir - var parsed = nopt({key: path}, {}, ["--key=" + the.val], 0) - t.same(parsed.key, path.resolve(process.env[the.key], "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() -}); - -// https://github.com/npm/nopt/issues/48 -test("Check types based on name of type", function (t) { - var parsed = nopt({"parse-me": {name: "Number"}}, null, ['--parse-me=1.20'], 0) - t.equal(parsed['parse-me'], 1.2) - t.end() -}) - - -test("Missing types are not parsed", function (t) { - var parsed = nopt({"parse-me": {}}, null, ['--parse-me=1.20'], 0) - //should only contain argv - t.equal(Object.keys(parsed).length, 1) - t.end() -}) - -test("Types passed without a name are not parsed", function (t) { - var parsed = nopt({"parse-me": {}}, {}, ['--parse-me=1.20'], 0) - //should only contain argv - t.equal(Object.keys(parsed).length, 1) - 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: isWin ? "C:\\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/once/LICENSE b/node_modules/once/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/once/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/once/README.md b/node_modules/once/README.md deleted file mode 100644 index 1f1ffca9..00000000 --- a/node_modules/once/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# 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. - -To check whether you function has been called, use `fn.called`. Once the -function is called for the first time the return value of the original -function is saved in `fn.value` and subsequent calls will continue to -return this value. - -```javascript -var once = require('once') - -function load (cb) { - cb = once(cb) - var stream = createStream() - stream.once('data', cb) - stream.once('end', function () { - if (!cb.called) cb(new Error('not found')) - }) -} -``` - -## `once.strict(func)` - -Throw an error if the function is called twice. - -Some functions are expected to be called only once. Using `once` for them would -potentially hide logical errors. - -In the example below, the `greet` function has to call the callback only once: - -```javascript -function greet (name, cb) { - // return is missing from the if statement - // when no name is passed, the callback is called twice - if (!name) cb('Hello anonymous') - cb('Hello ' + name) -} - -function log (msg) { - console.log(msg) -} - -// this will print 'Hello anonymous' but the logical error will be missed -greet(null, once(msg)) - -// once.strict will print 'Hello anonymous' and throw an error when the callback will be called the second time -greet(null, once.strict(msg)) -``` diff --git a/node_modules/once/once.js b/node_modules/once/once.js deleted file mode 100644 index 23540673..00000000 --- a/node_modules/once/once.js +++ /dev/null @@ -1,42 +0,0 @@ -var wrappy = require('wrappy') -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} diff --git a/node_modules/once/package.json b/node_modules/once/package.json deleted file mode 100644 index 8da46ace..00000000 --- a/node_modules/once/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "_args": [ - [ - "once@1.4.0", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "once@1.4.0", - "_id": "once@1.4.0", - "_inBundle": false, - "_integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "_location": "/once", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "once@1.4.0", - "name": "once", - "escapedName": "once", - "rawSpec": "1.4.0", - "saveSpec": null, - "fetchSpec": "1.4.0" - }, - "_requiredBy": [ - "/glob", - "/inflight" - ], - "_resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "_spec": "1.4.0", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/once/issues" - }, - "dependencies": { - "wrappy": "1" - }, - "description": "Run a function exactly one time", - "devDependencies": { - "tap": "^7.0.1" - }, - "directories": { - "test": "test" - }, - "files": [ - "once.js" - ], - "homepage": "https://github.com/isaacs/once#readme", - "keywords": [ - "once", - "function", - "one", - "single" - ], - "license": "ISC", - "main": "once.js", - "name": "once", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/once.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "version": "1.4.0" -} diff --git a/node_modules/os-homedir/index.js b/node_modules/os-homedir/index.js deleted file mode 100644 index 33066166..00000000 --- a/node_modules/os-homedir/index.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; -var os = require('os'); - -function homedir() { - var env = process.env; - var home = env.HOME; - var user = env.LOGNAME || env.USER || env.LNAME || env.USERNAME; - - if (process.platform === 'win32') { - return env.USERPROFILE || env.HOMEDRIVE + env.HOMEPATH || home || null; - } - - if (process.platform === 'darwin') { - return home || (user ? '/Users/' + user : null); - } - - if (process.platform === 'linux') { - return home || (process.getuid() === 0 ? '/root' : (user ? '/home/' + user : null)); - } - - return home || null; -} - -module.exports = typeof os.homedir === 'function' ? os.homedir : homedir; diff --git a/node_modules/os-homedir/license b/node_modules/os-homedir/license deleted file mode 100644 index 654d0bfe..00000000 --- a/node_modules/os-homedir/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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/os-homedir/package.json b/node_modules/os-homedir/package.json deleted file mode 100644 index ebf679fa..00000000 --- a/node_modules/os-homedir/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_args": [ - [ - "os-homedir@1.0.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "os-homedir@1.0.2", - "_id": "os-homedir@1.0.2", - "_inBundle": false, - "_integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "_location": "/os-homedir", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "os-homedir@1.0.2", - "name": "os-homedir", - "escapedName": "os-homedir", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/osenv" - ], - "_resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "bugs": { - "url": "https://github.com/sindresorhus/os-homedir/issues" - }, - "description": "Node.js 4 `os.homedir()` ponyfill", - "devDependencies": { - "ava": "*", - "path-exists": "^2.0.0", - "xo": "^0.16.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/sindresorhus/os-homedir#readme", - "keywords": [ - "builtin", - "core", - "ponyfill", - "polyfill", - "shim", - "os", - "homedir", - "home", - "dir", - "directory", - "folder", - "user", - "path" - ], - "license": "MIT", - "name": "os-homedir", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/os-homedir.git" - }, - "scripts": { - "test": "xo && ava" - }, - "version": "1.0.2" -} diff --git a/node_modules/os-homedir/readme.md b/node_modules/os-homedir/readme.md deleted file mode 100644 index 856ae615..00000000 --- a/node_modules/os-homedir/readme.md +++ /dev/null @@ -1,31 +0,0 @@ -# os-homedir [![Build Status](https://travis-ci.org/sindresorhus/os-homedir.svg?branch=master)](https://travis-ci.org/sindresorhus/os-homedir) - -> Node.js 4 [`os.homedir()`](https://nodejs.org/api/os.html#os_os_homedir) [ponyfill](https://ponyfill.com) - - -## Install - -``` -$ npm install --save os-homedir -``` - - -## Usage - -```js -const osHomedir = require('os-homedir'); - -console.log(osHomedir()); -//=> '/Users/sindresorhus' -``` - - -## Related - -- [user-home](https://github.com/sindresorhus/user-home) - Same as this module but caches the result -- [home-or-tmp](https://github.com/sindresorhus/home-or-tmp) - Get the user home directory with fallback to the system temp directory - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/os-tmpdir/index.js b/node_modules/os-tmpdir/index.js deleted file mode 100644 index 2077b1ce..00000000 --- a/node_modules/os-tmpdir/index.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; -var isWindows = process.platform === 'win32'; -var trailingSlashRe = isWindows ? /[^:]\\$/ : /.\/$/; - -// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43 -module.exports = function () { - var path; - - if (isWindows) { - path = process.env.TEMP || - process.env.TMP || - (process.env.SystemRoot || process.env.windir) + '\\temp'; - } else { - path = process.env.TMPDIR || - process.env.TMP || - process.env.TEMP || - '/tmp'; - } - - if (trailingSlashRe.test(path)) { - path = path.slice(0, -1); - } - - return path; -}; diff --git a/node_modules/os-tmpdir/license b/node_modules/os-tmpdir/license deleted file mode 100644 index 654d0bfe..00000000 --- a/node_modules/os-tmpdir/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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/os-tmpdir/package.json b/node_modules/os-tmpdir/package.json deleted file mode 100644 index 4249e6bf..00000000 --- a/node_modules/os-tmpdir/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_args": [ - [ - "os-tmpdir@1.0.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "os-tmpdir@1.0.2", - "_id": "os-tmpdir@1.0.2", - "_inBundle": false, - "_integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "_location": "/os-tmpdir", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "os-tmpdir@1.0.2", - "name": "os-tmpdir", - "escapedName": "os-tmpdir", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/osenv" - ], - "_resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "bugs": { - "url": "https://github.com/sindresorhus/os-tmpdir/issues" - }, - "description": "Node.js os.tmpdir() ponyfill", - "devDependencies": { - "ava": "*", - "xo": "^0.16.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/sindresorhus/os-tmpdir#readme", - "keywords": [ - "built-in", - "core", - "ponyfill", - "polyfill", - "shim", - "os", - "tmpdir", - "tempdir", - "tmp", - "temp", - "dir", - "directory", - "env", - "environment" - ], - "license": "MIT", - "name": "os-tmpdir", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/os-tmpdir.git" - }, - "scripts": { - "test": "xo && ava" - }, - "version": "1.0.2" -} diff --git a/node_modules/os-tmpdir/readme.md b/node_modules/os-tmpdir/readme.md deleted file mode 100644 index c09f7ed8..00000000 --- a/node_modules/os-tmpdir/readme.md +++ /dev/null @@ -1,32 +0,0 @@ -# os-tmpdir [![Build Status](https://travis-ci.org/sindresorhus/os-tmpdir.svg?branch=master)](https://travis-ci.org/sindresorhus/os-tmpdir) - -> Node.js [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) [ponyfill](https://ponyfill.com) - -Use this instead of `require('os').tmpdir()` to get a consistent behavior on different Node.js versions (even 0.8). - - -## Install - -``` -$ npm install --save os-tmpdir -``` - - -## Usage - -```js -const osTmpdir = require('os-tmpdir'); - -osTmpdir(); -//=> '/var/folders/m3/5574nnhn0yj488ccryqr7tc80000gn/T' -``` - - -## API - -See the [`os.tmpdir()` docs](https://nodejs.org/api/os.html#os_os_tmpdir). - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/osenv/LICENSE b/node_modules/osenv/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/osenv/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/osenv/README.md b/node_modules/osenv/README.md deleted file mode 100644 index 08fd9002..00000000 --- a/node_modules/osenv/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# osenv - -Look up environment settings specific to different operating systems. - -## Usage - -```javascript -var osenv = require('osenv') -var path = osenv.path() -var user = osenv.user() -// etc. - -// Some things are not reliably in the env, and have a fallback command: -var h = osenv.hostname(function (er, hostname) { - h = hostname -}) -// This will still cause it to be memoized, so calling osenv.hostname() -// is now an immediate operation. - -// You can always send a cb, which will get called in the nextTick -// if it's been memoized, or wait for the fallback data if it wasn't -// found in the environment. -osenv.hostname(function (er, hostname) { - if (er) console.error('error looking up hostname') - else console.log('this machine calls itself %s', hostname) -}) -``` - -## osenv.hostname() - -The machine name. Calls `hostname` if not found. - -## osenv.user() - -The currently logged-in user. Calls `whoami` if not found. - -## osenv.prompt() - -Either PS1 on unix, or PROMPT on Windows. - -## osenv.tmpdir() - -The place where temporary files should be created. - -## osenv.home() - -No place like it. - -## osenv.path() - -An array of the places that the operating system will search for -executables. - -## osenv.editor() - -Return the executable name of the editor program. This uses the EDITOR -and VISUAL environment variables, and falls back to `vi` on Unix, or -`notepad.exe` on Windows. - -## osenv.shell() - -The SHELL on Unix, which Windows calls the ComSpec. Defaults to 'bash' -or 'cmd'. diff --git a/node_modules/osenv/osenv.js b/node_modules/osenv/osenv.js deleted file mode 100644 index 702a95b9..00000000 --- a/node_modules/osenv/osenv.js +++ /dev/null @@ -1,72 +0,0 @@ -var isWindows = process.platform === 'win32' -var path = require('path') -var exec = require('child_process').exec -var osTmpdir = require('os-tmpdir') -var osHomedir = require('os-homedir') - -// looking up envs is a bit costly. -// Also, sometimes we want to have a fallback -// Pass in a callback to wait for the fallback on failures -// After the first lookup, always returns the same thing. -function memo (key, lookup, fallback) { - var fell = false - var falling = false - exports[key] = function (cb) { - var val = lookup() - if (!val && !fell && !falling && fallback) { - fell = true - falling = true - exec(fallback, function (er, output, stderr) { - falling = false - if (er) return // oh well, we tried - val = output.trim() - }) - } - exports[key] = function (cb) { - if (cb) process.nextTick(cb.bind(null, null, val)) - return val - } - if (cb && !falling) process.nextTick(cb.bind(null, null, val)) - return val - } -} - -memo('user', function () { - return ( isWindows - ? process.env.USERDOMAIN + '\\' + process.env.USERNAME - : process.env.USER - ) -}, 'whoami') - -memo('prompt', function () { - return isWindows ? process.env.PROMPT : process.env.PS1 -}) - -memo('hostname', function () { - return isWindows ? process.env.COMPUTERNAME : process.env.HOSTNAME -}, 'hostname') - -memo('tmpdir', function () { - return osTmpdir() -}) - -memo('home', function () { - return osHomedir() -}) - -memo('path', function () { - return (process.env.PATH || - process.env.Path || - process.env.path).split(isWindows ? ';' : ':') -}) - -memo('editor', function () { - return process.env.EDITOR || - process.env.VISUAL || - (isWindows ? 'notepad.exe' : 'vi') -}) - -memo('shell', function () { - return isWindows ? process.env.ComSpec || 'cmd' - : process.env.SHELL || 'bash' -}) diff --git a/node_modules/osenv/package.json b/node_modules/osenv/package.json deleted file mode 100644 index b2364084..00000000 --- a/node_modules/osenv/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "_args": [ - [ - "osenv@0.1.5", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "osenv@0.1.5", - "_id": "osenv@0.1.5", - "_inBundle": false, - "_integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "_location": "/osenv", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "osenv@0.1.5", - "name": "osenv", - "escapedName": "osenv", - "rawSpec": "0.1.5", - "saveSpec": null, - "fetchSpec": "0.1.5" - }, - "_requiredBy": [ - "/nopt" - ], - "_resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "_spec": "0.1.5", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/npm/osenv/issues" - }, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - }, - "description": "Look up environment settings specific to different operating systems", - "devDependencies": { - "tap": "^11.1.0" - }, - "directories": { - "test": "test" - }, - "files": [ - "osenv.js" - ], - "homepage": "https://github.com/npm/osenv#readme", - "keywords": [ - "environment", - "variable", - "home", - "tmpdir", - "path", - "prompt", - "ps1" - ], - "license": "ISC", - "main": "osenv.js", - "name": "osenv", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/osenv.git" - }, - "scripts": { - "postpublish": "git push origin --all; git push origin --tags", - "postversion": "npm publish", - "preversion": "npm test", - "test": "tap test/*.js" - }, - "version": "0.1.5" -} diff --git a/node_modules/path-is-absolute/index.js b/node_modules/path-is-absolute/index.js deleted file mode 100644 index 22aa6c35..00000000 --- a/node_modules/path-is-absolute/index.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict'; - -function posix(path) { - return path.charAt(0) === '/'; -} - -function win32(path) { - // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 - var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; - var result = splitDeviceRe.exec(path); - var device = result[1] || ''; - var isUnc = Boolean(device && device.charAt(1) !== ':'); - - // UNC paths are always absolute - return Boolean(result[2] || isUnc); -} - -module.exports = process.platform === 'win32' ? win32 : posix; -module.exports.posix = posix; -module.exports.win32 = win32; diff --git a/node_modules/path-is-absolute/license b/node_modules/path-is-absolute/license deleted file mode 100644 index 654d0bfe..00000000 --- a/node_modules/path-is-absolute/license +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Sindre Sorhus (sindresorhus.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/path-is-absolute/package.json b/node_modules/path-is-absolute/package.json deleted file mode 100644 index 043f2385..00000000 --- a/node_modules/path-is-absolute/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "_args": [ - [ - "path-is-absolute@1.0.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "path-is-absolute@1.0.1", - "_id": "path-is-absolute@1.0.1", - "_inBundle": false, - "_integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "_location": "/path-is-absolute", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "path-is-absolute@1.0.1", - "name": "path-is-absolute", - "escapedName": "path-is-absolute", - "rawSpec": "1.0.1", - "saveSpec": null, - "fetchSpec": "1.0.1" - }, - "_requiredBy": [ - "/glob" - ], - "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "_spec": "1.0.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Sindre Sorhus", - "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com" - }, - "bugs": { - "url": "https://github.com/sindresorhus/path-is-absolute/issues" - }, - "description": "Node.js 0.12 path.isAbsolute() ponyfill", - "devDependencies": { - "xo": "^0.16.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/sindresorhus/path-is-absolute#readme", - "keywords": [ - "path", - "paths", - "file", - "dir", - "absolute", - "isabsolute", - "is-absolute", - "built-in", - "util", - "utils", - "core", - "ponyfill", - "polyfill", - "shim", - "is", - "detect", - "check" - ], - "license": "MIT", - "name": "path-is-absolute", - "repository": { - "type": "git", - "url": "git+https://github.com/sindresorhus/path-is-absolute.git" - }, - "scripts": { - "test": "xo && node test.js" - }, - "version": "1.0.1" -} diff --git a/node_modules/path-is-absolute/readme.md b/node_modules/path-is-absolute/readme.md deleted file mode 100644 index 8dbdf5fc..00000000 --- a/node_modules/path-is-absolute/readme.md +++ /dev/null @@ -1,59 +0,0 @@ -# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute) - -> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) [ponyfill](https://ponyfill.com) - - -## Install - -``` -$ npm install --save path-is-absolute -``` - - -## Usage - -```js -const pathIsAbsolute = require('path-is-absolute'); - -// Running on Linux -pathIsAbsolute('/home/foo'); -//=> true -pathIsAbsolute('C:/Users/foo'); -//=> false - -// Running on Windows -pathIsAbsolute('C:/Users/foo'); -//=> true -pathIsAbsolute('/home/foo'); -//=> false - -// Running on any OS -pathIsAbsolute.posix('/home/foo'); -//=> true -pathIsAbsolute.posix('C:/Users/foo'); -//=> false -pathIsAbsolute.win32('C:/Users/foo'); -//=> true -pathIsAbsolute.win32('/home/foo'); -//=> false -``` - - -## API - -See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path). - -### pathIsAbsolute(path) - -### pathIsAbsolute.posix(path) - -POSIX specific version. - -### pathIsAbsolute.win32(path) - -Windows specific version. - - -## License - -MIT © [Sindre Sorhus](https://sindresorhus.com) diff --git a/node_modules/process-nextick-args/index.js b/node_modules/process-nextick-args/index.js deleted file mode 100644 index 3eecf114..00000000 --- a/node_modules/process-nextick-args/index.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -if (typeof process === 'undefined' || - !process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = { nextTick: nextTick }; -} else { - module.exports = process -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - diff --git a/node_modules/process-nextick-args/license.md b/node_modules/process-nextick-args/license.md deleted file mode 100644 index c67e3532..00000000 --- a/node_modules/process-nextick-args/license.md +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2015 Calvin Metcalf - -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/process-nextick-args/package.json b/node_modules/process-nextick-args/package.json deleted file mode 100644 index 0de6f25f..00000000 --- a/node_modules/process-nextick-args/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "_args": [ - [ - "process-nextick-args@2.0.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "process-nextick-args@2.0.1", - "_id": "process-nextick-args@2.0.1", - "_inBundle": false, - "_integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "_location": "/process-nextick-args", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "process-nextick-args@2.0.1", - "name": "process-nextick-args", - "escapedName": "process-nextick-args", - "rawSpec": "2.0.1", - "saveSpec": null, - "fetchSpec": "2.0.1" - }, - "_requiredBy": [ - "/readable-stream" - ], - "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "_spec": "2.0.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": "", - "bugs": { - "url": "https://github.com/calvinmetcalf/process-nextick-args/issues" - }, - "description": "process.nextTick but always with args", - "devDependencies": { - "tap": "~0.2.6" - }, - "files": [ - "index.js" - ], - "homepage": "https://github.com/calvinmetcalf/process-nextick-args", - "license": "MIT", - "main": "index.js", - "name": "process-nextick-args", - "repository": { - "type": "git", - "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git" - }, - "scripts": { - "test": "node test.js" - }, - "version": "2.0.1" -} diff --git a/node_modules/process-nextick-args/readme.md b/node_modules/process-nextick-args/readme.md deleted file mode 100644 index ecb432c9..00000000 --- a/node_modules/process-nextick-args/readme.md +++ /dev/null @@ -1,18 +0,0 @@ -process-nextick-args -===== - -[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args) - -```bash -npm install --save process-nextick-args -``` - -Always be able to pass arguments to process.nextTick, no matter the platform - -```js -var pna = require('process-nextick-args'); - -pna.nextTick(function (a, b, c) { - console.log(a, b, c); -}, 'step', 3, 'profit'); -``` diff --git a/node_modules/proto-list/LICENSE b/node_modules/proto-list/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/proto-list/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/proto-list/README.md b/node_modules/proto-list/README.md deleted file mode 100644 index 43cfa358..00000000 --- a/node_modules/proto-list/README.md +++ /dev/null @@ -1,3 +0,0 @@ -A list of objects, bound by their prototype chain. - -Used in npm's config stuff. diff --git a/node_modules/proto-list/package.json b/node_modules/proto-list/package.json deleted file mode 100644 index 1b452e6f..00000000 --- a/node_modules/proto-list/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "_args": [ - [ - "proto-list@1.2.4", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "proto-list@1.2.4", - "_id": "proto-list@1.2.4", - "_inBundle": false, - "_integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "_location": "/proto-list", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "proto-list@1.2.4", - "name": "proto-list", - "escapedName": "proto-list", - "rawSpec": "1.2.4", - "saveSpec": null, - "fetchSpec": "1.2.4" - }, - "_requiredBy": [ - "/config-chain" - ], - "_resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "_spec": "1.2.4", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/proto-list/issues" - }, - "description": "A utility for managing a prototype chain", - "devDependencies": { - "tap": "0" - }, - "homepage": "https://github.com/isaacs/proto-list#readme", - "license": "ISC", - "main": "./proto-list.js", - "name": "proto-list", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/proto-list.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "version": "1.2.4" -} diff --git a/node_modules/proto-list/proto-list.js b/node_modules/proto-list/proto-list.js deleted file mode 100644 index b55c25c0..00000000 --- a/node_modules/proto-list/proto-list.js +++ /dev/null @@ -1,88 +0,0 @@ - -module.exports = ProtoList - -function setProto(obj, proto) { - if (typeof Object.setPrototypeOf === "function") - return Object.setPrototypeOf(obj, proto) - else - obj.__proto__ = proto -} - -function ProtoList () { - this.list = [] - var root = null - Object.defineProperty(this, 'root', { - get: function () { return root }, - set: function (r) { - root = r - if (this.list.length) { - setProto(this.list[this.list.length - 1], r) - } - }, - enumerable: true, - configurable: true - }) -} - -ProtoList.prototype = - { get length () { return this.list.length } - , get keys () { - var k = [] - for (var i in this.list[0]) k.push(i) - return k - } - , get snapshot () { - var o = {} - this.keys.forEach(function (k) { o[k] = this.get(k) }, this) - return o - } - , get store () { - return this.list[0] - } - , push : function (obj) { - if (typeof obj !== "object") obj = {valueOf:obj} - if (this.list.length >= 1) { - setProto(this.list[this.list.length - 1], obj) - } - setProto(obj, this.root) - return this.list.push(obj) - } - , pop : function () { - if (this.list.length >= 2) { - setProto(this.list[this.list.length - 2], this.root) - } - return this.list.pop() - } - , unshift : function (obj) { - setProto(obj, this.list[0] || this.root) - return this.list.unshift(obj) - } - , shift : function () { - if (this.list.length === 1) { - setProto(this.list[0], this.root) - } - return this.list.shift() - } - , get : function (key) { - return this.list[0][key] - } - , set : function (key, val, save) { - if (!this.length) this.push({}) - if (save && this.list[0].hasOwnProperty(key)) this.push({}) - return this.list[0][key] = val - } - , forEach : function (fn, thisp) { - for (var key in this.list[0]) fn.call(thisp, key, this.list[0][key]) - } - , slice : function () { - return this.list.slice.apply(this.list, arguments) - } - , splice : function () { - // handle injections - var ret = this.list.splice.apply(this.list, arguments) - for (var i = 0, l = this.list.length; i < l; i++) { - setProto(this.list[i], this.list[i + 1] || this.root) - } - return ret - } - } diff --git a/node_modules/proto-list/test/basic.js b/node_modules/proto-list/test/basic.js deleted file mode 100644 index 5cd66bef..00000000 --- a/node_modules/proto-list/test/basic.js +++ /dev/null @@ -1,61 +0,0 @@ -var tap = require("tap") - , test = tap.test - , ProtoList = require("../proto-list.js") - -tap.plan(1) - -tap.test("protoList tests", function (t) { - var p = new ProtoList - p.push({foo:"bar"}) - p.push({}) - p.set("foo", "baz") - t.equal(p.get("foo"), "baz") - - var p = new ProtoList - p.push({foo:"bar"}) - p.set("foo", "baz") - t.equal(p.get("foo"), "baz") - t.equal(p.length, 1) - p.pop() - t.equal(p.length, 0) - p.set("foo", "asdf") - t.equal(p.length, 1) - t.equal(p.get("foo"), "asdf") - p.push({bar:"baz"}) - t.equal(p.length, 2) - t.equal(p.get("foo"), "asdf") - p.shift() - t.equal(p.length, 1) - t.equal(p.get("foo"), undefined) - - - p.unshift({foo:"blo", bar:"rab"}) - p.unshift({foo:"boo"}) - t.equal(p.length, 3) - t.equal(p.get("foo"), "boo") - t.equal(p.get("bar"), "rab") - - var ret = p.splice(1, 1, {bar:"bar"}) - t.same(ret, [{foo:"blo", bar:"rab"}]) - t.equal(p.get("bar"), "bar") - - // should not inherit default object properties - t.equal(p.get('hasOwnProperty'), undefined) - - // unless we give it those. - p.root = {} - t.equal(p.get('hasOwnProperty'), {}.hasOwnProperty) - - p.root = {default:'monkey'} - t.equal(p.get('default'), 'monkey') - - p.push({red:'blue'}) - p.push({red:'blue'}) - p.push({red:'blue'}) - while (p.length) { - t.equal(p.get('default'), 'monkey') - p.shift() - } - - t.end() -}) diff --git a/node_modules/pseudomap/LICENSE b/node_modules/pseudomap/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/pseudomap/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/pseudomap/README.md b/node_modules/pseudomap/README.md deleted file mode 100644 index 778bf01d..00000000 --- a/node_modules/pseudomap/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# pseudomap - -A thing that is a lot like ES6 `Map`, but without iterators, for use -in environments where `for..of` syntax and `Map` are not available. - -If you need iterators, or just in general a more faithful polyfill to -ES6 Maps, check out [es6-map](http://npm.im/es6-map). - -If you are in an environment where `Map` is supported, then that will -be returned instead, unless `process.env.TEST_PSEUDOMAP` is set. - -You can use any value as keys, and any value as data. Setting again -with the identical key will overwrite the previous value. - -Internally, data is stored on an `Object.create(null)` style object. -The key is coerced to a string to generate the key on the internal -data-bag object. The original key used is stored along with the data. - -In the event of a stringified-key collision, a new key is generated by -appending an increasing number to the stringified-key until finding -either the intended key or an empty spot. - -Note that because object traversal order of plain objects is not -guaranteed to be identical to insertion order, the insertion order -guarantee of `Map.prototype.forEach` is not guaranteed in this -implementation. However, in all versions of Node.js and V8 where this -module works, `forEach` does traverse data in insertion order. - -## API - -Most of the [Map -API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map), -with the following exceptions: - -1. A `Map` object is not an iterator. -2. `values`, `keys`, and `entries` methods are not implemented, - because they return iterators. -3. The argument to the constructor can be an Array of `[key, value]` - pairs, or a `Map` or `PseudoMap` object. But, since iterators - aren't used, passing any plain-old iterator won't initialize the - map properly. - -## USAGE - -Use just like a regular ES6 Map. - -```javascript -var PseudoMap = require('pseudomap') - -// optionally provide a pseudomap, or an array of [key,value] pairs -// as the argument to initialize the map with -var myMap = new PseudoMap() - -myMap.set(1, 'number 1') -myMap.set('1', 'string 1') -var akey = {} -var bkey = {} -myMap.set(akey, { some: 'data' }) -myMap.set(bkey, { some: 'other data' }) -``` diff --git a/node_modules/pseudomap/map.js b/node_modules/pseudomap/map.js deleted file mode 100644 index 7db15994..00000000 --- a/node_modules/pseudomap/map.js +++ /dev/null @@ -1,9 +0,0 @@ -if (process.env.npm_package_name === 'pseudomap' && - process.env.npm_lifecycle_script === 'test') - process.env.TEST_PSEUDOMAP = 'true' - -if (typeof Map === 'function' && !process.env.TEST_PSEUDOMAP) { - module.exports = Map -} else { - module.exports = require('./pseudomap') -} diff --git a/node_modules/pseudomap/package.json b/node_modules/pseudomap/package.json deleted file mode 100644 index 4d08fe67..00000000 --- a/node_modules/pseudomap/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "_args": [ - [ - "pseudomap@1.0.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "pseudomap@1.0.2", - "_id": "pseudomap@1.0.2", - "_inBundle": false, - "_integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "_location": "/pseudomap", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "pseudomap@1.0.2", - "name": "pseudomap", - "escapedName": "pseudomap", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/lru-cache" - ], - "_resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/pseudomap/issues" - }, - "description": "A thing that is a lot like ES6 `Map`, but without iterators, for use in environments where `for..of` syntax and `Map` are not available.", - "devDependencies": { - "tap": "^2.3.1" - }, - "directories": { - "test": "test" - }, - "homepage": "https://github.com/isaacs/pseudomap#readme", - "license": "ISC", - "main": "map.js", - "name": "pseudomap", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/pseudomap.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "version": "1.0.2" -} diff --git a/node_modules/pseudomap/pseudomap.js b/node_modules/pseudomap/pseudomap.js deleted file mode 100644 index 25a21d82..00000000 --- a/node_modules/pseudomap/pseudomap.js +++ /dev/null @@ -1,113 +0,0 @@ -var hasOwnProperty = Object.prototype.hasOwnProperty - -module.exports = PseudoMap - -function PseudoMap (set) { - if (!(this instanceof PseudoMap)) // whyyyyyyy - throw new TypeError("Constructor PseudoMap requires 'new'") - - this.clear() - - if (set) { - if ((set instanceof PseudoMap) || - (typeof Map === 'function' && set instanceof Map)) - set.forEach(function (value, key) { - this.set(key, value) - }, this) - else if (Array.isArray(set)) - set.forEach(function (kv) { - this.set(kv[0], kv[1]) - }, this) - else - throw new TypeError('invalid argument') - } -} - -PseudoMap.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - Object.keys(this._data).forEach(function (k) { - if (k !== 'size') - fn.call(thisp, this._data[k].value, this._data[k].key) - }, this) -} - -PseudoMap.prototype.has = function (k) { - return !!find(this._data, k) -} - -PseudoMap.prototype.get = function (k) { - var res = find(this._data, k) - return res && res.value -} - -PseudoMap.prototype.set = function (k, v) { - set(this._data, k, v) -} - -PseudoMap.prototype.delete = function (k) { - var res = find(this._data, k) - if (res) { - delete this._data[res._index] - this._data.size-- - } -} - -PseudoMap.prototype.clear = function () { - var data = Object.create(null) - data.size = 0 - - Object.defineProperty(this, '_data', { - value: data, - enumerable: false, - configurable: true, - writable: false - }) -} - -Object.defineProperty(PseudoMap.prototype, 'size', { - get: function () { - return this._data.size - }, - set: function (n) {}, - enumerable: true, - configurable: true -}) - -PseudoMap.prototype.values = -PseudoMap.prototype.keys = -PseudoMap.prototype.entries = function () { - throw new Error('iterators are not implemented in this version') -} - -// Either identical, or both NaN -function same (a, b) { - return a === b || a !== a && b !== b -} - -function Entry (k, v, i) { - this.key = k - this.value = v - this._index = i -} - -function find (data, k) { - for (var i = 0, s = '_' + k, key = s; - hasOwnProperty.call(data, key); - key = s + i++) { - if (same(data[key].key, k)) - return data[key] - } -} - -function set (data, k, v) { - for (var i = 0, s = '_' + k, key = s; - hasOwnProperty.call(data, key); - key = s + i++) { - if (same(data[key].key, k)) { - data[key].value = v - return - } - } - data.size++ - data[key] = new Entry(k, v, key) -} diff --git a/node_modules/pseudomap/test/basic.js b/node_modules/pseudomap/test/basic.js deleted file mode 100644 index 4378e454..00000000 --- a/node_modules/pseudomap/test/basic.js +++ /dev/null @@ -1,86 +0,0 @@ -var t = require('tap') - -process.env.TEST_PSEUDOMAP = 'true' - -var PM = require('../') -runTests(PM) - -// if possible, verify that Map also behaves the same way -if (typeof Map === 'function') - runTests(Map) - - -function runTests (Map) { - t.throws(Map) - - var m = new Map() - - t.equal(m.size, 0) - - m.set(1, '1 string') - t.equal(m.get(1), '1 string') - t.equal(m.size, 1) - m.size = 1000 - t.equal(m.size, 1) - m.size = 0 - t.equal(m.size, 1) - - m = new Map([[1, 'number 1'], ['1', 'string 1']]) - t.equal(m.get(1), 'number 1') - t.equal(m.get('1'), 'string 1') - t.equal(m.size, 2) - - m = new Map(m) - t.equal(m.get(1), 'number 1') - t.equal(m.get('1'), 'string 1') - t.equal(m.size, 2) - - var akey = {} - var bkey = {} - m.set(akey, { some: 'data' }) - m.set(bkey, { some: 'other data' }) - t.same(m.get(akey), { some: 'data' }) - t.same(m.get(bkey), { some: 'other data' }) - t.equal(m.size, 4) - - var x = /x/ - var y = /x/ - m.set(x, 'x regex') - m.set(y, 'y regex') - t.equal(m.get(x), 'x regex') - m.set(x, 'x again') - t.equal(m.get(x), 'x again') - t.equal(m.size, 6) - - m.set(NaN, 'not a number') - t.equal(m.get(NaN), 'not a number') - m.set(NaN, 'it is a ' + typeof NaN) - t.equal(m.get(NaN), 'it is a number') - m.set('NaN', 'stringie nan') - t.equal(m.get(NaN), 'it is a number') - t.equal(m.get('NaN'), 'stringie nan') - t.equal(m.size, 8) - - m.delete(NaN) - t.equal(m.get(NaN), undefined) - t.equal(m.size, 7) - - var expect = [ - { value: 'number 1', key: 1 }, - { value: 'string 1', key: '1' }, - { value: { some: 'data' }, key: {} }, - { value: { some: 'other data' }, key: {} }, - { value: 'x again', key: /x/ }, - { value: 'y regex', key: /x/ }, - { value: 'stringie nan', key: 'NaN' } - ] - var actual = [] - - m.forEach(function (value, key) { - actual.push({ value: value, key: key }) - }) - t.same(actual, expect) - - m.clear() - t.equal(m.size, 0) -} diff --git a/node_modules/readable-stream/.travis.yml b/node_modules/readable-stream/.travis.yml deleted file mode 100644 index 40992555..00000000 --- a/node_modules/readable-stream/.travis.yml +++ /dev/null @@ -1,55 +0,0 @@ -sudo: false -language: node_js -before_install: - - npm install -g npm@2 - - test $NPM_LEGACY && npm install -g npm@latest-3 || npm install npm -g -notifications: - email: false -matrix: - fast_finish: true - include: - - node_js: '0.8' - env: - - TASK=test - - NPM_LEGACY=true - - node_js: '0.10' - env: - - TASK=test - - NPM_LEGACY=true - - node_js: '0.11' - env: - - TASK=test - - NPM_LEGACY=true - - node_js: '0.12' - env: - - TASK=test - - NPM_LEGACY=true - - node_js: 1 - env: - - TASK=test - - NPM_LEGACY=true - - node_js: 2 - env: - - TASK=test - - NPM_LEGACY=true - - node_js: 3 - env: - - TASK=test - - NPM_LEGACY=true - - node_js: 4 - env: TASK=test - - node_js: 5 - env: TASK=test - - node_js: 6 - env: TASK=test - - node_js: 7 - env: TASK=test - - node_js: 8 - env: TASK=test - - node_js: 9 - env: TASK=test -script: "npm run $TASK" -env: - global: - - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= - - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/readable-stream/CONTRIBUTING.md b/node_modules/readable-stream/CONTRIBUTING.md deleted file mode 100644 index f478d58d..00000000 --- a/node_modules/readable-stream/CONTRIBUTING.md +++ /dev/null @@ -1,38 +0,0 @@ -# Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -* (a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -* (b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -* (c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -* (d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - -## Moderation Policy - -The [Node.js Moderation Policy] applies to this WG. - -## Code of Conduct - -The [Node.js Code of Conduct][] applies to this WG. - -[Node.js Code of Conduct]: -https://github.com/nodejs/node/blob/master/CODE_OF_CONDUCT.md -[Node.js Moderation Policy]: -https://github.com/nodejs/TSC/blob/master/Moderation-Policy.md diff --git a/node_modules/readable-stream/GOVERNANCE.md b/node_modules/readable-stream/GOVERNANCE.md deleted file mode 100644 index 16ffb93f..00000000 --- a/node_modules/readable-stream/GOVERNANCE.md +++ /dev/null @@ -1,136 +0,0 @@ -### Streams Working Group - -The Node.js Streams is jointly governed by a Working Group -(WG) -that is responsible for high-level guidance of the project. - -The WG has final authority over this project including: - -* Technical direction -* Project governance and process (including this policy) -* Contribution policy -* GitHub repository hosting -* Conduct guidelines -* Maintaining the list of additional Collaborators - -For the current list of WG members, see the project -[README.md](./README.md#current-project-team-members). - -### Collaborators - -The readable-stream GitHub repository is -maintained by the WG and additional Collaborators who are added by the -WG on an ongoing basis. - -Individuals making significant and valuable contributions are made -Collaborators and given commit-access to the project. These -individuals are identified by the WG and their addition as -Collaborators is discussed during the WG meeting. - -_Note:_ If you make a significant contribution and are not considered -for commit-access log an issue or contact a WG member directly and it -will be brought up in the next WG meeting. - -Modifications of the contents of the readable-stream repository are -made on -a collaborative basis. Anybody with a GitHub account may propose a -modification via pull request and it will be considered by the project -Collaborators. All pull requests must be reviewed and accepted by a -Collaborator with sufficient expertise who is able to take full -responsibility for the change. In the case of pull requests proposed -by an existing Collaborator, an additional Collaborator is required -for sign-off. Consensus should be sought if additional Collaborators -participate and there is disagreement around a particular -modification. See _Consensus Seeking Process_ below for further detail -on the consensus model used for governance. - -Collaborators may opt to elevate significant or controversial -modifications, or modifications that have not found consensus to the -WG for discussion by assigning the ***WG-agenda*** tag to a pull -request or issue. The WG should serve as the final arbiter where -required. - -For the current list of Collaborators, see the project -[README.md](./README.md#members). - -### WG Membership - -WG seats are not time-limited. There is no fixed size of the WG. -However, the expected target is between 6 and 12, to ensure adequate -coverage of important areas of expertise, balanced with the ability to -make decisions efficiently. - -There is no specific set of requirements or qualifications for WG -membership beyond these rules. - -The WG may add additional members to the WG by unanimous consensus. - -A WG member may be removed from the WG by voluntary resignation, or by -unanimous consensus of all other WG members. - -Changes to WG membership should be posted in the agenda, and may be -suggested as any other agenda item (see "WG Meetings" below). - -If an addition or removal is proposed during a meeting, and the full -WG is not in attendance to participate, then the addition or removal -is added to the agenda for the subsequent meeting. This is to ensure -that all members are given the opportunity to participate in all -membership decisions. If a WG member is unable to attend a meeting -where a planned membership decision is being made, then their consent -is assumed. - -No more than 1/3 of the WG members may be affiliated with the same -employer. If removal or resignation of a WG member, or a change of -employment by a WG member, creates a situation where more than 1/3 of -the WG membership shares an employer, then the situation must be -immediately remedied by the resignation or removal of one or more WG -members affiliated with the over-represented employer(s). - -### WG Meetings - -The WG meets occasionally on a Google Hangout On Air. A designated moderator -approved by the WG runs the meeting. Each meeting should be -published to YouTube. - -Items are added to the WG agenda that are considered contentious or -are modifications of governance, contribution policy, WG membership, -or release process. - -The intention of the agenda is not to approve or review all patches; -that should happen continuously on GitHub and be handled by the larger -group of Collaborators. - -Any community member or contributor can ask that something be added to -the next meeting's agenda by logging a GitHub Issue. Any Collaborator, -WG member or the moderator can add the item to the agenda by adding -the ***WG-agenda*** tag to the issue. - -Prior to each WG meeting the moderator will share the Agenda with -members of the WG. WG members can add any items they like to the -agenda at the beginning of each meeting. The moderator and the WG -cannot veto or remove items. - -The WG may invite persons or representatives from certain projects to -participate in a non-voting capacity. - -The moderator is responsible for summarizing the discussion of each -agenda item and sends it as a pull request after the meeting. - -### Consensus Seeking Process - -The WG follows a -[Consensus -Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) -decision-making model. - -When an agenda item has appeared to reach a consensus the moderator -will ask "Does anyone object?" as a final call for dissent from the -consensus. - -If an agenda item cannot reach a consensus a WG member can call for -either a closing vote or a vote to table the issue to the next -meeting. The call for a vote must be seconded by a majority of the WG -or else the discussion will continue. Simple majority wins. - -Note that changes to WG membership require a majority consensus. See -"WG Membership" above. diff --git a/node_modules/readable-stream/LICENSE b/node_modules/readable-stream/LICENSE deleted file mode 100644 index 2873b3b2..00000000 --- a/node_modules/readable-stream/LICENSE +++ /dev/null @@ -1,47 +0,0 @@ -Node.js is licensed for use as follows: - -""" -Copyright Node.js 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. -""" - -This license applies to parts of Node.js originating from the -https://github.com/joyent/node repository: - -""" -Copyright Joyent, Inc. and other Node 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. -""" diff --git a/node_modules/readable-stream/README.md b/node_modules/readable-stream/README.md deleted file mode 100644 index 23fe3f3e..00000000 --- a/node_modules/readable-stream/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# readable-stream - -***Node-core v8.11.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) - - -[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) -[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) - - -[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) - -```bash -npm install --save readable-stream -``` - -***Node-core streams for userland*** - -This package is a mirror of the Streams2 and Streams3 implementations in -Node-core. - -Full documentation may be found on the [Node.js website](https://nodejs.org/dist/v8.11.1/docs/api/stream.html). - -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, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). - -As of version 2.0.0 **readable-stream** uses semantic versioning. - -# Streams Working Group - -`readable-stream` is maintained by the Streams Working Group, which -oversees the development and maintenance of the Streams API within -Node.js. The responsibilities of the Streams Working Group include: - -* Addressing stream issues on the Node.js issue tracker. -* Authoring and editing stream documentation within the Node.js project. -* Reviewing changes to stream subclasses within the Node.js project. -* Redirecting changes to streams from the Node.js project to this - project. -* Assisting in the implementation of stream providers within Node.js. -* Recommending versions of `readable-stream` to be included in Node.js. -* Messaging about the future of streams to give the community advance - notice of changes. - - -## Team Members - -* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> - - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B -* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> - - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 -* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> - - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D -* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> -* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> -* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> -* **Matteo Collina** ([@mcollina](https://github.com/mcollina)) <matteo.collina@gmail.com> - - Release GPG key: 3ABC01543F22DD2239285CDD818674489FBC127E -* **Irina Shestak** ([@lrlna](https://github.com/lrlna)) <shestak.irina@gmail.com> diff --git a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md deleted file mode 100644 index 83275f19..00000000 --- a/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +++ /dev/null @@ -1,60 +0,0 @@ -# streams WG Meeting 2015-01-30 - -## Links - -* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg -* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 -* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ - -## Agenda - -Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. - -* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) -* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) -* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) -* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) - -## Minutes - -### adopt a charter - -* group: +1's all around - -### What versioning scheme should be adopted? -* group: +1’s 3.0.0 -* domenic+group: pulling in patches from other sources where appropriate -* mikeal: version independently, suggesting versions for io.js -* mikeal+domenic: work with TC to notify in advance of changes -simpler stream creation - -### streamline creation of streams -* sam: streamline creation of streams -* domenic: nice simple solution posted - but, we lose the opportunity to change the model - may not be backwards incompatible (double check keys) - - **action item:** domenic will check - -### remove implicit flowing of streams on(‘data’) -* add isFlowing / isPaused -* mikeal: worrying that we’re documenting polyfill methods – confuses users -* domenic: more reflective API is probably good, with warning labels for users -* new section for mad scientists (reflective stream access) -* calvin: name the “third state” -* mikeal: maybe borrow the name from whatwg? -* domenic: we’re missing the “third state” -* consensus: kind of difficult to name the third state -* mikeal: figure out differences in states / compat -* mathias: always flow on data – eliminates third state - * explore what it breaks - -**action items:** -* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) -* ask rod/build for infrastructure -* **chris**: explore the “flow on data” approach -* add isPaused/isFlowing -* add new docs section -* move isPaused to that section - - diff --git a/node_modules/readable-stream/duplex-browser.js b/node_modules/readable-stream/duplex-browser.js deleted file mode 100644 index f8b2db83..00000000 --- a/node_modules/readable-stream/duplex-browser.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/_stream_duplex.js'); diff --git a/node_modules/readable-stream/duplex.js b/node_modules/readable-stream/duplex.js deleted file mode 100644 index 46924cbf..00000000 --- a/node_modules/readable-stream/duplex.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./readable').Duplex diff --git a/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/readable-stream/lib/_stream_duplex.js deleted file mode 100644 index a1ca813e..00000000 --- a/node_modules/readable-stream/lib/_stream_duplex.js +++ /dev/null @@ -1,131 +0,0 @@ -// 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. - -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -/**/ -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - keys.push(key); - }return keys; -}; -/**/ - -module.exports = Duplex; - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -var Readable = require('./_stream_readable'); -var Writable = require('./_stream_writable'); - -util.inherits(Duplex, Readable); - -{ - // avoid scope creep, the keys array can then be collected - var keys = objectKeys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { - var method = keys[v]; - 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); -} - -Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// 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. - pna.nextTick(onEndNT, this); -} - -function onEndNT(self) { - self.end(); -} - -Object.defineProperty(Duplex.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined || this._writableState === undefined) { - return false; - } - return this._readableState.destroyed && this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (this._readableState === undefined || this._writableState === undefined) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - this._writableState.destroyed = value; - } -}); - -Duplex.prototype._destroy = function (err, cb) { - this.push(null); - this.end(); - - pna.nextTick(cb, err); -}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/readable-stream/lib/_stream_passthrough.js deleted file mode 100644 index a9c83588..00000000 --- a/node_modules/readable-stream/lib/_stream_passthrough.js +++ /dev/null @@ -1,47 +0,0 @@ -// 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. - -'use strict'; - -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); -}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/readable-stream/lib/_stream_readable.js deleted file mode 100644 index bf34ac65..00000000 --- a/node_modules/readable-stream/lib/_stream_readable.js +++ /dev/null @@ -1,1019 +0,0 @@ -// 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. - -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -module.exports = Readable; - -/**/ -var isArray = require('isarray'); -/**/ - -/**/ -var Duplex; -/**/ - -Readable.ReadableState = ReadableState; - -/**/ -var EE = require('events').EventEmitter; - -var EElistenerCount = function (emitter, type) { - return emitter.listeners(type).length; -}; -/**/ - -/**/ -var Stream = require('./internal/streams/stream'); -/**/ - -/**/ - -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/**/ - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -/**/ -var debugUtil = require('util'); -var debug = void 0; -if (debugUtil && debugUtil.debuglog) { - debug = debugUtil.debuglog('stream'); -} else { - debug = function () {}; -} -/**/ - -var BufferList = require('./internal/streams/BufferList'); -var destroyImpl = require('./internal/streams/destroy'); -var StringDecoder; - -util.inherits(Readable, Stream); - -var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume']; - -function prependListener(emitter, event, fn) { - // Sadly this is not cacheable as some libraries bundle their own - // event emitter implementation with them. - if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn); - - // This is a hack to make sure that our error handler is attached before any - // userland ones. NEVER DO THIS. This is here only because this code needs - // to continue to work with older versions of Node.js that do not include - // the prependListener() method. The goal is to eventually remove this hack. - if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; -} - -function ReadableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // 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; - - if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode; - - // 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; - var readableHwm = options.readableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // A linked list is used to store data chunks instead of an array because the - // linked list can remove elements from the beginning faster than - // array.shift() - this.buffer = new BufferList(); - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - - // a flag to be able to tell if the event 'readable'/'data' is emitted - // immediately, or on a later tick. We set this to true at first, because - // any actions that shouldn't happen until "later" should generally also - // not happen before the first read 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; - this.resumeScheduled = false; - - // has it been destroyed - this.destroyed = false; - - // 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'; - - // 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) { - Duplex = Duplex || require('./_stream_duplex'); - - if (!(this instanceof Readable)) return new Readable(options); - - this._readableState = new ReadableState(options, this); - - // legacy - this.readable = true; - - if (options) { - if (typeof options.read === 'function') this._read = options.read; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - } - - Stream.call(this); -} - -Object.defineProperty(Readable.prototype, 'destroyed', { - get: function () { - if (this._readableState === undefined) { - return false; - } - return this._readableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._readableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._readableState.destroyed = value; - } -}); - -Readable.prototype.destroy = destroyImpl.destroy; -Readable.prototype._undestroy = destroyImpl.undestroy; -Readable.prototype._destroy = function (err, cb) { - this.push(null); - cb(err); -}; - -// 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; - var skipChunkCheck; - - if (!state.objectMode) { - if (typeof chunk === 'string') { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = Buffer.from(chunk, encoding); - encoding = ''; - } - skipChunkCheck = true; - } - } else { - skipChunkCheck = true; - } - - return readableAddChunk(this, chunk, encoding, false, skipChunkCheck); -}; - -// Unshift should *always* be something directly out of read() -Readable.prototype.unshift = function (chunk) { - return readableAddChunk(this, chunk, null, true, false); -}; - -function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) { - var state = stream._readableState; - if (chunk === null) { - state.reading = false; - onEofChunk(stream, state); - } else { - var er; - if (!skipChunkCheck) er = chunkInvalid(state, chunk); - if (er) { - stream.emit('error', er); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (addToFront) { - if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true); - } else if (state.ended) { - stream.emit('error', new Error('stream.push() after EOF')); - } else { - state.reading = false; - if (state.decoder && !encoding) { - chunk = state.decoder.write(chunk); - if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state); - } else { - addChunk(stream, state, chunk, false); - } - } - } else if (!addToFront) { - state.reading = false; - } - } - - return needMoreData(state); -} - -function addChunk(stream, state, chunk, addToFront) { - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit('data', chunk); - stream.read(0); - } else { - // update the buffer info. - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); - - if (state.needReadable) emitReadable(stream); - } - maybeReadMore(stream, state); -} - -function chunkInvalid(state, chunk) { - var er; - if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - return er; -} - -// 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); -} - -Readable.prototype.isPaused = function () { - return this._readableState.flowing === false; -}; - -// backwards compatibility. -Readable.prototype.setEncoding = function (enc) { - if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; -}; - -// Don't raise the hwm > 8MB -var MAX_HWM = 0x800000; -function computeNewHighWaterMark(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - // Get the next highest power of 2 to prevent increasing hwm excessively in - // tiny amounts - n--; - n |= n >>> 1; - n |= n >>> 2; - n |= n >>> 4; - n |= n >>> 8; - n |= n >>> 16; - n++; - } - return n; -} - -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function howMuchToRead(n, state) { - if (n <= 0 || state.length === 0 && state.ended) return 0; - if (state.objectMode) return 1; - if (n !== n) { - // Only flow one buffer at a time - if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; - } - // If we're asking for more than the current hwm, then raise the hwm. - if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); - if (n <= state.length) return n; - // Don't have enough - if (!state.ended) { - state.needReadable = true; - return 0; - } - return state.length; -} - -// you can override either this method, or the async _read(n) below. -Readable.prototype.read = function (n) { - debug('read', n); - n = parseInt(n, 10); - var state = this._readableState; - var nOrig = n; - - if (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)) { - debug('read: emitReadable', state.length, state.ended); - if (state.length === 0 && state.ended) endReadable(this);else 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) { - if (state.length === 0) endReadable(this); - return null; - } - - // 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; - debug('need readable', doRead); - - // if we currently have less than the highWaterMark, then also read some - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug('length less than watermark', doRead); - } - - // 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; - debug('reading or ended', doRead); - } else if (doRead) { - debug('do read'); - 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 pushed data synchronously, then `reading` will be false, - // and we need to re-evaluate how much data we can return to the user. - if (!state.reading) n = howMuchToRead(nOrig, state); - } - - var ret; - if (n > 0) ret = fromList(n, state);else ret = null; - - if (ret === null) { - state.needReadable = true; - n = 0; - } else { - state.length -= n; - } - - if (state.length === 0) { - // If we have nothing in the buffer, then we want to know - // as soon as we *do* get something into the buffer. - if (!state.ended) state.needReadable = true; - - // If we tried to read() past the EOF, then emit end on the next tick. - if (nOrig !== n && state.ended) endReadable(this); - } - - if (ret !== null) this.emit('data', ret); - - return ret; -}; - -function onEofChunk(stream, state) { - if (state.ended) return; - if (state.decoder) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - - // emit 'readable' now to make sure it gets picked up. - emitReadable(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) { - debug('emitReadable', state.flowing); - state.emittedReadable = true; - if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); - } -} - -function emitReadable_(stream) { - debug('emit readable'); - stream.emit('readable'); - flow(stream); -} - -// 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; - pna.nextTick(maybeReadMore_, stream, state); - } -} - -function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug('maybeReadMore read 0'); - 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('_read() is 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; - debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); - - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - - var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); - - dest.on('unpipe', onunpipe); - function onunpipe(readable, unpipeInfo) { - debug('onunpipe'); - if (readable === src) { - if (unpipeInfo && unpipeInfo.hasUnpiped === false) { - unpipeInfo.hasUnpiped = true; - cleanup(); - } - } - } - - function onend() { - debug('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); - - var cleanedUp = false; - function cleanup() { - debug('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', unpipe); - src.removeListener('data', ondata); - - cleanedUp = true; - - // 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 (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); - } - - // If the user pushes more data while we're writing to dest then we'll end up - // in ondata again. However, we only want to increase awaitDrain once because - // dest will only emit one 'drain' event for the multiple writes. - // => Introduce a guard on increasing awaitDrain. - var increasedAwaitDrain = false; - src.on('data', ondata); - function ondata(chunk) { - debug('ondata'); - increasedAwaitDrain = false; - var ret = dest.write(chunk); - if (false === ret && !increasedAwaitDrain) { - // If the user unpiped during `dest.write()`, it is possible - // to get stuck in a permanently paused state if that write - // also returned false. - // => Check whether `dest` is still a piping destination. - if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { - debug('false write response, pause', src._readableState.awaitDrain); - src._readableState.awaitDrain++; - increasedAwaitDrain = true; - } - src.pause(); - } - } - - // if the dest has an error, then stop piping into it. - // however, don't suppress the throwing behavior for this. - function onerror(er) { - debug('onerror', er); - unpipe(); - dest.removeListener('error', onerror); - if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); - } - - // Make sure our error handler is attached before userland ones. - prependListener(dest, 'error', onerror); - - // Both close and finish should trigger unpipe, but only once. - function onclose() { - dest.removeListener('finish', onfinish); - unpipe(); - } - dest.once('close', onclose); - function onfinish() { - debug('onfinish'); - dest.removeListener('close', onclose); - unpipe(); - } - dest.once('finish', onfinish); - - function unpipe() { - debug('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) { - debug('pipe resume'); - src.resume(); - } - - return dest; -}; - -function pipeOnDrain(src) { - return function () { - var state = src._readableState; - debug('pipeOnDrain', state.awaitDrain); - if (state.awaitDrain) state.awaitDrain--; - if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { - state.flowing = true; - flow(src); - } - }; -} - -Readable.prototype.unpipe = function (dest) { - var state = this._readableState; - var unpipeInfo = { hasUnpiped: false }; - - // 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; - state.flowing = false; - if (dest) dest.emit('unpipe', this, unpipeInfo); - 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; - state.flowing = false; - - for (var i = 0; i < len; i++) { - dests[i].emit('unpipe', this, unpipeInfo); - }return this; - } - - // try to find the right one. - var index = indexOf(state.pipes, dest); - if (index === -1) return this; - - state.pipes.splice(index, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) state.pipes = state.pipes[0]; - - dest.emit('unpipe', this, unpipeInfo); - - 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') { - // Start flowing on next tick if stream isn't explicitly paused - if (this._readableState.flowing !== false) this.resume(); - } else if (ev === 'readable') { - var state = this._readableState; - if (!state.endEmitted && !state.readableListening) { - state.readableListening = state.needReadable = true; - state.emittedReadable = false; - if (!state.reading) { - pna.nextTick(nReadingNextTick, this); - } else if (state.length) { - emitReadable(this); - } - } - } - - return res; -}; -Readable.prototype.addListener = Readable.prototype.on; - -function nReadingNextTick(self) { - debug('readable nexttick read 0'); - self.read(0); -} - -// 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 () { - var state = this._readableState; - if (!state.flowing) { - debug('resume'); - state.flowing = true; - resume(this, state); - } - return this; -}; - -function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - pna.nextTick(resume_, stream, state); - } -} - -function resume_(stream, state) { - if (!state.reading) { - debug('resume read 0'); - stream.read(0); - } - - state.resumeScheduled = false; - state.awaitDrain = 0; - stream.emit('resume'); - flow(stream); - if (state.flowing && !state.reading) stream.read(0); -} - -Readable.prototype.pause = function () { - debug('call pause flowing=%j', this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug('pause'); - this._readableState.flowing = false; - this.emit('pause'); - } - return this; -}; - -function flow(stream) { - var state = stream._readableState; - debug('flow', state.flowing); - while (state.flowing && stream.read() !== null) {} -} - -// 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 _this = this; - - var state = this._readableState; - var paused = false; - - stream.on('end', function () { - debug('wrapped end'); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) _this.push(chunk); - } - - _this.push(null); - }); - - stream.on('data', function (chunk) { - debug('wrapped data'); - if (state.decoder) chunk = state.decoder.write(chunk); - - // don't skip over falsy values in objectMode - if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; - - var ret = _this.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 (this[i] === undefined && typeof stream[i] === 'function') { - this[i] = function (method) { - return function () { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - - // proxy certain important events. - for (var n = 0; n < kProxyEvents.length; n++) { - stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n])); - } - - // when we try to consume some more bytes, simply unpause the - // underlying stream. - this._read = function (n) { - debug('wrapped _read', n); - if (paused) { - paused = false; - stream.resume(); - } - }; - - return this; -}; - -Object.defineProperty(Readable.prototype, 'readableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._readableState.highWaterMark; - } -}); - -// 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. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromList(n, state) { - // nothing buffered - if (state.length === 0) return null; - - var ret; - if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { - // read it all, truncate the list - if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); - state.buffer.clear(); - } else { - // read part of list - ret = fromListPartial(n, state.buffer, state.decoder); - } - - return ret; -} - -// Extracts only enough buffered data to satisfy the amount requested. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function fromListPartial(n, list, hasStrings) { - var ret; - if (n < list.head.data.length) { - // slice is the same for buffers and strings - ret = list.head.data.slice(0, n); - list.head.data = list.head.data.slice(n); - } else if (n === list.head.data.length) { - // first chunk is a perfect match - ret = list.shift(); - } else { - // result spans more than one buffer - ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); - } - return ret; -} - -// Copies a specified amount of characters from the list of buffered data -// chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBufferString(n, list) { - var p = list.head; - var c = 1; - var ret = p.data; - n -= ret.length; - while (p = p.next) { - var str = p.data; - var nb = n > str.length ? str.length : n; - if (nb === str.length) ret += str;else ret += str.slice(0, n); - n -= nb; - if (n === 0) { - if (nb === str.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = str.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - return ret; -} - -// Copies a specified amount of bytes from the list of buffered data chunks. -// This function is designed to be inlinable, so please take care when making -// changes to the function body. -function copyFromBuffer(n, list) { - var ret = Buffer.allocUnsafe(n); - var p = list.head; - var c = 1; - p.data.copy(ret); - n -= p.data.length; - while (p = p.next) { - var buf = p.data; - var nb = n > buf.length ? buf.length : n; - buf.copy(ret, ret.length - n, 0, nb); - n -= nb; - if (n === 0) { - if (nb === buf.length) { - ++c; - if (p.next) list.head = p.next;else list.head = list.tail = null; - } else { - list.head = p; - p.data = buf.slice(nb); - } - break; - } - ++c; - } - list.length -= c; - 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.ended = true; - pna.nextTick(endReadableNT, state, stream); - } -} - -function endReadableNT(state, stream) { - // 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 indexOf(xs, x) { - for (var i = 0, l = xs.length; i < l; i++) { - if (xs[i] === x) return i; - } - return -1; -} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/readable-stream/lib/_stream_transform.js deleted file mode 100644 index 5d1f8b87..00000000 --- a/node_modules/readable-stream/lib/_stream_transform.js +++ /dev/null @@ -1,214 +0,0 @@ -// 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. - -'use strict'; - -module.exports = Transform; - -var Duplex = require('./_stream_duplex'); - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -util.inherits(Transform, Duplex); - -function afterTransform(er, data) { - var ts = this._transformState; - ts.transforming = false; - - var cb = ts.writecb; - - if (!cb) { - return this.emit('error', new Error('write callback called multiple times')); - } - - ts.writechunk = null; - ts.writecb = null; - - if (data != null) // single equals check for both `null` and `undefined` - this.push(data); - - cb(er); - - var rs = this._readableState; - rs.reading = false; - if (rs.needReadable || rs.length < rs.highWaterMark) { - this._read(rs.highWaterMark); - } -} - -function Transform(options) { - if (!(this instanceof Transform)) return new Transform(options); - - Duplex.call(this, options); - - this._transformState = { - afterTransform: afterTransform.bind(this), - needTransform: false, - transforming: false, - writecb: null, - writechunk: null, - writeencoding: null - }; - - // 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; - - if (options) { - if (typeof options.transform === 'function') this._transform = options.transform; - - if (typeof options.flush === 'function') this._flush = options.flush; - } - - // When the writable side finishes, then flush out anything remaining. - this.on('prefinish', prefinish); -} - -function prefinish() { - var _this = this; - - if (typeof this._flush === 'function') { - this._flush(function (er, data) { - done(_this, er, data); - }); - } else { - done(this, null, null); - } -} - -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('_transform() is 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; - } -}; - -Transform.prototype._destroy = function (err, cb) { - var _this2 = this; - - Duplex.prototype._destroy.call(this, err, function (err2) { - cb(err2); - _this2.emit('close'); - }); -}; - -function done(stream, er, data) { - if (er) return stream.emit('error', er); - - if (data != null) // single equals check for both `null` and `undefined` - stream.push(data); - - // if there's nothing in the write buffer, then that means - // that nothing more will ever be provided - if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0'); - - if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming'); - - return stream.push(null); -} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/readable-stream/lib/_stream_writable.js deleted file mode 100644 index b3f4e85a..00000000 --- a/node_modules/readable-stream/lib/_stream_writable.js +++ /dev/null @@ -1,687 +0,0 @@ -// 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, encoding, cb), and it'll handle all -// the drain event emission and buffering. - -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -module.exports = Writable; - -/* */ -function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - this.next = null; -} - -// It seems a linked list but it is not -// there will be only 2 of these for each stream -function CorkedRequest(state) { - var _this = this; - - this.next = null; - this.entry = null; - this.finish = function () { - onCorkedFinish(_this, state); - }; -} -/* */ - -/**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; -/**/ - -/**/ -var Duplex; -/**/ - -Writable.WritableState = WritableState; - -/**/ -var util = require('core-util-is'); -util.inherits = require('inherits'); -/**/ - -/**/ -var internalUtil = { - deprecate: require('util-deprecate') -}; -/**/ - -/**/ -var Stream = require('./internal/streams/stream'); -/**/ - -/**/ - -var Buffer = require('safe-buffer').Buffer; -var OurUint8Array = global.Uint8Array || function () {}; -function _uint8ArrayToBuffer(chunk) { - return Buffer.from(chunk); -} -function _isUint8Array(obj) { - return Buffer.isBuffer(obj) || obj instanceof OurUint8Array; -} - -/**/ - -var destroyImpl = require('./internal/streams/destroy'); - -util.inherits(Writable, Stream); - -function nop() {} - -function WritableState(options, stream) { - Duplex = Duplex || require('./_stream_duplex'); - - options = options || {}; - - // Duplex streams are both readable and writable, but share - // the same options object. - // However, some cases require setting options to different - // values for the readable and the writable sides of the duplex stream. - // These options can be provided separately as readableXXX and writableXXX. - var isDuplex = stream instanceof Duplex; - - // object stream flag to indicate whether or not this stream - // contains buffers or objects. - this.objectMode = !!options.objectMode; - - if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode; - - // 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; - var writableHwm = options.writableHighWaterMark; - var defaultHwm = this.objectMode ? 16 : 16 * 1024; - - if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm; - - // cast to ints. - this.highWaterMark = Math.floor(this.highWaterMark); - - // if _final has been called - this.finalCalled = false; - - // drain event flag. - 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; - - // has it been destroyed - this.destroyed = 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; - - // when true all writes will be buffered until .uncork() call - this.corked = 0; - - // 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, because 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.bufferedRequest = null; - this.lastBufferedRequest = null; - - // number of pending user-supplied write callbacks - // this must be 0 before 'finish' can be emitted - this.pendingcb = 0; - - // emit prefinish if the only thing we're waiting for is _write cbs - // This is relevant for synchronous Transform streams - this.prefinished = false; - - // True if the error was already emitted and should not be thrown again - this.errorEmitted = false; - - // count buffered requests - this.bufferedRequestCount = 0; - - // allocate the first CorkedRequest, there is always - // one allocated and free to use, and we maintain at most two - this.corkedRequestsFree = new CorkedRequest(this); -} - -WritableState.prototype.getBuffer = function getBuffer() { - var current = this.bufferedRequest; - var out = []; - while (current) { - out.push(current); - current = current.next; - } - return out; -}; - -(function () { - try { - Object.defineProperty(WritableState.prototype, 'buffer', { - get: internalUtil.deprecate(function () { - return this.getBuffer(); - }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003') - }); - } catch (_) {} -})(); - -// Test _writableState for inheritance to account for Duplex streams, -// whose prototype chain only points to Readable. -var realHasInstance; -if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') { - realHasInstance = Function.prototype[Symbol.hasInstance]; - Object.defineProperty(Writable, Symbol.hasInstance, { - value: function (object) { - if (realHasInstance.call(this, object)) return true; - if (this !== Writable) return false; - - return object && object._writableState instanceof WritableState; - } - }); -} else { - realHasInstance = function (object) { - return object instanceof this; - }; -} - -function Writable(options) { - Duplex = Duplex || require('./_stream_duplex'); - - // Writable ctor is applied to Duplexes, too. - // `realHasInstance` is necessary because using plain `instanceof` - // would return false, as no `_writableState` property is attached. - - // Trying to use the custom `instanceof` for Writable here will also break the - // Node.js LazyTransform implementation, which has a non-trivial getter for - // `_writableState` that would lead to infinite recursion. - if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) { - return new Writable(options); - } - - this._writableState = new WritableState(options, this); - - // legacy. - this.writable = true; - - if (options) { - if (typeof options.write === 'function') this._write = options.write; - - if (typeof options.writev === 'function') this._writev = options.writev; - - if (typeof options.destroy === 'function') this._destroy = options.destroy; - - if (typeof options.final === 'function') this._final = options.final; - } - - 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, cb) { - var er = new Error('write after end'); - // TODO: defer error events consistently everywhere, not just the cb - stream.emit('error', er); - pna.nextTick(cb, er); -} - -// Checks that a user-supplied chunk is valid, especially for the particular -// mode the stream is in. Currently this means that `null` is never accepted -// and undefined/non-string values are only allowed in object mode. -function validChunk(stream, state, chunk, cb) { - var valid = true; - var er = false; - - if (chunk === null) { - er = new TypeError('May not write null values to stream'); - } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { - er = new TypeError('Invalid non-string/buffer chunk'); - } - if (er) { - stream.emit('error', er); - pna.nextTick(cb, er); - valid = false; - } - return valid; -} - -Writable.prototype.write = function (chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - var isBuf = !state.objectMode && _isUint8Array(chunk); - - if (isBuf && !Buffer.isBuffer(chunk)) { - chunk = _uint8ArrayToBuffer(chunk); - } - - if (typeof encoding === 'function') { - cb = encoding; - encoding = null; - } - - if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; - - if (typeof cb !== 'function') cb = nop; - - if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb); - } - - return ret; -}; - -Writable.prototype.cork = function () { - var state = this._writableState; - - state.corked++; -}; - -Writable.prototype.uncork = function () { - var state = this._writableState; - - if (state.corked) { - state.corked--; - - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); - } -}; - -Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { - // node::ParseEncoding() requires lower case. - if (typeof encoding === 'string') encoding = encoding.toLowerCase(); - if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); - this._writableState.defaultEncoding = encoding; - return this; -}; - -function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { - chunk = Buffer.from(chunk, encoding); - } - return chunk; -} - -Object.defineProperty(Writable.prototype, 'writableHighWaterMark', { - // making it explicit this property is not enumerable - // because otherwise some prototype manipulation in - // userland will fail - enumerable: false, - get: function () { - return this._writableState.highWaterMark; - } -}); - -// 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, isBuf, chunk, encoding, cb) { - if (!isBuf) { - var newChunk = decodeChunk(state, chunk, encoding); - if (chunk !== newChunk) { - isBuf = true; - encoding = 'buffer'; - chunk = newChunk; - } - } - 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.corked) { - var last = state.lastBufferedRequest; - state.lastBufferedRequest = { - chunk: chunk, - encoding: encoding, - isBuf: isBuf, - callback: cb, - next: null - }; - if (last) { - last.next = state.lastBufferedRequest; - } else { - state.bufferedRequest = state.lastBufferedRequest; - } - state.bufferedRequestCount += 1; - } else { - doWrite(stream, state, false, len, chunk, encoding, cb); - } - - return ret; -} - -function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); - state.sync = false; -} - -function onwriteError(stream, state, sync, er, cb) { - --state.pendingcb; - - if (sync) { - // defer the callback if we are being called synchronously - // to avoid piling up things on the stack - pna.nextTick(cb, er); - // this can emit finish, and it will always happen - // after error - pna.nextTick(finishMaybe, stream, state); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - } else { - // the caller expect this to happen before if - // it is async - cb(er); - stream._writableState.errorEmitted = true; - stream.emit('error', er); - // this can emit finish, but finish must - // always follow error - finishMaybe(stream, state); - } -} - -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(state); - - if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { - clearBuffer(stream, state); - } - - if (sync) { - /**/ - asyncWrite(afterWrite, stream, state, finished, cb); - /**/ - } else { - afterWrite(stream, state, finished, cb); - } - } -} - -function afterWrite(stream, state, finished, cb) { - if (!finished) onwriteDrain(stream, state); - state.pendingcb--; - cb(); - 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; - var entry = state.bufferedRequest; - - if (stream._writev && entry && entry.next) { - // Fast case, write everything using _writev() - var l = state.bufferedRequestCount; - var buffer = new Array(l); - var holder = state.corkedRequestsFree; - holder.entry = entry; - - var count = 0; - var allBuffers = true; - while (entry) { - buffer[count] = entry; - if (!entry.isBuf) allBuffers = false; - entry = entry.next; - count += 1; - } - buffer.allBuffers = allBuffers; - - doWrite(stream, state, true, state.length, buffer, '', holder.finish); - - // doWrite is almost always async, defer these to save a bit of time - // as the hot path ends with doWrite - state.pendingcb++; - state.lastBufferedRequest = null; - if (holder.next) { - state.corkedRequestsFree = holder.next; - holder.next = null; - } else { - state.corkedRequestsFree = new CorkedRequest(state); - } - state.bufferedRequestCount = 0; - } else { - // Slow case, write chunks one-by-one - while (entry) { - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - - doWrite(stream, state, false, len, chunk, encoding, cb); - entry = entry.next; - state.bufferedRequestCount--; - // 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) { - break; - } - } - - if (entry === null) state.lastBufferedRequest = null; - } - - state.bufferedRequest = entry; - state.bufferProcessing = false; -} - -Writable.prototype._write = function (chunk, encoding, cb) { - cb(new Error('_write() is not implemented')); -}; - -Writable.prototype._writev = null; - -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 (chunk !== null && chunk !== undefined) this.write(chunk, encoding); - - // .end() fully uncorks - if (state.corked) { - state.corked = 1; - this.uncork(); - } - - // ignore unnecessary end() calls. - if (!state.ending && !state.finished) endWritable(this, state, cb); -}; - -function needFinish(state) { - return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; -} -function callFinal(stream, state) { - stream._final(function (err) { - state.pendingcb--; - if (err) { - stream.emit('error', err); - } - state.prefinished = true; - stream.emit('prefinish'); - finishMaybe(stream, state); - }); -} -function prefinish(stream, state) { - if (!state.prefinished && !state.finalCalled) { - if (typeof stream._final === 'function') { - state.pendingcb++; - state.finalCalled = true; - pna.nextTick(callFinal, stream, state); - } else { - state.prefinished = true; - stream.emit('prefinish'); - } - } -} - -function finishMaybe(stream, state) { - var need = needFinish(state); - if (need) { - prefinish(stream, state); - if (state.pendingcb === 0) { - state.finished = true; - stream.emit('finish'); - } - } - return need; -} - -function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); - } - state.ended = true; - stream.writable = false; -} - -function onCorkedFinish(corkReq, state, err) { - var entry = corkReq.entry; - corkReq.entry = null; - while (entry) { - var cb = entry.callback; - state.pendingcb--; - cb(err); - entry = entry.next; - } - if (state.corkedRequestsFree) { - state.corkedRequestsFree.next = corkReq; - } else { - state.corkedRequestsFree = corkReq; - } -} - -Object.defineProperty(Writable.prototype, 'destroyed', { - get: function () { - if (this._writableState === undefined) { - return false; - } - return this._writableState.destroyed; - }, - set: function (value) { - // we ignore the value if the stream - // has not been initialized yet - if (!this._writableState) { - return; - } - - // backward compatibility, the user is explicitly - // managing destroyed - this._writableState.destroyed = value; - } -}); - -Writable.prototype.destroy = destroyImpl.destroy; -Writable.prototype._undestroy = destroyImpl.undestroy; -Writable.prototype._destroy = function (err, cb) { - this.end(); - cb(err); -}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/readable-stream/lib/internal/streams/BufferList.js deleted file mode 100644 index aefc68bd..00000000 --- a/node_modules/readable-stream/lib/internal/streams/BufferList.js +++ /dev/null @@ -1,79 +0,0 @@ -'use strict'; - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var Buffer = require('safe-buffer').Buffer; -var util = require('util'); - -function copyBuffer(src, target, offset) { - src.copy(target, offset); -} - -module.exports = function () { - function BufferList() { - _classCallCheck(this, BufferList); - - this.head = null; - this.tail = null; - this.length = 0; - } - - BufferList.prototype.push = function push(v) { - var entry = { data: v, next: null }; - if (this.length > 0) this.tail.next = entry;else this.head = entry; - this.tail = entry; - ++this.length; - }; - - BufferList.prototype.unshift = function unshift(v) { - var entry = { data: v, next: this.head }; - if (this.length === 0) this.tail = entry; - this.head = entry; - ++this.length; - }; - - BufferList.prototype.shift = function shift() { - if (this.length === 0) return; - var ret = this.head.data; - if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; - --this.length; - return ret; - }; - - BufferList.prototype.clear = function clear() { - this.head = this.tail = null; - this.length = 0; - }; - - BufferList.prototype.join = function join(s) { - if (this.length === 0) return ''; - var p = this.head; - var ret = '' + p.data; - while (p = p.next) { - ret += s + p.data; - }return ret; - }; - - BufferList.prototype.concat = function concat(n) { - if (this.length === 0) return Buffer.alloc(0); - if (this.length === 1) return this.head.data; - var ret = Buffer.allocUnsafe(n >>> 0); - var p = this.head; - var i = 0; - while (p) { - copyBuffer(p.data, ret, i); - i += p.data.length; - p = p.next; - } - return ret; - }; - - return BufferList; -}(); - -if (util && util.inspect && util.inspect.custom) { - module.exports.prototype[util.inspect.custom] = function () { - var obj = util.inspect({ length: this.length }); - return this.constructor.name + ' ' + obj; - }; -} \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/destroy.js b/node_modules/readable-stream/lib/internal/streams/destroy.js deleted file mode 100644 index 5a0a0d88..00000000 --- a/node_modules/readable-stream/lib/internal/streams/destroy.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict'; - -/**/ - -var pna = require('process-nextick-args'); -/**/ - -// undocumented cb() API, needed for core, not for public API -function destroy(err, cb) { - var _this = this; - - var readableDestroyed = this._readableState && this._readableState.destroyed; - var writableDestroyed = this._writableState && this._writableState.destroyed; - - if (readableDestroyed || writableDestroyed) { - if (cb) { - cb(err); - } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - pna.nextTick(emitErrorNT, this, err); - } - return this; - } - - // we set destroyed to true before firing error callbacks in order - // to make it re-entrance safe in case destroy() is called within callbacks - - if (this._readableState) { - this._readableState.destroyed = true; - } - - // if this is a duplex stream mark the writable part as destroyed as well - if (this._writableState) { - this._writableState.destroyed = true; - } - - this._destroy(err || null, function (err) { - if (!cb && err) { - pna.nextTick(emitErrorNT, _this, err); - if (_this._writableState) { - _this._writableState.errorEmitted = true; - } - } else if (cb) { - cb(err); - } - }); - - return this; -} - -function undestroy() { - if (this._readableState) { - this._readableState.destroyed = false; - this._readableState.reading = false; - this._readableState.ended = false; - this._readableState.endEmitted = false; - } - - if (this._writableState) { - this._writableState.destroyed = false; - this._writableState.ended = false; - this._writableState.ending = false; - this._writableState.finished = false; - this._writableState.errorEmitted = false; - } -} - -function emitErrorNT(self, err) { - self.emit('error', err); -} - -module.exports = { - destroy: destroy, - undestroy: undestroy -}; \ No newline at end of file diff --git a/node_modules/readable-stream/lib/internal/streams/stream-browser.js b/node_modules/readable-stream/lib/internal/streams/stream-browser.js deleted file mode 100644 index 9332a3fd..00000000 --- a/node_modules/readable-stream/lib/internal/streams/stream-browser.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('events').EventEmitter; diff --git a/node_modules/readable-stream/lib/internal/streams/stream.js b/node_modules/readable-stream/lib/internal/streams/stream.js deleted file mode 100644 index ce2ad5b6..00000000 --- a/node_modules/readable-stream/lib/internal/streams/stream.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('stream'); diff --git a/node_modules/readable-stream/package.json b/node_modules/readable-stream/package.json deleted file mode 100644 index 3e9dbf59..00000000 --- a/node_modules/readable-stream/package.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "_args": [ - [ - "readable-stream@2.3.6", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "readable-stream@2.3.6", - "_id": "readable-stream@2.3.6", - "_inBundle": false, - "_integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "_location": "/readable-stream", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "readable-stream@2.3.6", - "name": "readable-stream", - "escapedName": "readable-stream", - "rawSpec": "2.3.6", - "saveSpec": null, - "fetchSpec": "2.3.6" - }, - "_requiredBy": [ - "/concat-stream" - ], - "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "_spec": "2.3.6", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "browser": { - "util": false, - "./readable.js": "./readable-browser.js", - "./writable.js": "./writable-browser.js", - "./duplex.js": "./duplex-browser.js", - "./lib/internal/streams/stream.js": "./lib/internal/streams/stream-browser.js" - }, - "bugs": { - "url": "https://github.com/nodejs/readable-stream/issues" - }, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "description": "Streams3, a user-land copy of the stream library from Node.js", - "devDependencies": { - "assert": "^1.4.0", - "babel-polyfill": "^6.9.1", - "buffer": "^4.9.0", - "lolex": "^2.3.2", - "nyc": "^6.4.0", - "tap": "^0.7.0", - "tape": "^4.8.0" - }, - "homepage": "https://github.com/nodejs/readable-stream#readme", - "keywords": [ - "readable", - "stream", - "pipe" - ], - "license": "MIT", - "main": "readable.js", - "name": "readable-stream", - "nyc": { - "include": [ - "lib/**.js" - ] - }, - "repository": { - "type": "git", - "url": "git://github.com/nodejs/readable-stream.git" - }, - "scripts": { - "ci": "tap test/parallel/*.js test/ours/*.js --tap | tee test.tap && node test/verify-dependencies.js", - "cover": "nyc npm test", - "report": "nyc report --reporter=lcov", - "test": "tap test/parallel/*.js test/ours/*.js && node test/verify-dependencies.js" - }, - "version": "2.3.6" -} diff --git a/node_modules/readable-stream/passthrough.js b/node_modules/readable-stream/passthrough.js deleted file mode 100644 index ffd791d7..00000000 --- a/node_modules/readable-stream/passthrough.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./readable').PassThrough diff --git a/node_modules/readable-stream/readable-browser.js b/node_modules/readable-stream/readable-browser.js deleted file mode 100644 index e5037259..00000000 --- a/node_modules/readable-stream/readable-browser.js +++ /dev/null @@ -1,7 +0,0 @@ -exports = module.exports = require('./lib/_stream_readable.js'); -exports.Stream = exports; -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/readable-stream/readable.js b/node_modules/readable-stream/readable.js deleted file mode 100644 index ec89ec53..00000000 --- a/node_modules/readable-stream/readable.js +++ /dev/null @@ -1,19 +0,0 @@ -var Stream = require('stream'); -if (process.env.READABLE_STREAM === 'disable' && Stream) { - module.exports = Stream; - exports = module.exports = Stream.Readable; - exports.Readable = Stream.Readable; - exports.Writable = Stream.Writable; - exports.Duplex = Stream.Duplex; - exports.Transform = Stream.Transform; - exports.PassThrough = Stream.PassThrough; - exports.Stream = Stream; -} else { - exports = module.exports = require('./lib/_stream_readable.js'); - exports.Stream = Stream || exports; - 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/readable-stream/transform.js b/node_modules/readable-stream/transform.js deleted file mode 100644 index b1baba26..00000000 --- a/node_modules/readable-stream/transform.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./readable').Transform diff --git a/node_modules/readable-stream/writable-browser.js b/node_modules/readable-stream/writable-browser.js deleted file mode 100644 index ebdde6a8..00000000 --- a/node_modules/readable-stream/writable-browser.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/_stream_writable.js'); diff --git a/node_modules/readable-stream/writable.js b/node_modules/readable-stream/writable.js deleted file mode 100644 index 3211a6f8..00000000 --- a/node_modules/readable-stream/writable.js +++ /dev/null @@ -1,8 +0,0 @@ -var Stream = require("stream") -var Writable = require("./lib/_stream_writable.js") - -if (process.env.READABLE_STREAM === 'disable') { - module.exports = Stream && Stream.Writable || Writable -} else { - module.exports = Writable -} diff --git a/node_modules/semver/CHANGELOG.md b/node_modules/semver/CHANGELOG.md deleted file mode 100644 index 66304fdd..00000000 --- a/node_modules/semver/CHANGELOG.md +++ /dev/null @@ -1,39 +0,0 @@ -# changes log - -## 5.7 - -* Add `minVersion` method - -## 5.6 - -* Move boolean `loose` param to an options object, with - backwards-compatibility protection. -* Add ability to opt out of special prerelease version handling with - the `includePrerelease` option flag. - -## 5.5 - -* Add version coercion capabilities - -## 5.4 - -* Add intersection checking - -## 5.3 - -* Add `minSatisfying` method - -## 5.2 - -* Add `prerelease(v)` that returns prerelease components - -## 5.1 - -* Add Backus-Naur for ranges -* Remove excessively cute inspection methods - -## 5.0 - -* Remove AMD/Browserified build artifacts -* Fix ltr and gtr when using the `*` range -* Fix for range `*` with a prerelease identifier diff --git a/node_modules/semver/LICENSE b/node_modules/semver/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/semver/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/semver/README.md b/node_modules/semver/README.md deleted file mode 100644 index f8dfa5a0..00000000 --- a/node_modules/semver/README.md +++ /dev/null @@ -1,412 +0,0 @@ -semver(1) -- The semantic versioner for npm -=========================================== - -## Install - -```bash -npm install --save semver -```` - -## Usage - -As a node module: - -```js -const semver = require('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 -semver.minVersion('>=1.0.0') // '1.0.0' -semver.valid(semver.coerce('v2')) // '2.0.0' -semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' -``` - -As a command-line utility: - -``` -$ semver -h - -A JavaScript implementation of the https://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. - ---preid - Identifier to be used to prefix premajor, preminor, - prepatch or prerelease version increments. - --l --loose - Interpret versions and ranges loosely - --p --include-prerelease - Always include prerelease versions in range matching - --c --coerce - Coerce a string into SemVer if possible - (does not imply --loose) - -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. -``` - -## Versions - -A "version" is described by the `v2.0.0` specification found at -. - -A leading `"="` or `"v"` character is stripped off and ignored. - -## Ranges - -A `version range` is a set of `comparators` which specify versions -that satisfy the range. - -A `comparator` is composed of an `operator` and a `version`. The set -of primitive `operators` is: - -* `<` Less than -* `<=` Less than or equal to -* `>` Greater than -* `>=` Greater than or equal to -* `=` Equal. If no operator is specified, then equality is assumed, - so this operator is optional, but MAY be included. - -For example, the comparator `>=1.2.7` would match the versions -`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` -or `1.1.0`. - -Comparators can be joined by whitespace to form a `comparator set`, -which is satisfied by the **intersection** of all of the comparators -it includes. - -A range is composed of one or more comparator sets, joined by `||`. A -version matches a range if and only if every comparator in at least -one of the `||`-separated comparator sets is satisfied by the version. - -For example, the range `>=1.2.7 <1.3.0` would match the versions -`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, -or `1.1.0`. - -The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, -`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. - -### Prerelease Tags - -If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then -it will only be allowed to satisfy comparator sets if at least one -comparator with the same `[major, minor, patch]` tuple also has a -prerelease tag. - -For example, the range `>1.2.3-alpha.3` would be allowed to match the -version `1.2.3-alpha.7`, but it would *not* be satisfied by -`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater -than" `1.2.3-alpha.3` according to the SemVer sort rules. The version -range only accepts prerelease tags on the `1.2.3` version. The -version `3.4.5` *would* satisfy the range, because it does not have a -prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. - -The purpose for this behavior is twofold. First, prerelease versions -frequently are updated very quickly, and contain many breaking changes -that are (by the author's design) not yet fit for public consumption. -Therefore, by default, they are excluded from range matching -semantics. - -Second, a user who has opted into using a prerelease version has -clearly indicated the intent to use *that specific* set of -alpha/beta/rc versions. By including a prerelease tag in the range, -the user is indicating that they are aware of the risk. However, it -is still not appropriate to assume that they have opted into taking a -similar risk on the *next* set of prerelease versions. - -Note that this behavior can be suppressed (treating all prerelease -versions as if they were normal versions, for the purpose of range -matching) by setting the `includePrerelease` flag on the options -object to any -[functions](https://github.com/npm/node-semver#functions) that do -range matching. - -#### Prerelease Identifiers - -The method `.inc` takes an additional `identifier` string argument that -will append the value of the string as a prerelease identifier: - -```javascript -semver.inc('1.2.3', 'prerelease', 'beta') -// '1.2.4-beta.0' -``` - -command-line example: - -```bash -$ semver 1.2.3 -i prerelease --preid beta -1.2.4-beta.0 -``` - -Which then can be used to increment further: - -```bash -$ semver 1.2.4-beta.0 -i prerelease -1.2.4-beta.1 -``` - -### Advanced Range Syntax - -Advanced range syntax desugars to primitive comparators in -deterministic ways. - -Advanced ranges may be combined in the same way as primitive -comparators using white space or `||`. - -#### Hyphen Ranges `X.Y.Z - A.B.C` - -Specifies an inclusive set. - -* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` - -If a partial version is provided as the first version in the inclusive -range, then the missing pieces are replaced with zeroes. - -* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` - -If a partial version is provided as the second version in the -inclusive range, then all versions that start with the supplied parts -of the tuple are accepted, but nothing that would be greater than the -provided tuple parts. - -* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0` -* `1.2.3 - 2` := `>=1.2.3 <3.0.0` - -#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` - -Any of `X`, `x`, or `*` may be used to "stand in" for one of the -numeric values in the `[major, minor, patch]` tuple. - -* `*` := `>=0.0.0` (Any version satisfies) -* `1.x` := `>=1.0.0 <2.0.0` (Matching major version) -* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions) - -A partial version range is treated as an X-Range, so the special -character is in fact optional. - -* `""` (empty string) := `*` := `>=0.0.0` -* `1` := `1.x.x` := `>=1.0.0 <2.0.0` -* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0` - -#### Tilde Ranges `~1.2.3` `~1.2` `~1` - -Allows patch-level changes if a minor version is specified on the -comparator. Allows minor-level changes if not. - -* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0` -* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`) -* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`) -* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0` -* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`) -* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`) -* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in - the `1.2.3` version will be allowed, if they are greater than or - equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but - `1.2.4-beta.2` would not, because it is a prerelease of a - different `[major, minor, patch]` tuple. - -#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` - -Allows changes that do not modify the left-most non-zero digit in the -`[major, minor, patch]` tuple. In other words, this allows patch and -minor updates for versions `1.0.0` and above, patch updates for -versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. - -Many authors treat a `0.x` version as if the `x` were the major -"breaking-change" indicator. - -Caret ranges are ideal when an author may make breaking changes -between `0.2.4` and `0.3.0` releases, which is a common practice. -However, it presumes that there will *not* be breaking changes between -`0.2.4` and `0.2.5`. It allows for changes that are presumed to be -additive (but non-breaking), according to commonly observed practices. - -* `^1.2.3` := `>=1.2.3 <2.0.0` -* `^0.2.3` := `>=0.2.3 <0.3.0` -* `^0.0.3` := `>=0.0.3 <0.0.4` -* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in - the `1.2.3` version will be allowed, if they are greater than or - equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but - `1.2.4-beta.2` would not, because it is a prerelease of a - different `[major, minor, patch]` tuple. -* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4` Note that prereleases in the - `0.0.3` version *only* will be allowed, if they are greater than or - equal to `beta`. So, `0.0.3-pr.2` would be allowed. - -When parsing caret ranges, a missing `patch` value desugars to the -number `0`, but will allow flexibility within that value, even if the -major and minor versions are both `0`. - -* `^1.2.x` := `>=1.2.0 <2.0.0` -* `^0.0.x` := `>=0.0.0 <0.1.0` -* `^0.0` := `>=0.0.0 <0.1.0` - -A missing `minor` and `patch` values will desugar to zero, but also -allow flexibility within those values, even if the major version is -zero. - -* `^1.x` := `>=1.0.0 <2.0.0` -* `^0.x` := `>=0.0.0 <1.0.0` - -### Range Grammar - -Putting all this together, here is a Backus-Naur grammar for ranges, -for the benefit of parser authors: - -```bnf -range-set ::= range ( logical-or range ) * -logical-or ::= ( ' ' ) * '||' ( ' ' ) * -range ::= hyphen | simple ( ' ' simple ) * | '' -hyphen ::= partial ' - ' partial -simple ::= primitive | partial | tilde | caret -primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial -partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -xr ::= 'x' | 'X' | '*' | nr -nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * -tilde ::= '~' partial -caret ::= '^' partial -qualifier ::= ( '-' pre )? ( '+' build )? -pre ::= parts -build ::= parts -parts ::= part ( '.' part ) * -part ::= nr | [-0-9A-Za-z]+ -``` - -## Functions - -All methods and classes take a final `options` object argument. All -options in this object are `false` by default. The options supported -are: - -- `loose` Be more forgiving about not-quite-valid semver strings. - (Any resulting output will always be 100% strict compliant, of - course.) For backwards compatibility reasons, if the `options` - argument is a boolean value instead of an object, it is interpreted - to be the `loose` param. -- `includePrerelease` Set to suppress the [default - behavior](https://github.com/npm/node-semver#prerelease-tags) of - excluding prerelease tagged versions from ranges unless they are - explicitly opted into. - -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. -* `prerelease(v)`: Returns an array of prerelease components, or null - if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` -* `major(v)`: Return the major version number. -* `minor(v)`: Return the minor version number. -* `patch(v)`: Return the patch version number. -* `intersects(r1, r2, loose)`: Return true if the two supplied ranges - or comparators intersect. -* `parse(v)`: Attempt to parse a string as a semantic version, returning either - a `SemVer` object or `null`. - -### 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()`. -* `diff(v1, v2)`: Returns difference between two versions by the release type - (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), - or null if the versions are the same. - -### Comparators - -* `intersects(comparator)`: Return true if the comparators intersect - -### 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. -* `minSatisfying(versions, range)`: Return the lowest version in the list - that satisfies the range, or `null` if none of them do. -* `minVersion(range)`: Return the lowest version that can possibly match - the given range. -* `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`.) -* `intersects(range)`: Return true if any of the ranges comparators intersect - -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. - -### Coercion - -* `coerce(version)`: Coerces a string to semver if possible - -This aims to provide a very forgiving translation of a non-semver string to -semver. It looks for the first digit in a string, and consumes all -remaining characters which satisfy at least a partial semver (e.g., `1`, -`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer -versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All -surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes -`3.4.0`). Only text which lacks digits will fail coercion (`version one` -is not valid). The maximum length for any semver component considered for -coercion is 16 characters; longer components will be ignored -(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any -semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value -components are invalid (`9999999999999999.4.7.4` is likely invalid). diff --git a/node_modules/semver/bin/semver b/node_modules/semver/bin/semver deleted file mode 100755 index 801e77f1..00000000 --- a/node_modules/semver/bin/semver +++ /dev/null @@ -1,160 +0,0 @@ -#!/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) - -var versions = [] - -var range = [] - -var inc = null - -var version = require('../package.json').version - -var loose = false - -var includePrerelease = false - -var coerce = false - -var identifier - -var semver = require('../semver') - -var reverse = false - -var options = {} - -main() - -function main () { - if (!argv.length) return help() - while (argv.length) { - var a = argv.shift() - var indexOfEqualSign = a.indexOf('=') - if (indexOfEqualSign !== -1) { - a = a.slice(0, indexOfEqualSign) - argv.unshift(a.slice(indexOfEqualSign + 1)) - } - switch (a) { - case '-rv': case '-rev': case '--rev': case '--reverse': - reverse = true - break - case '-l': case '--loose': - loose = true - break - case '-p': case '--include-prerelease': - includePrerelease = 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 '--preid': - identifier = argv.shift() - break - case '-r': case '--range': - range.push(argv.shift()) - break - case '-c': case '--coerce': - coerce = true - break - case '-h': case '--help': case '-?': - return help() - default: - versions.push(a) - break - } - } - - var options = { loose: loose, includePrerelease: includePrerelease } - - versions = versions.map(function (v) { - return coerce ? (semver.coerce(v) || { version: v }).version : v - }).filter(function (v) { - return semver.valid(v) - }) - 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], options) - }) - 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, options) - }).map(function (v) { - return semver.clean(v, options) - }).map(function (v) { - return inc ? semver.inc(v, inc, options, identifier) : v - }).forEach(function (v, i, _) { console.log(v) }) -} - -function help () { - console.log(['SemVer ' + version, - '', - 'A JavaScript implementation of the https://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.', - '', - '--preid ', - ' Identifier to be used to prefix premajor, preminor,', - ' prepatch or prerelease version increments.', - '', - '-l --loose', - ' Interpret versions and ranges loosely', - '', - '-p --include-prerelease', - ' Always include prerelease versions in range matching', - '', - '-c --coerce', - ' Coerce a string into SemVer if possible', - ' (does not imply --loose)', - '', - '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/semver/package.json b/node_modules/semver/package.json deleted file mode 100644 index de9acf67..00000000 --- a/node_modules/semver/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "_args": [ - [ - "semver@5.7.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "semver@5.7.1", - "_id": "semver@5.7.1", - "_inBundle": false, - "_integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "_location": "/semver", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "semver@5.7.1", - "name": "semver", - "escapedName": "semver", - "rawSpec": "5.7.1", - "saveSpec": null, - "fetchSpec": "5.7.1" - }, - "_requiredBy": [ - "/editorconfig" - ], - "_resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "_spec": "5.7.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "bin": { - "semver": "./bin/semver" - }, - "bugs": { - "url": "https://github.com/npm/node-semver/issues" - }, - "description": "The semantic version parser used by npm.", - "devDependencies": { - "tap": "^13.0.0-rc.18" - }, - "files": [ - "bin", - "range.bnf", - "semver.js" - ], - "homepage": "https://github.com/npm/node-semver#readme", - "license": "ISC", - "main": "semver.js", - "name": "semver", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/node-semver.git" - }, - "scripts": { - "postpublish": "git push origin --all; git push origin --tags", - "postversion": "npm publish", - "preversion": "npm test", - "test": "tap" - }, - "tap": { - "check-coverage": true - }, - "version": "5.7.1" -} diff --git a/node_modules/semver/range.bnf b/node_modules/semver/range.bnf deleted file mode 100644 index d4c6ae0d..00000000 --- a/node_modules/semver/range.bnf +++ /dev/null @@ -1,16 +0,0 @@ -range-set ::= range ( logical-or range ) * -logical-or ::= ( ' ' ) * '||' ( ' ' ) * -range ::= hyphen | simple ( ' ' simple ) * | '' -hyphen ::= partial ' - ' partial -simple ::= primitive | partial | tilde | caret -primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial -partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? -xr ::= 'x' | 'X' | '*' | nr -nr ::= '0' | [1-9] ( [0-9] ) * -tilde ::= '~' partial -caret ::= '^' partial -qualifier ::= ( '-' pre )? ( '+' build )? -pre ::= parts -build ::= parts -parts ::= part ( '.' part ) * -part ::= nr | [-0-9A-Za-z]+ diff --git a/node_modules/semver/semver.js b/node_modules/semver/semver.js deleted file mode 100644 index d315d5d6..00000000 --- a/node_modules/semver/semver.js +++ /dev/null @@ -1,1483 +0,0 @@ -exports = module.exports = SemVer - -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) - } -} else { - 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' - -var MAX_LENGTH = 256 -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 - -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 - -// 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] + ')?' + - src[BUILD] + '?' + - ')?)?' - -var XRANGEPLAINLOOSE = R++ -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?' - -var XRANGE = R++ -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' -var XRANGELOOSE = R++ -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' - -// 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, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - if (version.length > MAX_LENGTH) { - return null - } - - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null - } - - try { - return new SemVer(version, options) - } catch (er) { - return null - } -} - -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null -} - -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null -} - -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') - } - - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } - - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose - - var m = version.trim().match(options.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] - - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } - - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } - - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } - - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] - } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return 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.toString = function () { - return this.version -} - -SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - return this.compareMain(other) || this.comparePre(other) -} - -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } - - 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.options) - } - - // 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, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - 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', identifier) - this.inc('pre', identifier) - 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', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - 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 publicly. - // 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) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break - - default: - throw new Error('invalid increment argument: ' + release) - } - this.format() - this.raw = this.version - return this -} - -exports.inc = inc -function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose - loose = undefined - } - - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } -} - -exports.diff = diff -function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1) - var v2 = parse(version2) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } - } - return defaultResult // may be undefined - } -} - -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 a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -exports.rcompareIdentifiers = rcompareIdentifiers -function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) -} - -exports.major = major -function major (a, loose) { - return new SemVer(a, loose).major -} - -exports.minor = minor -function minor (a, loose) { - return new SemVer(a, loose).minor -} - -exports.patch = patch -function patch (a, loose) { - return new SemVer(a, loose).patch -} - -exports.compare = compare -function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) -} - -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) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) - - case '>=': - return gte(a, b, loose) - - case '<': - return lt(a, b, loose) - - case '<=': - return lte(a, b, loose) - - default: - throw new TypeError('Invalid operator: ' + op) - } -} - -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } - } - - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) - } - - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version - } - - debug('comp', this) -} - -var ANY = {} -Comparator.prototype.parse = function (comp) { - var r = this.options.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.options.loose) - } -} - -Comparator.prototype.toString = function () { - return this.value -} - -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) - - if (this.semver === ANY) { - return true - } - - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } - - return cmp(version, this.operator, this.semver, this.options) -} - -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - var rangeTmp - - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) - } - - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) - - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan -} - -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } - } - - if (range instanceof Comparator) { - return new Range(range.value, options) - } - - if (!(this instanceof Range)) { - return new Range(range, options) - } - - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // 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.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.options.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) - 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, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.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, this.options) - }, this) - - return set -} - -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') - } - - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} - -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).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, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - 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, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} - -function replaceTilde (comp, options) { - var r = options.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 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else if (pr) { - debug('replaceTilde pr', pr) - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.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, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') -} - -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.loose ? re[CARETLOOSE] : re[CARET] - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr) - var ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0' - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0' - } - } - - debug('caret return', ret) - return ret - }) -} - -function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') -} - -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.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 (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - ret = gtlt + M + '.' + m + '.' + p - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.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, options) { - debug('replaceStars', comp, options) - // 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 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.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' - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0' - } else { - from = '>=' + from - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0' - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.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 - } - - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } - - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } - } - return false -} - -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } - } - - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } - } - - // Version has a -pre, but it's not one of the ones we like. - return false - } - - return true -} - -exports.satisfies = satisfies -function satisfies (version, range, options) { - try { - range = new Range(range, options) - } catch (er) { - return false - } - return range.test(version) -} - -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} - -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} - -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) - - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } - - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } - - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] - - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) - } - }) - } - - if (minver && range.test(minver)) { - return minver - } - - return null -} - -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).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, options) { - return outside(version, range, '<', options) -} - -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} - -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) - - 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, options)) { - 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) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - 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 -} - -exports.prerelease = prerelease -function prerelease (version, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} - -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} - -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version - } - - if (typeof version !== 'string') { - return null - } - - var match = version.match(re[COERCE]) - - if (match == null) { - return null - } - - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) -} diff --git a/node_modules/sigmund/LICENSE b/node_modules/sigmund/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/sigmund/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/sigmund/README.md b/node_modules/sigmund/README.md deleted file mode 100644 index 25a38a53..00000000 --- a/node_modules/sigmund/README.md +++ /dev/null @@ -1,53 +0,0 @@ -# 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 cocaine-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 `util.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/sigmund/bench.js b/node_modules/sigmund/bench.js deleted file mode 100644 index 5acfd6d9..00000000 --- a/node_modules/sigmund/bench.js +++ /dev/null @@ -1,283 +0,0 @@ -// 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/sigmund/package.json b/node_modules/sigmund/package.json deleted file mode 100644 index 80cc5537..00000000 --- a/node_modules/sigmund/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "_args": [ - [ - "sigmund@1.0.1", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "sigmund@1.0.1", - "_id": "sigmund@1.0.1", - "_inBundle": false, - "_integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "_location": "/sigmund", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "sigmund@1.0.1", - "name": "sigmund", - "escapedName": "sigmund", - "rawSpec": "1.0.1", - "saveSpec": null, - "fetchSpec": "1.0.1" - }, - "_requiredBy": [ - "/editorconfig" - ], - "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "_spec": "1.0.1", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/sigmund/issues" - }, - "dependencies": {}, - "description": "Quick and dirty signatures for Objects.", - "devDependencies": { - "tap": "~0.3.0" - }, - "directories": { - "test": "test" - }, - "homepage": "https://github.com/isaacs/sigmund#readme", - "keywords": [ - "object", - "signature", - "key", - "data", - "psychoanalysis" - ], - "license": "ISC", - "main": "sigmund.js", - "name": "sigmund", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/sigmund.git" - }, - "scripts": { - "bench": "node bench.js", - "test": "tap test/*.js" - }, - "version": "1.0.1" -} diff --git a/node_modules/sigmund/sigmund.js b/node_modules/sigmund/sigmund.js deleted file mode 100644 index 82c7ab8c..00000000 --- a/node_modules/sigmund/sigmund.js +++ /dev/null @@ -1,39 +0,0 @@ -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/sigmund/test/basic.js b/node_modules/sigmund/test/basic.js deleted file mode 100644 index 50c53a13..00000000 --- a/node_modules/sigmund/test/basic.js +++ /dev/null @@ -1,24 +0,0 @@ -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/typedarray/.travis.yml b/node_modules/typedarray/.travis.yml deleted file mode 100644 index cc4dba29..00000000 --- a/node_modules/typedarray/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" diff --git a/node_modules/typedarray/LICENSE b/node_modules/typedarray/LICENSE deleted file mode 100644 index 11adfaec..00000000 --- a/node_modules/typedarray/LICENSE +++ /dev/null @@ -1,35 +0,0 @@ -/* - Copyright (c) 2010, Linden Research, Inc. - Copyright (c) 2012, Joshua Bell - - 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. - $/LicenseInfo$ - */ - -// Original can be found at: -// https://bitbucket.org/lindenlab/llsd -// Modifications by Joshua Bell inexorabletash@gmail.com -// https://github.com/inexorabletash/polyfill - -// ES3/ES5 implementation of the Krhonos Typed Array Specification -// Ref: http://www.khronos.org/registry/typedarray/specs/latest/ -// Date: 2011-02-01 -// -// Variations: -// * Allows typed_array.get/set() as alias for subscripts (typed_array[]) diff --git a/node_modules/typedarray/example/tarray.js b/node_modules/typedarray/example/tarray.js deleted file mode 100644 index 8423d7c9..00000000 --- a/node_modules/typedarray/example/tarray.js +++ /dev/null @@ -1,4 +0,0 @@ -var Uint8Array = require('../').Uint8Array; -var ua = new Uint8Array(5); -ua[1] = 256 + 55; -console.log(ua[1]); diff --git a/node_modules/typedarray/index.js b/node_modules/typedarray/index.js deleted file mode 100644 index 5e540841..00000000 --- a/node_modules/typedarray/index.js +++ /dev/null @@ -1,630 +0,0 @@ -var undefined = (void 0); // Paranoia - -// Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to -// create, and consume so much memory, that the browser appears frozen. -var MAX_ARRAY_LENGTH = 1e5; - -// Approximations of internal ECMAScript conversion functions -var ECMAScript = (function() { - // Stash a copy in case other scripts modify these - var opts = Object.prototype.toString, - ophop = Object.prototype.hasOwnProperty; - - return { - // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues: - Class: function(v) { return opts.call(v).replace(/^\[object *|\]$/g, ''); }, - HasProperty: function(o, p) { return p in o; }, - HasOwnProperty: function(o, p) { return ophop.call(o, p); }, - IsCallable: function(o) { return typeof o === 'function'; }, - ToInt32: function(v) { return v >> 0; }, - ToUint32: function(v) { return v >>> 0; } - }; -}()); - -// Snapshot intrinsics -var LN2 = Math.LN2, - abs = Math.abs, - floor = Math.floor, - log = Math.log, - min = Math.min, - pow = Math.pow, - round = Math.round; - -// ES5: lock down object properties -function configureProperties(obj) { - if (getOwnPropNames && defineProp) { - var props = getOwnPropNames(obj), i; - for (i = 0; i < props.length; i += 1) { - defineProp(obj, props[i], { - value: obj[props[i]], - writable: false, - enumerable: false, - configurable: false - }); - } - } -} - -// emulate ES5 getter/setter API using legacy APIs -// http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx -// (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but -// note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless) -var defineProp -if (Object.defineProperty && (function() { - try { - Object.defineProperty({}, 'x', {}); - return true; - } catch (e) { - return false; - } - })()) { - defineProp = Object.defineProperty; -} else { - defineProp = function(o, p, desc) { - if (!o === Object(o)) throw new TypeError("Object.defineProperty called on non-object"); - if (ECMAScript.HasProperty(desc, 'get') && Object.prototype.__defineGetter__) { Object.prototype.__defineGetter__.call(o, p, desc.get); } - if (ECMAScript.HasProperty(desc, 'set') && Object.prototype.__defineSetter__) { Object.prototype.__defineSetter__.call(o, p, desc.set); } - if (ECMAScript.HasProperty(desc, 'value')) { o[p] = desc.value; } - return o; - }; -} - -var getOwnPropNames = Object.getOwnPropertyNames || function (o) { - if (o !== Object(o)) throw new TypeError("Object.getOwnPropertyNames called on non-object"); - var props = [], p; - for (p in o) { - if (ECMAScript.HasOwnProperty(o, p)) { - props.push(p); - } - } - return props; -}; - -// ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value) -// for index in 0 ... obj.length -function makeArrayAccessors(obj) { - if (!defineProp) { return; } - - if (obj.length > MAX_ARRAY_LENGTH) throw new RangeError("Array too large for polyfill"); - - function makeArrayAccessor(index) { - defineProp(obj, index, { - 'get': function() { return obj._getter(index); }, - 'set': function(v) { obj._setter(index, v); }, - enumerable: true, - configurable: false - }); - } - - var i; - for (i = 0; i < obj.length; i += 1) { - makeArrayAccessor(i); - } -} - -// Internal conversion functions: -// pack() - take a number (interpreted as Type), output a byte array -// unpack() - take a byte array, output a Type-like number - -function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; } -function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; } - -function packI8(n) { return [n & 0xff]; } -function unpackI8(bytes) { return as_signed(bytes[0], 8); } - -function packU8(n) { return [n & 0xff]; } -function unpackU8(bytes) { return as_unsigned(bytes[0], 8); } - -function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; } - -function packI16(n) { return [(n >> 8) & 0xff, n & 0xff]; } -function unpackI16(bytes) { return as_signed(bytes[0] << 8 | bytes[1], 16); } - -function packU16(n) { return [(n >> 8) & 0xff, n & 0xff]; } -function unpackU16(bytes) { return as_unsigned(bytes[0] << 8 | bytes[1], 16); } - -function packI32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; } -function unpackI32(bytes) { return as_signed(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); } - -function packU32(n) { return [(n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff]; } -function unpackU32(bytes) { return as_unsigned(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], 32); } - -function packIEEE754(v, ebits, fbits) { - - var bias = (1 << (ebits - 1)) - 1, - s, e, f, ln, - i, bits, str, bytes; - - function roundToEven(n) { - var w = floor(n), f = n - w; - if (f < 0.5) - return w; - if (f > 0.5) - return w + 1; - return w % 2 ? w + 1 : w; - } - - // Compute sign, exponent, fraction - if (v !== v) { - // NaN - // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping - e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0; - } else if (v === Infinity || v === -Infinity) { - e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0; - } else if (v === 0) { - e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0; - } else { - s = v < 0; - v = abs(v); - - if (v >= pow(2, 1 - bias)) { - e = min(floor(log(v) / LN2), 1023); - f = roundToEven(v / pow(2, e) * pow(2, fbits)); - if (f / pow(2, fbits) >= 2) { - e = e + 1; - f = 1; - } - if (e > bias) { - // Overflow - e = (1 << ebits) - 1; - f = 0; - } else { - // Normalized - e = e + bias; - f = f - pow(2, fbits); - } - } else { - // Denormalized - e = 0; - f = roundToEven(v / pow(2, 1 - bias - fbits)); - } - } - - // Pack sign, exponent, fraction - bits = []; - for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); } - for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); } - bits.push(s ? 1 : 0); - bits.reverse(); - str = bits.join(''); - - // Bits to bytes - bytes = []; - while (str.length) { - bytes.push(parseInt(str.substring(0, 8), 2)); - str = str.substring(8); - } - return bytes; -} - -function unpackIEEE754(bytes, ebits, fbits) { - - // Bytes to bits - var bits = [], i, j, b, str, - bias, s, e, f; - - for (i = bytes.length; i; i -= 1) { - b = bytes[i - 1]; - for (j = 8; j; j -= 1) { - bits.push(b % 2 ? 1 : 0); b = b >> 1; - } - } - bits.reverse(); - str = bits.join(''); - - // Unpack sign, exponent, fraction - bias = (1 << (ebits - 1)) - 1; - s = parseInt(str.substring(0, 1), 2) ? -1 : 1; - e = parseInt(str.substring(1, 1 + ebits), 2); - f = parseInt(str.substring(1 + ebits), 2); - - // Produce number - if (e === (1 << ebits) - 1) { - return f !== 0 ? NaN : s * Infinity; - } else if (e > 0) { - // Normalized - return s * pow(2, e - bias) * (1 + f / pow(2, fbits)); - } else if (f !== 0) { - // Denormalized - return s * pow(2, -(bias - 1)) * (f / pow(2, fbits)); - } else { - return s < 0 ? -0 : 0; - } -} - -function unpackF64(b) { return unpackIEEE754(b, 11, 52); } -function packF64(v) { return packIEEE754(v, 11, 52); } -function unpackF32(b) { return unpackIEEE754(b, 8, 23); } -function packF32(v) { return packIEEE754(v, 8, 23); } - - -// -// 3 The ArrayBuffer Type -// - -(function() { - - /** @constructor */ - var ArrayBuffer = function ArrayBuffer(length) { - length = ECMAScript.ToInt32(length); - if (length < 0) throw new RangeError('ArrayBuffer size is not a small enough positive integer'); - - this.byteLength = length; - this._bytes = []; - this._bytes.length = length; - - var i; - for (i = 0; i < this.byteLength; i += 1) { - this._bytes[i] = 0; - } - - configureProperties(this); - }; - - exports.ArrayBuffer = exports.ArrayBuffer || ArrayBuffer; - - // - // 4 The ArrayBufferView Type - // - - // NOTE: this constructor is not exported - /** @constructor */ - var ArrayBufferView = function ArrayBufferView() { - //this.buffer = null; - //this.byteOffset = 0; - //this.byteLength = 0; - }; - - // - // 5 The Typed Array View Types - // - - function makeConstructor(bytesPerElement, pack, unpack) { - // Each TypedArray type requires a distinct constructor instance with - // identical logic, which this produces. - - var ctor; - ctor = function(buffer, byteOffset, length) { - var array, sequence, i, s; - - if (!arguments.length || typeof arguments[0] === 'number') { - // Constructor(unsigned long length) - this.length = ECMAScript.ToInt32(arguments[0]); - if (length < 0) throw new RangeError('ArrayBufferView size is not a small enough positive integer'); - - this.byteLength = this.length * this.BYTES_PER_ELEMENT; - this.buffer = new ArrayBuffer(this.byteLength); - this.byteOffset = 0; - } else if (typeof arguments[0] === 'object' && arguments[0].constructor === ctor) { - // Constructor(TypedArray array) - array = arguments[0]; - - this.length = array.length; - this.byteLength = this.length * this.BYTES_PER_ELEMENT; - this.buffer = new ArrayBuffer(this.byteLength); - this.byteOffset = 0; - - for (i = 0; i < this.length; i += 1) { - this._setter(i, array._getter(i)); - } - } else if (typeof arguments[0] === 'object' && - !(arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) { - // Constructor(sequence array) - sequence = arguments[0]; - - this.length = ECMAScript.ToUint32(sequence.length); - this.byteLength = this.length * this.BYTES_PER_ELEMENT; - this.buffer = new ArrayBuffer(this.byteLength); - this.byteOffset = 0; - - for (i = 0; i < this.length; i += 1) { - s = sequence[i]; - this._setter(i, Number(s)); - } - } else if (typeof arguments[0] === 'object' && - (arguments[0] instanceof ArrayBuffer || ECMAScript.Class(arguments[0]) === 'ArrayBuffer')) { - // Constructor(ArrayBuffer buffer, - // optional unsigned long byteOffset, optional unsigned long length) - this.buffer = buffer; - - this.byteOffset = ECMAScript.ToUint32(byteOffset); - if (this.byteOffset > this.buffer.byteLength) { - throw new RangeError("byteOffset out of range"); - } - - if (this.byteOffset % this.BYTES_PER_ELEMENT) { - // The given byteOffset must be a multiple of the element - // size of the specific type, otherwise an exception is raised. - throw new RangeError("ArrayBuffer length minus the byteOffset is not a multiple of the element size."); - } - - if (arguments.length < 3) { - this.byteLength = this.buffer.byteLength - this.byteOffset; - - if (this.byteLength % this.BYTES_PER_ELEMENT) { - throw new RangeError("length of buffer minus byteOffset not a multiple of the element size"); - } - this.length = this.byteLength / this.BYTES_PER_ELEMENT; - } else { - this.length = ECMAScript.ToUint32(length); - this.byteLength = this.length * this.BYTES_PER_ELEMENT; - } - - if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) { - throw new RangeError("byteOffset and length reference an area beyond the end of the buffer"); - } - } else { - throw new TypeError("Unexpected argument type(s)"); - } - - this.constructor = ctor; - - configureProperties(this); - makeArrayAccessors(this); - }; - - ctor.prototype = new ArrayBufferView(); - ctor.prototype.BYTES_PER_ELEMENT = bytesPerElement; - ctor.prototype._pack = pack; - ctor.prototype._unpack = unpack; - ctor.BYTES_PER_ELEMENT = bytesPerElement; - - // getter type (unsigned long index); - ctor.prototype._getter = function(index) { - if (arguments.length < 1) throw new SyntaxError("Not enough arguments"); - - index = ECMAScript.ToUint32(index); - if (index >= this.length) { - return undefined; - } - - var bytes = [], i, o; - for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT; - i < this.BYTES_PER_ELEMENT; - i += 1, o += 1) { - bytes.push(this.buffer._bytes[o]); - } - return this._unpack(bytes); - }; - - // NONSTANDARD: convenience alias for getter: type get(unsigned long index); - ctor.prototype.get = ctor.prototype._getter; - - // setter void (unsigned long index, type value); - ctor.prototype._setter = function(index, value) { - if (arguments.length < 2) throw new SyntaxError("Not enough arguments"); - - index = ECMAScript.ToUint32(index); - if (index >= this.length) { - return undefined; - } - - var bytes = this._pack(value), i, o; - for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT; - i < this.BYTES_PER_ELEMENT; - i += 1, o += 1) { - this.buffer._bytes[o] = bytes[i]; - } - }; - - // void set(TypedArray array, optional unsigned long offset); - // void set(sequence array, optional unsigned long offset); - ctor.prototype.set = function(index, value) { - if (arguments.length < 1) throw new SyntaxError("Not enough arguments"); - var array, sequence, offset, len, - i, s, d, - byteOffset, byteLength, tmp; - - if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) { - // void set(TypedArray array, optional unsigned long offset); - array = arguments[0]; - offset = ECMAScript.ToUint32(arguments[1]); - - if (offset + array.length > this.length) { - throw new RangeError("Offset plus length of array is out of range"); - } - - byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT; - byteLength = array.length * this.BYTES_PER_ELEMENT; - - if (array.buffer === this.buffer) { - tmp = []; - for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) { - tmp[i] = array.buffer._bytes[s]; - } - for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) { - this.buffer._bytes[d] = tmp[i]; - } - } else { - for (i = 0, s = array.byteOffset, d = byteOffset; - i < byteLength; i += 1, s += 1, d += 1) { - this.buffer._bytes[d] = array.buffer._bytes[s]; - } - } - } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') { - // void set(sequence array, optional unsigned long offset); - sequence = arguments[0]; - len = ECMAScript.ToUint32(sequence.length); - offset = ECMAScript.ToUint32(arguments[1]); - - if (offset + len > this.length) { - throw new RangeError("Offset plus length of array is out of range"); - } - - for (i = 0; i < len; i += 1) { - s = sequence[i]; - this._setter(offset + i, Number(s)); - } - } else { - throw new TypeError("Unexpected argument type(s)"); - } - }; - - // TypedArray subarray(long begin, optional long end); - ctor.prototype.subarray = function(start, end) { - function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } - - start = ECMAScript.ToInt32(start); - end = ECMAScript.ToInt32(end); - - if (arguments.length < 1) { start = 0; } - if (arguments.length < 2) { end = this.length; } - - if (start < 0) { start = this.length + start; } - if (end < 0) { end = this.length + end; } - - start = clamp(start, 0, this.length); - end = clamp(end, 0, this.length); - - var len = end - start; - if (len < 0) { - len = 0; - } - - return new this.constructor( - this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len); - }; - - return ctor; - } - - var Int8Array = makeConstructor(1, packI8, unpackI8); - var Uint8Array = makeConstructor(1, packU8, unpackU8); - var Uint8ClampedArray = makeConstructor(1, packU8Clamped, unpackU8); - var Int16Array = makeConstructor(2, packI16, unpackI16); - var Uint16Array = makeConstructor(2, packU16, unpackU16); - var Int32Array = makeConstructor(4, packI32, unpackI32); - var Uint32Array = makeConstructor(4, packU32, unpackU32); - var Float32Array = makeConstructor(4, packF32, unpackF32); - var Float64Array = makeConstructor(8, packF64, unpackF64); - - exports.Int8Array = exports.Int8Array || Int8Array; - exports.Uint8Array = exports.Uint8Array || Uint8Array; - exports.Uint8ClampedArray = exports.Uint8ClampedArray || Uint8ClampedArray; - exports.Int16Array = exports.Int16Array || Int16Array; - exports.Uint16Array = exports.Uint16Array || Uint16Array; - exports.Int32Array = exports.Int32Array || Int32Array; - exports.Uint32Array = exports.Uint32Array || Uint32Array; - exports.Float32Array = exports.Float32Array || Float32Array; - exports.Float64Array = exports.Float64Array || Float64Array; -}()); - -// -// 6 The DataView View Type -// - -(function() { - function r(array, index) { - return ECMAScript.IsCallable(array.get) ? array.get(index) : array[index]; - } - - var IS_BIG_ENDIAN = (function() { - var u16array = new(exports.Uint16Array)([0x1234]), - u8array = new(exports.Uint8Array)(u16array.buffer); - return r(u8array, 0) === 0x12; - }()); - - // Constructor(ArrayBuffer buffer, - // optional unsigned long byteOffset, - // optional unsigned long byteLength) - /** @constructor */ - var DataView = function DataView(buffer, byteOffset, byteLength) { - if (arguments.length === 0) { - buffer = new exports.ArrayBuffer(0); - } else if (!(buffer instanceof exports.ArrayBuffer || ECMAScript.Class(buffer) === 'ArrayBuffer')) { - throw new TypeError("TypeError"); - } - - this.buffer = buffer || new exports.ArrayBuffer(0); - - this.byteOffset = ECMAScript.ToUint32(byteOffset); - if (this.byteOffset > this.buffer.byteLength) { - throw new RangeError("byteOffset out of range"); - } - - if (arguments.length < 3) { - this.byteLength = this.buffer.byteLength - this.byteOffset; - } else { - this.byteLength = ECMAScript.ToUint32(byteLength); - } - - if ((this.byteOffset + this.byteLength) > this.buffer.byteLength) { - throw new RangeError("byteOffset and length reference an area beyond the end of the buffer"); - } - - configureProperties(this); - }; - - function makeGetter(arrayType) { - return function(byteOffset, littleEndian) { - - byteOffset = ECMAScript.ToUint32(byteOffset); - - if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) { - throw new RangeError("Array index out of range"); - } - byteOffset += this.byteOffset; - - var uint8Array = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT), - bytes = [], i; - for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) { - bytes.push(r(uint8Array, i)); - } - - if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) { - bytes.reverse(); - } - - return r(new arrayType(new exports.Uint8Array(bytes).buffer), 0); - }; - } - - DataView.prototype.getUint8 = makeGetter(exports.Uint8Array); - DataView.prototype.getInt8 = makeGetter(exports.Int8Array); - DataView.prototype.getUint16 = makeGetter(exports.Uint16Array); - DataView.prototype.getInt16 = makeGetter(exports.Int16Array); - DataView.prototype.getUint32 = makeGetter(exports.Uint32Array); - DataView.prototype.getInt32 = makeGetter(exports.Int32Array); - DataView.prototype.getFloat32 = makeGetter(exports.Float32Array); - DataView.prototype.getFloat64 = makeGetter(exports.Float64Array); - - function makeSetter(arrayType) { - return function(byteOffset, value, littleEndian) { - - byteOffset = ECMAScript.ToUint32(byteOffset); - if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength) { - throw new RangeError("Array index out of range"); - } - - // Get bytes - var typeArray = new arrayType([value]), - byteArray = new exports.Uint8Array(typeArray.buffer), - bytes = [], i, byteView; - - for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1) { - bytes.push(r(byteArray, i)); - } - - // Flip if necessary - if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN)) { - bytes.reverse(); - } - - // Write them - byteView = new exports.Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT); - byteView.set(bytes); - }; - } - - DataView.prototype.setUint8 = makeSetter(exports.Uint8Array); - DataView.prototype.setInt8 = makeSetter(exports.Int8Array); - DataView.prototype.setUint16 = makeSetter(exports.Uint16Array); - DataView.prototype.setInt16 = makeSetter(exports.Int16Array); - DataView.prototype.setUint32 = makeSetter(exports.Uint32Array); - DataView.prototype.setInt32 = makeSetter(exports.Int32Array); - DataView.prototype.setFloat32 = makeSetter(exports.Float32Array); - DataView.prototype.setFloat64 = makeSetter(exports.Float64Array); - - exports.DataView = exports.DataView || DataView; - -}()); diff --git a/node_modules/typedarray/package.json b/node_modules/typedarray/package.json deleted file mode 100644 index cd4fbfe1..00000000 --- a/node_modules/typedarray/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "_args": [ - [ - "typedarray@0.0.6", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "typedarray@0.0.6", - "_id": "typedarray@0.0.6", - "_inBundle": false, - "_integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "_location": "/typedarray", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "typedarray@0.0.6", - "name": "typedarray", - "escapedName": "typedarray", - "rawSpec": "0.0.6", - "saveSpec": null, - "fetchSpec": "0.0.6" - }, - "_requiredBy": [ - "/concat-stream" - ], - "_resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "_spec": "0.0.6", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "bugs": { - "url": "https://github.com/substack/typedarray/issues" - }, - "description": "TypedArray polyfill for old browsers", - "devDependencies": { - "tape": "~2.3.2" - }, - "homepage": "https://github.com/substack/typedarray", - "keywords": [ - "ArrayBuffer", - "DataView", - "Float32Array", - "Float64Array", - "Int8Array", - "Int16Array", - "Int32Array", - "Uint8Array", - "Uint8ClampedArray", - "Uint16Array", - "Uint32Array", - "typed", - "array", - "polyfill" - ], - "license": "MIT", - "main": "index.js", - "name": "typedarray", - "repository": { - "type": "git", - "url": "git://github.com/substack/typedarray.git" - }, - "scripts": { - "test": "tape test/*.js test/server/*.js" - }, - "testling": { - "files": "test/*.js", - "browsers": [ - "ie/6..latest", - "firefox/16..latest", - "firefox/nightly", - "chrome/22..latest", - "chrome/canary", - "opera/12..latest", - "opera/next", - "safari/5.1..latest", - "ipad/6.0..latest", - "iphone/6.0..latest", - "android-browser/4.2..latest" - ] - }, - "version": "0.0.6" -} diff --git a/node_modules/typedarray/readme.markdown b/node_modules/typedarray/readme.markdown deleted file mode 100644 index d18f6f71..00000000 --- a/node_modules/typedarray/readme.markdown +++ /dev/null @@ -1,61 +0,0 @@ -# typedarray - -TypedArray polyfill ripped from [this -module](https://raw.github.com/inexorabletash/polyfill). - -[![build status](https://secure.travis-ci.org/substack/typedarray.png)](http://travis-ci.org/substack/typedarray) - -[![testling badge](https://ci.testling.com/substack/typedarray.png)](https://ci.testling.com/substack/typedarray) - -# example - -``` js -var Uint8Array = require('typedarray').Uint8Array; -var ua = new Uint8Array(5); -ua[1] = 256 + 55; -console.log(ua[1]); -``` - -output: - -``` -55 -``` - -# methods - -``` js -var TA = require('typedarray') -``` - -The `TA` object has the following constructors: - -* TA.ArrayBuffer -* TA.DataView -* TA.Float32Array -* TA.Float64Array -* TA.Int8Array -* TA.Int16Array -* TA.Int32Array -* TA.Uint8Array -* TA.Uint8ClampedArray -* TA.Uint16Array -* TA.Uint32Array - -# install - -With [npm](https://npmjs.org) do: - -``` -npm install typedarray -``` - -To use this module in the browser, compile with -[browserify](http://browserify.org) -or download a UMD build from browserify CDN: - -http://wzrd.in/standalone/typedarray@latest - -# license - -MIT diff --git a/node_modules/typedarray/test/server/undef_globals.js b/node_modules/typedarray/test/server/undef_globals.js deleted file mode 100644 index 425950f9..00000000 --- a/node_modules/typedarray/test/server/undef_globals.js +++ /dev/null @@ -1,19 +0,0 @@ -var test = require('tape'); -var vm = require('vm'); -var fs = require('fs'); -var src = fs.readFileSync(__dirname + '/../../index.js', 'utf8'); - -test('u8a without globals', function (t) { - var c = { - module: { exports: {} }, - }; - c.exports = c.module.exports; - vm.runInNewContext(src, c); - var TA = c.module.exports; - var ua = new(TA.Uint8Array)(5); - - t.equal(ua.length, 5); - ua[1] = 256 + 55; - t.equal(ua[1], 55); - t.end(); -}); diff --git a/node_modules/typedarray/test/tarray.js b/node_modules/typedarray/test/tarray.js deleted file mode 100644 index df596a34..00000000 --- a/node_modules/typedarray/test/tarray.js +++ /dev/null @@ -1,10 +0,0 @@ -var TA = require('../'); -var test = require('tape'); - -test('tiny u8a test', function (t) { - var ua = new(TA.Uint8Array)(5); - t.equal(ua.length, 5); - ua[1] = 256 + 55; - t.equal(ua[1], 55); - t.end(); -}); diff --git a/node_modules/wrappy/LICENSE b/node_modules/wrappy/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/wrappy/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/wrappy/README.md b/node_modules/wrappy/README.md deleted file mode 100644 index 98eab252..00000000 --- a/node_modules/wrappy/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# wrappy - -Callback wrapping utility - -## USAGE - -```javascript -var wrappy = require("wrappy") - -// var wrapper = wrappy(wrapperFunction) - -// make sure a cb is called only once -// See also: http://npm.im/once for this specific use case -var once = wrappy(function (cb) { - var called = false - return function () { - if (called) return - called = true - return cb.apply(this, arguments) - } -}) - -function printBoo () { - console.log('boo') -} -// has some rando property -printBoo.iAmBooPrinter = true - -var onlyPrintOnce = once(printBoo) - -onlyPrintOnce() // prints 'boo' -onlyPrintOnce() // does nothing - -// random property is retained! -assert.equal(onlyPrintOnce.iAmBooPrinter, true) -``` diff --git a/node_modules/wrappy/package.json b/node_modules/wrappy/package.json deleted file mode 100644 index 4f8b1d99..00000000 --- a/node_modules/wrappy/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "_args": [ - [ - "wrappy@1.0.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "wrappy@1.0.2", - "_id": "wrappy@1.0.2", - "_inBundle": false, - "_integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "_location": "/wrappy", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "wrappy@1.0.2", - "name": "wrappy", - "escapedName": "wrappy", - "rawSpec": "1.0.2", - "saveSpec": null, - "fetchSpec": "1.0.2" - }, - "_requiredBy": [ - "/inflight", - "/once" - ], - "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/npm/wrappy/issues" - }, - "dependencies": {}, - "description": "Callback wrapping utility", - "devDependencies": { - "tap": "^2.3.1" - }, - "directories": { - "test": "test" - }, - "files": [ - "wrappy.js" - ], - "homepage": "https://github.com/npm/wrappy", - "license": "ISC", - "main": "wrappy.js", - "name": "wrappy", - "repository": { - "type": "git", - "url": "git+https://github.com/npm/wrappy.git" - }, - "scripts": { - "test": "tap --coverage test/*.js" - }, - "version": "1.0.2" -} diff --git a/node_modules/wrappy/wrappy.js b/node_modules/wrappy/wrappy.js deleted file mode 100644 index bb7e7d6f..00000000 --- a/node_modules/wrappy/wrappy.js +++ /dev/null @@ -1,33 +0,0 @@ -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} diff --git a/node_modules/yallist/LICENSE b/node_modules/yallist/LICENSE deleted file mode 100644 index 19129e31..00000000 --- a/node_modules/yallist/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -The ISC License - -Copyright (c) Isaac Z. Schlueter and Contributors - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/yallist/README.md b/node_modules/yallist/README.md deleted file mode 100644 index f5861018..00000000 --- a/node_modules/yallist/README.md +++ /dev/null @@ -1,204 +0,0 @@ -# yallist - -Yet Another Linked List - -There are many doubly-linked list implementations like it, but this -one is mine. - -For when an array would be too big, and a Map can't be iterated in -reverse order. - - -[![Build Status](https://travis-ci.org/isaacs/yallist.svg?branch=master)](https://travis-ci.org/isaacs/yallist) [![Coverage Status](https://coveralls.io/repos/isaacs/yallist/badge.svg?service=github)](https://coveralls.io/github/isaacs/yallist) - -## basic usage - -```javascript -var yallist = require('yallist') -var myList = yallist.create([1, 2, 3]) -myList.push('foo') -myList.unshift('bar') -// of course pop() and shift() are there, too -console.log(myList.toArray()) // ['bar', 1, 2, 3, 'foo'] -myList.forEach(function (k) { - // walk the list head to tail -}) -myList.forEachReverse(function (k, index, list) { - // walk the list tail to head -}) -var myDoubledList = myList.map(function (k) { - return k + k -}) -// now myDoubledList contains ['barbar', 2, 4, 6, 'foofoo'] -// mapReverse is also a thing -var myDoubledListReverse = myList.mapReverse(function (k) { - return k + k -}) // ['foofoo', 6, 4, 2, 'barbar'] - -var reduced = myList.reduce(function (set, entry) { - set += entry - return set -}, 'start') -console.log(reduced) // 'startfoo123bar' -``` - -## api - -The whole API is considered "public". - -Functions with the same name as an Array method work more or less the -same way. - -There's reverse versions of most things because that's the point. - -### Yallist - -Default export, the class that holds and manages a list. - -Call it with either a forEach-able (like an array) or a set of -arguments, to initialize the list. - -The Array-ish methods all act like you'd expect. No magic length, -though, so if you change that it won't automatically prune or add -empty spots. - -### Yallist.create(..) - -Alias for Yallist function. Some people like factories. - -#### yallist.head - -The first node in the list - -#### yallist.tail - -The last node in the list - -#### yallist.length - -The number of nodes in the list. (Change this at your peril. It is -not magic like Array length.) - -#### yallist.toArray() - -Convert the list to an array. - -#### yallist.forEach(fn, [thisp]) - -Call a function on each item in the list. - -#### yallist.forEachReverse(fn, [thisp]) - -Call a function on each item in the list, in reverse order. - -#### yallist.get(n) - -Get the data at position `n` in the list. If you use this a lot, -probably better off just using an Array. - -#### yallist.getReverse(n) - -Get the data at position `n`, counting from the tail. - -#### yallist.map(fn, thisp) - -Create a new Yallist with the result of calling the function on each -item. - -#### yallist.mapReverse(fn, thisp) - -Same as `map`, but in reverse. - -#### yallist.pop() - -Get the data from the list tail, and remove the tail from the list. - -#### yallist.push(item, ...) - -Insert one or more items to the tail of the list. - -#### yallist.reduce(fn, initialValue) - -Like Array.reduce. - -#### yallist.reduceReverse - -Like Array.reduce, but in reverse. - -#### yallist.reverse - -Reverse the list in place. - -#### yallist.shift() - -Get the data from the list head, and remove the head from the list. - -#### yallist.slice([from], [to]) - -Just like Array.slice, but returns a new Yallist. - -#### yallist.sliceReverse([from], [to]) - -Just like yallist.slice, but the result is returned in reverse. - -#### yallist.toArray() - -Create an array representation of the list. - -#### yallist.toArrayReverse() - -Create a reversed array representation of the list. - -#### yallist.unshift(item, ...) - -Insert one or more items to the head of the list. - -#### yallist.unshiftNode(node) - -Move a Node object to the front of the list. (That is, pull it out of -wherever it lives, and make it the new head.) - -If the node belongs to a different list, then that list will remove it -first. - -#### yallist.pushNode(node) - -Move a Node object to the end of the list. (That is, pull it out of -wherever it lives, and make it the new tail.) - -If the node belongs to a list already, then that list will remove it -first. - -#### yallist.removeNode(node) - -Remove a node from the list, preserving referential integrity of head -and tail and other nodes. - -Will throw an error if you try to have a list remove a node that -doesn't belong to it. - -### Yallist.Node - -The class that holds the data and is actually the list. - -Call with `var n = new Node(value, previousNode, nextNode)` - -Note that if you do direct operations on Nodes themselves, it's very -easy to get into weird states where the list is broken. Be careful :) - -#### node.next - -The next node in the list. - -#### node.prev - -The previous node in the list. - -#### node.value - -The data the node contains. - -#### node.list - -The list to which this node belongs. (Null if it does not belong to -any list.) diff --git a/node_modules/yallist/iterator.js b/node_modules/yallist/iterator.js deleted file mode 100644 index 4a15bf22..00000000 --- a/node_modules/yallist/iterator.js +++ /dev/null @@ -1,7 +0,0 @@ -var Yallist = require('./yallist.js') - -Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } -} diff --git a/node_modules/yallist/package.json b/node_modules/yallist/package.json deleted file mode 100644 index 4df88ad8..00000000 --- a/node_modules/yallist/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "_args": [ - [ - "yallist@2.1.2", - "/Users/joseph.whissel/Documents/GitHub/Postgen" - ] - ], - "_from": "yallist@2.1.2", - "_id": "yallist@2.1.2", - "_inBundle": false, - "_integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "_location": "/yallist", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "yallist@2.1.2", - "name": "yallist", - "escapedName": "yallist", - "rawSpec": "2.1.2", - "saveSpec": null, - "fetchSpec": "2.1.2" - }, - "_requiredBy": [ - "/lru-cache" - ], - "_resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "_spec": "2.1.2", - "_where": "/Users/joseph.whissel/Documents/GitHub/Postgen", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "bugs": { - "url": "https://github.com/isaacs/yallist/issues" - }, - "dependencies": {}, - "description": "Yet Another Linked List", - "devDependencies": { - "tap": "^10.3.0" - }, - "directories": { - "test": "test" - }, - "files": [ - "yallist.js", - "iterator.js" - ], - "homepage": "https://github.com/isaacs/yallist#readme", - "license": "ISC", - "main": "yallist.js", - "name": "yallist", - "repository": { - "type": "git", - "url": "git+https://github.com/isaacs/yallist.git" - }, - "scripts": { - "postpublish": "git push origin --all; git push origin --tags", - "postversion": "npm publish", - "preversion": "npm test", - "test": "tap test/*.js --100" - }, - "version": "2.1.2" -} diff --git a/node_modules/yallist/yallist.js b/node_modules/yallist/yallist.js deleted file mode 100644 index 518d2333..00000000 --- a/node_modules/yallist/yallist.js +++ /dev/null @@ -1,370 +0,0 @@ -module.exports = Yallist - -Yallist.Node = Node -Yallist.create = Yallist - -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() - } - - self.tail = null - self.head = null - self.length = 0 - - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) - } - } - - return self -} - -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } - - var next = node.next - var prev = node.prev - - if (next) { - next.prev = prev - } - - if (prev) { - prev.next = next - } - - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } - - node.list.length-- - node.next = null - node.prev = null - node.list = null -} - -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} - -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined - } - - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} - -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} - -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} - -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value - } -} - -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} - -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} - -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next - } - - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } - - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev - } - - return acc -} - -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next - } - return arr -} - -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev - } - return arr -} - -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} diff --git a/package-lock.json b/package-lock.json index 81535ae0..1708edc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,6 @@ "regenerator-runtime": "^0.13.2" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -62,30 +57,6 @@ } } }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "beautify": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/beautify/-/beautify-0.0.8.tgz", - "integrity": "sha1-5P91XCzVZyfeDMwebMXTygxSCI0=", - "requires": { - "cssbeautify": "^0.3.1", - "html": "^1.0.0", - "js-beautify": "^1.6.4" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "browserslist": { "version": "4.7.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.2.tgz", @@ -96,11 +67,6 @@ "node-releases": "^1.1.38" } }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, "caniuse-db": { "version": "1.0.30001005", "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001005.tgz", @@ -139,51 +105,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, "core-js": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.3.5.tgz", "integrity": "sha512-0J3K+Par/ZydhKg8pEiTcK/9d65/nqJOzY62uMkjeBmt05fDOt/khUVjDdh8TpeIuGQDy1yLDDCjiWN/8pFIuw==" }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cssbeautify": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cssbeautify/-/cssbeautify-0.3.1.tgz", - "integrity": "sha1-Et0fc0A1wub6ymfcvc73TkKBE5c=" - }, "dom-serializer": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", @@ -227,17 +153,6 @@ "domelementtype": "1" } }, - "editorconfig": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", - "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", - "requires": { - "commander": "^2.19.0", - "lru-cache": "^4.1.5", - "semver": "^5.6.0", - "sigmund": "^1.0.1" - } - }, "electron-to-chromium": { "version": "1.3.296", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz", @@ -299,24 +214,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, "handlebars": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.0.tgz", @@ -334,14 +231,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, - "html": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/html/-/html-1.0.0.tgz", - "integrity": "sha1-pUT6nqVJK/s6LMqCEKEL57WvH2E=", - "requires": { - "concat-stream": "^1.4.7" - } - }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -380,42 +269,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "js-beautify": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.2.tgz", - "integrity": "sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==", - "requires": { - "config-chain": "^1.1.12", - "editorconfig": "^0.15.3", - "glob": "^7.1.3", - "mkdirp": "~0.5.1", - "nopt": "~4.0.1" - } - }, "liquid-json": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/liquid-json/-/liquid-json-0.3.1.tgz", @@ -461,15 +319,6 @@ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=" }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "marked": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", @@ -504,27 +353,11 @@ "mime-db": "1.40.0" } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -550,28 +383,11 @@ } } }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -581,35 +397,11 @@ "wordwrap": "~0.0.2" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "parse-github-url": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.2.tgz", "integrity": "sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==" }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, "postcss": { "version": "7.0.17", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", @@ -663,34 +455,10 @@ "resolved": "https://registry.npmjs.org/postman-url-encoder/-/postman-url-encoder-1.0.2.tgz", "integrity": "sha512-PBGPIJnm9dqyUST/oX9mxTxT5seqWS4AdzAhGt4judiOh7xT4leTv2CLoGtHXUCHFuLLp9h9wDGAMN7Cm0Znyw==" }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } + "prettier": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz", + "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==" }, "regenerator-runtime": { "version": "0.13.3", @@ -724,16 +492,6 @@ "xtend": "^4.0.1" } }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -764,11 +522,6 @@ "has-flag": "^3.0.0" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "uglify-js": { "version": "3.6.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.4.tgz", @@ -802,20 +555,10 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" } } } diff --git a/package.json b/package.json index f9b5c2cf..5878fd25 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ }, "dependencies": { "auto-changelog": "^1.16.1", - "beautify": "0.0.8", "fasquest": "^1.2.3", - "postman-collection": "^3.5.1" + "postman-collection": "^3.5.1", + "prettier": "^2.0.5" } } diff --git a/swag.js b/swag.js deleted file mode 100644 index 28730665..00000000 --- a/swag.js +++ /dev/null @@ -1,3038 +0,0 @@ -'use strict'; -const qs = require('querystring'); -const url = require('url'); -const client = { - https: require('https'), - http: require('http'), -}; - -const agent = { - http: new client.http.Agent({ - keepAlive: true - }), - https: new client.https.Agent({ - keepAlive: true - }) -}; - -const REDIRECT_CODES = [301, 302, 303, 307]; - -class SimpleError extends Error { - constructor() { - super( - 'Error happened due to simple constraint not being 2xx status code.') - this.name = 'FR_Simple'; - } -} - -class RequestError extends Error { - constructor(e) { - super('Error happened reguarding a request: ' + e.message) - this.name = 'FR_Simple'; - } -} - -class Fasquest { - constructor() {} - - request(options, cb = null) { - if (!cb) { - return this.requestPromise(options); - } else { - this._request(options, (err, req, res) => { - const connection = res.info || res.connection; - reject({ - req, - res, - err - }); - }) - } - } - - requestPromise(options) { - return new Promise((resolve, reject) => { - this._request(options, (req, res, err) => { - if (err) { - reject({ - req, - res, - err - }) - } else { - resolve(options.resolveWithFullResponse ? res : res.body); - } - }); - }); - } - - _request(ops, cb, count = 0) { - var options = this._setOptions({ - ...ops - }); - if (options.body && !options.headers['Content-Length']) { - options.headers['Content-Length'] = Buffer.byteLength(JSON.stringify(options.body)); - } - var req = client[options.proto].request(options.uri, options, (res) => { - res.body = ''; - res.on('data', (chunk) => { - res.body += chunk; - }); - res.on('end', () => { - // remove as causes circular references - delete options.agent; - - if (REDIRECT_CODES.indexOf(res.statusCode) !== -1 && count < options.redirect_max) { - options.uri = url.resolve(options.uri, res.headers.location); - options.proto = options.uri.split(':')[0]; - return this._request(this._setOptions(options), cb, ++count); - } else { - if (res.headers['content-type'] && res.headers['content-type'].indexOf('json') > -1) { - try { - res.body = JSON.parse(res.body); - } catch (e) { - // do nothing - } - } - if (options.simple) { - if (res.statusCode > 299 || res.statusCode < 200) { - return cb(req, res, new SimpleError()); - } - } - - return cb(req, res, null); - } - - }); - }); - - req.on('error', (e) => { - // remove as causes circular references - delete options.agent; - - return cb(req, null, new RequestError(e)) - }); - - if (options.body) { - req.write(options.json ? JSON.stringify(options.body) : options.body); - } - - req.end(); - } - - _setOptions(options) { - options.proto = options.proto || options.uri.split(':')[0]; - - options.simple = options.simple !== false; - - if (options.qs) { - var escQS = qs.stringify(options.qs); - - if (escQS.length > 0) { - options.uri += (options.uri.indexOf('?') > -1 ? '&' : '?') + escQS; - } - } - - options.agent = options.agent || agent[options.proto]; - - if (!options.headers) { - options.headers = {}; - } - - if (options.json) { - options.headers['Content-Type'] = 'application/json'; - } else if (options.form) { - options.body = qs.stringify(options.form); - options.headers['Content-Type'] = 'application/x-www-form-urlencoded'; - options.headers['Content-Length'] = Buffer.byteLength(options.body); - } - if (options.authorization) { - if (options.authorization.basic) { - options.headers['Authorization'] = 'Basic ' + Buffer.from(options.authorization.basic.client + ':' + options.authorization.basic.secret, 'ascii').toString('base64'); - } else if (options.authorization.bearer) { - options.headers['Authorization'] = 'Bearer ' + options.authorization.bearer; - } - - delete options.authorization; - } - - - if (!options.redirect_max) { - options.redirect_max = 5; - } - - return options; - } -} -module.exports = new Fasquest(); - -const fasq = new Fasquest(); -var hostUrl = ''; - -/** - * - */ -class Travelling { - constructor() {} - static get _postgenClassUrls() { - return { - healthcheck: 'travelling/_health', - metrics: 'travelling/metrics', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * healthCheck - server's health check - * Path: travelling/_health - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async healthCheck(authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/_health`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * metrics - servers metrics - * Path: travelling/metrics - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async metrics(authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/metrics`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - static get Config() { - return Config; - } - - static get Groups() { - return Groups; - } - - static get Group() { - return Group; - } - - static get Users() { - return Users; - } - - static get User() { - return User; - } - - static get Auth() { - return Auth; - } - -} -/** - * - */ -class Config { - constructor() {} - static get _postgenClassUrls() { - return { - getproperty: 'travelling/api/v1/config/:property', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * getProperty - Gets a property from travellings config. - * Path: travelling/api/v1/config/:property - * @param {any} property (example: password) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async getProperty(property, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/config/${property}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class Groups { - constructor() {} - static get _postgenClassUrls() { - return { - export: 'travelling/api/v1/groups/export', - import: 'travelling/api/v1/groups/import', - get: 'travelling/api/v1/groups', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * export - Exports all groups in the proper format to be imported. - * Path: travelling/api/v1/groups/export - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async export (authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/groups/export`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * import - Imports all groups from the exported format. - * Path: travelling/api/v1/groups/import - * @param {Object} body - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "testgroup": { - * "group1": { - * "inherited": [ - * "group|group4" - * ] - * }, - * "superadmin": {} - * }, - * "group": { - * "anonymous": { - * "allowed": [{ - * "route": "/travelling/portal/*", - * "host": null, - * "name": "*-travelling-portal-*" - * }, - * { - * "route": "/travelling/api/v1/auth/*", - * "host": null, - * "name": "*-travelling-api-v1-auth-*" - * }, - * { - * "route": "/travelling/api/v1/user/me/route/allowed", - * "host": null, - * "method": "GET", - * "name": "get-travelling-api-v1-user-me-route-allowed" - * }, - * { - * "route": "/travelling/api/v1/user/me/permission/allowed/*", - * "host": null, - * "method": "GET", - * "name": "get-travelling-api-v1-user-me-permission-allowed-*" - * }, - * { - * "route": "/travelling/assets/*", - * "host": null, - * "remove_from_path": "/travelling/assets/", - * "method": "GET", - * "name": "get-travelling-assets-*" - * }, - * { - * "route": "/travelling/api/v1/config/password", - * "host": null, - * "method": "GET", - * "name": "get-travelling-api-v1-config-password" - * }, - * { - * "route": "/favicon.ico", - * "host": null, - * "method": "GET", - * "name": "get-favicon.ico" - * } - * ] - * }, - * "group4": {}, - * "group1": {}, - * "group3": { - * "inherited": [ - * "testgroup|group1", - * "group|group2" - * ] - * }, - * "superadmin": { - * "allowed": [{ - * "host": null, - * "route": "/travelling/*", - * "name": "*-travelling-*" - * }, - * { - * "name": "test-one-*-three" - * } - * ], - * "inherited": [ - * "group|anonymous" - * ] - * }, - * "group2": { - * "allowed": [{ - * "route": "/test/get", - * "host": "https://127.0.0.1:4268/:username/:group", - * "remove_from_path": "/test/get", - * "method": "GET", - * "name": "get-test-get" - * }, - * { - * "route": "/test/post", - * "host": "http://127.0.0.1:4267/?id=:id&permission=:permission", - * "remove_from_path": "/test/post", - * "method": "POST", - * "name": "post-test-post" - * } - * ], - * "inherited": [ - * "testgroup|group1" - * ] - * }, - * "group5": { - * "allowed": [{ - * "route": "/test/delete/:grouptype", - * "host": "https://127.0.0.1:4268", - * "remove_from_path": "/test/delete", - * "method": "DELETE", - * "name": "delete-test-delete-:grouptype" - * }], - * "inherited": [ - * "group|group4", - * "group|superadmin" - * ], - * "is_default": true - * } - * } - * } - * ``` - */ - static async import(body, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/groups/import`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Get all the groups - * Path: travelling/api/v1/groups - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/groups`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - static get Type() { - return GroupsType; - } - -} -/** - * - */ -class GroupsType { - constructor() {} - static get _postgenClassUrls() { - return { - all: 'travelling/api/v1/groups/type/:type', - gettypeslist: 'travelling/api/v1/groups/types', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * all - Gets all groups of a particular type - * Path: travelling/api/v1/groups/type/:type - * @param {any} type The type of the group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async all(type, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/groups/type/${type}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * getTypesList - Gets all the types of groups currently made. - * Path: travelling/api/v1/groups/types - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async getTypesList(authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/groups/types`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class Group { - constructor() {} - static get _postgenClassUrls() { - return { - addpermission: 'travelling/api/v1/group/id/:id/insert/permission/:permission', - deletepermission: 'travelling/api/v1/group/id/:id/permission/:permission', - addroute: 'travelling/api/v1/group/id/:id/insert/route', - removeinheritance: 'travelling/api/v1/group/id/:id/remove/inheritance/:inherited/type/:grouptype', - inheritfrom: 'travelling/api/v1/group/id/:id/inherit/from/:inherited/type/:grouptype', - setdefault: 'travelling/api/v1/group/id/:id/set/default', - delete: 'travelling/api/v1/group/id/:id', - edit: 'travelling/api/v1/group/id/:id', - get: 'travelling/api/v1/group/id/:id', - createbyname: 'travelling/api/v1/group/id/:id', - create: 'travelling/api/v1/group', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * addPermission - Adds a permission to a group. - * Path: travelling/api/v1/group/id/:id/insert/permission/:permission - * @param {any} id Name of the group (example: anonymous) - * @param {any} permission Permission (example: test-one-two-*) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addPermission(id, permission, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/insert/permission/${permission}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * deletePermission - Removes a permission/route from a group. - * Path: travelling/api/v1/group/id/:id/permission/:permission - * @param {any} id Name of the group (example: anonymous) - * @param {any} permission Name or Route (example: test-one-two-*) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async deletePermission(id, permission, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/permission/${permission}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addRoute - Adds a route to a group. - - ```javascript - { - "route": "test/permissions/*", // optional - "host": null, // optional, defaults to travelling host - "method": "*", // optional, defaults to '*' - "remove_from_path": 'test/', // optional - "name": "test-permissions-*" // Required and needs to be unqiue, defaults to method + route seperated by '-' instead of `/` - } - ``` - * Path: travelling/api/v1/group/id/:id/insert/route - * @param {Object} body - * @param {any} id - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "route": "test/permissions/*", - * "host": null, - * "method": "*", - * "name": "test-permissions-*" - * } - * ``` - */ - static async addRoute(body, id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/insert/route`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * removeInheritance - Removes an inheritance from a group. - * Path: travelling/api/v1/group/id/:id/remove/inheritance/:inherited/type/:grouptype - * @param {any} id Name of the group (example: test1234) - * @param {any} inherited Name of the group to inherit from (example: group4) - * @param {any} grouptype The type of the inherited group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async removeInheritance(id, inherited, grouptype, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/remove/inheritance/${inherited}/type/${grouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * inheritFrom - Adds an inheritance to a group. - * Path: travelling/api/v1/group/id/:id/inherit/from/:inherited/type/:grouptype - * @param {any} id Name of the group (example: test1234) - * @param {any} inherited Name of the group to inherit from (example: group4) - * @param {any} grouptype The type of the inherited group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async inheritFrom(id, inherited, grouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/inherit/from/${inherited}/type/${grouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * setDefault - Sets the group to be the default group for new users. - * Path: travelling/api/v1/group/id/:id/set/default - * @param {any} id id or name (example: group6) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async setDefault(id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/set/default`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * delete - delete group by its id or name - * Path: travelling/api/v1/group/id/:id - * @param {any} id id or name - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async delete(id, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Edits a group - * Path: travelling/api/v1/group/id/:id - * @param {Object} body - * @param {any} id (example: ab31efc8-40a5-4d38-a347-adb4e38d0075) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "allowed": [{ - * "route": "/travelling/portal/*", - * "host": null, - * "remove_from_path": "/travelling/portal", - * "method": "*", - * "name": "*-travelling-portal-*" - * }, - * { - * "route": "/travelling/api/v1/auth/*", - * "host": null, - * "method": "*", - * "name": "*-travelling-api-v1-auth-*" - * }, - * { - * "route": "/travelling/api/v1/user/me/route/allowed", - * "host": null, - * "method": "GET", - * "name": "get-travelling-api-v1-user-me-route-allowed" - * }, - * { - * "route": "/travelling/api/v1/user/me/permission/allowed/*", - * "host": null, - * "method": "GET", - * "name": "get-travelling-api-v1-user-me-permission-allowed-*" - * }, - * { - * "route": "/travelling/assets/*", - * "host": null, - * "remove_from_path": "/travelling/assets/", - * "method": "*", - * "name": "*-travelling-assets-*" - * }, - * { - * "route": "travelling/api/v1/config/password", - * "host": null, - * "method": "get" - * } - * ] - * } - * ``` - */ - static async edit(body, id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Get a group by it's id or name. - * Path: travelling/api/v1/group/id/:id - * @param {any} id id or name (example: group1) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(id, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * createByName - Add a new blank group with the set name. - * Path: travelling/api/v1/group/id/:id - * @param {any} id Name of the new group (example: test123) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async createByName(id, authorization_bearer, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * create - Add a new group - * Path: travelling/api/v1/group - * @param {Object} body - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "name": "group1", - * "type": "accounts", - * "allowed": [{ - * "route": "/test", - * "host": "http://127.0.0.1:1237/", - * "remove_from_path": "test", - * "method": "*", - * "name": "all-test" - * }], - * "is_default": false - * } - * ``` - */ - static async create(body, authorization_bearer, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - static get Users() { - return GroupUsers; - } - - static get User() { - return GroupUser; - } - - static get Type() { - return GroupType; - } - - static get Request() { - return GroupRequest; - } - -} -/** - * - */ -class GroupUsers { - constructor() {} - static get _postgenClassUrls() { - return { - inherited: 'travelling/api/v1/group/id/:id/users/inherited', - get: 'travelling/api/v1/group/id/:id/users', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * inherited - Gets all the users that belong to the group and all of its inherited groups. - - ##### Optional Query Params - - | Param | Description | - | --- | --- | - | id | *optional* (example: 26c6aeff-ab95-4bdd-8260-534cf92d1c23) | - | username | *optional* (example: user7) | - | locked | *optional* (example: true) | - | locked_reason | *optional* (example: Activation Required email your admin to get your account activated) | - | group_request | *optional* (example: superadmin) | - | failed_login_attempts | *optional* (example: 0) | - | change_username | *optional* (example: false) | - | change_password | *optional* (example: false) | - | reset_password | *optional* (example: false) | - | email_verify | *optional* (example: false) | - | group_id | *optional* (example: 7320292c-627e-4e5a-b059-583eabdd6264) | - | email | *optional* (example: test@test.ai) | - | created_on | *optional* (example: 1568419646794) | - | last_login | *optional* (example: null) | - * Path: travelling/api/v1/group/id/:id/users/inherited - * @param {any} id id or name (example: superadmin) - */ - static async inherited(id, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/users/inherited`, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Gets all the users that belong to the group. - - ##### Optional Query Params - - | Param | Description | - | --- | --- | - | id | *optional* (example: 26c6aeff-ab95-4bdd-8260-534cf92d1c23) | - | username | *optional* (example: user7) | - | locked | *optional* (example: true) | - | locked_reason | *optional* (example: Activation Required email your admin to get your account activated) | - | group_request | *optional* (example: superadmin) | - | failed_login_attempts | *optional* (example: 0) | - | change_username | *optional* (example: false) | - | change_password | *optional* (example: false) | - | reset_password | *optional* (example: false) | - | email_verify | *optional* (example: false) | - | group_id | *optional* (example: 7320292c-627e-4e5a-b059-583eabdd6264) | - | email | *optional* (example: test@test.ai) | - | created_on | *optional* (example: 1568419646794) | - | last_login | *optional* (example: null) | - * Path: travelling/api/v1/group/id/:id/users - * @param {any} id id or name (example: superadmin) - */ - static async get(id, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/users`, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class GroupUser { - constructor() {} - static get _postgenClassUrls() { - return { - delete: 'travelling/api/v1/group/id/:group/type/:type/user/:id', - removegroupinheritance: 'travelling/api/v1/group/id/:group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - addgroupinheritance: 'travelling/api/v1/group/id/:group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - editpropertyvalue: 'travelling/api/v1/group/id/:group/type/:type/user/:id/property/:property/:value', - editproperty: 'travelling/api/v1/group/id/:group/type/:type/user/:id/property/:property', - edit: 'travelling/api/v1/group/id/:group/type/:type/user/:id', - getproperty: 'travelling/api/v1/group/id/:group/type/:type/user/:id/property/:property', - get: 'travelling/api/v1/group/id/:group/type/:type/user/:id', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * delete - Delete a user by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id - * @param {any} group id or name of the group - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user7) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async delete(group, type, id, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * removeGroupInheritance - Remove a user to a group of a particular type of group. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} group id or name of the group (example: group1) - * @param {any} type type of group (example: group) - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async removeGroupInheritance(group, type, id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addGroupInheritance - Add a group for the current user from a group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} group id or name of the group (example: group1) - * @param {any} type type of group (example: group) - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addGroupInheritance(group, type, id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editPropertyValue - Edit a current user's property data as a path param from a group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id/property/:property/:value - * @param {any} group id or name of the group - * @param {any} type The type of the group (example: group) - * @param {any} id id or name (example: user5) - * @param {any} property (example: email) - * @param {any} value (example: swag@yolo.com) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async editPropertyValue(group, type, id, property, value, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}/property/${property}/${value}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editProperty - Edit a user's property by it's id or username from a group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id/property/:property - * @param {Object} body - * @param {any} group id or name of the group - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {any} property (example: email) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async editProperty(body, group, type, id, property, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}/property/${property}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Edit a user by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id - * @param {Object} body - * @param {any} group id or name of the group - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async edit(body, group, type, id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * getProperty - Get a user's property by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id/property/:property - * @param {any} group id or name of the group - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {any} property (example: email) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async getProperty(group, type, id, property, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}/property/${property}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Get a user by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/id/:group/type/:type/user/:id - * @param {any} group id or name of the group - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(group, type, id, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${group}/type/${type}/user/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class GroupType { - constructor() {} - static get _postgenClassUrls() { - return { - deletepermission: 'travelling/api/v1/group/id/:id/type/:type/permission/:permission', - addpermission: 'travelling/api/v1/group/id/:id/type/:type/insert/permission/:permission', - addroute: 'travelling/api/v1/group/id/:id/type/:type/insert/route', - removeinheritance: 'travelling/api/v1/group/id/:id/type/:type/remove/inheritance/:inherited/type/:grouptype', - inheritfrom: 'travelling/api/v1/group/id/:id/type/:type/inherit/from/:inherited/type/:grouptype', - setdefault: 'travelling/api/v1/group/id/:id/type/:type/set/default', - delete: 'travelling/api/v1/group/id/:id/type/:type', - get: 'travelling/api/v1/group/id/:id/type/:type', - edit: 'travelling/api/v1/group/id/:id/type/:type', - createbyname: 'travelling/api/v1/group/id/:id/type/:type', - create: 'travelling/api/v1/group/type/:type', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * deletePermission - Removes a permission/route from a group of a particular type. - * Path: travelling/api/v1/group/id/:id/type/:type/permission/:permission - * @param {any} id Name of the group (example: anonymous) - * @param {any} type Type of the group (example: group) - * @param {any} permission Name or Route (example: test-one-three-*) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async deletePermission(id, type, permission, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/permission/${permission}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addPermission - Adds a permission to a group of a particular type. - * Path: travelling/api/v1/group/id/:id/type/:type/insert/permission/:permission - * @param {any} id Name of the group (example: anonymous) - * @param {any} type Type of the group (example: group) - * @param {any} permission Permission (example: test-one-three-*) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addPermission(id, type, permission, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/insert/permission/${permission}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addRoute - Adds a route to a group of a particular type. - - ```javascript - { - "route": "test/permissions/*", // optional - "host": null, // optional, defaults to travelling host - "method": "*", // optional, defaults to '*' - "remove_from_path": 'test/', // optional - "name": "test-permissions-*" // Required and needs to be unqiue, defaults to method + route seperated by '-' instead of `/` - } - ``` - * Path: travelling/api/v1/group/id/:id/type/:type/insert/route - * @param {Object} body - * @param {any} id Name of the group - * @param {any} type - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "route": "test/permissions/*", - * "host": null, - * "method": "*", - * "name": "test-permissions-*" - * } - * ``` - */ - static async addRoute(body, id, type, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/insert/route`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * removeInheritance - Removes an inheritance from a group of a particular type. - * Path: travelling/api/v1/group/id/:id/type/:type/remove/inheritance/:inherited/type/:grouptype - * @param {any} id Name of the group (example: test1234) - * @param {any} type The type of the group (example: accounts) - * @param {any} inherited Name of the group to inherit from (example: superadmin) - * @param {any} grouptype The type of the inherited group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async removeInheritance(id, type, inherited, grouptype, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/remove/inheritance/${inherited}/type/${grouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * inheritFrom - Adds an inheritance to a group of a particular type. - * Path: travelling/api/v1/group/id/:id/type/:type/inherit/from/:inherited/type/:grouptype - * @param {any} id Name of the group (example: group1) - * @param {any} type The type of the group (example: testgroup) - * @param {any} inherited Name of the group to inherit from (example: test123) - * @param {any} grouptype The type of the inherited group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async inheritFrom(id, type, inherited, grouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/inherit/from/${inherited}/type/${grouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * setDefault - Sets the group of a particular type to be the default group for new users. - * Path: travelling/api/v1/group/id/:id/type/:type/set/default - * @param {any} id id or name (example: group1) - * @param {any} type The type of the group (example: account) - */ - static async setDefault(id, type, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/set/default`, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * delete - delete group of a particular type by its name or id - * Path: travelling/api/v1/group/id/:id/type/:type - * @param {any} id id or name - * @param {any} type The type of the group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async delete(id, type, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Get a group by it's id or name of a particular type. - * Path: travelling/api/v1/group/id/:id/type/:type - * @param {any} id id or name (example: group1) - * @param {any} type The type of the group (example: accounts) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(id, type, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Edits a group of a particular type - * Path: travelling/api/v1/group/id/:id/type/:type - * @param {Object} body - * @param {any} id id or name - * @param {any} type The type of the group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "inherited": ["a717b880-b17b-4995-9610-cf451a06d015", "7ec8c351-7b8a-4ea8-95cc-0d990b225768"] - * } - * ``` - */ - static async edit(body, id, type, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * createByName - Add a new blank group with the set name and type - * Path: travelling/api/v1/group/id/:id/type/:type - * @param {any} id Name of the new group (example: test1234) - * @param {any} type Type of the new group (example: accounts) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async createByName(id, type, authorization_bearer, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * create - Add a new group of a particular type - * Path: travelling/api/v1/group/type/:type - * @param {Object} body - * @param {any} type The type of the group - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "name": "group1", - * "type": "accounts", - * "allowed": [{ - * "route": "/test", - * "host": "http://127.0.0.1:1237/", - * "remove_from_path": "test", - * "method": "*", - * "name": "all-test" - * }], - * "is_default": false - * } - * ``` - */ - static async create(body, type, authorization_bearer, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - static get Users() { - return GroupTypeUsers; - } - - static get User() { - return GroupTypeUser; - } - -} -/** - * Both requests are disabled. Dont use. - */ -class GroupTypeUsers { - constructor() {} - static get _postgenClassUrls() { - return { - get: 'travelling/api/v1/group/id/:id/type/:type/users', - inherited: 'travelling/api/v1/group/id/:id/type/:type/users/inherited', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * get - Gets all the users that belong to the group of a particular type by its name or id. - - ##### Optional Query Params - - | Param | Description | - | --- | --- | - | id | *optional* (example: 26c6aeff-ab95-4bdd-8260-534cf92d1c23) | - | username | *optional* (example: user7) | - | locked | *optional* (example: true) | - | locked_reason | *optional* (example: Activation Required email your admin to get your account activated) | - | group_request | *optional* (example: superadmin) | - | failed_login_attempts | *optional* (example: 0) | - | change_username | *optional* (example: false) | - | change_password | *optional* (example: false) | - | reset_password | *optional* (example: false) | - | email_verify | *optional* (example: false) | - | group_id | *optional* (example: 7320292c-627e-4e5a-b059-583eabdd6264) | - | email | *optional* (example: test@test.ai) | - | created_on | *optional* (example: 1568419646794) | - | last_login | *optional* (example: null) | - * Path: travelling/api/v1/group/id/:id/type/:type/users - * @param {any} id - * @param {any} type - */ - static async get(id, type, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/users`, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * inherited - Gets all the users that belong to the group of a particular type by its name or id and all of its inherited groups. - - ##### Optional Query Params - - | Param | Description | - | --- | --- | - | id | *optional* (example: 26c6aeff-ab95-4bdd-8260-534cf92d1c23) | - | username | *optional* (example: user7) | - | locked | *optional* (example: true) | - | locked_reason | *optional* (example: Activation Required email your admin to get your account activated) | - | group_request | *optional* (example: superadmin) | - | failed_login_attempts | *optional* (example: 0) | - | change_username | *optional* (example: false) | - | change_password | *optional* (example: false) | - | reset_password | *optional* (example: false) | - | email_verify | *optional* (example: false) | - | group_id | *optional* (example: 7320292c-627e-4e5a-b059-583eabdd6264) | - | email | *optional* (example: test@test.ai) | - | created_on | *optional* (example: 1568419646794) | - | last_login | *optional* (example: null) | - * Path: travelling/api/v1/group/id/:id/type/:type/users/inherited - * @param {any} id (example: group4) - * @param {any} type The type of the group (example: groups) - */ - static async inherited(id, type, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/id/${id}/type/${type}/users/inherited`, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class GroupTypeUser { - constructor() {} - static get _postgenClassUrls() { - return { - delete: 'travelling/api/v1/group/type/:type/user/:id', - removegroupinheritance: 'travelling/api/v1/group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - addgroupinheritance: 'travelling/api/v1/group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - editpropertyvalue: 'travelling/api/v1/group/type/:type/user/:id/property/:property/:value', - editproperty: 'travelling/api/v1/group/type/:type/user/:id/property/:property', - edit: 'travelling/api/v1/group/type/:type/user/:id', - getproperty: 'travelling/api/v1/group/type/:type/user/:id/property/:property', - get: 'travelling/api/v1/group/type/:type/user/:id', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * delete - Delete a user by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/type/:type/user/:id - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user7) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async delete(type, id, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * removeGroupInheritance - Remove a user to a group of a particular type of group. - * Path: travelling/api/v1/group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} type type of group (example: group) - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async removeGroupInheritance(type, id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addGroupInheritance - Add a user to a group of a particular type of group. - * Path: travelling/api/v1/group/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} type type of group (example: group) - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addGroupInheritance(type, id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editPropertyValue - Edit a current user's property data as a path param from a group of a particular type. - * Path: travelling/api/v1/group/type/:type/user/:id/property/:property/:value - * @param {any} type The type of the group (example: group) - * @param {any} id id or name (example: user5) - * @param {any} property (example: email) - * @param {any} value (example: swag@yolo.com) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async editPropertyValue(type, id, property, value, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}/property/${property}/${value}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editProperty - Edit a user's property by it's id or username from a group of a particular type. - * Path: travelling/api/v1/group/type/:type/user/:id/property/:property - * @param {Object} body - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {any} property (example: email) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async editProperty(body, type, id, property, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}/property/${property}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Edit a user by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/type/:type/user/:id - * @param {Object} body - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async edit(body, type, id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * getProperty - Get a user's property by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/type/:type/user/:id/property/:property - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {any} property (example: email) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async getProperty(type, id, property, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}/property/${property}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Get a user by it's id or username from group of a particular type. - * Path: travelling/api/v1/group/type/:type/user/:id - * @param {any} type The type of the group (example: accounts) - * @param {any} id id or name (example: user6) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(type, id, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/type/${type}/user/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class GroupRequest { - constructor() {} - static get _postgenClassUrls() { - return {}; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - static get User() { - return GroupRequestUser; - } - -} -/** - * - */ -class GroupRequestUser { - constructor() {} - static get _postgenClassUrls() { - return { - delete: 'travelling/api/v1/group/request/type/:type/user/:id', - addgroupinheritance: 'travelling/api/v1/group/request/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - editproperty: 'travelling/api/v1/group/request/type/:type/user/:id/property/:property', - edit: 'travelling/api/v1/group/request/type/:type/user/:id', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * delete - Delete a user by it's id or username from the user's `group_request` of a particular type. - * Path: travelling/api/v1/group/request/type/:type/user/:id - * @param {Object} body - * @param {any} type (example: testgroup) - * @param {any} id (example: user69) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async delete(body, type, id, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/request/type/${type}/user/${id}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addGroupInheritance - Add a user to a group from the user's `group_request` of a particular type. - * Path: travelling/api/v1/group/request/type/:type/user/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} type type of group (example: group) - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addGroupInheritance(type, id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/request/type/${type}/user/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editProperty - Edit a user's property by it's id or username from the user's `group_request` of a particular type. - * Path: travelling/api/v1/group/request/type/:type/user/:id/property/:property - * @param {Object} body - * @param {any} type (example: accounts) - * @param {any} id (example: user6) - * @param {any} property (example: email) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async editProperty(body, type, id, property, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/request/type/${type}/user/${id}/property/${property}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Edit a user by it's id or username from the user's `group_request` of a particular type. - * Path: travelling/api/v1/group/request/type/:type/user/:id - * @param {Object} body - * @param {any} type (example: accounts) - * @param {any} id (example: user6) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "locked": false - * } - * ``` - */ - static async edit(body, type, id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/group/request/type/${type}/user/${id}`, - body, - authorization: { - bearer: authorization_bearer - }, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class Users { - constructor() {} - static get _postgenClassUrls() { - return { - bygrouprequest: 'travelling/api/v1/users/group/request/:group_request', - get: 'travelling/api/v1/users', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * byGroupRequest - Gets all the users that have the specified group request - - ##### Optional Query Params - - | Param | Description | - | --- | --- | - | id | *optional* (example: 26c6aeff-ab95-4bdd-8260-534cf92d1c23) | - | username | *optional* (example: user7) | - | locked | *optional* (example: true) | - | locked_reason | *optional* (example: Activation Required email your admin to get your account activated) | - | group_request | *optional* (example: superadmin) | - | failed_login_attempts | *optional* (example: 0) | - | change_username | *optional* (example: false) | - | change_password | *optional* (example: false) | - | reset_password | *optional* (example: false) | - | email_verify | *optional* (example: false) | - | group_id | *optional* (example: 7320292c-627e-4e5a-b059-583eabdd6264) | - | email | *optional* (example: test@test.ai) | - | created_on | *optional* (example: 1568419646794) | - | last_login | *optional* (example: null) | - * Path: travelling/api/v1/users/group/request/:group_request - * @param {any} group_request name of the group (example: superadmin) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async byGroupRequest(group_request, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/users/group/request/${group_request}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Gets all the users - - ##### Optional Query Params - - | Param | Description | - | --- | --- | - | id | *optional* (example: 26c6aeff-ab95-4bdd-8260-534cf92d1c23) | - | username | *optional* (example: user7) | - | locked | *optional* (example: true) | - | locked_reason | *optional* (example: Activation Required email your admin to get your account activated) | - | group_request | *optional* (example: superadmin) | - | failed_login_attempts | *optional* (example: 0) | - | change_username | *optional* (example: false) | - | change_password | *optional* (example: false) | - | reset_password | *optional* (example: false) | - | email_verify | *optional* (example: false) | - | group_id | *optional* (example: 7320292c-627e-4e5a-b059-583eabdd6264) | - | email | *optional* (example: test@test.ai) | - | created_on | *optional* (example: 1568419646794) | - | last_login | *optional* (example: null) | - * Path: travelling/api/v1/users - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/users`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * - */ -class User { - constructor() {} - static get _postgenClassUrls() { - return { - delete: 'travelling/api/v1/user/id/:id', - removegroupinheritance: 'travelling/api/v1/user/id/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - addgroupinheritance: 'travelling/api/v1/user/id/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - editpropertyvalue: 'travelling/api/v1/user/id/:id/property/:property/:value', - editproperty: 'travelling/api/v1/user/id/:id/property/:property', - edit: 'travelling/api/v1/user/id/:id', - getproperty: 'travelling/api/v1/user/id/:id/property/:property', - get: 'travelling/api/v1/user/id/:id', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * delete - Delete a user by it's Id. - * Path: travelling/api/v1/user/id/:id - * @param {any} id Id or Username (example: 39A2BC37-61AE-434C-B245-A731A27CF8DA) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async delete(id, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * removeGroupInheritance - Remove a user from a group. - * Path: travelling/api/v1/user/id/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async removeGroupInheritance(id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addGroupInheritance - Add a user to a group. - * Path: travelling/api/v1/user/id/:id/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} id id or name of the user (example: user5) - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addGroupInheritance(id, inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editPropertyValue - Edit a current user's property data as a path param. - * Path: travelling/api/v1/user/id/:id/property/:property/:value - * @param {any} id Id or Username - * @param {any} property (example: group_id) - * @param {any} value (example: 595d3f9a-5383-4da9-a465-b975d8a5e28e) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async editPropertyValue(id, property, value, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}/property/${property}/${value}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editProperty - Edit a user's property by id. - * Path: travelling/api/v1/user/id/:id/property/:property - * @param {Object} body - * @param {any} id Id or Username (example: 39A2BC37-61AE-434C-B245-A731A27CF8DA) - * @param {any} property - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * user6 - * ``` - */ - static async editProperty(body, id, property, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}/property/${property}`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Edit a user's by id. - * Path: travelling/api/v1/user/id/:id - * @param {Object} body - * @param {any} id Id or Username (example: 39A2BC37-61AE-434C-B245-A731A27CF8DA) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "username": "user6", - * "password": "Awickednewawesomepasword4242!@" - * } - * ``` - */ - static async edit(body, id, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * getProperty - Get a user's property by it's id. - * Path: travelling/api/v1/user/id/:id/property/:property - * @param {any} id Id or Username (example: 39A2BC37-61AE-434C-B245-A731A27CF8DA) - * @param {any} property - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async getProperty(id, property, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}/property/${property}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Get a user by it's id. - * Path: travelling/api/v1/user/id/:id - * @param {any} id (example: 39A2BC37-61AE-434C-B245-A731A27CF8DA) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(id, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/id/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - static get Current() { - return UserCurrent; - } - -} -/** - * - */ -class UserCurrent { - constructor() {} - static get _postgenClassUrls() { - return { - removegroupinheritance: 'travelling/api/v1/user/me/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - addgroupinheritance: 'travelling/api/v1/user/me/inheritance/group/:inheritgroupid/type/:inheritgrouptype', - editpropertyvalue: 'travelling/api/v1/user/me/property/:property/:value', - editproperty: 'travelling/api/v1/user/me/property/:property', - deletetoken: 'travelling/api/v1/user/me/token/:id', - registertoken: 'travelling/api/v1/user/me/token', - edit: 'travelling/api/v1/user/me', - getproperty: 'travelling/api/v1/user/me/property/:property', - routecheck: 'travelling/api/v1/user/me/route/allowed', - permissioncheck: 'travelling/api/v1/user/me/permission/allowed/:permission', - get: 'travelling/api/v1/user/me', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * removeGroupInheritance - Remove a user from a group. - * Path: travelling/api/v1/user/me/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async removeGroupInheritance(inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * addGroupInheritance - Add a user to a group. - * Path: travelling/api/v1/user/me/inheritance/group/:inheritgroupid/type/:inheritgrouptype - * @param {any} inheritgroupid id or name of the group to inherit (example: group2) - * @param {any} inheritgrouptype type of the group to inherit (example: group) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async addGroupInheritance(inheritgroupid, inheritgrouptype, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/inheritance/group/${inheritgroupid}/type/${inheritgrouptype}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editPropertyValue - Edit a current user's property data as a path param. - * Path: travelling/api/v1/user/me/property/:property/:value - * @param {any} property (example: group_id) - * @param {any} value (example: 595d3f9a-5383-4da9-a465-b975d8a5e28e) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async editPropertyValue(property, value, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/property/${property}/${value}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * editProperty - Edit a current user's property data. - * Path: travelling/api/v1/user/me/property/:property - * @param {Object} body - * @param {any} property (example: user_data) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "test": 123 - * } - * ``` - */ - static async editProperty(body, property, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/property/${property}`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * deleteToken - Deletes a client_credentials based access token auth. - * Path: travelling/api/v1/user/me/token/:id - * @param {any} id id or name of the token - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async deleteToken(id, authorization_bearer, opts) { - var options = { - method: 'DELETE', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/token/${id}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * registerToken - Registers a new credentials service for client_credentials based access token auth. - * Path: travelling/api/v1/user/me/token - * @param {Object} body - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "name": "conversate" - * } - * ``` - */ - static async registerToken(body, authorization_bearer, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/token`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * edit - Updates the current logged in user. - * Path: travelling/api/v1/user/me - * @param {Object} body - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - * @example - * body - * ```js - * { - * "username": "user6", - * "password": "Awickednewawesomepasword4242!@" - * } - * ``` - */ - static async edit(body, authorization_bearer, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me`, - body, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * getProperty - Gets the currently logged in user's single property - * Path: travelling/api/v1/user/me/property/:property - * @param {any} property (example: username) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async getProperty(property, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/property/${property}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * routeCheck - Checks if current logged in user can access the route with method. - * Path: travelling/api/v1/user/me/route/allowed - * @param {any} method (example: get) - * @param {any} route (example: /travelling/api/v1/group/request/type/anonymous/user/) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async routeCheck(method, route, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/route/allowed`, - qs: { - method, - route - }, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * permissionCheck - Checks to see if the current user can access content based on permission. - * Path: travelling/api/v1/user/me/permission/allowed/:permission - * @param {any} permission name of the route/permission (example: get-travelling) - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async permissionCheck(permission, authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me/permission/allowed/${permission}`, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * get - Gets the currently logged in user - * Path: travelling/api/v1/user/me - * @param {string} authorization_bearer The client_credentials generated OAUth2 access token. - */ - static async get(authorization_bearer, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/user/me`, - json: true, - authorization: { - bearer: authorization_bearer - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -/** - * #### Auth endpoints - * - */ -class Auth { - constructor() {} - static get _postgenClassUrls() { - return { - accesstoken: 'travelling/api/v1/auth/token', - activate: 'travelling/api/v1/auth/activate', - resetpassword: 'travelling/api/v1/auth/password/reset', - forgotpassword: 'travelling/api/v1/auth/password/forgot', - logout: 'travelling/api/v1/auth/logout', - login: 'travelling/api/v1/auth/login', - register: 'travelling/api/v1/auth/register', - }; - } - static getFunctionsPath(name) { - return this._postgenClassUrls[name.toLowerCase()]; - } - - - - /** - * accessToken - Oauth2 `client_credentials` access token flow. Body must be `application/x-www-form-urlencoded` and must contain the `grant_type`. `client_id` & `client_secret` will be sent in a `Basic` Authorization header as `base64(client_id:client_secret)` - * Path: travelling/api/v1/auth/token - */ - static async accessToken(grant_type, code, client_id, client_secret, redirect_uri, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/token`, - form: { - grant_type, - code, - client_id, - client_secret, - redirect_uri - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * activate - Activates and unlocks user - * Path: travelling/api/v1/auth/activate - * @param {any} token (example: activation_token) - */ - static async activate(token, opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/activate`, - qs: { - token - }, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * resetPassword - Resets the password if the recovery token is vaild of the user. - * Path: travelling/api/v1/auth/password/reset - * @param {Object} body - * @param {any} token (example: [thegeneratedtoken]) - * @example - * body - * ```js - * { - * "password": "asdf" - * } - * ``` - */ - static async resetPassword(body, token, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/password/reset`, - qs: { - token - }, - body, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * forgotPassword - Generates a recovery token and sends a email to the attached user (if they exist) - * Path: travelling/api/v1/auth/password/forgot - * @param {Object} body - * @example - * body - * ```js - * { - * "email": "joseph@abe.ai" - * } - * ``` - */ - static async forgotPassword(body, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/password/forgot`, - body, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * logout - - * Path: travelling/api/v1/auth/logout - */ - static async logout(opts) { - var options = { - method: 'GET', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/logout`, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * login - Register a user - * Path: travelling/api/v1/auth/login - * @param {Object} body - * @example - * body - * ```js - * { - * "username": "user5", - * "password": "swagmoney69xd420" - * } - * ``` - */ - static async login(body, opts) { - var options = { - method: 'PUT', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/login`, - body, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - - - /** - * register - Register a user - - `group_request` is optional. - * Path: travelling/api/v1/auth/register - * @param {Object} body - * @example - * body - * ```js - * { - * "username": "user5", - * "password": "swagmoney69xd420", - * "email": "test@test.com" - * } - * ``` - */ - static async register(body, opts) { - var options = { - method: 'POST', - resolveWithFullResponse: true, - simple: false, - uri: hostUrl + "/" + `travelling/api/v1/auth/register`, - body, - json: true, - }; - if (opts) { - options = Object.assign(options, opts); - } - return await fasq.request(options) - } - -} -module.exports = function(host) { - if (host) { - hostUrl = host; - } - return { - Travelling, - Config, - Groups, - GroupsType, - Group, - GroupUsers, - GroupUser, - GroupType, - GroupTypeUsers, - GroupTypeUser, - GroupRequest, - GroupRequestUser, - Users, - User, - UserCurrent, - Auth - }; -}

    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