From af8face42e47a1c13f0759312f27f0bb46d2ca59 Mon Sep 17 00:00:00 2001 From: Vadim Namniak Date: Tue, 5 May 2015 23:57:06 -0400 Subject: [PATCH] got rid of node modules in repo --- .../grunt-contrib-jshint/.jshintignore | 1 - node_modules/grunt-contrib-jshint/.jshintrc | 13 - node_modules/grunt-contrib-jshint/.npmignore | 3 - node_modules/grunt-contrib-jshint/.travis.yml | 6 - node_modules/grunt-contrib-jshint/AUTHORS | 2 - node_modules/grunt-contrib-jshint/CHANGELOG | 93 - .../grunt-contrib-jshint/CONTRIBUTING.md | 1 - .../grunt-contrib-jshint/Gruntfile.js | 63 - node_modules/grunt-contrib-jshint/LICENSE-MIT | 22 - node_modules/grunt-contrib-jshint/README.md | 232 - .../docs/jshint-examples.md | 103 - .../docs/jshint-options.md | 66 - .../docs/jshint-overview.md | 3 - .../node_modules/.bin/jshint | 1 - .../node_modules/jshint/README.md | 40 - .../node_modules/jshint/bin/apply | 6 - .../node_modules/jshint/bin/build | 32 - .../node_modules/jshint/bin/changelog | 36 - .../node_modules/jshint/bin/jshint | 3 - .../node_modules/jshint/bin/land | 37 - .../jshint/node_modules/.bin/shjs | 1 - .../jshint/node_modules/cli/README.md | 196 - .../jshint/node_modules/cli/cli.js | 1133 -- .../jshint/node_modules/cli/examples/cat.js | 17 - .../node_modules/cli/examples/command.js | 16 - .../jshint/node_modules/cli/examples/echo.js | 54 - .../jshint/node_modules/cli/examples/glob.js | 6 - .../node_modules/cli/examples/long_desc.js | 20 - .../node_modules/cli/examples/progress.js | 11 - .../jshint/node_modules/cli/examples/sort.js | 18 - .../node_modules/cli/examples/spinner.js | 9 - .../node_modules/cli/examples/static.coffee | 27 - .../node_modules/cli/examples/static.js | 25 - .../jshint/node_modules/cli/index.js | 1 - .../cli/node_modules/glob/.npmignore | 2 - .../cli/node_modules/glob/.travis.yml | 4 - .../cli/node_modules/glob/LICENSE | 27 - .../cli/node_modules/glob/README.md | 250 - .../cli/node_modules/glob/examples/g.js | 9 - .../node_modules/glob/examples/usr-local.js | 9 - .../cli/node_modules/glob/glob.js | 738 -- .../glob/node_modules/inherits/LICENSE | 16 - .../glob/node_modules/inherits/README.md | 42 - .../glob/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../glob/node_modules/inherits/package.json | 33 - .../glob/node_modules/inherits/test.js | 25 - .../glob/node_modules/once/LICENSE | 27 - .../glob/node_modules/once/README.md | 51 - .../glob/node_modules/once/once.js | 20 - .../glob/node_modules/once/package.json | 42 - .../glob/node_modules/once/test/once.js | 20 - .../cli/node_modules/glob/package.json | 43 - .../cli/node_modules/glob/test/00-setup.js | 176 - .../node_modules/glob/test/bash-comparison.js | 63 - .../node_modules/glob/test/bash-results.json | 354 - .../cli/node_modules/glob/test/cwd-test.js | 55 - .../cli/node_modules/glob/test/empty-set.js | 20 - .../node_modules/glob/test/error-callback.js | 20 - .../node_modules/glob/test/globstar-match.js | 19 - .../cli/node_modules/glob/test/mark.js | 118 - .../glob/test/new-glob-optional-options.js | 10 - .../node_modules/glob/test/nocase-nomagic.js | 124 - .../node_modules/glob/test/pause-resume.js | 73 - .../node_modules/glob/test/readme-issue.js | 36 - .../node_modules/glob/test/root-nomount.js | 39 - .../cli/node_modules/glob/test/root.js | 46 - .../cli/node_modules/glob/test/stat.js | 32 - .../cli/node_modules/glob/test/zz-cleanup.js | 11 - .../jshint/node_modules/cli/package.json | 53 - .../console-browserify/.npmignore | 14 - .../console-browserify/.testem.json | 14 - .../console-browserify/.travis.yml | 4 - .../node_modules/console-browserify/LICENCE | 19 - .../node_modules/console-browserify/README.md | 32 - .../node_modules/console-browserify/index.js | 85 - .../console-browserify/package.json | 76 - .../console-browserify/test/index.js | 67 - .../console-browserify/test/static/index.html | 12 - .../test/static/test-adapter.js | 53 - .../jshint/node_modules/minimatch/.npmignore | 1 - .../jshint/node_modules/minimatch/LICENSE | 23 - .../jshint/node_modules/minimatch/README.md | 218 - .../node_modules/minimatch/minimatch.js | 1061 -- .../node_modules/lru-cache/.npmignore | 1 - .../node_modules/lru-cache/CONTRIBUTORS | 14 - .../minimatch/node_modules/lru-cache/LICENSE | 23 - .../node_modules/lru-cache/README.md | 97 - .../node_modules/lru-cache/lib/lru-cache.js | 252 - .../node_modules/lru-cache/package.json | 33 - .../node_modules/lru-cache/test/basic.js | 369 - .../node_modules/lru-cache/test/foreach.js | 52 - .../lru-cache/test/memory-leak.js | 50 - .../minimatch/node_modules/sigmund/LICENSE | 27 - .../minimatch/node_modules/sigmund/README.md | 53 - .../minimatch/node_modules/sigmund/bench.js | 283 - .../node_modules/sigmund/package.json | 42 - .../minimatch/node_modules/sigmund/sigmund.js | 39 - .../node_modules/sigmund/test/basic.js | 24 - .../node_modules/minimatch/package.json | 42 - .../node_modules/minimatch/test/basic.js | 399 - .../minimatch/test/brace-expand.js | 33 - .../node_modules/minimatch/test/caching.js | 14 - .../node_modules/minimatch/test/defaults.js | 274 - .../test/extglob-ending-with-state-char.js | 8 - .../node_modules/shelljs/.documentup.json | 6 - .../jshint/node_modules/shelljs/.npmignore | 1 - .../jshint/node_modules/shelljs/.travis.yml | 5 - .../jshint/node_modules/shelljs/LICENSE | 26 - .../jshint/node_modules/shelljs/README.md | 513 - .../jshint/node_modules/shelljs/bin/shjs | 51 - .../jshint/node_modules/shelljs/global.js | 3 - .../jshint/node_modules/shelljs/jshint.json | 4 - .../jshint/node_modules/shelljs/make.js | 48 - .../jshint/node_modules/shelljs/package.json | 44 - .../node_modules/shelljs/scripts/docs.js | 15 - .../node_modules/shelljs/scripts/run-tests.js | 50 - .../jshint/node_modules/shelljs/shell.js | 1901 ---- .../node_modules/shelljs/test/.npmignore | 2 - .../jshint/node_modules/shelljs/test/cat.js | 57 - .../jshint/node_modules/shelljs/test/cd.js | 64 - .../jshint/node_modules/shelljs/test/chmod.js | 81 - .../node_modules/shelljs/test/config.js | 50 - .../jshint/node_modules/shelljs/test/cp.js | 143 - .../jshint/node_modules/shelljs/test/dirs.js | 37 - .../jshint/node_modules/shelljs/test/echo.js | 50 - .../jshint/node_modules/shelljs/test/env.js | 19 - .../jshint/node_modules/shelljs/test/exec.js | 109 - .../jshint/node_modules/shelljs/test/find.js | 56 - .../jshint/node_modules/shelljs/test/grep.js | 59 - .../jshint/node_modules/shelljs/test/ls.js | 202 - .../jshint/node_modules/shelljs/test/make.js | 20 - .../jshint/node_modules/shelljs/test/mkdir.js | 79 - .../jshint/node_modules/shelljs/test/mv.js | 130 - .../jshint/node_modules/shelljs/test/popd.js | 118 - .../jshint/node_modules/shelljs/test/pushd.js | 228 - .../jshint/node_modules/shelljs/test/pwd.js | 28 - .../node_modules/shelljs/test/resources/a.txt | 11 - .../test/resources/chmod/a/b/c/.npmignore | 0 .../test/resources/chmod/b/a/b/.npmignore | 0 .../test/resources/chmod/c/a/b/.npmignore | 0 .../shelljs/test/resources/chmod/file1 | 2 - .../node_modules/shelljs/test/resources/cp/a | 1 - .../node_modules/shelljs/test/resources/cp/b | 1 - .../shelljs/test/resources/cp/dir_a/z | 1 - .../resources/cp/dir_b/dir_b_a/dir_b_a_a/z | 1 - .../test/resources/external/node_script.js | 2 - .../node_modules/shelljs/test/resources/file1 | 1 - .../shelljs/test/resources/file1.js | 1 - .../shelljs/test/resources/file1.txt | 1 - .../node_modules/shelljs/test/resources/file2 | 1 - .../shelljs/test/resources/file2.js | 1 - .../shelljs/test/resources/file2.txt | 1 - .../shelljs/test/resources/find/.hidden | 1 - .../shelljs/test/resources/find/a | 1 - .../shelljs/test/resources/find/b | 1 - .../shelljs/test/resources/find/dir1/a_dir1 | 1 - .../test/resources/find/dir1/dir11/a_dir11 | 1 - .../shelljs/test/resources/find/dir2/a_dir1 | 1 - .../shelljs/test/resources/issue44/main.js | 1 - .../test/resources/ls/.hidden_dir/nada | 1 - .../shelljs/test/resources/ls/.hidden_file | 1 - .../test/resources/ls/a_dir/.hidden_dir/nada | 1 - .../shelljs/test/resources/ls/a_dir/b_dir/z | 1 - .../shelljs/test/resources/ls/a_dir/nada | 1 - .../shelljs/test/resources/ls/file1 | 1 - .../shelljs/test/resources/ls/file1.js | 1 - .../shelljs/test/resources/ls/file2 | 1 - .../shelljs/test/resources/ls/file2.js | 1 - ...ilename(with)[chars$]^that.must+be-escaped | 1 - .../shelljs/test/resources/pushd/a/dummy | 1 - .../shelljs/test/resources/pushd/b/c/dummy | 1 - .../jshint/node_modules/shelljs/test/rm.js | 183 - .../jshint/node_modules/shelljs/test/sed.js | 58 - .../node_modules/shelljs/test/tempdir.js | 27 - .../jshint/node_modules/shelljs/test/test.js | 91 - .../jshint/node_modules/shelljs/test/to.js | 39 - .../jshint/node_modules/shelljs/test/which.js | 38 - .../jshint/node_modules/underscore/.npmignore | 4 - .../node_modules/underscore/.travis.yml | 5 - .../jshint/node_modules/underscore/CNAME | 1 - .../node_modules/underscore/CONTRIBUTING.md | 9 - .../jshint/node_modules/underscore/LICENSE | 22 - .../jshint/node_modules/underscore/README.md | 19 - .../node_modules/underscore/favicon.ico | Bin 1406 -> 0 bytes .../jshint/node_modules/underscore/index.html | 2467 ----- .../jshint/node_modules/underscore/index.js | 1 - .../node_modules/underscore/package.json | 35 - .../node_modules/underscore/underscore-min.js | 1 - .../node_modules/underscore/underscore.js | 1226 --- .../node_modules/jshint/package.json | 70 - .../node_modules/jshint/src/cli.js | 506 - .../node_modules/jshint/src/jshint.js | 4872 --------- .../node_modules/jshint/src/lex.js | 1694 --- .../node_modules/jshint/src/messages.js | 218 - .../jshint/src/platforms/rhino.js | 113 - .../node_modules/jshint/src/reg.js | 34 - .../jshint/src/reporters/checkstyle.js | 115 - .../jshint/src/reporters/default.js | 34 - .../jshint/src/reporters/jslint_xml.js | 57 - .../jshint/src/reporters/non_error.js | 52 - .../node_modules/jshint/src/state.js | 24 - .../node_modules/jshint/src/style.js | 171 - .../node_modules/jshint/src/vars.js | 588 -- .../grunt-contrib-jshint/package.json | 57 - .../grunt-contrib-jshint/tasks/jshint.js | 74 - .../grunt-contrib-jshint/tasks/lib/jshint.js | 221 - .../test/fixtures/dontlint.txt | 1 - .../test/fixtures/lint.txt | Bin 180 -> 0 bytes .../test/fixtures/missingsemicolon.js | 1 - .../test/fixtures/nodemodule.js | 4 - .../grunt-contrib-jshint/test/jshint_test.js | 141 - node_modules/grunt-contrib-nodeunit/.jshintrc | 13 - .../grunt-contrib-nodeunit/.npmignore | 3 - .../grunt-contrib-nodeunit/.travis.yml | 6 - node_modules/grunt-contrib-nodeunit/AUTHORS | 2 - node_modules/grunt-contrib-nodeunit/CHANGELOG | 34 - .../grunt-contrib-nodeunit/CONTRIBUTING.md | 1 - .../grunt-contrib-nodeunit/Gruntfile.js | 51 - .../grunt-contrib-nodeunit/LICENSE-MIT | 22 - node_modules/grunt-contrib-nodeunit/README.md | 74 - .../docs/nodeunit-examples.md | 25 - .../docs/nodeunit-options.md | 0 .../docs/nodeunit-overview.md | 3 - .../node_modules/.bin/nodeunit | 1 - .../node_modules/nodeunit/.npmignore | 3 - .../node_modules/nodeunit/CONTRIBUTORS.md | 68 - .../node_modules/nodeunit/LICENSE | 19 - .../node_modules/nodeunit/Makefile | 177 - .../node_modules/nodeunit/README.md | 464 - .../node_modules/nodeunit/bin/nodeunit | 133 - .../node_modules/nodeunit/bin/nodeunit.json | 10 - .../node_modules/nodeunit/deps/async.js | 628 -- .../node_modules/nodeunit/deps/console.log.js | 55 - .../node_modules/nodeunit/deps/ejs/History.md | 70 - .../node_modules/nodeunit/deps/ejs/Makefile | 20 - .../node_modules/nodeunit/deps/ejs/Readme.md | 152 - .../nodeunit/deps/ejs/benchmark.js | 14 - .../node_modules/nodeunit/deps/ejs/ejs.js | 531 - .../node_modules/nodeunit/deps/ejs/ejs.min.js | 2 - .../nodeunit/deps/ejs/examples/client.html | 5 - .../nodeunit/deps/ejs/examples/list.ejs | 7 - .../nodeunit/deps/ejs/examples/list.js | 16 - .../node_modules/nodeunit/deps/ejs/index.js | 2 - .../node_modules/nodeunit/deps/ejs/lib/ejs.js | 251 - .../nodeunit/deps/ejs/lib/filters.js | 198 - .../nodeunit/deps/ejs/lib/utils.js | 23 - .../nodeunit/deps/ejs/package.json | 11 - .../nodeunit/deps/ejs/support/compile.js | 173 - .../nodeunit/deps/ejs/test/ejs.test.js | 269 - .../node_modules/nodeunit/deps/json2.js | 481 - .../node_modules/nodeunit/doc/nodeunit.md | 60 - .../nodeunit/examples/browser/nodeunit.js | 2034 ---- .../nodeunit/examples/browser/suite1.js | 12 - .../nodeunit/examples/browser/suite2.js | 13 - .../nodeunit/examples/browser/suite3.js | 7 - .../nodeunit/examples/browser/test.html | 18 - .../nested/nested_reporter_test.unit.js | 94 - .../nodeunit/img/example_fail.png | Bin 38642 -> 0 bytes .../nodeunit/img/example_machineout.png | Bin 422136 -> 0 bytes .../nodeunit/img/example_pass.png | Bin 14133 -> 0 bytes .../node_modules/nodeunit/index.js | 3 - .../node_modules/nodeunit/lib/assert.js | 354 - .../node_modules/nodeunit/lib/core.js | 319 - .../node_modules/nodeunit/lib/nodeunit.js | 104 - .../nodeunit/lib/reporters/browser.js | 123 - .../nodeunit/lib/reporters/default.js | 131 - .../nodeunit/lib/reporters/eclipse.js | 104 - .../nodeunit/lib/reporters/html.js | 110 - .../nodeunit/lib/reporters/index.js | 27 - .../nodeunit/lib/reporters/junit.js | 180 - .../nodeunit/lib/reporters/lcov.js | 54 - .../nodeunit/lib/reporters/machineout.js | 112 - .../nodeunit/lib/reporters/minimal.js | 121 - .../nodeunit/lib/reporters/nested.js | 216 - .../nodeunit/lib/reporters/skip_passed.js | 108 - .../nodeunit/lib/reporters/tap.js | 67 - .../nodeunit/lib/reporters/verbose.js | 125 - .../node_modules/nodeunit/lib/track.js | 48 - .../node_modules/nodeunit/lib/types.js | 190 - .../node_modules/nodeunit/lib/utils.js | 216 - .../node_modules/nodeunit/man1/nodeunit.1 | 95 - .../nodeunit/node_modules/.bin/tap | 1 - .../nodeunit/node_modules/tap/.npmignore | 0 .../nodeunit/node_modules/tap/AUTHORS | 11 - .../nodeunit/node_modules/tap/LICENSE | 23 - .../nodeunit/node_modules/tap/README.md | 86 - .../nodeunit/node_modules/tap/bin/tap-http.js | 19 - .../node_modules/tap/bin/tap-reader.js | 33 - .../nodeunit/node_modules/tap/bin/tap.js | 144 - .../tap/coverage-example/lib/bar.js | 15 - .../tap/coverage-example/lib/foo.js | 15 - .../tap/coverage-example/test/bar.test.js | 20 - .../tap/coverage-example/test/baz.test.js | 29 - .../tap/coverage-example/test/foo.test.js | 20 - .../node_modules/tap/example/lib/math.js | 1 - .../tap/example/test/test-example.js | 237 - .../nodeunit/node_modules/tap/lib/main.js | 16 - .../node_modules/tap/lib/tap-assert.js | 445 - .../tap/lib/tap-browser-harness.js | 63 - .../node_modules/tap/lib/tap-consumer.js | 246 - .../node_modules/tap/lib/tap-cov-html.js | 78 - .../tap/lib/tap-global-harness.js | 68 - .../node_modules/tap/lib/tap-harness.js | 224 - .../node_modules/tap/lib/tap-producer.js | 131 - .../node_modules/tap/lib/tap-results.js | 71 - .../node_modules/tap/lib/tap-runner.js | 501 - .../nodeunit/node_modules/tap/lib/tap-test.js | 110 - .../node_modules/tap/node_modules/.bin/nopt | 1 - .../tap/node_modules/buffer-equal/.travis.yml | 4 - .../node_modules/buffer-equal/README.markdown | 62 - .../node_modules/buffer-equal/example/eq.js | 14 - .../tap/node_modules/buffer-equal/index.js | 14 - .../node_modules/buffer-equal/package.json | 43 - .../tap/node_modules/buffer-equal/test/eq.js | 35 - .../node_modules/deep-equal/README.markdown | 55 - .../node_modules/deep-equal/example/cmp.js | 11 - .../tap/node_modules/deep-equal/index.js | 84 - .../tap/node_modules/deep-equal/package.json | 43 - .../tap/node_modules/deep-equal/test/cmp.js | 18 - .../tap/node_modules/difflet/.travis.yml | 4 - .../tap/node_modules/difflet/README.markdown | 116 - .../node_modules/difflet/example/cmp_array.js | 6 - .../difflet/example/cmp_object.js | 6 - .../node_modules/difflet/example/colors.js | 18 - .../difflet/example/comma_first.js | 12 - .../tap/node_modules/difflet/example/diff.js | 15 - .../tap/node_modules/difflet/example/html.js | 34 - .../node_modules/difflet/example/string.js | 4 - .../tap/node_modules/difflet/index.js | 377 - .../node_modules/charm/README.markdown | 216 - .../difflet/node_modules/charm/example/256.js | 17 - .../node_modules/charm/example/column.js | 11 - .../node_modules/charm/example/cursor.js | 22 - .../node_modules/charm/example/http_spin.js | 36 - .../node_modules/charm/example/lucky.js | 24 - .../node_modules/charm/example/position.js | 7 - .../node_modules/charm/example/progress.js | 18 - .../node_modules/charm/example/resize.js | 62 - .../node_modules/charm/example/spin.js | 23 - .../difflet/node_modules/charm/index.js | 305 - .../difflet/node_modules/charm/lib/encode.js | 18 - .../difflet/node_modules/charm/package.json | 42 - .../difflet/node_modules/deep-is/.npmignore | 1 - .../difflet/node_modules/deep-is/.travis.yml | 6 - .../node_modules/deep-is/README.markdown | 63 - .../node_modules/deep-is/example/cmp.js | 11 - .../difflet/node_modules/deep-is/index.js | 102 - .../difflet/node_modules/deep-is/package.json | 66 - .../difflet/node_modules/deep-is/test/NaN.js | 16 - .../difflet/node_modules/deep-is/test/cmp.js | 23 - .../node_modules/deep-is/test/neg-vs-pos-0.js | 15 - .../difflet/node_modules/traverse/.npmignore | 1 - .../difflet/node_modules/traverse/.travis.yml | 3 - .../difflet/node_modules/traverse/LICENSE | 24 - .../node_modules/traverse/examples/json.js | 16 - .../node_modules/traverse/examples/leaves.js | 15 - .../traverse/examples/negative.js | 8 - .../node_modules/traverse/examples/scrub.js | 10 - .../traverse/examples/stringify.js | 38 - .../difflet/node_modules/traverse/index.js | 314 - .../node_modules/traverse/package.json | 68 - .../node_modules/traverse/readme.markdown | 209 - .../node_modules/traverse/test/circular.js | 117 - .../node_modules/traverse/test/date.js | 37 - .../node_modules/traverse/test/equal.js | 240 - .../node_modules/traverse/test/error.js | 11 - .../difflet/node_modules/traverse/test/has.js | 15 - .../node_modules/traverse/test/instance.js | 17 - .../node_modules/traverse/test/interface.js | 43 - .../node_modules/traverse/test/json.js | 49 - .../node_modules/traverse/test/keys.js | 31 - .../node_modules/traverse/test/leaves.js | 22 - .../traverse/test/lib/deep_equal.js | 96 - .../node_modules/traverse/test/mutability.js | 300 - .../node_modules/traverse/test/negative.js | 21 - .../difflet/node_modules/traverse/test/obj.js | 11 - .../node_modules/traverse/test/siblings.js | 37 - .../node_modules/traverse/test/stop.js | 44 - .../node_modules/traverse/test/stringify.js | 36 - .../node_modules/traverse/test/subexpr.js | 36 - .../node_modules/traverse/test/super_deep.js | 56 - .../node_modules/traverse/testling/leaves.js | 22 - .../tap/node_modules/difflet/package.json | 49 - .../node_modules/difflet/test/diffing-NaN.js | 17 - .../tap/node_modules/difflet/test/html.js | 80 - .../tap/node_modules/glob/.npmignore | 2 - .../tap/node_modules/glob/.travis.yml | 3 - .../tap/node_modules/glob/LICENSE | 27 - .../tap/node_modules/glob/README.md | 250 - .../tap/node_modules/glob/examples/g.js | 9 - .../node_modules/glob/examples/usr-local.js | 9 - .../tap/node_modules/glob/glob.js | 728 -- .../glob/node_modules/inherits/LICENSE | 16 - .../glob/node_modules/inherits/README.md | 42 - .../glob/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../glob/node_modules/inherits/package.json | 33 - .../glob/node_modules/inherits/test.js | 25 - .../glob/node_modules/minimatch/.npmignore | 1 - .../glob/node_modules/minimatch/LICENSE | 23 - .../glob/node_modules/minimatch/README.md | 218 - .../glob/node_modules/minimatch/minimatch.js | 1061 -- .../node_modules/lru-cache/.npmignore | 1 - .../node_modules/lru-cache/CONTRIBUTORS | 14 - .../minimatch/node_modules/lru-cache/LICENSE | 23 - .../node_modules/lru-cache/README.md | 97 - .../node_modules/lru-cache/lib/lru-cache.js | 252 - .../node_modules/lru-cache/package.json | 33 - .../node_modules/lru-cache/test/basic.js | 369 - .../node_modules/lru-cache/test/foreach.js | 52 - .../lru-cache/test/memory-leak.js | 50 - .../minimatch/node_modules/sigmund/LICENSE | 27 - .../minimatch/node_modules/sigmund/README.md | 53 - .../minimatch/node_modules/sigmund/bench.js | 283 - .../node_modules/sigmund/package.json | 42 - .../minimatch/node_modules/sigmund/sigmund.js | 39 - .../node_modules/sigmund/test/basic.js | 24 - .../glob/node_modules/minimatch/package.json | 42 - .../glob/node_modules/minimatch/test/basic.js | 399 - .../minimatch/test/brace-expand.js | 33 - .../node_modules/minimatch/test/caching.js | 14 - .../node_modules/minimatch/test/defaults.js | 274 - .../test/extglob-ending-with-state-char.js | 8 - .../tap/node_modules/glob/package.json | 42 - .../tap/node_modules/glob/test/00-setup.js | 176 - .../node_modules/glob/test/bash-comparison.js | 63 - .../node_modules/glob/test/bash-results.json | 351 - .../tap/node_modules/glob/test/cwd-test.js | 55 - .../node_modules/glob/test/globstar-match.js | 19 - .../tap/node_modules/glob/test/mark.js | 118 - .../glob/test/new-glob-optional-options.js | 10 - .../node_modules/glob/test/nocase-nomagic.js | 113 - .../node_modules/glob/test/pause-resume.js | 73 - .../node_modules/glob/test/readme-issue.js | 36 - .../node_modules/glob/test/root-nomount.js | 39 - .../tap/node_modules/glob/test/root.js | 46 - .../tap/node_modules/glob/test/stat.js | 32 - .../tap/node_modules/glob/test/zz-cleanup.js | 11 - .../tap/node_modules/inherits/LICENSE | 16 - .../tap/node_modules/inherits/README.md | 42 - .../tap/node_modules/inherits/inherits.js | 1 - .../node_modules/inherits/inherits_browser.js | 23 - .../tap/node_modules/inherits/package.json | 33 - .../tap/node_modules/inherits/test.js | 25 - .../tap/node_modules/mkdirp/.npmignore | 2 - .../tap/node_modules/mkdirp/.travis.yml | 5 - .../tap/node_modules/mkdirp/LICENSE | 21 - .../tap/node_modules/mkdirp/examples/pow.js | 6 - .../tap/node_modules/mkdirp/index.js | 82 - .../tap/node_modules/mkdirp/package.json | 34 - .../tap/node_modules/mkdirp/readme.markdown | 63 - .../tap/node_modules/mkdirp/test/chmod.js | 38 - .../tap/node_modules/mkdirp/test/clobber.js | 37 - .../tap/node_modules/mkdirp/test/mkdirp.js | 28 - .../tap/node_modules/mkdirp/test/perm.js | 32 - .../tap/node_modules/mkdirp/test/perm_sync.js | 39 - .../tap/node_modules/mkdirp/test/race.js | 41 - .../tap/node_modules/mkdirp/test/rel.js | 32 - .../tap/node_modules/mkdirp/test/return.js | 25 - .../node_modules/mkdirp/test/return_sync.js | 24 - .../tap/node_modules/mkdirp/test/root.js | 18 - .../tap/node_modules/mkdirp/test/sync.js | 32 - .../tap/node_modules/mkdirp/test/umask.js | 28 - .../node_modules/mkdirp/test/umask_sync.js | 32 - .../tap/node_modules/nopt/.npmignore | 1 - .../tap/node_modules/nopt/LICENSE | 23 - .../tap/node_modules/nopt/README.md | 210 - .../tap/node_modules/nopt/bin/nopt.js | 51 - .../node_modules/nopt/examples/my-program.js | 30 - .../tap/node_modules/nopt/lib/nopt.js | 412 - .../nopt/node_modules/abbrev/CONTRIBUTING.md | 3 - .../nopt/node_modules/abbrev/LICENSE | 23 - .../nopt/node_modules/abbrev/README.md | 23 - .../nopt/node_modules/abbrev/abbrev.js | 62 - .../nopt/node_modules/abbrev/package.json | 29 - .../nopt/node_modules/abbrev/test.js | 47 - .../tap/node_modules/nopt/package.json | 39 - .../tap/node_modules/nopt/test/basic.js | 243 - .../node_modules/runforcover/README.markdown | 56 - .../tap/node_modules/runforcover/index.js | 127 - .../node_modules/bunker/.npmignore | 1 - .../node_modules/bunker/.travis.yml | 4 - .../node_modules/bunker/README.markdown | 82 - .../node_modules/bunker/example/prof.js | 51 - .../node_modules/bunker/example/tiny.js | 18 - .../node_modules/bunker/example/top/run.js | 31 - .../node_modules/bunker/example/top/src.js | 18 - .../runforcover/node_modules/bunker/index.js | 116 - .../bunker/node_modules/burrito/.npmignore | 1 - .../bunker/node_modules/burrito/.travis.yml | 4 - .../node_modules/burrito/README.markdown | 187 - .../node_modules/burrito/example/microwave.js | 8 - .../node_modules/burrito/example/web/bs.js | 4832 --------- .../burrito/example/web/index.html | 14 - .../node_modules/burrito/example/web/main.js | 17 - .../burrito/example/web/server.js | 12 - .../node_modules/burrito/example/wrap.js | 7 - .../bunker/node_modules/burrito/index.js | 208 - .../burrito/node_modules/.bin/uglifyjs | 1 - .../burrito/node_modules/traverse/.npmignore | 1 - .../burrito/node_modules/traverse/LICENSE | 24 - .../node_modules/traverse/README.markdown | 237 - .../node_modules/traverse/examples/json.js | 16 - .../node_modules/traverse/examples/leaves.js | 15 - .../traverse/examples/negative.js | 8 - .../node_modules/traverse/examples/scrub.js | 10 - .../traverse/examples/stringify.js | 38 - .../burrito/node_modules/traverse/index.js | 267 - .../burrito/node_modules/traverse/main.js | 10 - .../node_modules/traverse/package.json | 28 - .../node_modules/traverse/test/circular.js | 115 - .../node_modules/traverse/test/date.js | 35 - .../node_modules/traverse/test/equal.js | 220 - .../node_modules/traverse/test/instance.js | 17 - .../node_modules/traverse/test/interface.js | 42 - .../node_modules/traverse/test/json.js | 47 - .../node_modules/traverse/test/keys.js | 29 - .../node_modules/traverse/test/leaves.js | 21 - .../traverse/test/lib/deep_equal.js | 92 - .../node_modules/traverse/test/mutability.js | 252 - .../node_modules/traverse/test/negative.js | 20 - .../burrito/node_modules/traverse/test/obj.js | 15 - .../node_modules/traverse/test/siblings.js | 35 - .../node_modules/traverse/test/stop.js | 41 - .../node_modules/traverse/test/stringify.js | 36 - .../node_modules/traverse/test/subexpr.js | 34 - .../node_modules/traverse/test/super_deep.js | 55 - .../burrito/node_modules/uglify-js/.npmignore | 4 - .../node_modules/uglify-js/README.html | 1026 -- .../burrito/node_modules/uglify-js/README.org | 571 - .../node_modules/uglify-js/bin/uglifyjs | 317 - .../node_modules/uglify-js/docstyle.css | 75 - .../node_modules/uglify-js/lib/object-ast.js | 75 - .../node_modules/uglify-js/lib/parse-js.js | 1339 --- .../node_modules/uglify-js/lib/process.js | 2001 ---- .../uglify-js/lib/squeeze-more.js | 51 - .../node_modules/uglify-js/package.json | 26 - .../node_modules/uglify-js/package.json~ | 24 - .../node_modules/uglify-js/test/beautify.js | 28 - .../node_modules/uglify-js/test/testparser.js | 403 - .../test/unit/compress/expected/array1.js | 1 - .../test/unit/compress/expected/array2.js | 1 - .../test/unit/compress/expected/array3.js | 1 - .../test/unit/compress/expected/array4.js | 1 - .../test/unit/compress/expected/assignment.js | 1 - .../unit/compress/expected/concatstring.js | 1 - .../test/unit/compress/expected/const.js | 1 - .../unit/compress/expected/empty-blocks.js | 1 - .../unit/compress/expected/forstatement.js | 1 - .../test/unit/compress/expected/if.js | 1 - .../test/unit/compress/expected/ifreturn.js | 1 - .../test/unit/compress/expected/ifreturn2.js | 1 - .../test/unit/compress/expected/issue10.js | 1 - .../test/unit/compress/expected/issue11.js | 1 - .../test/unit/compress/expected/issue13.js | 1 - .../test/unit/compress/expected/issue14.js | 1 - .../test/unit/compress/expected/issue16.js | 1 - .../test/unit/compress/expected/issue17.js | 1 - .../test/unit/compress/expected/issue20.js | 1 - .../test/unit/compress/expected/issue21.js | 1 - .../test/unit/compress/expected/issue25.js | 1 - .../test/unit/compress/expected/issue27.js | 1 - .../test/unit/compress/expected/issue28.js | 1 - .../test/unit/compress/expected/issue29.js | 1 - .../test/unit/compress/expected/issue30.js | 1 - .../test/unit/compress/expected/issue34.js | 1 - .../test/unit/compress/expected/issue4.js | 1 - .../test/unit/compress/expected/issue48.js | 1 - .../test/unit/compress/expected/issue50.js | 1 - .../test/unit/compress/expected/issue53.js | 1 - .../test/unit/compress/expected/issue54.1.js | 1 - .../test/unit/compress/expected/issue68.js | 1 - .../test/unit/compress/expected/issue69.js | 1 - .../test/unit/compress/expected/issue9.js | 1 - .../test/unit/compress/expected/mangle.js | 1 - .../unit/compress/expected/null_string.js | 1 - .../unit/compress/expected/strict-equals.js | 1 - .../test/unit/compress/expected/var.js | 1 - .../test/unit/compress/expected/whitespace.js | 1 - .../test/unit/compress/expected/with.js | 1 - .../test/unit/compress/test/array1.js | 3 - .../test/unit/compress/test/array2.js | 4 - .../test/unit/compress/test/array3.js | 4 - .../test/unit/compress/test/array4.js | 6 - .../test/unit/compress/test/assignment.js | 20 - .../test/unit/compress/test/concatstring.js | 3 - .../test/unit/compress/test/const.js | 5 - .../test/unit/compress/test/empty-blocks.js | 4 - .../test/unit/compress/test/forstatement.js | 10 - .../uglify-js/test/unit/compress/test/if.js | 6 - .../test/unit/compress/test/ifreturn.js | 9 - .../test/unit/compress/test/ifreturn2.js | 16 - .../test/unit/compress/test/issue10.js | 1 - .../test/unit/compress/test/issue11.js | 3 - .../test/unit/compress/test/issue13.js | 1 - .../test/unit/compress/test/issue14.js | 1 - .../test/unit/compress/test/issue16.js | 1 - .../test/unit/compress/test/issue17.js | 4 - .../test/unit/compress/test/issue20.js | 1 - .../test/unit/compress/test/issue21.js | 6 - .../test/unit/compress/test/issue25.js | 7 - .../test/unit/compress/test/issue27.js | 1 - .../test/unit/compress/test/issue28.js | 3 - .../test/unit/compress/test/issue29.js | 1 - .../test/unit/compress/test/issue30.js | 3 - .../test/unit/compress/test/issue34.js | 3 - .../test/unit/compress/test/issue4.js | 3 - .../test/unit/compress/test/issue48.js | 1 - .../test/unit/compress/test/issue50.js | 9 - .../test/unit/compress/test/issue53.js | 1 - .../test/unit/compress/test/issue54.1.js | 3 - .../test/unit/compress/test/issue68.js | 5 - .../test/unit/compress/test/issue69.js | 1 - .../test/unit/compress/test/issue9.js | 4 - .../test/unit/compress/test/mangle.js | 5 - .../test/unit/compress/test/null_string.js | 1 - .../test/unit/compress/test/strict-equals.js | 3 - .../uglify-js/test/unit/compress/test/var.js | 3 - .../test/unit/compress/test/whitespace.js | 21 - .../uglify-js/test/unit/compress/test/with.js | 2 - .../uglify-js/test/unit/scripts.js | 55 - .../node_modules/uglify-js/tmp/hoist.js | 33 - .../node_modules/uglify-js/tmp/instrument.js | 97 - .../node_modules/uglify-js/tmp/instrument2.js | 138 - .../node_modules/uglify-js/tmp/test.js | 30 - .../node_modules/uglify-js/uglify-js.js | 17 - .../bunker/node_modules/burrito/package.json | 51 - .../bunker/node_modules/burrito/test/ast.js | 31 - .../bunker/node_modules/burrito/test/err.js | 52 - .../bunker/node_modules/burrito/test/fail.js | 9 - .../node_modules/burrito/test/fail/src.js | 60 - .../bunker/node_modules/burrito/test/label.js | 92 - .../node_modules/burrito/test/microwave.js | 34 - .../node_modules/burrito/test/parent.js | 27 - .../bunker/node_modules/burrito/test/wrap.js | 159 - .../node_modules/bunker/package.json | 45 - .../node_modules/bunker/test/cover.js | 36 - .../node_modules/bunker/test/return.js | 29 - .../node_modules/bunker/test/src/cover.js | 6 - .../tap/node_modules/runforcover/package.json | 42 - .../node_modules/runforcover/test/index.js | 1 - .../runforcover/test/interface.js | 50 - .../runforcover/test/src/coverage.js | 7 - .../tap/node_modules/slide/LICENSE | 15 - .../tap/node_modules/slide/README.md | 143 - .../tap/node_modules/slide/index.js | 1 - .../slide/lib/async-map-ordered.js | 65 - .../tap/node_modules/slide/lib/async-map.js | 56 - .../tap/node_modules/slide/lib/bind-actor.js | 16 - .../tap/node_modules/slide/lib/chain.js | 20 - .../tap/node_modules/slide/lib/slide.js | 3 - .../tap/node_modules/slide/package.json | 36 - .../tap/node_modules/yamlish/LICENSE | 19 - .../tap/node_modules/yamlish/README.md | 20 - .../tap/node_modules/yamlish/package.json | 35 - .../tap/node_modules/yamlish/yamlish.js | 260 - .../nodeunit/node_modules/tap/package.json | 72 - .../node_modules/tap/test-disabled/bailout.js | 36 - .../node_modules/tap/test-disabled/foo.js | 1 - .../node_modules/tap/test-disabled/t.js | 16 - .../node_modules/tap/test/buffer_compare.js | 11 - .../nodeunit/node_modules/tap/test/common.js | 32 - .../node_modules/tap/test/debug-test.js | 16 - .../nodeunit/node_modules/tap/test/deep.js | 43 - .../node_modules/tap/test/end-exception/t.js | 12 - .../node_modules/tap/test/executed.sh | 4 - .../node_modules/tap/test/expose-gc-test.js | 46 - .../tap/test/independent-timeouts.js | 16 - .../tap/test/isolated-conf-test.js | 16 - .../node_modules/tap/test/meta-test.js | 73 - .../node_modules/tap/test/nested-test.js | 23 - .../node_modules/tap/test/non-tap-output.js | 12 - .../node_modules/tap/test/not-executed.sh | 4 - .../tap/test/output-childtest-description.js | 50 - .../node_modules/tap/test/result-trap.js | 25 - .../nodeunit/node_modules/tap/test/segv.js | 69 - .../tap/test/simple-harness-test-with-plan.js | 16 - .../tap/test/simple-harness-test.js | 13 - .../node_modules/tap/test/test-test.js | 91 - .../nodeunit/node_modules/tap/test/timeout.js | 33 - .../node_modules/tap/test/trivial-success.js | 0 .../tap/test/undefined_indented.js | 27 - .../node_modules/tap/test/valid-command.js | 30 - .../node_modules/nodeunit/nodelint.cfg | 7 - .../node_modules/nodeunit/package.json | 103 - .../node_modules/nodeunit/share/junit.xml.ejs | 19 - .../node_modules/nodeunit/share/license.js | 11 - .../node_modules/nodeunit/share/nodeunit.css | 70 - .../fixtures/coffee/mock_coffee_module.coffee | 4 - .../test/fixtures/dir/mock_module3.js | 1 - .../test/fixtures/dir/mock_module4.js | 1 - .../nodeunit/test/fixtures/example_test.js | 4 - .../nodeunit/test/fixtures/mock_module1.js | 1 - .../nodeunit/test/fixtures/mock_module2.js | 1 - .../nodeunit/test/fixtures/raw_jscode1.js | 3 - .../nodeunit/test/fixtures/raw_jscode2.js | 3 - .../nodeunit/test/fixtures/raw_jscode3.js | 1 - .../node_modules/nodeunit/test/test-base.js | 239 - .../nodeunit/test/test-bettererrors.js | 76 - .../node_modules/nodeunit/test/test-cli.js | 16 - .../nodeunit/test/test-failing-callbacks.js | 114 - .../nodeunit/test/test-httputil.js | 55 - .../nodeunit/test/test-runfiles.js | 231 - .../nodeunit/test/test-runmodule.js | 222 - .../nodeunit/test/test-runtest.js | 46 - .../nodeunit/test/test-sandbox.js | 31 - .../nodeunit/test/test-testcase-legacy.js | 257 - .../nodeunit/test/test-testcase.js | 256 - .../node_modules/nodeunit/test/test.html | 28 - .../grunt-contrib-nodeunit/package.json | 57 - .../grunt-contrib-nodeunit/tasks/nodeunit.js | 224 - .../test/fixtures/fail.js | 18 - .../test/nodeunit_test.js | 23 - .../grunt-contrib-uglify/package.json | 2 +- node_modules/grunt/node_modules/.bin/cake | 16 +- node_modules/grunt/node_modules/.bin/coffee | 16 +- node_modules/grunt/node_modules/.bin/js-yaml | 16 +- node_modules/grunt/node_modules/.bin/nopt | 16 +- node_modules/grunt/node_modules/.bin/rimraf | 16 +- node_modules/grunt/node_modules/.bin/which | 16 +- .../grunt/node_modules/async/package.json | 35 +- .../node_modules/coffee-script/package.json | 27 +- .../grunt/node_modules/colors/package.json | 26 +- .../node_modules/dateformat/package.json | 28 +- .../node_modules/eventemitter2/README.md | 130 +- .../eventemitter2/lib/eventemitter2.js | 32 +- .../node_modules/eventemitter2/package.json | 31 +- .../grunt/node_modules/exit/package.json | 20 +- .../glob/node_modules/inherits/package.json | 24 +- .../node_modules/lru-cache/README.md | 16 +- .../node_modules/lru-cache/lib/lru-cache.js | 46 +- .../node_modules/lru-cache/package.json | 38 +- .../node_modules/lru-cache/test/basic.js | 28 +- .../node_modules/lru-cache/test/foreach.js | 69 + .../node_modules/sigmund/package.json | 26 +- .../glob/node_modules/minimatch/package.json | 23 +- .../node_modules/glob/package.json | 24 +- .../findup-sync/node_modules/lodash/README.md | 162 +- .../node_modules/lodash/dist/lodash.compat.js | 9 +- .../lodash/dist/lodash.compat.min.js | 145 +- .../node_modules/lodash/dist/lodash.js | 9 +- .../node_modules/lodash/dist/lodash.min.js | 135 +- .../lodash/dist/lodash.underscore.js | 8 +- .../lodash/dist/lodash.underscore.min.js | 4 +- .../findup-sync/node_modules/lodash/lodash.js | 9 +- .../node_modules/lodash/package.json | 47 +- .../node_modules/findup-sync/package.json | 23 +- .../grunt/node_modules/getobject/package.json | 20 +- .../node_modules/graceful-fs/package.json | 24 +- .../glob/node_modules/inherits/package.json | 25 +- .../grunt/node_modules/glob/package.json | 27 +- .../node_modules/lodash/README.md | 162 +- .../node_modules/lodash/dist/lodash.compat.js | 9 +- .../lodash/dist/lodash.compat.min.js | 145 +- .../node_modules/lodash/dist/lodash.js | 9 +- .../node_modules/lodash/dist/lodash.min.js | 135 +- .../lodash/dist/lodash.underscore.js | 8 +- .../lodash/dist/lodash.underscore.min.js | 4 +- .../node_modules/lodash/lodash.js | 9 +- .../node_modules/lodash/package.json | 47 +- .../underscore.string/package.json | 33 +- .../grunt-legacy-log/package.json | 31 +- .../grunt-legacy-util/package.json | 27 +- .../grunt/node_modules/hooker/package.json | 27 +- .../node_modules/iconv-lite/package.json | 23 +- .../js-yaml/node_modules/.bin/esparse | 16 +- .../js-yaml/node_modules/.bin/esvalidate | 16 +- .../js-yaml/node_modules/argparse/HISTORY.md | 6 + .../js-yaml/node_modules/argparse/README.md | 6 +- .../argparse/lib/argument_parser.js | 29 +- .../argparse/lib/help/formatter.js | 17 +- .../underscore.string/.travis.yml | 8 +- .../node_modules/underscore.string/Gemfile | 4 - .../underscore.string/Gemfile.lock | 17 - .../underscore.string/README.markdown | 21 +- .../node_modules/underscore.string/Rakefile | 23 - .../underscore.string/component.json | 2 +- .../dist/underscore.string.min.js | 1 - .../lib/underscore.string.js | 8 +- .../underscore.string/package.json | 48 +- .../underscore.string/test/run-qunit.js | 45 - .../underscore.string/test/speed.js | 148 - .../underscore.string/test/strings.js | 685 -- .../test/strings_standalone.js | 12 - .../underscore.string/test/test.html | 31 - .../test/test_standalone.html | 18 - .../test/test_underscore/arrays.js | 200 - .../test/test_underscore/chaining.js | 59 - .../test/test_underscore/collections.js | 426 - .../test/test_underscore/functions.js | 259 - .../test/test_underscore/index.html | 45 - .../test/test_underscore/objects.js | 548 - .../test/test_underscore/speed.js | 75 - .../test/test_underscore/utility.js | 249 - .../test/test_underscore/vendor/jquery.js | 9404 ----------------- .../test/test_underscore/vendor/jslitmus.js | 670 -- .../test/test_underscore/vendor/qunit.css | 235 - .../test/test_underscore/vendor/qunit.js | 1977 ---- .../underscore.string/test/underscore.js | 1201 --- .../node_modules/underscore/.npmignore | 4 - .../node_modules/underscore/.travis.yml | 5 - .../argparse/node_modules/underscore/CNAME | 1 - .../node_modules/underscore/CONTRIBUTING.md | 9 - .../argparse/node_modules/underscore/LICENSE | 3 +- .../node_modules/underscore/README.md | 5 +- .../node_modules/underscore/favicon.ico | Bin 1406 -> 0 bytes .../node_modules/underscore/index.html | 2467 ----- .../argparse/node_modules/underscore/index.js | 1 - .../node_modules/underscore/package.json | 52 +- .../node_modules/underscore/underscore-min.js | 7 +- .../node_modules/underscore/underscore.js | 1145 +- .../node_modules/argparse/package.json | 38 +- .../js-yaml/node_modules/esprima/package.json | 26 +- .../grunt/node_modules/js-yaml/package.json | 23 +- .../grunt/node_modules/lodash/package.json | 25 +- .../node_modules/lru-cache/README.md | 16 +- .../node_modules/lru-cache/lib/lru-cache.js | 46 +- .../node_modules/lru-cache/package.json | 38 +- .../node_modules/lru-cache/test/basic.js | 28 +- .../node_modules/lru-cache/test/foreach.js | 69 + .../node_modules/sigmund/package.json | 26 +- .../grunt/node_modules/minimatch/package.json | 23 +- .../nopt/node_modules/abbrev/package.json | 25 +- .../grunt/node_modules/nopt/package.json | 36 +- .../grunt/node_modules/rimraf/package.json | 23 +- .../underscore.string/package.json | 32 +- node_modules/grunt/node_modules/which/LICENSE | 32 +- .../grunt/node_modules/which/package.json | 37 +- .../grunt/node_modules/which/which.js | 9 +- node_modules/grunt/package.json | 27 +- node_modules/uglify-save-license/package.json | 2 +- 832 files changed, 2744 insertions(+), 88337 deletions(-) delete mode 100644 node_modules/grunt-contrib-jshint/.jshintignore delete mode 100644 node_modules/grunt-contrib-jshint/.jshintrc delete mode 100644 node_modules/grunt-contrib-jshint/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/.travis.yml delete mode 100644 node_modules/grunt-contrib-jshint/AUTHORS delete mode 100644 node_modules/grunt-contrib-jshint/CHANGELOG delete mode 100644 node_modules/grunt-contrib-jshint/CONTRIBUTING.md delete mode 100644 node_modules/grunt-contrib-jshint/Gruntfile.js delete mode 100644 node_modules/grunt-contrib-jshint/LICENSE-MIT delete mode 100644 node_modules/grunt-contrib-jshint/README.md delete mode 100644 node_modules/grunt-contrib-jshint/docs/jshint-examples.md delete mode 100644 node_modules/grunt-contrib-jshint/docs/jshint-options.md delete mode 100644 node_modules/grunt-contrib-jshint/docs/jshint-overview.md delete mode 120000 node_modules/grunt-contrib-jshint/node_modules/.bin/jshint delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/README.md delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/bin/apply delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/bin/build delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/bin/changelog delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/bin/jshint delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/bin/land delete mode 120000 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/.bin/shjs delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/cli.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/cat.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/command.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/echo.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/glob.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/long_desc.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/progress.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/sort.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/spinner.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.coffee delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/index.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.travis.yml delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/once.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/test/once.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/empty-set.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/error-callback.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.testem.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.travis.yml delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/LICENCE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/index.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/index.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/index.html delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/bench.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/sigmund.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/test/basic.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/basic.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/brace-expand.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/caching.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/defaults.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.documentup.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.travis.yml delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/README.md delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/bin/shjs delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/global.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/jshint.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/make.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/package.json delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/docs.js delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/shell.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cat.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cd.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/chmod.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/config.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cp.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/dirs.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/echo.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/env.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/exec.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/find.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/grep.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/ls.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/make.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mkdir.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mv.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/popd.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pushd.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pwd.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/a.txt delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/a/b/c/.npmignore delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/b/a/b/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/c/a/b/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/file1 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/a delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/b delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_a/z delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z delete mode 100755 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/external/node_script.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.txt delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.txt delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/.hidden delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/a delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/b delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/a_dir1 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/dir11/a_dir11 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir2/a_dir1 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/issue44/main.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_dir/nada delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_file delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/.hidden_dir/nada delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/b_dir/z delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/nada delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2 delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/filename(with)[chars$]^that.must+be-escaped delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/a/dummy delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/b/c/dummy delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/rm.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/sed.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/tempdir.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/test.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/to.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/which.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.npmignore delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.travis.yml delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CNAME delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CONTRIBUTING.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/LICENSE delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/README.md delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/favicon.ico delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.html delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore-min.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/package.json delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/cli.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/jshint.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/lex.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/messages.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/platforms/rhino.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/reg.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/checkstyle.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/default.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/jslint_xml.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/non_error.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/state.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/style.js delete mode 100644 node_modules/grunt-contrib-jshint/node_modules/jshint/src/vars.js delete mode 100644 node_modules/grunt-contrib-jshint/package.json delete mode 100644 node_modules/grunt-contrib-jshint/tasks/jshint.js delete mode 100644 node_modules/grunt-contrib-jshint/tasks/lib/jshint.js delete mode 100644 node_modules/grunt-contrib-jshint/test/fixtures/dontlint.txt delete mode 100644 node_modules/grunt-contrib-jshint/test/fixtures/lint.txt delete mode 100644 node_modules/grunt-contrib-jshint/test/fixtures/missingsemicolon.js delete mode 100644 node_modules/grunt-contrib-jshint/test/fixtures/nodemodule.js delete mode 100644 node_modules/grunt-contrib-jshint/test/jshint_test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/.jshintrc delete mode 100644 node_modules/grunt-contrib-nodeunit/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/AUTHORS delete mode 100644 node_modules/grunt-contrib-nodeunit/CHANGELOG delete mode 100644 node_modules/grunt-contrib-nodeunit/CONTRIBUTING.md delete mode 100644 node_modules/grunt-contrib-nodeunit/Gruntfile.js delete mode 100644 node_modules/grunt-contrib-nodeunit/LICENSE-MIT delete mode 100644 node_modules/grunt-contrib-nodeunit/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/docs/nodeunit-examples.md delete mode 100644 node_modules/grunt-contrib-nodeunit/docs/nodeunit-options.md delete mode 100644 node_modules/grunt-contrib-nodeunit/docs/nodeunit-overview.md delete mode 120000 node_modules/grunt-contrib-nodeunit/node_modules/.bin/nodeunit delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/CONTRIBUTORS.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/Makefile delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/README.md delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/console.log.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/History.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Makefile delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Readme.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/benchmark.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.min.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/client.html delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.ejs delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/ejs.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/filters.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/utils.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/support/compile.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/test/ejs.test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/json2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/doc/nodeunit.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/browser/nodeunit.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/browser/suite1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/browser/suite2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/browser/suite3.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/browser/test.html delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/nested/nested_reporter_test.unit.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_fail.png delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_machineout.png delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_pass.png delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/assert.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/nodeunit.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/browser.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/default.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/eclipse.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/html.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/junit.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/lcov.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/machineout.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/minimal.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/nested.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/skip_passed.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/tap.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/verbose.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/track.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/types.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/utils.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/man1/nodeunit.1 delete mode 120000 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/.bin/tap delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/AUTHORS delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-http.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-reader.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/bar.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/foo.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/bar.test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/baz.test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/foo.test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/lib/math.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/test/test-example.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/main.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-assert.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-browser-harness.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-consumer.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-cov-html.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-global-harness.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-harness.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-producer.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-results.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-runner.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-test.js delete mode 120000 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/.bin/nopt delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/example/eq.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/test/eq.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/example/cmp.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/test/cmp.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_array.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_object.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/colors.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/comma_first.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/diff.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/html.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/string.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/256.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/column.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/cursor.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/http_spin.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/lucky.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/position.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/progress.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/resize.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/spin.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/lib/encode.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/example/cmp.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/NaN.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/cmp.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/neg-vs-pos-0.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/LICENSE delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/json.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/leaves.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/negative.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/scrub.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/stringify.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/readme.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/circular.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/date.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/equal.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/error.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/has.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/instance.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/interface.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/json.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/keys.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/leaves.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/lib/deep_equal.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/mutability.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/negative.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/obj.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/siblings.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stop.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stringify.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/subexpr.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/super_deep.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/testling/leaves.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/diffing-NaN.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/html.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/g.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/usr-local.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/glob.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits_browser.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/minimatch.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/basic.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/brace-expand.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/caching.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/defaults.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/00-setup.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-comparison.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-results.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/cwd-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/globstar-match.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/mark.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/new-glob-optional-options.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/nocase-nomagic.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/pause-resume.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/readme-issue.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root-nomount.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/stat.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/zz-cleanup.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits_browser.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/examples/pow.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/readme.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/chmod.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/clobber.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/mkdirp.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm_sync.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/race.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/rel.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/return.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/return_sync.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/root.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/sync.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask_sync.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/README.md delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/bin/nopt.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/examples/my-program.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/lib/nopt.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/abbrev.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/test/basic.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/prof.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/tiny.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/run.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/src.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.travis.yml delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/README.markdown delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/microwave.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/bs.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/index.html delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/main.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/server.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/wrap.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/index.js delete mode 120000 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/.bin/uglifyjs delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/README.markdown delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/json.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/leaves.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/negative.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/scrub.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/stringify.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/index.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/main.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/circular.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/date.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/equal.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/instance.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/interface.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/json.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/keys.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/leaves.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/lib/deep_equal.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/mutability.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/negative.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/obj.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/siblings.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stop.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stringify.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/subexpr.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/super_deep.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/.npmignore delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.html delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.org delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/bin/uglifyjs delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/docstyle.css delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/lib/object-ast.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/lib/parse-js.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/lib/process.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/lib/squeeze-more.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/package.json~ delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/beautify.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/testparser.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/array1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/array2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/array3.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/array4.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/assignment.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/concatstring.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/const.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/empty-blocks.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/forstatement.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/if.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/ifreturn.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/ifreturn2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue10.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue11.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue13.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue14.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue16.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue17.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue20.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue21.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue25.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue27.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue28.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue29.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue30.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue34.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue4.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue48.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue50.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue53.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue54.1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue68.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue69.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/issue9.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/mangle.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/null_string.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/strict-equals.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/var.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/whitespace.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/expected/with.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/array1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/array2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/array3.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/array4.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/assignment.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/concatstring.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/const.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/empty-blocks.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/forstatement.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/if.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/ifreturn.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/ifreturn2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue10.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue11.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue13.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue14.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue16.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue17.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue20.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue21.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue25.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue27.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue28.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue29.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue30.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue34.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue4.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue48.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue50.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue53.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue54.1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue68.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue69.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue9.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/mangle.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/null_string.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/strict-equals.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/var.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/whitespace.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/with.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/scripts.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/hoist.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument2.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/uglify-js.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/ast.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/err.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail/src.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/label.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/microwave.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/parent.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/wrap.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/cover.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/return.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/src/cover.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/interface.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/src/coverage.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/index.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map-ordered.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/bind-actor.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/chain.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/slide.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/LICENSE delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/README.md delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/yamlish.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/bailout.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/foo.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/t.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/buffer_compare.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/common.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/debug-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/deep.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/end-exception/t.js delete mode 100755 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/executed.sh delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/expose-gc-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/independent-timeouts.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/isolated-conf-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/meta-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/nested-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/non-tap-output.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/not-executed.sh delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/output-childtest-description.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/result-trap.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/segv.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test-with-plan.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/test-test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/timeout.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/trivial-success.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/undefined_indented.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/valid-command.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/nodelint.cfg delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/junit.xml.ejs delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/license.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/nodeunit.css delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/coffee/mock_coffee_module.coffee delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module3.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module4.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/example_test.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode1.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode2.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode3.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-base.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-bettererrors.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-cli.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-failing-callbacks.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-httputil.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runfiles.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runmodule.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runtest.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-sandbox.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase-legacy.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase.js delete mode 100644 node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test.html delete mode 100644 node_modules/grunt-contrib-nodeunit/package.json delete mode 100644 node_modules/grunt-contrib-nodeunit/tasks/nodeunit.js delete mode 100644 node_modules/grunt-contrib-nodeunit/test/fixtures/fail.js delete mode 100644 node_modules/grunt-contrib-nodeunit/test/nodeunit_test.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile.lock delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Rakefile delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/dist/underscore.string.min.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/run-qunit.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/speed.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/strings.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/strings_standalone.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test.html delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_standalone.html delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/arrays.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/chaining.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/collections.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/functions.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/index.html delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/objects.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/speed.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/utility.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/vendor/jquery.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/vendor/jslitmus.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/vendor/qunit.css delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/vendor/qunit.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/underscore.js delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/.npmignore delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/.travis.yml delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/CNAME delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/CONTRIBUTING.md delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/favicon.ico delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/index.html delete mode 100644 node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/index.js diff --git a/node_modules/grunt-contrib-jshint/.jshintignore b/node_modules/grunt-contrib-jshint/.jshintignore deleted file mode 100644 index 7365357..0000000 --- a/node_modules/grunt-contrib-jshint/.jshintignore +++ /dev/null @@ -1 +0,0 @@ -test/fixtures/dontlint.txt \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/.jshintrc b/node_modules/grunt-contrib-jshint/.jshintrc deleted file mode 100644 index 6b61881..0000000 --- a/node_modules/grunt-contrib-jshint/.jshintrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "curly": true, // true: Require {} for every new block or scope - "eqeqeq": true, // true: Require triple equals (===) for comparison - "immed": true, // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());` - "latedef": true, // true: Require variables/functions to be defined before being used - "newcap": true, // true: Require capitalization of all constructor functions e.g. `new F()` - "noarg": true, // true: Prohibit use of `arguments.caller` and `arguments.callee` - "sub": true, // true: Tolerate using `[]` notation when it can still be expressed in dot notation - "undef": true, // true: Require all non-global variables to be declared (prevents global leaks) - "boss": true, // true: Tolerate assignments where comparisons would be expected - "eqnull": true, // true: Tolerate use of `== null` - "node": true // Node.js -} diff --git a/node_modules/grunt-contrib-jshint/.npmignore b/node_modules/grunt-contrib-jshint/.npmignore deleted file mode 100644 index 5cb6bfd..0000000 --- a/node_modules/grunt-contrib-jshint/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -npm-debug.log -tmp \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/.travis.yml b/node_modules/grunt-contrib-jshint/.travis.yml deleted file mode 100644 index 5766191..0000000 --- a/node_modules/grunt-contrib-jshint/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" -before_script: - - npm install -g grunt-cli \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/AUTHORS b/node_modules/grunt-contrib-jshint/AUTHORS deleted file mode 100644 index 75165ef..0000000 --- a/node_modules/grunt-contrib-jshint/AUTHORS +++ /dev/null @@ -1,2 +0,0 @@ -"Cowboy" Ben Alman (http://benalman.com/) -Tyler Kellen (http://goingslowly.com/) diff --git a/node_modules/grunt-contrib-jshint/CHANGELOG b/node_modules/grunt-contrib-jshint/CHANGELOG deleted file mode 100644 index d44f837..0000000 --- a/node_modules/grunt-contrib-jshint/CHANGELOG +++ /dev/null @@ -1,93 +0,0 @@ -v0.6.5: - date: 2013-10-23 - changes: - - Fix output when maxerr is low. -v0.6.4: - date: 2013-08-29 - changes: - - jshintrc now loaded by jshint allowing comments. -v0.6.3: - date: 2013-08-15 - changes: - - Fix module location for jshint 2.1.10. -v0.6.2: - date: 2013-07-29 - changes: - - Update to jshint 2.1.7. -v0.6.1: - date: 2013-07-27 - changes: - - Peg jshint to 2.1.4 until breaking changes in 2.1.5 are fixed. -v0.6.0: - date: 2013-06-02 - changes: - - Dont always succeed the task when using a custom reporter. - - Bump jshint to 2.1.3. -v0.5.4: - date: 2013-05-22 - changes: - - Fix default reporter to show offending file. -v0.5.3: - date: 2013-05-19 - changes: - - "Performance: Execute the reporter once rather than per file." -v0.5.2: - date: 2013-05-18 - changes: - - Fix printing too many erroneous ignored file errors. -v0.5.1: - date: 2013-05-17 - changes: - - Fix for when only 1 file is lint free. -v0.5.0: - date: 2013-05-17 - changes: - - Bump to jshint 2.0. - - Add support for .jshintignore files and ignores option - - Add support for extensions option. - - Add support for custom reporters and output report to a file. -v0.4.3: - date: 2013-04-08 - changes: - - Fix evaluation of predef option when it's an object. -v0.4.2: - date: 2013-04-08 - changes: - - Avoid wiping force option when jshintrc is used. -v0.4.1: - date: 2013-04-06 - changes: - - Fix to allow object type for deprecated predef. -v0.4.0: - date: 2013-04-04 - changes: - - Revert task level options to override jshintrc files. -v0.3.0: - date: 2013-03-13 - changes: - - Bump to JSHint 1.1.0. - - Add force option to report JSHint errors but not fail the task. - - Add error/warning code to message. - - Allow task level options to override jshintrc file. -v0.2.0: - date: 2013-02-26 - changes: - - Bump to JSHint 1.0 -v0.1.1: - date: 2013-02-15 - changes: - - First official release for Grunt 0.4.0. -v0.1.1rc6: - date: 2013-01-18 - changes: - - Updating grunt/gruntplugin dependencies to rc6. - - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. -v0.1.1rc5: - date: 2013-01-09 - changes: - - Updating to work with grunt v0.4.0rc5. - - Switching to this.filesSrc api. -v0.1.0: - date: 2012-10-18 - changes: - - Work in progress, not yet officially released. diff --git a/node_modules/grunt-contrib-jshint/CONTRIBUTING.md b/node_modules/grunt-contrib-jshint/CONTRIBUTING.md deleted file mode 100644 index 5d08cc3..0000000 --- a/node_modules/grunt-contrib-jshint/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project. diff --git a/node_modules/grunt-contrib-jshint/Gruntfile.js b/node_modules/grunt-contrib-jshint/Gruntfile.js deleted file mode 100644 index 0a65eeb..0000000 --- a/node_modules/grunt-contrib-jshint/Gruntfile.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * grunt-contrib-jshint - * http://gruntjs.com/ - * - * Copyright (c) 2013 "Cowboy" Ben Alman, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -module.exports = function(grunt) { - - // Project configuration. - grunt.initConfig({ - jshint: { - allFiles: [ - 'Gruntfile.js', - 'tasks/**/*.js', - '<%= nodeunit.tests %>', - ], - individualFiles: { - files: [ - {src: 'Gruntfile.js'}, - {src: 'tasks/**/*.js'}, - {src: '<%= nodeunit.tests %>'}, - ], - }, - withReporterShouldFail: { - options: { - reporter: 'checkstyle', - reporterOutput: 'tmp/report.xml', - force: true, - }, - src: ['test/fixtures/missingsemicolon.js'], - }, - ignoresSupport: { - src: ['test/fixtures/dontlint.txt'], - }, - options: { - jshintrc: '.jshintrc', - }, - }, - - // Unit tests. - nodeunit: { - tests: ['test/*_test.js'], - }, - }); - - // Actually load this plugin's task(s). - grunt.loadTasks('tasks'); - - // These plugins provide necessary tasks. - grunt.loadNpmTasks('grunt-contrib-nodeunit'); - grunt.loadNpmTasks('grunt-contrib-internal'); - - // Whenever the "test" task is run, run the "nodeunit" task. - grunt.registerTask('test', ['jshint', 'nodeunit']); - - // By default, lint and run all tests. - grunt.registerTask('default', ['test', 'build-contrib']); - -}; diff --git a/node_modules/grunt-contrib-jshint/LICENSE-MIT b/node_modules/grunt-contrib-jshint/LICENSE-MIT deleted file mode 100644 index 8368849..0000000 --- a/node_modules/grunt-contrib-jshint/LICENSE-MIT +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 "Cowboy" Ben Alman, 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/grunt-contrib-jshint/README.md b/node_modules/grunt-contrib-jshint/README.md deleted file mode 100644 index 2aad179..0000000 --- a/node_modules/grunt-contrib-jshint/README.md +++ /dev/null @@ -1,232 +0,0 @@ -# grunt-contrib-jshint v0.6.5 [![Build Status](https://travis-ci.org/gruntjs/grunt-contrib-jshint.png?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-jshint) - -> Validate files with JSHint. - - - -## Getting Started -This plugin requires Grunt `~0.4.0` - -If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: - -```shell -npm install grunt-contrib-jshint --save-dev -``` - -Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: - -```js -grunt.loadNpmTasks('grunt-contrib-jshint'); -``` - - - - -## Jshint task -_Run this task with the `grunt jshint` command._ - -Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide. - -For more explanations of the lint errors JSHint will throw at you please visit [jslinterrors.com](http://jslinterrors.com/). - -### Options - -Any specified option will be passed through directly to [JSHint][], thus you can specify any option that JSHint supports. See the [JSHint documentation][] for a list of supported options. - -[JSHint]: http://www.jshint.com/ -[JSHint documentation]: http://www.jshint.com/docs/ - -A few additional options are supported: - -#### globals -Type: `Object` -Default value: `null` - -A map of global variables, with keys as names and a boolean value to determine if they are assignable. This is not a standard JSHint option, but is passed into the `JSHINT` function as its third argument. See the [JSHint documentation][] for more information. - -#### jshintrc -Type: `String` -Default value: `null` - -If this filename is specified, options and globals defined therein will be used. The `jshintrc` file must be valid JSON and looks something like this: - -```json -{ - "curly": true, - "eqnull": true, - "eqeqeq": true, - "undef": true, - "globals": { - "jQuery": true - } -} -``` - -*Be aware that `jshintrc` settings are not merged with your Grunt options.* - -#### extensions -Type: `String` -Default value: `''` - -A list of non-dot-js extensions to check. - -#### ignores -Type: `Array` -Default value: `null` - -A list of files and dirs to ignore. This will override your `.jshintignore` file if set and does not merge. - -#### force -Type: `Boolean` -Default value: `false` - -Set `force` to `true` to report JSHint errors but not fail the task. - -#### reporter -Type: `String` -Default value: `null` - -Allows you to modify this plugins output. By default it will use a built-in Grunt reporter. Set the path to your own custom reporter or to one of the built-in JSHint reporters: `jslint` or `checkstyle`. - -See also: [Writing your own JSHint reporter.](http://jshint.com/docs/reporters/) - -#### reporterOutput -Type: `String` -Default value: `null` - -Specify a filepath to output the results of a reporter. If `reporterOutput` is specified then all output will be written to the given filepath instead of printed to stdout. - -### Usage examples - -#### Wildcards -In this example, running `grunt jshint:all` (or `grunt jshint` because `jshint` is a [multi task](http://gruntjs.com/configuring-tasks#task-configuration-and-targets)) will lint the project's Gruntfile as well as all JavaScript files in the `lib` and `test` directories and their subdirectores, using the default JSHint options. - -```js -// Project configuration. -grunt.initConfig({ - jshint: { - all: ['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js'] - } -}); -``` - -#### Linting before and after concatenating -In this example, running `grunt jshint` will lint both the "beforeconcat" set and "afterconcat" sets of files. This is not ideal, because `dist/output.js` may get linted before it gets created via the [grunt-contrib-concat plugin](https://github.com/gruntjs/grunt-contrib-concat) `concat` task. - -In this case, you should lint the "beforeconcat" files first, then concat, then lint the "afterconcat" files, by running `grunt jshint:beforeconcat concat jshint:afterconcat`. - -```js -// Project configuration. -grunt.initConfig({ - concat: { - dist: { - src: ['src/foo.js', 'src/bar.js'], - dest: 'dist/output.js' - } - }, - jshint: { - beforeconcat: ['src/foo.js', 'src/bar.js'], - afterconcat: ['dist/output.js'] - } -}); -``` - -#### Specifying JSHint options and globals - -In this example, custom JSHint options are specified. Note that when `grunt jshint:uses_defaults` is run, those files are linted using the default options, but when `grunt jshint:with_overrides` is run, those files are linted using _merged_ task/target options. - -```js -// Project configuration. -grunt.initConfig({ - jshint: { - options: { - curly: true, - eqeqeq: true, - eqnull: true, - browser: true, - globals: { - jQuery: true - }, - }, - uses_defaults: ['dir1/**/*.js', 'dir2/**/*.js'], - with_overrides: { - options: { - curly: false, - undef: true, - }, - files: { - src: ['dir3/**/*.js', 'dir4/**/*.js'] - }, - } - }, -}); -``` - -#### Ignoring specific warnings - -If you would like to ignore a specific warning: - -```shell -[L24:C9] W015: Expected '}' to have an indentation at 11 instead at 9. -``` - -You can toggle it by prepending `-` to the warning id as an option: - -```js -grunt.initConfig({ - jshint: { - ignore_warning: { - options: { - '-W015': true, - }, - src: ['**/*.js'], - }, - }, -}); -``` - -#### Ignoring specific files - -Occasionally application files and third party libraries share the same directory. To exclude third party code, but include all current and future application files, use a glob for `files` and specifically exclude libraries using `ignores`. In this example, the jQuery file is matched by the glob but subsequently ignored when JSHint does its analysis. - -```js -grunt.initConfig({ - jshint: { - files: ['js/*.js'], - options: { - ignores: ['js/jquery.js'] - } - } -}); -``` - - -## Release History - - * 2013-10-23   v0.6.5   Fix output when maxerr is low. - * 2013-08-29   v0.6.4   jshintrc now loaded by jshint allowing comments. - * 2013-08-15   v0.6.3   Fix module location for jshint 2.1.10. - * 2013-07-29   v0.6.2   Update to jshint 2.1.7. - * 2013-07-27   v0.6.1   Peg jshint to 2.1.4 until breaking changes in 2.1.5 are fixed. - * 2013-06-02   v0.6.0   Dont always succeed the task when using a custom reporter. Bump jshint to 2.1.3. - * 2013-05-22   v0.5.4   Fix default reporter to show offending file. - * 2013-05-19   v0.5.3   Performance: Execute the reporter once rather than per file. - * 2013-05-18   v0.5.2   Fix printing too many erroneous ignored file errors. - * 2013-05-17   v0.5.1   Fix for when only 1 file is lint free. - * 2013-05-17   v0.5.0   Bump to jshint 2.0. Add support for .jshintignore files and ignores option Add support for extensions option. Add support for custom reporters and output report to a file. - * 2013-04-08   v0.4.3   Fix evaluation of predef option when it's an object. - * 2013-04-08   v0.4.2   Avoid wiping force option when jshintrc is used. - * 2013-04-06   v0.4.1   Fix to allow object type for deprecated predef. - * 2013-04-04   v0.4.0   Revert task level options to override jshintrc files. - * 2013-03-13   v0.3.0   Bump to JSHint 1.1.0. Add force option to report JSHint errors but not fail the task. Add error/warning code to message. Allow task level options to override jshintrc file. - * 2013-02-26   v0.2.0   Bump to JSHint 1.0 - * 2013-02-15   v0.1.1   First official release for Grunt 0.4.0. - * 2013-01-18   v0.1.1rc6   Updating grunt/gruntplugin dependencies to rc6. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. - * 2013-01-09   v0.1.1rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api. - * 2012-10-18   v0.1.0   Work in progress, not yet officially released. - ---- - -Task submitted by ["Cowboy" Ben Alman](http://benalman.com/) - -*This file was generated on Wed Oct 23 2013 20:33:11.* diff --git a/node_modules/grunt-contrib-jshint/docs/jshint-examples.md b/node_modules/grunt-contrib-jshint/docs/jshint-examples.md deleted file mode 100644 index a64ef65..0000000 --- a/node_modules/grunt-contrib-jshint/docs/jshint-examples.md +++ /dev/null @@ -1,103 +0,0 @@ -# Usage examples - -## Wildcards -In this example, running `grunt jshint:all` (or `grunt jshint` because `jshint` is a [multi task](http://gruntjs.com/configuring-tasks#task-configuration-and-targets)) will lint the project's Gruntfile as well as all JavaScript files in the `lib` and `test` directories and their subdirectores, using the default JSHint options. - -```js -// Project configuration. -grunt.initConfig({ - jshint: { - all: ['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js'] - } -}); -``` - -## Linting before and after concatenating -In this example, running `grunt jshint` will lint both the "beforeconcat" set and "afterconcat" sets of files. This is not ideal, because `dist/output.js` may get linted before it gets created via the [grunt-contrib-concat plugin](https://github.com/gruntjs/grunt-contrib-concat) `concat` task. - -In this case, you should lint the "beforeconcat" files first, then concat, then lint the "afterconcat" files, by running `grunt jshint:beforeconcat concat jshint:afterconcat`. - -```js -// Project configuration. -grunt.initConfig({ - concat: { - dist: { - src: ['src/foo.js', 'src/bar.js'], - dest: 'dist/output.js' - } - }, - jshint: { - beforeconcat: ['src/foo.js', 'src/bar.js'], - afterconcat: ['dist/output.js'] - } -}); -``` - -## Specifying JSHint options and globals - -In this example, custom JSHint options are specified. Note that when `grunt jshint:uses_defaults` is run, those files are linted using the default options, but when `grunt jshint:with_overrides` is run, those files are linted using _merged_ task/target options. - -```js -// Project configuration. -grunt.initConfig({ - jshint: { - options: { - curly: true, - eqeqeq: true, - eqnull: true, - browser: true, - globals: { - jQuery: true - }, - }, - uses_defaults: ['dir1/**/*.js', 'dir2/**/*.js'], - with_overrides: { - options: { - curly: false, - undef: true, - }, - files: { - src: ['dir3/**/*.js', 'dir4/**/*.js'] - }, - } - }, -}); -``` - -## Ignoring specific warnings - -If you would like to ignore a specific warning: - -```shell -[L24:C9] W015: Expected '}' to have an indentation at 11 instead at 9. -``` - -You can toggle it by prepending `-` to the warning id as an option: - -```js -grunt.initConfig({ - jshint: { - ignore_warning: { - options: { - '-W015': true, - }, - src: ['**/*.js'], - }, - }, -}); -``` - -## Ignoring specific files - -Occasionally application files and third party libraries share the same directory. To exclude third party code, but include all current and future application files, use a glob for `files` and specifically exclude libraries using `ignores`. In this example, the jQuery file is matched by the glob but subsequently ignored when JSHint does its analysis. - -```js -grunt.initConfig({ - jshint: { - files: ['js/*.js'], - options: { - ignores: ['js/jquery.js'] - } - } -}); -``` diff --git a/node_modules/grunt-contrib-jshint/docs/jshint-options.md b/node_modules/grunt-contrib-jshint/docs/jshint-options.md deleted file mode 100644 index d1369a0..0000000 --- a/node_modules/grunt-contrib-jshint/docs/jshint-options.md +++ /dev/null @@ -1,66 +0,0 @@ -# Options - -Any specified option will be passed through directly to [JSHint][], thus you can specify any option that JSHint supports. See the [JSHint documentation][] for a list of supported options. - -[JSHint]: http://www.jshint.com/ -[JSHint documentation]: http://www.jshint.com/docs/ - -A few additional options are supported: - -## globals -Type: `Object` -Default value: `null` - -A map of global variables, with keys as names and a boolean value to determine if they are assignable. This is not a standard JSHint option, but is passed into the `JSHINT` function as its third argument. See the [JSHint documentation][] for more information. - -## jshintrc -Type: `String` -Default value: `null` - -If this filename is specified, options and globals defined therein will be used. The `jshintrc` file must be valid JSON and looks something like this: - -```json -{ - "curly": true, - "eqnull": true, - "eqeqeq": true, - "undef": true, - "globals": { - "jQuery": true - } -} -``` - -*Be aware that `jshintrc` settings are not merged with your Grunt options.* - -## extensions -Type: `String` -Default value: `''` - -A list of non-dot-js extensions to check. - -## ignores -Type: `Array` -Default value: `null` - -A list of files and dirs to ignore. This will override your `.jshintignore` file if set and does not merge. - -## force -Type: `Boolean` -Default value: `false` - -Set `force` to `true` to report JSHint errors but not fail the task. - -## reporter -Type: `String` -Default value: `null` - -Allows you to modify this plugins output. By default it will use a built-in Grunt reporter. Set the path to your own custom reporter or to one of the built-in JSHint reporters: `jslint` or `checkstyle`. - -See also: [Writing your own JSHint reporter.](http://jshint.com/docs/reporters/) - -## reporterOutput -Type: `String` -Default value: `null` - -Specify a filepath to output the results of a reporter. If `reporterOutput` is specified then all output will be written to the given filepath instead of printed to stdout. diff --git a/node_modules/grunt-contrib-jshint/docs/jshint-overview.md b/node_modules/grunt-contrib-jshint/docs/jshint-overview.md deleted file mode 100644 index 70cb954..0000000 --- a/node_modules/grunt-contrib-jshint/docs/jshint-overview.md +++ /dev/null @@ -1,3 +0,0 @@ -Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide. - -For more explanations of the lint errors JSHint will throw at you please visit [jslinterrors.com](http://jslinterrors.com/). diff --git a/node_modules/grunt-contrib-jshint/node_modules/.bin/jshint b/node_modules/grunt-contrib-jshint/node_modules/.bin/jshint deleted file mode 120000 index 1b5b30c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/.bin/jshint +++ /dev/null @@ -1 +0,0 @@ -../jshint/bin/jshint \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/README.md deleted file mode 100644 index c37da25..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/README.md +++ /dev/null @@ -1,40 +0,0 @@ -JSHint, A Static Code Analysis Tool for JavaScript --------------------------------------------------- - -\[ [Use it online](http://jshint.com/) • [About](http://jshint.com/about/) • -[Docs](http://jshint.com/docs/) • [FAQ](http://jshint.com/docs/faq) • -[Install](http://jshint.com/install/) • [Hack](http://jshint.com/hack/) • -[Blog](http://jshint.com/blog/) • [Twitter](https://twitter.com/jshint/) \] - -[![Build Status](https://travis-ci.org/jshint/jshint.png?branch=master)](https://travis-ci.org/jshint/jshint) -[![NPM version](https://badge.fury.io/js/jshint.png)](http://badge.fury.io/js/jshint) - -JSHint is a community-driven tool to detect errors and potential problems -in JavaScript code and to enforce your team’s coding conventions. It is -very flexible so you can easily adjust it to your particular coding guidelines -and the environment you expect your code to execute in. - -#### Reporting a bug - -To report a bug simply create a -[new GitHub Issue](https://github.com/jshint/jshint/issues/new) and describe -your problem or suggestion. We welcome all kind of feedback regarding -JSHint including but not limited to: - - * When JSHint doesn't work as expected - * When JSHint complains about valid JavaScript code that works in all browsers - * When you simply want a new option or feature - -Before reporting a bug look around to see if there are any open or closed tickets -that cover your issue. And remember the wisdom: pull request > bug report > tweet. - - -#### License - -JSHint is distributed under the MIT License. One file and one file only -(src/stable/jshint.js) is distributed under the slightly modified MIT License. - - -#### Thank you! - -We really appreciate all kind of feedback and contributions. Thanks for using and supporting JSHint! diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/apply b/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/apply deleted file mode 100755 index ab0da40..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/apply +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node - -var shjs = require("shelljs"); -var url = "https://github.com/jshint/jshint/pull/" + process.argv[2] + ".diff"; - -shjs.exec('curl "' + url + '" | git apply'); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/build b/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/build deleted file mode 100755 index 92dd2f9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/build +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env node -/*jshint shelljs:true */ - -"use strict"; - -var browserify = require("browserify"); -var bundle = browserify("./src/jshint.js"); -var version = require("../package.json").version; -require("shelljs/make"); - -if (!test("-e", "../dist")) - mkdir("../dist"); - -bundle.require("./src/jshint.js", { expose: "jshint" }); -bundle.bundle({}, function (err, src) { - var web = "./dist/jshint-" + version + ".js"; - var rhino = "./dist/jshint-rhino-" + version + ".js"; - - [ "// " + version, - "var JSHINT;", - "var window;", - "if (typeof window === 'undefined') window = {};", - "(function () {", - "var require;", - src, - "JSHINT = require('jshint').JSHINT;", - "}());" - ].join("\n").to(web); - - ("#!/usr/bin/env rhino\nvar window = {};\n" + cat(web, "./src/platforms/rhino.js")).to(rhino); - chmod("+x", rhino); -}); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/changelog b/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/changelog deleted file mode 100755 index 48f5e6f..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/changelog +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env node -/*jshint shelljs:true, lastsemic:true, -W101*/ - -"use strict"; - -var version = require("../package.json").version; -require("shelljs/make"); - -exec("git log --format='%H|%h|%an|%s' " + version + "..HEAD", { silent: true }, function (code, output) { - if (code !== 0) - return void console.log("git log return code is non-zero"); - - var commits = output.split("\n") - .filter(function (cmt) { return cmt.trim() !== "" }) - .map(function (cmt) { return cmt.split("|") }); - - var html = ""; - var authors = {}; - - commits.forEach(function (cmt) { - var tr = ""; - tr += "" + cmt[1] + ""; - tr += "" + cmt[3].replace(/(#(\d+))/, "$1") + ""; - html += "" + tr + "\n"; - - if (cmt[2] !== "Anton Kovalyov") - authors[cmt[2]] = true; - }); - - echo(""); - echo("\n" + html + "
\n"); - - if (Object.keys(authors).length) { - echo("

Thanks to " + Object.keys(authors).join(", ") + " for sending patches!

"); - } -}); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/jshint b/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/jshint deleted file mode 100755 index f56105f..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/jshint +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node - -require("../src/cli.js").interpret(process.argv); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/land b/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/land deleted file mode 100755 index 2e3c026..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/bin/land +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env node - -var url = "https://github.com/jshint/jshint/pull/" + process.argv[2] + ".patch"; -var https = require("https"); -var shjs = require("shelljs"); -var opts = require("url").parse(url); -var msg = process.argv[3]; - -opts.rejectUnauthorized = false; -opts.agent = new https.Agent(opts); - -https.get(opts, succ).on("error", err); - -function succ(res) { - if (res.statusCode !== 200) - return void console.log("error:", res.statusCode); - - var data = ""; - res.on("data", function (chunk) { - data += chunk.toString(); - }); - - res.on("end", function () { - data = data.split("\n"); - data = data[1].replace(/^From\:\s/, ""); - data = data.replace(/"/g, ""); - - shjs.exec("git commit -s --author=\"" + data + "\" --message=\"" + msg + "\""); - }) -} - -function err(res) { - console.log("error:", res.message); -} - - - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/.bin/shjs b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/.bin/shjs deleted file mode 120000 index a044997..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/.bin/shjs +++ /dev/null @@ -1 +0,0 @@ -../shelljs/bin/shjs \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/README.md deleted file mode 100644 index 0fe30d4..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/README.md +++ /dev/null @@ -1,196 +0,0 @@ -**cli is a toolkit for rapidly building command line apps - it includes:** - -- Full featured opts/args parser -- Plugin support for adding common options and switches -- Helper methods for working with input/output and spawning child processes -- Output colored/styled messages, [progress bars](https://github.com/chriso/cli/blob/master/examples/progress.js) or [spinners](https://github.com/chriso/cli/blob/master/examples/spinner.js) -- Command [auto-completion](https://github.com/chriso/cli/blob/master/examples/command.js) and [glob support](https://github.com/chriso/cli/blob/master/examples/glob.js) - -Install using `npm install cli` or just bundle [cli.js](https://github.com/chriso/cli/raw/master/cli-min.js) with your app. - -## Example apps - -### sort.js - -```javascript -#!/usr/bin/env node -require('cli').withStdinLines(function(lines, newline) { - this.output(lines.sort().join(newline)); -}); -``` - -Try it out - -```bash -$ ./sort.js < input.txt -``` - -Let's add support for an `-n` switch to use a numeric sort, and a `-r` switch to reverse output - only 5 extra lines of code (!) - -```javascript -var cli = require('cli'), options = cli.parse(); - -cli.withStdinLines(function(lines, newline) { - lines.sort(!options.n ? null : function(a, b) { - return parseInt(a) > parseInt(b); - }); - if (options.r) lines.reverse(); - this.output(lines.join(newline)); -}); -``` - -### static.js - -Let's create a static file server with daemon support to see the opts parser + plugins in use - note: this requires `npm install creationix daemon` - -```javascript -var cli = require('cli').enable('daemon', 'status'); //Enable 2 plugins - -cli.parse({ - log: ['l', 'Enable logging'], - port: ['p', 'Listen on this port', 'number', 8080], - serve: [false, 'Serve static files from PATH', 'path', './public'] -}); - -cli.main(function(args, options) { - var server, middleware = []; - - if (options.log) { - this.debug('Enabling logging'); - middleware.push(require('creationix/log')()); - } - - this.debug('Serving files from ' + options.serve); - middleware.push(require('creationix/static')('/', options.serve, 'index.html')); - - server = this.createServer(middleware).listen(options.port); - - this.ok('Listening on port ' + options.port); -}); -``` - -To output usage information - -```bash -$ ./static.js --help -``` - -To create a daemon that serves files from */tmp*, run - -```bash -$ ./static.js -ld --serve=/tmp -``` - -For more examples, see [./examples](https://github.com/chriso/cli/tree/master/examples) - -## Helper methods - -cli has methods that collect stdin (newline is autodetected as \n or \r\n) - -```javascript -cli.withStdin(callback); //callback receives stdin as a string -cli.withStdinLines(callback); //callback receives stdin split into an array of lines (lines, newline) -``` - -cli also has a lower level method for working with input line by line (see [./examples/cat.js](https://github.com/chriso/cli/blob/master/examples/cat.js) for an example). - -```javascript -cli.withInput(file, function (line, newline, eof) { - if (!eof) { - this.output(line + newline); - } -}); -``` - -*Note: `file` can be omitted if you want to work with stdin* - -To output a progress bar, call - -```javascript -cli.progress(progress); //Where 0 <= progress <= 1 -``` - -To spawn a child process, use - -```javascript -cli.exec(cmd, callback); //callback receives the output of the process (split into lines) -``` - -cli also comes bundled with kof's [node-natives](https://github.com/kof/node-natives) (access with cli.native) and creationix' [stack](https://github.com/creationix/stack) (access with cli.createServer) - -## Plugins - -Plugins are a way of adding common opts and can be enabled using - -```javascript -cli.enable(plugin1, [plugin2, ...]); //To disable, use the equivalent disable() method -``` - -**help** - *enabled by default* - -Adds `-h,--help` to output auto-generated usage information - -**version** - -Adds `-v,--version` to output version information for the app. cli will attempt to locate and parse a nearby *package.json* - -To set your own app name and version, use `cli.setApp(app_name, version)` - -**status** - -Adds options to show/hide the stylized status messages that are output to the console when using one of these methods - -```javascript -cli.debug(msg); //Only shown when using --debug -cli.error(msg); -cli.fatal(msg); //Exits the process after outputting msg -cli.info(msg); -cli.ok(msg); -``` - -`-k,--no-color` will omit ANSI color escapes from the output - -**glob** - *requires* `npm install glob` - -Enables glob matching of arguments - -**daemon** - *requires* `npm install daemon` - -Adds `-d,--daemon ARG` for daemonizing the process and controlling the resulting daemon - -`ARG` can be either start (default), stop, restart, pid (outputs the daemon's pid if it's running), or log (output the daemon's stdout+stderr) - -**timeout** - -Adds `-t,--timeout N` to exit the process after N seconds with an error - -**catchall** - -Adds `-c,--catch` to catch and output uncaughtExceptions and resume execution - -*Note: Plugins are automatically disabled if an option or switch of the same name is already defined* - -## LICENSE - -(MIT license) - -Copyright (c) 2010 Chris O'Hara - -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/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/cli.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/cli.js deleted file mode 100644 index f94e973..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/cli.js +++ /dev/null @@ -1,1133 +0,0 @@ -/** - * Copyright (c) 2010 Chris O'Hara - * - * 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: cli includes kof/node-natives and creationix/stack. I couldn't find - //license information for either - contact me if you want your license added - -var cli = exports, - argv, curr_opt, curr_val, full_opt, is_long, - short_tags = [], opt_list, parsed = {}, - usage, argv_parsed, command_list, commands, - daemon, daemon_arg, no_color, show_debug; - -cli.app = null; -cli.version = null; -cli.argv = []; -cli.argc = 0; - -cli.options = {}; -cli.args = []; -cli.command; - -cli.width = 70; -cli.option_width = 25; - -/** - * Bind kof's node-natives (https://github.com/kof/node-natives) to `cli.native` - * - * Rather than requiring node natives (e.g. var fs = require('fs')), all - * native modules can be accessed like `cli.native.fs` - */ -cli.native = {}; -var define_native = function (module) { - Object.defineProperty(cli.native, module, { - enumerable: true, - configurable: true, - get: function() { - delete cli.native[module]; - return cli.native[module] = require(module); - } - }); -}; -var natives = process.binding('natives'); -for (var module in natives) { - define_native(module); -} - -cli.output = cli.native.util.print; -cli.exit = process.exit; - -/** - * Define plugins. Plugins can be enabled and disabled by calling: - * - * `cli.enable(plugin1, [plugin2, ...])` - * `cli.disable(plugin1, [plugin2, ...])` - * - * Methods are chainable - `cli.enable(plugin).disable(plugin2)`. - * - * The 'help' plugin is enabled by default. - */ -var enable = { - help: true, //Adds -h, --help - version: false, //Adds -v,--version => gets version by parsing a nearby package.json - daemon: false, //Adds -d,--daemon [ARG] => (see cli.daemon() below) - status: false, //Adds -k,--no-color & --debug => display plain status messages /display debug messages - timeout: false, //Adds -t,--timeout N => timeout the process after N seconds - catchall: false, //Adds -c,--catch => catch and output uncaughtExceptions - glob: false //Adds glob matching => use cli.glob(arg) -} -cli.enable = function (/*plugins*/) { - Array.prototype.slice.call(arguments).forEach(function (plugin) { - switch (plugin) { - case 'daemon': - try { - daemon = require('daemon'); - if (typeof daemon.daemonize !== 'function') { - throw 'Invalid module'; - } - } catch (e) { - cli.fatal('daemon.node not installed. Please run `npm install daemon`'); - } - break; - case 'catchall': - process.on('uncaughtException', function (err) { - cli.error('Uncaught exception: ' + (err.msg || err)); - }); - break; - case 'help': case 'version': case 'status': - case 'autocomplete': case 'timeout': - //Just add switches. - break; - case 'glob': - cli.glob = require('glob'); - break; - default: - cli.fatal('Unknown plugin "' + plugin + '"'); - break; - } - enable[plugin] = true; - }); - return cli; -} -cli.disable = function (/*plugins*/) { - Array.prototype.slice.call(arguments).forEach(function (plugin) { - if (enable[plugin]) { - enable[plugin] = false; - } - }); - return cli; -} - -/** - * Sets argv (default is process.argv). - * - * @param {Array|String} argv - * @param {Boolean} keep_arg0 (optional - default is false) - * @api public - */ -cli.setArgv = function (arr, keep_arg0) { - if (typeof arr == 'string') { - arr = arr.split(' '); - } else { - arr = arr.slice(); - } - cli.app = arr.shift(); - //Strip off argv[0] if it's a node binary - if (!keep_arg0 && ('node' === cli.native.path.basename(cli.app) - || process.execPath === cli.app)) { - cli.app = arr.shift(); - } - cli.app = cli.native.path.basename(cli.app); - argv_parsed = false; - cli.args = cli.argv = argv = arr; - cli.argc = argv.length; - cli.options = {}; - cli.command = null; -}; -cli.setArgv(process.argv); - -/** - * Returns the next opt, or false if no opts are found. - * - * @return {String} opt - * @api public - */ -cli.next = function () { - if (!argv_parsed) { - cli.args = []; - argv_parsed = true; - } - - curr_val = null; - - //If we're currently in a group of short opts (e.g. -abc), return the next opt - if (short_tags.length) { - curr_opt = short_tags.shift(); - full_opt = '-' + curr_opt; - return curr_opt; - } - - if (!argv.length) { - return false; - } - - curr_opt = argv.shift(); - - //If an escape sequence is found (- or --), subsequent opts are ignored - if (curr_opt === '-' || curr_opt === '--') { - while (argv.length) { - cli.args.push(argv.shift()); - } - return false; - } - - //If the next element in argv isn't an opt, add it to the list of args - if (curr_opt[0] !== '-') { - cli.args.push(curr_opt); - return cli.next(); - } else { - //Check if the opt is short/long - is_long = curr_opt[1] === '-'; - curr_opt = curr_opt.substr(is_long ? 2 : 1); - } - - //Accept grouped short opts, e.g. -abc => -a -b -c - if (!is_long && curr_opt.length > 1) { - short_tags = curr_opt.split(''); - return cli.next(); - } - - var eq, len; - - //Check if the long opt is in the form --option=VALUE - if (is_long && (eq = curr_opt.indexOf('=')) >= 0) { - curr_val = curr_opt.substr(eq + 1); - curr_opt = curr_opt.substr(0, eq); - len = curr_val.length; - //Allow values to be quoted - if ((curr_val[0] === '"' && curr_val[len - 1] === '"') || - (curr_val[0] === "'" && curr_val[len - 1] === "'")) - { - curr_val = curr_val.substr(1, len-2); - } - if (curr_val.match(/^[0-9]+$/)) { - curr_val = parseInt(curr_val, 10); - } - } - - //Save the opt representation for later - full_opt = (is_long ? '--' : '-') + curr_opt; - - return curr_opt; -}; - -/** - * Parses command line opts. - * - * `opts` must be an object with opts defined like: - * long_tag: [short_tag, description, value_type, default_value]; - * - * `commands` is an optional array or object for apps that are of the form - * my_app [OPTIONS] [ARGS] - * The command list is output with usage information + there is bundled - * support for auto-completion, etc. - * - * See README.md for more information. - * - * @param {Object} opts - * @param {Object} commands (optional) - * @return {Object} opts (parsed) - * @api public - */ -cli.parse = function (opts, command_def) { - var default_val, i, parsed = cli.options, seen, - catch_all = !opts; - opt_list = opts || {}; - commands = command_def; - command_list = commands || []; - if (commands && !Array.isArray(commands)) { - command_list = Object.keys(commands); - } - while (o = cli.next()) { - seen = false; - for (opt in opt_list) { - if (!(opt_list[opt] instanceof Array)) { - continue; - } - if (!opt_list[opt][0]) { - opt_list[opt][0] = opt; - } - if (o === opt || o === opt_list[opt][0]) { - seen = true; - if (opt_list[opt].length === 2) { - parsed[opt] = true; - break; - } - default_val = null; - if (opt_list[opt].length === 4) { - default_val = opt_list[opt][3]; - } - if (opt_list[opt][2] instanceof Array) { - for (i = 0, l = opt_list[opt][2].length; i < l; i++) { - if (typeof opt_list[opt][2][i] === 'number') { - opt_list[opt][2][i] += ''; - } - } - parsed[opt] = cli.getArrayValue(opt_list[opt][2], is_long ? null : default_val); - break; - } - if (opt_list[opt][2].toLowerCase) { - opt_list[opt][2] = opt_list[opt][2].toLowerCase(); - } - switch (opt_list[opt][2]) { - case 'string': case 1: case true: - parsed[opt] = cli.getValue(default_val); - break; - case 'int': case 'number': case 'num': - case 'time': case 'seconds': case 'secs': case 'minutes': case 'mins': - case 'x': case 'n': - parsed[opt] = cli.getInt(default_val); - break; - case 'float': case 'decimal': - parsed[opt] = cli.getFloat(default_val); - break; - case 'path': case 'file': case 'directory': case 'dir': - parsed[opt] = cli.getPath(default_val, opt_list[opt][2]); - break; - case 'email': - parsed[opt] = cli.getEmail(default_val); - break; - case 'url': case 'uri': case 'domain': case 'host': - parsed[opt] = cli.getUrl(default_val, opt_list[opt][2]); - break; - case 'ip': - parsed[opt] = cli.getIp(default_val); - break; - case 'bool': case 'boolean': case 'on': - parsed[opt] = true; - break; - case 'false': case 'off': case false: case 0: - parsed[opt] = false; - break; - default: - cli.fatal('Unknown opt type "' + opt_list[opt][2] + '"'); - } - break; - } - } - if (process.env.NODE_DISABLE_COLORS) { - no_color = true; - } - if (!seen) { - if (enable.help && (o === 'h' || o === 'help')) { - cli.getUsage(); - process.exit(); - } else if (enable.version && (o === 'v' || o === 'version')) { - if (cli.version == null) { - cli.parsePackageJson(); - } - console.error(cli.app + ' v' + cli.version); - process.exit(); - } else if (enable.daemon && (o === 'd' || o === 'daemon')) { - daemon_arg = cli.getArrayValue(['start','stop','restart','pid','log'], is_long ? null : 'start'); - continue; - } else if (enable.catchall && (o === 'c' || o === 'catch')) { - continue; - } else if (enable.status && (o === 'k' || o === 'no-color' || o === 'debug')) { - no_color = (o === 'k' || o === 'no-color'); - show_debug = o === 'debug'; - continue; - } else if (enable.timeout && (o === 't' || o === 'timeout')) { - var secs = cli.getInt(); - setTimeout(function () { - cli.fatal('Process timed out after ' + secs + 's'); - }, secs * 1000); - continue; - } else if (catch_all) { - parsed[o] = curr_val || true; - continue; - } - cli.fatal('Unknown option ' + full_opt); - } - } - //Fill the remaining options with their default value or null - for (opt in opt_list) { - default_val = opt_list[opt].length === 4 ? opt_list[opt][3] : null; - if (!(opt_list[opt] instanceof Array)) { - parsed[opt] = opt_list[opt]; - continue; - } else if (typeof parsed[opt] === 'undefined') { - parsed[opt] = default_val; - } - } - if (command_list.length) { - if (cli.args.length === 0) { - if (enable.help) { - cli.getUsage(); - } else { - cli.fatal('A command is required (' + command_list.join(', ') + ').'); - } - process.exit(1); - } else { - cli.command = cli.autocompleteCommand(cli.args.shift()); - } - } - cli.argc = cli.args.length; - return parsed; -}; - -/** - * Helper method for matching a command from the command list. - * - * @param {String} command - * @return {String} full_command - * @api public - */ -cli.autocompleteCommand = function (command) { - var list; - if (!(command_list instanceof Array)) { - list = Object.keys(command_list); - } else { - list = command_list; - } - var i, j = 0, c = command.length, tmp_list; - if (list.length === 0 || list.indexOf(command) !== -1) { - return command; - } - for (i = 0; i < c; i++) { - tmp_list = []; - l = list.length; - if (l <= 1) break; - for (j = 0; j < l; j++) - if (list[j].length >= i && list[j][i] === command[i]) - tmp_list.push(list[j]); - list = tmp_list; - } - l = list.length; - if (l === 1) { - return list[0]; - } else if (l === 0) { - cli.fatal('Unknown command "' + command + '"' + (enable.help ? '. Please see --help for more information' : '')); - } else { - list.sort(); - cli.fatal('The command "' + command + '" is ambiguous and could mean "' + list.join('", "') + '"'); - } -}; - -/** - * Adds methods to output styled status messages to stderr. - * - * Added methods are cli.info(msg), cli.error(msg), cli.ok(msg), and - * cli.debug(msg). - * - * To control status messages, use the 'status' plugin - * 1) debug() messages are hidden by default. Display them with - * the --debug opt. - * 2) to hide all status messages, use the -s or --silent opt. - * - * @api private - */ -cli.status = function (msg, type) { - var pre; - switch (type) { - case 'info': - pre = no_color ? 'INFO:' : '\x1B[33mINFO\x1B[0m:'; - break; - case 'debug': - pre = no_color ? 'DEBUG:' : '\x1B[36mDEBUG\x1B[0m:'; - break; - case 'error': - case 'fatal': - pre = no_color ? 'ERROR:' : '\x1B[31mERROR\x1B[0m:'; - break; - case 'ok': - pre = no_color ? 'OK:' : '\x1B[32mOK\x1B[0m:'; - break; - } - msg = pre + ' ' + msg; - if (type === 'fatal') { - console.error(msg); - process.exit(1); - } - if (enable.status && !show_debug && type === 'debug') { - return; - } - console.error(msg); -}; -['info','error','ok','debug','fatal'].forEach(function (type) { - cli[type] = function (msg) { - cli.status(msg, type); - }; -}); - -/** - * Sets the app name and version. - * - * Usage: - * setApp('myapp', '0.1.0'); - * setApp('./package.json'); //Pull name/version from package.json - * - * @param {String} name - * @return cli (for chaining) - * @api public - */ -cli.setApp = function (name, version) { - if (name.indexOf('package.json') !== -1) { - cli.parsePackageJson(name); - } else { - cli.app = name; - cli.version = version; - } - return cli; -}; - -/** - * Parses the version number from package.json. If no path is specified, cli - * will attempt to locate a package.json in ./, ../ or ../../ - * - * @param {String} path (optional) - * @api public - */ -cli.parsePackageJson = function (path) { - var parse_packagejson = function (path) { - var packagejson = JSON.parse(cli.native.fs.readFileSync(path, 'utf8')); - cli.version = packagejson.version; - cli.app = packagejson.name; - }; - var try_all = function (arr, func, err) { - for (var i = 0, l = arr.length; i < l; i++) { - try { - func(arr[i]); - return; - } catch (e) { - if (i === l-1) { - cli.fatal(err); - } - } - } - }; - try { - if (path) { - return parse_packagejson(path); - } - try_all([ - __dirname + '/package.json', - __dirname + '/../package.json', - __dirname + '/../../package.json' - ], parse_packagejson); - } catch (e) { - cli.fatal('Could not detect ' + cli.app + ' version'); - } -}; - -/** - * Sets the usage string - default is `app [OPTIONS] [ARGS]`. - * - * @param {String} u - * @return cli (for chaining) - * @api public - */ -cli.setUsage = function (u) { - usage = u; - return cli; -}; - -var pad = function (str, len) { - if (typeof len === 'undefined') { - len = str; - str = ''; - } - if (str.length < len) { - len -= str.length; - while (len--) str += ' '; - } - return str; -}; - -/** - * Automatically build usage information from the opts list. If the help - * plugin is enabled (default), this info is displayed with -h, --help. - * - * @api public - */ -cli.getUsage = function () { - var short, desc, optional, line, seen_opts = [], - switch_pad = cli.option_width; - - var trunc_desc = function (pref, desc, len) { - var pref_len = pref.length, - desc_len = cli.width - pref_len, - truncated = ''; - if (desc.length <= desc_len) { - return desc; - } - var desc_words = (desc+'').split(' '), chars = 0, word; - while (desc_words.length) { - truncated += (word = desc_words.shift()) + ' '; - chars += word.length; - if (desc_words.length && chars + desc_words[0].length > desc_len) { - truncated += '\n' + pad(pref_len); - chars = 0; - } - } - return truncated; - }; - - usage = usage || cli.app + ' [OPTIONS]' + (command_list.length ? ' ' : '') + ' [ARGS]'; - if (no_color) { - console.error('Usage:\n ' + usage); - console.error('Options: '); - } else { - console.error('\x1b[1mUsage\x1b[0m:\n ' + usage); - console.error('\n\x1b[1mOptions\x1b[0m: '); - } - for (opt in opt_list) { - - if (opt.length === 1) { - long = opt_list[opt][0]; - short = opt; - } else { - long = opt; - short = opt_list[opt][0]; - } - - //Parse opt_list - desc = opt_list[opt][1].trim(); - type = opt_list[opt].length >= 3 ? opt_list[opt][2] : null; - optional = opt_list[opt].length === 4 ? opt_list[opt][3] : null; - - //Build usage line - if (short === long) { - if (short.length === 1) { - line = ' -' + short; - } else { - line = ' --' + long; - } - } else { - line = ' -' + short + ', --' + long; - } - line += ' '; - - if (type) { - if (type instanceof Array) { - desc += '. VALUE must be either [' + type.join('|') + ']'; - type = 'VALUE'; - } - if (type === true || type === 1) { - type = long.toUpperCase(); - } - type = type.toUpperCase(); - if (type === 'FLOAT' || type === 'INT') { - type = 'NUMBER'; - } - line += optional ? '[' + type + ']' : type; - } - line = pad(line, switch_pad); - line += trunc_desc(line, desc); - line += optional ? ' (Default is ' + optional + ')' : ''; - console.error(line.replace('%s', '%\0s')); - - seen_opts.push(short); - seen_opts.push(long); - } - if (enable.timeout && seen_opts.indexOf('t') === -1 && seen_opts.indexOf('timeout') === -1) { - console.error(pad(' -t, --timeout N', switch_pad) + 'Exit if the process takes longer than N seconds'); - } - if (enable.status) { - if (seen_opts.indexOf('k') === -1 && seen_opts.indexOf('no-color') === -1) { - console.error(pad(' -k, --no-color', switch_pad) + 'Omit color from output'); - } - if (seen_opts.indexOf('debug') === -1) { - console.error(pad(' --debug', switch_pad) + 'Show debug information'); - } - } - if (enable.catchall && seen_opts.indexOf('c') === -1 && seen_opts.indexOf('catch') === -1) { - console.error(pad(' -c, --catch', switch_pad) + 'Catch unanticipated errors'); - } - if (enable.daemon && seen_opts.indexOf('d') === -1 && seen_opts.indexOf('daemon') === -1) { - console.error(pad(' -d, --daemon [ARG]', switch_pad) + 'Daemonize the process. Control the daemon using [start, stop, restart, log, pid]'); - } - if (enable.version && seen_opts.indexOf('v') === -1 && seen_opts.indexOf('version') === -1) { - console.error(pad(' -v, --version', switch_pad) + 'Display the current version'); - } - if (enable.help && seen_opts.indexOf('h') === -1 && seen_opts.indexOf('help') === -1) { - console.error(pad(' -h, --help', switch_pad) + 'Display help and usage details'); - } - if (command_list.length) { - console.error('\n\x1b[1mCommands\x1b[0m: '); - if (!Array.isArray(commands)) { - for (var c in commands) { - line = ' ' + pad(c, switch_pad - 2); - line += trunc_desc(line, commands[c]); - console.error(line); - } - } else { - command_list.sort(); - console.error(' ' + trunc_desc(' ', command_list.join(', '))); - } - } - process.exit(); -}; - -/** - * Generates an error message when an opt is incorrectly used. - * - * @param {String} expects (e.g. 'a value') - * @param {String} type (e.g. 'VALUE') - * @api public - */ -cli.getOptError = function (expects, type) { - var err = full_opt + ' expects ' + expects - + '. Use `' + cli.app + ' ' + full_opt + (is_long ? '=' : ' ') + type + '`'; - return err; -}; - -/** - * Gets the next opt value and validates it with an optional validation - * function. If validation fails or no value can be obtained, this method - * will return the default value (if specified) or exit with err_msg. - * - * @param {String} default_val - * @param {Function} validate_func - * @param {String} err_msg - * @api public - */ -cli.getValue = function (default_val, validate_func, err_msg) { - err_msg = err_msg || cli.getOptError('a value', 'VALUE'); - - var value; - - try { - if (curr_val) { - if (validate_func) { - curr_val = validate_func(curr_val); - } - return curr_val; - } - - //Grouped short opts aren't allowed to have values - if (short_tags.length) { - throw 'Short tags'; - } - - //If there's no args left or the next arg is an opt, return the - //default value (if specified) - otherwise fail - if (!argv.length || (argv[0].length === 1 && argv[0][0] === '-')) { - throw 'No value'; - } - - value = argv.shift(); - - if (value.match(/^[0-9]+$/)) { - value = parseInt(value, 10); - } - - //Run the value through a validation/transformation function if specified - if (validate_func) { - value = validate_func(value); - } - } catch (e) { - - //The value didn't pass the validation/transformation. Unshift the value and - //return the default value (if specified) - if (value) { - argv.unshift(value); - } - return default_val != null ? default_val : cli.fatal(err_msg); - } - return value; -}; - -cli.getInt = function (default_val) { - return cli.getValue(default_val, function (value) { - if (typeof value === 'number') return value; - if (!value.match(/^(?:-?(?:0|[1-9][0-9]*))$/)) { - throw 'Invalid int'; - } - return parseInt(value); - }, cli.getOptError('a number', 'NUMBER')); -} - -cli.getFloat = function (default_val) { - return cli.getValue(default_val, function (value) { - if (!value.match(/^(?:-?(?:0|[1-9][0-9]*))?(?:\.[0-9]*)?$/)) { - throw 'Invalid float'; - } - return parseFloat(value, 10); - }, cli.getOptError('a number', 'NUMBER')); -} - -cli.getUrl = function (default_val, identifier) { - identifier = identifier || 'url'; - return cli.getValue(default_val, function (value) { - if (!value.match(/^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?((?:(?:[-\w\d{1-3}]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|edu|co\.uk|ac\.uk|it|fr|tv|museum|asia|local|travel|[a-z]{2})?)|((\b25[0-5]\b|\b[2][0-4][0-9]\b|\b[0-1]?[0-9]?[0-9]\b)(\.(\b25[0-5]\b|\b[2][0-4][0-9]\b|\b[0-1]?[0-9]?[0-9]\b)){3}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$ |\/.,*:;=]|%[a-f\d]{2})*)?$/i)) { - throw 'Invalid URL'; - } - return value; - }, cli.getOptError('a ' + identifier, identifier.toUpperCase())); -} - -cli.getEmail = function (default_val) { - return cli.getValue(default_val, function (value) { - if (!value.match(/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/)) { - throw 'Invalid email'; - } - return value; - }, cli.getOptError('an email', 'EMAIL')); -} - -cli.getIp = function (default_val) { - return cli.getValue(default_val, function (value) { - if (!value.match(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/)) { - throw 'Invalid IP'; - } - return value; - }, cli.getOptError('an IP', 'IP')); -} - -cli.getPath = function (default_val, identifier) { - identifier = identifier || 'path'; - return cli.getValue(default_val, function (value) { - if (value.match(/[?*:;{}]/)) { - throw 'Invalid path'; - } - return value; - }, cli.getOptError('a ' + identifier, identifier.toUpperCase())); -} - -cli.getArrayValue = function (arr, default_val) { - return cli.getValue(default_val, function (value) { - if (arr.indexOf(value) === -1) { - throw 'Unexpected value'; - } - return value; - }, cli.getOptError('either [' + arr.join('|') + ']', 'VALUE')); -} - -/** - * Gets all data from STDIN (with optional encoding) and sends it to callback. - * - * @param {String} encoding (optional - default is 'utf8') - * @param {Function} callback - * @api public - */ -cli.withStdin = function (encoding, callback) { - if (typeof encoding === 'function') { - callback = encoding; - encoding = 'utf8'; - } - var stream = process.openStdin(), data = ''; - stream.setEncoding(encoding); - stream.on('data', function (chunk) { - data += chunk; - }); - stream.on('end', function () { - callback.apply(cli, [data]); - }); -}; - -/** - * Gets all data from STDIN, splits the data into lines and sends it - * to callback (callback isn't called until all of STDIN is read. To - * process each line as it's received, see the method below - * - * @param {Function} callback - * @api public - */ -cli.withStdinLines = function (callback) { - cli.withStdin(function (data) { - var sep = data.indexOf('\r\n') !== -1 ? '\r\n' : '\n'; - callback.apply(cli, [data.split(sep), sep]); - }); -}; - -/** - * Asynchronously reads a file line by line. When a line is received, - * callback is called with (line, sep) - when EOF is reached, callback - * receives (null, null, true) - * - * @param {String} file (optional - default is 'stdin') - * @param {String} encoding (optional - default is 'utf8') - * @param {Function} callback (line, sep, eof) - * @api public - */ -cli.withInput = function (file, encoding, callback) { - if (typeof encoding === 'function') { - callback = encoding; - encoding = 'utf8'; - } else if (typeof file === 'function') { - callback = file; - encoding = 'utf8'; - file = 'stdin'; - } - if (file === 'stdin') { - file = process.openStdin(); - } else { - try { - file = cli.native.fs.createReadStream(file); - file.on('error', cli.fatal); - } catch (e) { - return cli.fatal(e); - } - } - file.setEncoding(encoding); - var lines = [], data = '', eof, sep; - file.on('data', function (chunk) { - if (eof) return; - data += chunk; - if (!sep) { - if (data.indexOf('\r\n') !== -1) { - sep = '\r\n'; - } else if (data.indexOf('\n') !== -1) { - sep = '\n'; - } else { - last_line = data; - return; - } - } - lines = data.split(sep); - data = eof ? null : lines.pop(); - while (lines.length) { - callback.apply(cli, [lines.shift(), sep, false]); - } - }); - file.on('end', function () { - eof = true; - if (data.length) { - callback.apply(cli, [data, sep || '', false]); - } - callback.apply(cli, [null, null, true]); - }); -}; - -/** - * A method for creating and controlling a daemon. - * - * `arg` can be: - * start = daemonizes the process - * stop = stops the daemon if it is running - * restart = alias for stop -> start - * pid = outputs the daemon's PID if it is running - * log = outputs the daemon's log file (stdout + stderr) - * - * @param {String} arg (Optional - default is 'start') - * @param {Function} callback - * @api public - */ -cli.daemon = function (arg, callback) { - if (typeof daemon === 'undefined') { - cli.fatal('Daemon is not initialized'); - } - - if (typeof arg === 'function') { - callback = arg; - arg = 'start'; - } - - var lock_file = '/tmp/' + cli.app + '.pid', - log_file = '/tmp/' + cli.app + '.log'; - - var start = function () { - daemon.daemonize(log_file, lock_file, function (err) { - if (err) return cli.error('Error starting daemon: ' + err); - callback(); - }); - }; - - var stop = function () { - try { - cli.native.fs.readFileSync(lock_file); - } catch (e) { - return cli.error('Daemon is not running'); - }; - daemon.kill(lock_file, function (err, pid) { - if (err && err.errno === 3) { - return cli.error('Daemon is not running'); - } else if (err) { - return cli.error('Error stopping daemon: ' + err.errno); - } - cli.ok('Successfully stopped daemon with pid: ' + pid); - }); - }; - - switch(arg) { - case 'stop': - stop(); - break; - case 'restart': - daemon.stop(lock_file, function () { - start(); - }); - break; - case 'log': - try { - cli.native.fs.createReadStream(log_file, {encoding: 'utf8'}).pipe(process.stdout); - } catch (e) { - return cli.error('No daemon log file'); - }; - break; - case 'pid': - try { - var pid = cli.native.fs.readFileSync(lock_file, 'utf8'); - cli.native.fs.statSync('/proc/' + pid); - cli.info(pid); - } catch (e) { - return cli.error('Daemon is not running'); - }; - break; - default: - start(); - break; - } -} - -/** - * The main entry method. Calling cli.main() is only necessary in - * scripts that have daemon support enabled. `callback` receives (args, options) - * - * @param {Function} callback - * @api public - */ -cli.main = function (callback) { - var after = function () { - callback.apply(cli, [cli.args, cli.options]); - }; - if (enable.daemon && daemon_arg) { - cli.daemon(daemon_arg, after); - } else { - after(); - } -} - -/** - * Bind creationix's stack (https://github.com/creationix/stack). - * - * Create a simple middleware stack by calling: - * - * cli.createServer(middleware).listen(port); - * - * @return {Server} server - * @api public - */ -cli.createServer = function(/*layers*/) { - var defaultStackErrorHandler = function (req, res, err) { - if (err) { - console.error(err.stack); - res.writeHead(500, {"Content-Type": "text/plain"}); - return res.end(err.stack + "\n"); - } - res.writeHead(404, {"Content-Type": "text/plain"}); - res.end("Not Found\n"); - }; - var handle = error = defaultStackErrorHandler, - layers = Array.prototype.slice.call(arguments); - - //Allow createServer(a,b,c) and createServer([a,b,c]) - if (layers.length && layers[0] instanceof Array) { - layers = layers[0]; - } - layers.reverse().forEach(function (layer) { - var child = handle; - handle = function (req, res) { - try { - layer(req, res, function (err) { - if (err) return error(req, res, err); - child(req, res); - }); - } catch (err) { - error(req, res, err); - } - }; - }); - return cli.native.http.createServer(handle); -}; - -/** - * A wrapper for child_process.exec(). - * - * If the child_process exits successfully, `callback` receives an array of - * stdout lines. The current process exits if the child process has an error - * and `errback` isn't defined. - * - * @param {String} cmd - * @param {Function} callback (optional) - * @param {Function} errback (optional) - * @api public - */ -cli.exec = function (cmd, callback, errback) { - cli.native.child_process.exec(cmd, function (err, stdout, stderr) { - err = err || stderr; - if (err) { - if (errback) { - return errback(err, stdout); - } - return cli.fatal('exec() failed\n' + err); - } - if (callback) { - callback(stdout.split('\n')); - } - }); -}; - -/** - * Helper method for outputting a progress bar to the console. - * - * @param {Number} progress (0 <= progress <= 1) - * @api public - */ -var last_progress_call, progress_len = 74; -cli.progress = function (progress, decimals) { - if (progress < 0 || progress > 1 || isNaN(progress)) return; - if (!decimals) decimals = 0; - var now = (new Date()).getTime(); - if (last_progress_call && (now - last_progress_call) < 100 && progress !== 1) { - return; //Throttle progress calls - } - last_progress_call = now; - - - var barLength = Math.floor(progress_len * progress), - str = ''; - if (barLength == 0 && progress > 0) { - barLength = 1; - } - for (var i = 1; i <= progress_len; i++) { - str += i <= barLength ? '#' : ' '; - } - var pwr = Math.pow(10, decimals); - var percentage = Math.floor(progress * 100 * pwr) / pwr + '%'; - for (i = 0; i < decimals; i++) { - percentage += ' '; - } - cli.native.util.print('[' + str + '] ' + percentage + (progress === 1 ? '\n' : '\u000D')); -}; - -/** - * Helper method for outputting a spinner to the console. - * - * @param {String|Boolean} prefix (optional) - * @api public - */ -var spinnerInterval; -cli.spinner = function (prefix, end) { - if (end) { - cli.native.util.print('\u000D' + prefix); - return clearInterval(spinnerInterval); - } - prefix = prefix + ' ' || ''; - var spinner = ['-','\\','|','/'], i = 0, l = spinner.length; - spinnerInterval = setInterval(function () { - cli.native.util.print('\u000D' + prefix + spinner[i++]); - if (i == l) i = 0; - }, 200); -}; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/cat.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/cat.js deleted file mode 100755 index 14c4e79..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/cat.js +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli'); - -var output_file = function (file) { - cli.withInput(file, function (line, sep, eof) { - if (!eof) { - cli.output(line + sep); - } else if (cli.args.length) { - output_file(cli.args.shift()); - } - }); -}; - -if (cli.args.length) { - output_file(cli.args.shift()); -} \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/command.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/command.js deleted file mode 100755 index 2f04491..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/command.js +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli'); - -//The second (optional) argument of cli.parse() is a command list -//Type `./command.js --help` for usage info - -//cli enables auto-completion of commands (similiar to npm), e.g. all of -//the following are equivalent and result in "Command is: install": -// $ ./command.js install -// $ ./command.js inst -// $ ./command.js i - -cli.parse(null, ['install', 'test', 'edit', 'remove', 'uninstall', 'ls']); - -console.log('Command is: ' + cli.command); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/echo.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/echo.js deleted file mode 100755 index dac9cca..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/echo.js +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env node - -/* All of the following commands are equivalent and write `foo\tbar foo` to out.txt - $ ./echo.js -n -e --output=out.txt "foo\tbar" "foo" - $ ./echo.js --newline --escape --output "out.txt" "foo\tbar" "foo" - $ ./echo.js -ne --output=out.txt "foo\tbar" "foo" - $ ./echo.js -en --output="out.txt" "foo\tbar" "foo" -*/ - -var cli = require('cli'); - -cli.parse({ - newline: ['n', 'Do not output the trailing newline'], - escape: ['e', 'Enable interpretation of backslash escapes'], - separator: ['s', 'Separate arguments using this value', 'string', ' '], - output: [false, 'Write to FILE rather than the console', 'file'] -}); - -cli.main(function (args, options) { - var output = '', i, j, l, output_stream; - - if (this.argc) { - if (options.escape) { - var replace = {'\\n':'\n','\\r':'\r','\\t':'\t','\\e':'\e','\\v':'\v','\\f':'\f','\\c':'\c','\\b':'\b','\\a':'\a','\\\\':'\\'}; - var escape = function (str) { - string += ''; - for (j in replace) { - string = string.replace(i, replace[i]); - } - return string; - } - for (i = 0, l = this.argc; i < l; i++) { - args[i] = escape(args[i]); - } - options.separator = escape(options.separator); - } - output += args.join(options.separator); - } - - if (!options.newline) { - output += '\n'; - } - - try { - if (options.output) { - output_stream = this.native.fs.createWriteStream(options.output) - } else { - output_stream = process.stdout; - } - output_stream.write(output); - } catch (e) { - this.fatal('Could not write to output stream'); - } -}); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/glob.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/glob.js deleted file mode 100755 index 12585c0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/glob.js +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli').enable('glob'); - -//Running `./glob.js *.js` will output a list of .js files in this directory -console.log(cli.args); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/long_desc.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/long_desc.js deleted file mode 100755 index 63632f4..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/long_desc.js +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env node - -var cli = require('../'); - -//You can (optionally) boost the width of output with: -//cli.width = 120; - -//You can also adjust the width of the options/command definitions -//cli.option_width = 25; - -var long_desc = 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s ' - + 'standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make' - + ' a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, ' - + 'remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing ' - + 'Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions' - + ' of Lorem Ipsum.'; - -cli.parse({ - foo: ['f', long_desc] -}); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/progress.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/progress.js deleted file mode 100755 index 300c674..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/progress.js +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli'); - -var i = 0, interval = setInterval(function () { - cli.progress(++i / 100); - if (i === 100) { - clearInterval(interval); - cli.ok('Finished!'); - } -}, 50); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/sort.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/sort.js deleted file mode 100755 index 5d22313..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/sort.js +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli'); - -var options = cli.parse({ - numeric: ['n', 'Compare using a numeric sort'], - reverse: ['r', 'Reverse the results'] -}); - -cli.withStdinLines(function (lines, newline) { - lines.sort(!options.numeric ? null : function (a, b) { - return parseInt(a) > parseInt(b); - }); - if (options.reverse) { - lines.reverse(); - } - this.output(lines.join(newline)); -}); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/spinner.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/spinner.js deleted file mode 100755 index 6100001..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/spinner.js +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli'); - -cli.spinner('Working..'); - -setTimeout(function () { - cli.spinner('Working.. done!', true); //End the spinner -}, 3000); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.coffee b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.coffee deleted file mode 100755 index cbf3b16..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.coffee +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env coffee - -cli = require 'cli' - -cli.enable('daemon','status') - .setUsage('static.coffee [OPTIONS]') - -cli.parse { - log: ['l', 'Enable logging'] - port: ['p', 'Listen on this port', 'number', 8080] - serve: [false, 'Serve static files from PATH', 'path', './public'] -} - -middleware = [] - -cli.main (args, options) -> - - if options.log - @debug 'Enabling logging' - middleware.push require('creationix/log')() - - @debug 'Serving files from ' + options.serve - middleware.push require('creationix/static')('/', options.serve, 'index.html') - - server = @createServer(middleware).listen options.port - - @ok 'Listening on port ' + options.port \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.js deleted file mode 100755 index eb6fd24..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/examples/static.js +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env node - -var cli = require('cli').enable('status', 'daemon'); - -cli.parse({ - log: ['l', 'Enable logging'], - port: ['p', 'Listen on this port', 'number', 8080], - serve: [false, 'Serve static files from PATH', 'path', './public'] -}); - -cli.main(function (args, options) { - var server, middleware = []; - - if (options.log) { - this.debug('Enabling logging'); - middleware.push(require('creationix/log')()); - } - - this.debug('Serving files from ' + options.serve); - middleware.push(require('creationix/static')('/', options.serve, 'index.html')); - - server = this.createServer(middleware).listen(options.port); - - this.ok('Listening on port ' + options.port); -}); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/index.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/index.js deleted file mode 100644 index 3966bd7..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./cli'); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.npmignore deleted file mode 100644 index 2af4b71..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.*.swp -test/a/ diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.travis.yml b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.travis.yml deleted file mode 100644 index fca8ef0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.10 - - 0.11 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE deleted file mode 100644 index 0c44ae7..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Isaac Z. Schlueter ("Author") -All rights reserved. - -The BSD License - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/README.md deleted file mode 100644 index cc69164..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/README.md +++ /dev/null @@ -1,250 +0,0 @@ -# Glob - -Match files using the patterns the shell uses, like stars and stuff. - -This is a glob implementation in JavaScript. It uses the `minimatch` -library to do its matching. - -## Attention: node-glob users! - -The API has changed dramatically between 2.x and 3.x. This library is -now 100% JavaScript, and the integer flags have been replaced with an -options object. - -Also, there's an event emitter class, proper tests, and all the other -things you've come to expect from node modules. - -And best of all, no compilation! - -## Usage - -```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. -}) -``` - -## Features - -Please see the [minimatch -documentation](https://github.com/isaacs/minimatch) for more details. - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` -* [minimatch documentation](https://github.com/isaacs/minimatch) - -## 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 instanting 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. -* `error` The error encountered. When an error is encountered, the - glob object is in an undefined state, and should be discarded. -* `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. -* `statCache` Collection of all the stat results the glob search - performed. -* `cache` Convenience object. Each field has the following possible - values: - * `false` - Path does not exist - * `true` - Path exists - * `1` - Path exists, and is not a directory - * `2` - Path exists, and is a directory - * `[file, entries, ...]` - Path exists, is a directory, and the - array value is the results of `fs.readdir` - -### 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 matched. -* `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 - -* `abort` Stop the search. - -### 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. - -* `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. It will cause - ELOOP to be triggered one level sooner in the case of cyclical - symbolic links. -* `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.) -* `sync` Perform a synchronous glob search. -* `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). -* `nocase` Perform a case-insensitive match. Note that case-insensitive - filesystems will sometimes result in glob returning results that are - case-insensitively matched anyway, since readdir and stat will not - raise an error. -* `debug` Set to enable debug logging in minimatch and glob. -* `globDebug` Set to enable debug logging in glob, but not minimatch. - -## 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. - -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 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. - -## 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. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js deleted file mode 100644 index be122df..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/g.js +++ /dev/null @@ -1,9 +0,0 @@ -var Glob = require("../").Glob - -var pattern = "test/a/**/[cg]/../[cg]" -console.log(pattern) - -var mg = new Glob(pattern, {mark: true, sync:true}, function (er, matches) { - console.log("matches", matches) -}) -console.log("after") diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js deleted file mode 100644 index 327a425..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/examples/usr-local.js +++ /dev/null @@ -1,9 +0,0 @@ -var Glob = require("../").Glob - -var pattern = "{./*/*,/*,/usr/local/*}" -console.log(pattern) - -var mg = new Glob(pattern, {mark: true}, function (er, matches) { - console.log("matches", matches) -}) -console.log("after") diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js deleted file mode 100644 index b55ac8c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/glob.js +++ /dev/null @@ -1,738 +0,0 @@ -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern) -// 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. -// readdir(PREFIX) as ENTRIES -// If fails, END -// 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 .. $]) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $]) -// -// 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") -, minimatch = require("minimatch") -, Minimatch = minimatch.Minimatch -, inherits = require("inherits") -, EE = require("events").EventEmitter -, path = require("path") -, isDir = {} -, assert = require("assert").ok -, once = require("once") - -function glob (pattern, options, cb) { - if (typeof options === "function") cb = options, options = {} - if (!options) options = {} - - if (typeof options === "number") { - deprecated() - return - } - - var g = new Glob(pattern, options, cb) - return g.sync ? g.found : g -} - -glob.fnmatch = deprecated - -function deprecated () { - throw new Error("glob's interface has changed. Please see the docs.") -} - -glob.sync = globSync -function globSync (pattern, options) { - if (typeof options === "number") { - deprecated() - return - } - - options = options || {} - options.sync = true - return glob(pattern, options) -} - -this._processingEmitQueue = false - -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (!(this instanceof Glob)) { - return new Glob(pattern, options, cb) - } - - if (typeof options === "function") { - cb = options - options = null - } - - if (typeof cb === "function") { - cb = once(cb) - this.on("error", cb) - this.on("end", function (matches) { - cb(null, matches) - }) - } - - options = options || {} - - this._endEmitted = false - this.EOF = {} - this._emitQueue = [] - - this.paused = false - this._processingEmitQueue = false - - this.maxDepth = options.maxDepth || 1000 - this.maxLength = options.maxLength || Infinity - this.cache = options.cache || {} - this.statCache = options.statCache || {} - - this.changedCwd = false - var cwd = process.cwd() - if (!options.hasOwnProperty("cwd")) this.cwd = cwd - else { - this.cwd = options.cwd - this.changedCwd = path.resolve(options.cwd) !== cwd - } - - this.root = options.root || path.resolve(this.cwd, "/") - this.root = path.resolve(this.root) - if (process.platform === "win32") - this.root = this.root.replace(/\\/g, "/") - - this.nomount = !!options.nomount - - if (!pattern) { - throw new Error("must provide pattern") - } - - // 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 - } - - this.strict = options.strict !== false - this.dot = !!options.dot - this.mark = !!options.mark - this.sync = !!options.sync - this.nounique = !!options.nounique - this.nonull = !!options.nonull - this.nosort = !!options.nosort - this.nocase = !!options.nocase - this.stat = !!options.stat - - this.debug = !!options.debug || !!options.globDebug - - if (/\bglob\b/.test(process.env.NODE_DEBUG || '')) - this.debug = true - - if (this.debug) - this.log = console.error - - this.silent = !!options.silent - - var mm = this.minimatch = new Minimatch(pattern, options) - this.options = mm.options - pattern = this.pattern = mm.pattern - - this.error = null - this.aborted = false - - // list of all the patterns that ** has resolved do, so - // we can avoid visiting multiple times. - this._globstars = {} - - EE.call(this) - - // 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 (this.minimatch.set.length === 0) { - return process.nextTick(this._finish.bind(this)) - } - - this.minimatch.set.forEach(iterator.bind(this)) - function iterator (pattern, i, set) { - this._process(pattern, 0, i, function (er) { - if (er) this.emit("error", er) - if (-- n <= 0) this._finish() - }) - } -} - -Glob.prototype.log = function () {} - -Glob.prototype._finish = function () { - assert(this instanceof Glob) - - var nou = this.nounique - , all = nou ? [] : {} - - for (var i = 0, l = this.matches.length; i < l; i ++) { - var matches = this.matches[i] - this.log("matches[%d] =", i, matches) - // do like the shell, and spit out the literal glob - if (!matches) { - if (this.nonull) { - var literal = this.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 (!this.nosort) { - all = all.sort(this.nocase ? alphasorti : alphasort) - } - - if (this.mark) { - // at *some* point we statted all of these - all = all.map(this._mark, this) - } - - this.log("emitting end", all) - - this.EOF = this.found = all - this.emitMatch(this.EOF) -} - -function alphasorti (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return alphasort(a, b) -} - -function alphasort (a, b) { - return a > b ? 1 : a < b ? -1 : 0 -} - -Glob.prototype._mark = function (p) { - var c = this.cache[p] - var m = p - if (c) { - var isDir = c === 2 || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - this.statCache[m] = this.statCache[p] - this.cache[m] = this.cache[p] - } - } - - return m -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit("abort") -} - -Glob.prototype.pause = function () { - if (this.paused) return - if (this.sync) - this.emit("error", new Error("Can't pause/resume sync glob")) - this.paused = true - this.emit("pause") -} - -Glob.prototype.resume = function () { - if (!this.paused) return - if (this.sync) - this.emit("error", new Error("Can't pause/resume sync glob")) - this.paused = false - this.emit("resume") - this._processEmitQueue() - //process.nextTick(this.emit.bind(this, "resume")) -} - -Glob.prototype.emitMatch = function (m) { - this.log('emitMatch', m) - this._emitQueue.push(m) - this._processEmitQueue() -} - -Glob.prototype._processEmitQueue = function (m) { - this.log("pEQ paused=%j processing=%j m=%j", this.paused, - this._processingEmitQueue, m) - var done = false - while (!this._processingEmitQueue && - !this.paused) { - this._processingEmitQueue = true - var m = this._emitQueue.shift() - this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m) - if (!m) { - this.log(">processEmitQueue, falsey m") - this._processingEmitQueue = false - break - } - - if (m === this.EOF || !(this.mark && !this.stat)) { - this.log("peq: unmarked, or eof") - next.call(this, 0, false) - } else if (this.statCache[m]) { - var sc = this.statCache[m] - var exists - if (sc) - exists = sc.isDirectory() ? 2 : 1 - this.log("peq: stat cached") - next.call(this, exists, exists === 2) - } else { - this.log("peq: _stat, then next") - this._stat(m, next) - } - - function next(exists, isDir) { - this.log("next", m, exists, isDir) - var ev = m === this.EOF ? "end" : "match" - - // "end" can only happen once. - assert(!this._endEmitted) - if (ev === "end") - this._endEmitted = true - - if (exists) { - // Doesn't mean it necessarily doesn't exist, it's possible - // we just didn't check because we don't care that much, or - // this is EOF anyway. - if (isDir && !m.match(/\/$/)) { - m = m + "/" - } else if (!isDir && m.match(/\/$/)) { - m = m.replace(/\/+$/, "") - } - } - this.log("emit", ev, m) - this.emit(ev, m) - this._processingEmitQueue = false - if (done && m !== this.EOF && !this.paused) - this._processEmitQueue() - } - } - done = true -} - -Glob.prototype._process = function (pattern, depth, index, cb_) { - assert(this instanceof Glob) - - var cb = function cb (er, res) { - assert(this instanceof Glob) - if (this.paused) { - if (!this._processQueue) { - this._processQueue = [] - this.once("resume", function () { - var q = this._processQueue - this._processQueue = null - q.forEach(function (cb) { cb() }) - }) - } - this._processQueue.push(cb_.bind(this, er, res)) - } else { - cb_.call(this, er, res) - } - }.bind(this) - - if (this.aborted) return cb() - - if (depth > this.maxDepth) return cb() - - // 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: - prefix = pattern.join("/") - this._stat(prefix, function (exists, isDir) { - // either it's there, or it isn't. - // nothing more to do, either way. - if (exists) { - if (prefix && isAbsolute(prefix) && !this.nomount) { - if (prefix.charAt(0) === "/") { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - } - } - - if (process.platform === "win32") - prefix = prefix.replace(/\\/g, "/") - - this.matches[index] = this.matches[index] || {} - this.matches[index][prefix] = true - this.emitMatch(prefix) - } - return 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) - prefix = prefix.join("/") - break - } - - // 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 - - // if (process.platform === "win32") - // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/") - - this.log('absolute: ', prefix, this.root, pattern, read) - } else { - read = prefix - } - - this.log('readdir(%j)', read, this.cwd, this.root) - - return this._readdir(read, function (er, entries) { - if (er) { - // not a directory! - // this means that, whatever else comes after this, it can never match - return cb() - } - - // globstar is special - if (pattern[n] === minimatch.GLOBSTAR) { - // test without the globstar, and with every child both below - // and replacing the globstar. - var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ] - entries.forEach(function (e) { - if (e.charAt(0) === "." && !this.dot) return - // instead of the globstar - s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))) - // below the globstar - s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n))) - }, this) - - s = s.filter(function (pattern) { - var key = gsKey(pattern) - var seen = !this._globstars[key] - this._globstars[key] = true - return seen - }, this) - - if (!s.length) - return cb() - - // now asyncForEach over this - var l = s.length - , errState = null - s.forEach(function (gsPattern) { - this._process(gsPattern, depth + 1, index, function (er) { - if (errState) return - if (er) return cb(errState = er) - if (--l <= 0) return cb() - }) - }, this) - - return - } - - // not a globstar - // 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 = pattern[n] - var rawGlob = pattern[n]._glob - , dotOk = this.dot || rawGlob.charAt(0) === "." - - entries = entries.filter(function (e) { - return (e.charAt(0) !== "." || dotOk) && - e.match(pattern[n]) - }) - - // If n === pattern.length - 1, then there's no need for the extra stat - // *unless* the user has specified "mark" or "stat" explicitly. - // We know that they exist, since the readdir returned them. - if (n === pattern.length - 1 && - !this.mark && - !this.stat) { - entries.forEach(function (e) { - if (prefix) { - if (prefix !== "/") e = prefix + "/" + e - else e = prefix + e - } - if (e.charAt(0) === "/" && !this.nomount) { - e = path.join(this.root, e) - } - - if (process.platform === "win32") - e = e.replace(/\\/g, "/") - - this.matches[index] = this.matches[index] || {} - this.matches[index][e] = true - this.emitMatch(e) - }, this) - return cb.call(this) - } - - - // now test all the remaining entries as stand-ins for that part - // of the pattern. - var l = entries.length - , errState = null - if (l === 0) return cb() // no matches possible - entries.forEach(function (e) { - var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)) - this._process(p, depth + 1, index, function (er) { - if (errState) return - if (er) return cb(errState = er) - if (--l === 0) return cb.call(this) - }) - }, this) - }) - -} - -function gsKey (pattern) { - return '**' + pattern.map(function (p) { - return (p === minimatch.GLOBSTAR) ? '**' : (''+p) - }).join('/') -} - -Glob.prototype._stat = function (f, cb) { - assert(this instanceof Glob) - var abs = f - if (f.charAt(0) === "/") { - abs = path.join(this.root, f) - } else if (this.changedCwd) { - abs = path.resolve(this.cwd, f) - } - - if (f.length > this.maxLength) { - var er = new Error("Path name too long") - er.code = "ENAMETOOLONG" - er.path = f - return this._afterStat(f, abs, cb, er) - } - - this.log('stat', [this.cwd, f, '=', abs]) - - if (!this.stat && this.cache.hasOwnProperty(f)) { - var exists = this.cache[f] - , isDir = exists && (Array.isArray(exists) || exists === 2) - if (this.sync) return cb.call(this, !!exists, isDir) - return process.nextTick(cb.bind(this, !!exists, isDir)) - } - - var stat = this.statCache[abs] - if (this.sync || stat) { - var er - try { - stat = fs.statSync(abs) - } catch (e) { - er = e - } - this._afterStat(f, abs, cb, er, stat) - } else { - fs.stat(abs, this._afterStat.bind(this, f, abs, cb)) - } -} - -Glob.prototype._afterStat = function (f, abs, cb, er, stat) { - var exists - assert(this instanceof Glob) - - if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) { - this.log("should be ENOTDIR, fake it") - - er = new Error("ENOTDIR, not a directory '" + abs + "'") - er.path = abs - er.code = "ENOTDIR" - stat = null - } - - var emit = !this.statCache[abs] - this.statCache[abs] = stat - - if (er || !stat) { - exists = false - } else { - exists = stat.isDirectory() ? 2 : 1 - if (emit) - this.emit('stat', f, stat) - } - this.cache[f] = this.cache[f] || exists - cb.call(this, !!exists, exists === 2) -} - -Glob.prototype._readdir = function (f, cb) { - assert(this instanceof Glob) - var abs = f - if (f.charAt(0) === "/") { - abs = path.join(this.root, f) - } else if (isAbsolute(f)) { - abs = f - } else if (this.changedCwd) { - abs = path.resolve(this.cwd, f) - } - - if (f.length > this.maxLength) { - var er = new Error("Path name too long") - er.code = "ENAMETOOLONG" - er.path = f - return this._afterReaddir(f, abs, cb, er) - } - - this.log('readdir', [this.cwd, f, abs]) - if (this.cache.hasOwnProperty(f)) { - var c = this.cache[f] - if (Array.isArray(c)) { - if (this.sync) return cb.call(this, null, c) - return process.nextTick(cb.bind(this, null, c)) - } - - if (!c || c === 1) { - // either ENOENT or ENOTDIR - var code = c ? "ENOTDIR" : "ENOENT" - , er = new Error((c ? "Not a directory" : "Not found") + ": " + f) - er.path = f - er.code = code - this.log(f, er) - if (this.sync) return cb.call(this, er) - return process.nextTick(cb.bind(this, er)) - } - - // at this point, c === 2, meaning it's a dir, but we haven't - // had to read it yet, or c === true, meaning it's *something* - // but we don't have any idea what. Need to read it, either way. - } - - if (this.sync) { - var er, entries - try { - entries = fs.readdirSync(abs) - } catch (e) { - er = e - } - return this._afterReaddir(f, abs, cb, er, entries) - } - - fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb)) -} - -Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) { - assert(this instanceof Glob) - if (entries && !er) { - this.cache[f] = entries - // if we haven't asked to stat everything for suresies, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. This also gets us one step - // further into ELOOP territory. - if (!this.mark && !this.stat) { - entries.forEach(function (e) { - if (f === "/") e = f + e - else e = f + "/" + e - this.cache[e] = true - }, this) - } - - return cb.call(this, er, entries) - } - - // now handle errors, and cache the information - if (er) switch (er.code) { - case "ENOTDIR": // totally normal. means it *does* exist. - this.cache[f] = 1 - return cb.call(this, er) - case "ENOENT": // not terribly unusual - case "ELOOP": - case "ENAMETOOLONG": - case "UNKNOWN": - this.cache[f] = false - return cb.call(this, er) - default: // some unusual error. Treat as failure. - this.cache[f] = false - if (this.strict) this.emit("error", er) - if (!this.silent) console.error("glob error", er) - return cb.call(this, er) - } -} - -var isAbsolute = process.platform === "win32" ? absWin : absUnix - -function absWin (p) { - if (absUnix(p)) return true - // pull off the device/UNC bit from a windows path. - // from node's lib/path.js - var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/ - , result = splitDeviceRe.exec(p) - , device = result[1] || '' - , isUnc = device && device.charAt(1) !== ':' - , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute - - return isAbsolute -} - -function absUnix (p) { - return p.charAt(0) === "/" || p === "" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +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/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json deleted file mode 100644 index 5bf0db5..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "homepage": "https://github.com/isaacs/inherits", - "_id": "inherits@2.0.1", - "_from": "inherits@2" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/LICENSE deleted file mode 100644 index 0c44ae7..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Isaac Z. Schlueter ("Author") -All rights reserved. - -The BSD License - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/README.md deleted file mode 100644 index a2981ea..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/README.md +++ /dev/null @@ -1,51 +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')) - }) -} -``` diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/once.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/once.js deleted file mode 100644 index 0770a73..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/once.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = once - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(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 -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/package.json deleted file mode 100644 index 3ddc4bd..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "once", - "version": "1.3.0", - "description": "Run a function exactly one time", - "main": "once.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.3.0" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/once" - }, - "keywords": [ - "once", - "function", - "one", - "single" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "BSD", - "readme": "# once\n\nOnly call a function once.\n\n## usage\n\n```javascript\nvar once = require('once')\n\nfunction load (file, cb) {\n cb = once(cb)\n loader.load('file')\n loader.once('load', cb)\n loader.once('error', cb)\n}\n```\n\nOr add to the Function.prototype in a responsible way:\n\n```javascript\n// only has to be done once\nrequire('once').proto()\n\nfunction load (file, cb) {\n cb = cb.once()\n loader.load('file')\n loader.once('load', cb)\n loader.once('error', cb)\n}\n```\n\nIronically, the prototype feature makes this module twice as\ncomplicated as necessary.\n\nTo check whether you function has been called, use `fn.called`. Once the\nfunction is called for the first time the return value of the original\nfunction is saved in `fn.value` and subsequent calls will continue to\nreturn this value.\n\n```javascript\nvar once = require('once')\n\nfunction load (cb) {\n cb = once(cb)\n var stream = createStream()\n stream.once('data', cb)\n stream.once('end', function () {\n if (!cb.called) cb(new Error('not found'))\n })\n}\n```\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/once/issues" - }, - "homepage": "https://github.com/isaacs/once", - "_id": "once@1.3.0", - "_shasum": "151af86bfc1f08c4b9f07d06ab250ffcbeb56581", - "_from": "once@^1.3.0", - "_resolved": "https://registry.npmjs.org/once/-/once-1.3.0.tgz" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/test/once.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/test/once.js deleted file mode 100644 index a77951f..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/node_modules/once/test/once.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require('tap').test -var once = require('../once.js') - -test('once', function (t) { - var f = 0 - var foo = once(function (g) { - t.equal(f, 0) - f ++ - return f + g + this - }) - t.notOk(foo.called) - for (var i = 0; i < 1E3; i++) { - t.same(f, i === 0 ? 0 : 1) - var g = foo.call(1, 1) - t.ok(foo.called) - t.same(g, 3) - t.same(f, 1) - } - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json deleted file mode 100644 index e83734d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "name": "glob", - "description": "a little globber", - "version": "4.0.2", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "main": "glob.js", - "engines": { - "node": "*" - }, - "dependencies": { - "inherits": "2", - "minimatch": "^0.3.0", - "once": "^1.3.0" - }, - "devDependencies": { - "tap": "~0.4.0", - "mkdirp": "0", - "rimraf": "1" - }, - "scripts": { - "test": "tap test/*.js", - "test-regen": "TEST_REGEN=1 node test/00-setup.js" - }, - "license": "BSD", - "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/node-glob/issues" - }, - "homepage": "https://github.com/isaacs/node-glob", - "_id": "glob@4.0.2", - "_shasum": "d57dbdf54984dd7635c8247d1f2ebde2e81f4ee1", - "_from": "glob@>= 3.1.4", - "_resolved": "https://registry.npmjs.org/glob/-/glob-4.0.2.tgz" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js deleted file mode 100644 index 245afaf..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/00-setup.js +++ /dev/null @@ -1,176 +0,0 @@ -// just a little pre-run script to set up the fixtures. -// zz-finish cleans it up - -var mkdirp = require("mkdirp") -var path = require("path") -var i = 0 -var tap = require("tap") -var fs = require("fs") -var rimraf = require("rimraf") - -var files = -[ "a/.abcdef/x/y/z/a" -, "a/abcdef/g/h" -, "a/abcfed/g/h" -, "a/b/c/d" -, "a/bc/e/f" -, "a/c/d/c/b" -, "a/cb/e/f" -] - -var symlinkTo = path.resolve(__dirname, "a/symlink/a/b/c") -var symlinkFrom = "../.." - -files = files.map(function (f) { - return path.resolve(__dirname, f) -}) - -tap.test("remove fixtures", function (t) { - rimraf(path.resolve(__dirname, "a"), function (er) { - t.ifError(er, "remove fixtures") - t.end() - }) -}) - -files.forEach(function (f) { - tap.test(f, function (t) { - var d = path.dirname(f) - mkdirp(d, 0755, function (er) { - if (er) { - t.fail(er) - return t.bailout() - } - fs.writeFile(f, "i like tests", function (er) { - t.ifError(er, "make file") - t.end() - }) - }) - }) -}) - -if (process.platform !== "win32") { - tap.test("symlinky", function (t) { - var d = path.dirname(symlinkTo) - console.error("mkdirp", d) - mkdirp(d, 0755, function (er) { - t.ifError(er) - fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) { - t.ifError(er, "make symlink") - t.end() - }) - }) - }) -} - -;["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) { - w = "/tmp/glob-test/" + w - tap.test("create " + w, function (t) { - mkdirp(w, function (er) { - if (er) - throw er - t.pass(w) - t.end() - }) - }) -}) - - -// generate the bash pattern test-fixtures if possible -if (process.platform === "win32" || !process.env.TEST_REGEN) { - console.error("Windows, or TEST_REGEN unset. Using cached fixtures.") - return -} - -var spawn = require("child_process").spawn; -var globs = - // put more patterns here. - // anything that would be directly in / should be in /tmp/glob-test - ["test/a/*/+(c|g)/./d" - ,"test/a/**/[cg]/../[cg]" - ,"test/a/{b,c,d,e,f}/**/g" - ,"test/a/b/**" - ,"test/**/g" - ,"test/a/abc{fed,def}/g/h" - ,"test/a/abc{fed/g,def}/**/" - ,"test/a/abc{fed/g,def}/**///**/" - ,"test/**/a/**/" - ,"test/+(a|b|c)/a{/,bc*}/**" - ,"test/*/*/*/f" - ,"test/**/f" - ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**" - ,"{./*/*,/tmp/glob-test/*}" - ,"{/tmp/glob-test/*,*}" // evil owl face! how you taunt me! - ,"test/a/!(symlink)/**" - ] -var bashOutput = {} -var fs = require("fs") - -globs.forEach(function (pattern) { - tap.test("generate fixture " + pattern, function (t) { - var cmd = "shopt -s globstar && " + - "shopt -s extglob && " + - "shopt -s nullglob && " + - // "shopt >&2; " + - "eval \'for i in " + pattern + "; do echo $i; done\'" - var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) }) - var out = [] - cp.stdout.on("data", function (c) { - out.push(c) - }) - cp.stderr.pipe(process.stderr) - cp.on("close", function (code) { - out = flatten(out) - if (!out) - out = [] - else - out = cleanResults(out.split(/\r*\n/)) - - bashOutput[pattern] = out - t.notOk(code, "bash test should finish nicely") - t.end() - }) - }) -}) - -tap.test("save fixtures", function (t) { - var fname = path.resolve(__dirname, "bash-results.json") - var data = JSON.stringify(bashOutput, null, 2) + "\n" - fs.writeFile(fname, data, function (er) { - t.ifError(er) - t.end() - }) -}) - -function cleanResults (m) { - // normalize discrepancies in ordering, duplication, - // and ending slashes. - return m.map(function (m) { - return m.replace(/\/+/g, "/").replace(/\/$/, "") - }).sort(alphasort).reduce(function (set, f) { - if (f !== set[set.length - 1]) set.push(f) - return set - }, []).sort(alphasort).map(function (f) { - // de-windows - return (process.platform !== 'win32') ? f - : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') - }) -} - -function flatten (chunks) { - var s = 0 - chunks.forEach(function (c) { s += c.length }) - var out = new Buffer(s) - s = 0 - chunks.forEach(function (c) { - c.copy(out, s) - s += c.length - }) - - return out.toString().trim() -} - -function alphasort (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return a > b ? 1 : a < b ? -1 : 0 -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js deleted file mode 100644 index 239ed1a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-comparison.js +++ /dev/null @@ -1,63 +0,0 @@ -// basic test -// show that it does the same thing by default as the shell. -var tap = require("tap") -, child_process = require("child_process") -, bashResults = require("./bash-results.json") -, globs = Object.keys(bashResults) -, glob = require("../") -, path = require("path") - -// run from the root of the project -// this is usually where you're at anyway, but be sure. -process.chdir(path.resolve(__dirname, "..")) - -function alphasort (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return a > b ? 1 : a < b ? -1 : 0 -} - -globs.forEach(function (pattern) { - var expect = bashResults[pattern] - // anything regarding the symlink thing will fail on windows, so just skip it - if (process.platform === "win32" && - expect.some(function (m) { - return /\/symlink\//.test(m) - })) - return - - tap.test(pattern, function (t) { - glob(pattern, function (er, matches) { - if (er) - throw er - - // sort and unmark, just to match the shell results - matches = cleanResults(matches) - - t.deepEqual(matches, expect, pattern) - t.end() - }) - }) - - tap.test(pattern + " sync", function (t) { - var matches = cleanResults(glob.sync(pattern)) - - t.deepEqual(matches, expect, "should match shell") - t.end() - }) -}) - -function cleanResults (m) { - // normalize discrepancies in ordering, duplication, - // and ending slashes. - return m.map(function (m) { - return m.replace(/\/+/g, "/").replace(/\/$/, "") - }).sort(alphasort).reduce(function (set, f) { - if (f !== set[set.length - 1]) set.push(f) - return set - }, []).sort(alphasort).map(function (f) { - // de-windows - return (process.platform !== 'win32') ? f - : f.replace(/^[a-zA-Z]:[\/\\]+/, '/').replace(/[\\\/]+/g, '/') - }) -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json deleted file mode 100644 index 726d332..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/bash-results.json +++ /dev/null @@ -1,354 +0,0 @@ -{ - "test/a/*/+(c|g)/./d": [ - "test/a/b/c/./d" - ], - "test/a/**/[cg]/../[cg]": [ - "test/a/abcdef/g/../g", - "test/a/abcfed/g/../g", - "test/a/b/c/../c", - "test/a/c/../c", - "test/a/c/d/c/../c", - "test/a/symlink/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c" - ], - "test/a/{b,c,d,e,f}/**/g": [], - "test/a/b/**": [ - "test/a/b", - "test/a/b/c", - "test/a/b/c/d" - ], - "test/**/g": [ - "test/a/abcdef/g", - "test/a/abcfed/g" - ], - "test/a/abc{fed,def}/g/h": [ - "test/a/abcdef/g/h", - "test/a/abcfed/g/h" - ], - "test/a/abc{fed/g,def}/**/": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcfed/g" - ], - "test/a/abc{fed/g,def}/**///**/": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcfed/g" - ], - "test/**/a/**/": [ - "test/a", - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcfed", - "test/a/abcfed/g", - "test/a/b", - "test/a/b/c", - "test/a/bc", - "test/a/bc/e", - "test/a/c", - "test/a/c/d", - "test/a/c/d/c", - "test/a/cb", - "test/a/cb/e", - "test/a/symlink", - "test/a/symlink/a", - "test/a/symlink/a/b", - "test/a/symlink/a/b/c", - "test/a/symlink/a/b/c/a", - "test/a/symlink/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b" - ], - "test/+(a|b|c)/a{/,bc*}/**": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcdef/g/h", - "test/a/abcfed", - "test/a/abcfed/g", - "test/a/abcfed/g/h" - ], - "test/*/*/*/f": [ - "test/a/bc/e/f", - "test/a/cb/e/f" - ], - "test/**/f": [ - "test/a/bc/e/f", - "test/a/cb/e/f" - ], - "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**": [ - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c" - ], - "{./*/*,/tmp/glob-test/*}": [ - "./examples/g.js", - "./examples/usr-local.js", - "./node_modules/inherits", - "./node_modules/minimatch", - "./node_modules/mkdirp", - "./node_modules/once", - "./node_modules/rimraf", - "./node_modules/tap", - "./test/00-setup.js", - "./test/a", - "./test/bash-comparison.js", - "./test/bash-results.json", - "./test/cwd-test.js", - "./test/empty-set.js", - "./test/error-callback.js", - "./test/globstar-match.js", - "./test/mark.js", - "./test/new-glob-optional-options.js", - "./test/nocase-nomagic.js", - "./test/pause-resume.js", - "./test/readme-issue.js", - "./test/root-nomount.js", - "./test/root.js", - "./test/stat.js", - "./test/zz-cleanup.js", - "/tmp/glob-test/asdf", - "/tmp/glob-test/bar", - "/tmp/glob-test/baz", - "/tmp/glob-test/foo", - "/tmp/glob-test/quux", - "/tmp/glob-test/qwer", - "/tmp/glob-test/rewq" - ], - "{/tmp/glob-test/*,*}": [ - "/tmp/glob-test/asdf", - "/tmp/glob-test/bar", - "/tmp/glob-test/baz", - "/tmp/glob-test/foo", - "/tmp/glob-test/quux", - "/tmp/glob-test/qwer", - "/tmp/glob-test/rewq", - "examples", - "glob.js", - "LICENSE", - "node_modules", - "package.json", - "README.md", - "test" - ], - "test/a/!(symlink)/**": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcdef/g/h", - "test/a/abcfed", - "test/a/abcfed/g", - "test/a/abcfed/g/h", - "test/a/b", - "test/a/b/c", - "test/a/b/c/d", - "test/a/bc", - "test/a/bc/e", - "test/a/bc/e/f", - "test/a/c", - "test/a/c/d", - "test/a/c/d/c", - "test/a/c/d/c/b", - "test/a/cb", - "test/a/cb/e", - "test/a/cb/e/f" - ] -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js deleted file mode 100644 index 352c27e..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/cwd-test.js +++ /dev/null @@ -1,55 +0,0 @@ -var tap = require("tap") - -var origCwd = process.cwd() -process.chdir(__dirname) - -tap.test("changing cwd and searching for **/d", function (t) { - var glob = require('../') - var path = require('path') - t.test('.', function (t) { - glob('**/d', function (er, matches) { - t.ifError(er) - t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) - t.end() - }) - }) - - t.test('a', function (t) { - glob('**/d', {cwd:path.resolve('a')}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'b/c/d', 'c/d' ]) - t.end() - }) - }) - - t.test('a/b', function (t) { - glob('**/d', {cwd:path.resolve('a/b')}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'c/d' ]) - t.end() - }) - }) - - t.test('a/b/', function (t) { - glob('**/d', {cwd:path.resolve('a/b/')}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'c/d' ]) - t.end() - }) - }) - - t.test('.', function (t) { - glob('**/d', {cwd: process.cwd()}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) - t.end() - }) - }) - - t.test('cd -', function (t) { - process.chdir(origCwd) - t.end() - }) - - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/empty-set.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/empty-set.js deleted file mode 100644 index 3b627b0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/empty-set.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require('tap').test -var glob = require("../glob.js") - -// Patterns that cannot match anything -var patterns = [ - '# comment', - ' ', - '\n', - 'just doesnt happen to match anything so this is a control' -] - -patterns.forEach(function (p) { - test(JSON.stringify(p), function (t) { - glob(p, function (e, f) { - t.equal(e, null, 'no error') - t.same(f, [], 'no returned values') - t.end() - }) - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/error-callback.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/error-callback.js deleted file mode 100644 index 0b64aad..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/error-callback.js +++ /dev/null @@ -1,20 +0,0 @@ -var fs = require('fs') -var test = require('tap').test -var glob = require('../') - -test('mock fs', function(t) { - fs.readdir = function(path, cb) { - process.nextTick(function() { - cb(new Error('mock fs.readdir error')) - }) - } - t.pass('mocked') - t.end() -}) - -test('error callback', function(t) { - glob('*', function(err, res) { - t.ok(err, 'expecting mock error') - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js deleted file mode 100644 index 9b234fa..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/globstar-match.js +++ /dev/null @@ -1,19 +0,0 @@ -var Glob = require("../glob.js").Glob -var test = require('tap').test - -test('globstar should not have dupe matches', function(t) { - var pattern = 'a/**/[gh]' - var g = new Glob(pattern, { cwd: __dirname }) - var matches = [] - g.on('match', function(m) { - console.error('match %j', m) - matches.push(m) - }) - g.on('end', function(set) { - console.error('set', set) - matches = matches.sort() - set = set.sort() - t.same(matches, set, 'should have same set of matches') - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js deleted file mode 100644 index bf411c0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/mark.js +++ /dev/null @@ -1,118 +0,0 @@ -var test = require("tap").test -var glob = require('../') -process.chdir(__dirname) - -// expose timing issues -var lag = 5 -glob.Glob.prototype._stat = function(o) { return function(f, cb) { - var args = arguments - setTimeout(function() { - o.call(this, f, cb) - }.bind(this), lag += 5) -}}(glob.Glob.prototype._stat) - - -test("mark, with **", function (t) { - glob("a/*b*/**", {mark: true}, function (er, results) { - if (er) - throw er - var expect = - [ 'a/abcdef/', - 'a/abcdef/g/', - 'a/abcdef/g/h', - 'a/abcfed/', - 'a/abcfed/g/', - 'a/abcfed/g/h', - 'a/b/', - 'a/b/c/', - 'a/b/c/d', - 'a/bc/', - 'a/bc/e/', - 'a/bc/e/f', - 'a/cb/', - 'a/cb/e/', - 'a/cb/e/f' ] - - t.same(results, expect) - t.end() - }) -}) - -test("mark, no / on pattern", function (t) { - glob("a/*", {mark: true}, function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef/', - 'a/abcfed/', - 'a/b/', - 'a/bc/', - 'a/c/', - 'a/cb/' ] - - if (process.platform !== "win32") - expect.push('a/symlink/') - - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /\/$/) - }) -}) - -test("mark=false, no / on pattern", function (t) { - glob("a/*", function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef', - 'a/abcfed', - 'a/b', - 'a/bc', - 'a/c', - 'a/cb' ] - - if (process.platform !== "win32") - expect.push('a/symlink') - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /[^\/]$/) - }) -}) - -test("mark=true, / on pattern", function (t) { - glob("a/*/", {mark: true}, function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef/', - 'a/abcfed/', - 'a/b/', - 'a/bc/', - 'a/c/', - 'a/cb/' ] - if (process.platform !== "win32") - expect.push('a/symlink/') - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /\/$/) - }) -}) - -test("mark=false, / on pattern", function (t) { - glob("a/*/", function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef/', - 'a/abcfed/', - 'a/b/', - 'a/bc/', - 'a/c/', - 'a/cb/' ] - if (process.platform !== "win32") - expect.push('a/symlink/') - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /\/$/) - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js deleted file mode 100644 index 3e7dc5a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/new-glob-optional-options.js +++ /dev/null @@ -1,10 +0,0 @@ -var Glob = require('../glob.js').Glob; -var test = require('tap').test; - -test('new glob, with cb, and no options', function (t) { - new Glob(__filename, function(er, results) { - if (er) throw er; - t.same(results, [__filename]); - t.end(); - }); -}); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js deleted file mode 100644 index 162aaa1..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/nocase-nomagic.js +++ /dev/null @@ -1,124 +0,0 @@ -var fs = require('fs'); -var test = require('tap').test; -var glob = require('../'); - -test('mock fs', function(t) { - var stat = fs.stat - var statSync = fs.statSync - var readdir = fs.readdir - var readdirSync = fs.readdirSync - - function fakeStat(path) { - var ret - switch (path.toLowerCase()) { - case '/tmp': case '/tmp/': case 'c:\\tmp': case 'c:\\tmp\\': - ret = { isDirectory: function() { return true } } - break - case '/tmp/a': case 'c:\\tmp\\a': - ret = { isDirectory: function() { return false } } - break - } - return ret - } - - fs.stat = function(path, cb) { - var f = fakeStat(path); - if (f) { - process.nextTick(function() { - cb(null, f) - }) - } else { - stat.call(fs, path, cb) - } - } - - fs.statSync = function(path) { - return fakeStat(path) || statSync.call(fs, path) - } - - function fakeReaddir(path) { - var ret - switch (path.toLowerCase()) { - case '/tmp': case '/tmp/': case 'c:\\tmp': case 'c:\\tmp\\': - ret = [ 'a', 'A' ] - break - case '/': case 'c:\\': - ret = ['tmp', 'tMp', 'tMP', 'TMP'] - } - return ret - } - - fs.readdir = function(path, cb) { - var f = fakeReaddir(path) - if (f) - process.nextTick(function() { - cb(null, f) - }) - else - readdir.call(fs, path, cb) - } - - fs.readdirSync = function(path) { - return fakeReaddir(path) || readdirSync.call(fs, path) - } - - t.pass('mocked') - t.end() -}) - -test('nocase, nomagic', function(t) { - var n = 2 - var want = [ '/TMP/A', - '/TMP/a', - '/tMP/A', - '/tMP/a', - '/tMp/A', - '/tMp/a', - '/tmp/A', - '/tmp/a' ] - if(process.platform.match(/^win/)) { - want = want.map(function(p) { - return 'C:' + p - }) - } - glob('/tmp/a', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - if (--n === 0) t.end() - }) - glob('/tmp/A', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - if (--n === 0) t.end() - }) -}) - -test('nocase, with some magic', function(t) { - t.plan(2) - var want = [ '/TMP/A', - '/TMP/a', - '/tMP/A', - '/tMP/a', - '/tMp/A', - '/tMp/a', - '/tmp/A', - '/tmp/a' ] - if(process.platform.match(/^win/)) { - want = want.map(function(p) { - return 'C:' + p - }) - } - - glob('/tmp/*', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - }) - glob('/tmp/*', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js deleted file mode 100644 index e1ffbab..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/pause-resume.js +++ /dev/null @@ -1,73 +0,0 @@ -// show that no match events happen while paused. -var tap = require("tap") -, child_process = require("child_process") -// just some gnarly pattern with lots of matches -, pattern = "test/a/!(symlink)/**" -, bashResults = require("./bash-results.json") -, patterns = Object.keys(bashResults) -, glob = require("../") -, Glob = glob.Glob -, path = require("path") - -// run from the root of the project -// this is usually where you're at anyway, but be sure. -process.chdir(path.resolve(__dirname, "..")) - -function alphasort (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return a > b ? 1 : a < b ? -1 : 0 -} - -function cleanResults (m) { - // normalize discrepancies in ordering, duplication, - // and ending slashes. - return m.map(function (m) { - return m.replace(/\/+/g, "/").replace(/\/$/, "") - }).sort(alphasort).reduce(function (set, f) { - if (f !== set[set.length - 1]) set.push(f) - return set - }, []).sort(alphasort).map(function (f) { - // de-windows - return (process.platform !== 'win32') ? f - : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') - }) -} - -var globResults = [] -tap.test("use a Glob object, and pause/resume it", function (t) { - var g = new Glob(pattern) - , paused = false - , res = [] - , expect = bashResults[pattern] - - g.on("pause", function () { - console.error("pause") - }) - - g.on("resume", function () { - console.error("resume") - }) - - g.on("match", function (m) { - t.notOk(g.paused, "must not be paused") - globResults.push(m) - g.pause() - t.ok(g.paused, "must be paused") - setTimeout(g.resume.bind(g), 10) - }) - - g.on("end", function (matches) { - t.pass("reached glob end") - globResults = cleanResults(globResults) - matches = cleanResults(matches) - t.deepEqual(matches, globResults, - "end event matches should be the same as match events") - - t.deepEqual(matches, expect, - "glob matches should be the same as bash results") - - t.end() - }) -}) - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js deleted file mode 100644 index 0b4e0be..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/readme-issue.js +++ /dev/null @@ -1,36 +0,0 @@ -var test = require("tap").test -var glob = require("../") - -var mkdirp = require("mkdirp") -var fs = require("fs") -var rimraf = require("rimraf") -var dir = __dirname + "/package" - -test("setup", function (t) { - mkdirp.sync(dir) - fs.writeFileSync(dir + "/package.json", "{}", "ascii") - fs.writeFileSync(dir + "/README", "x", "ascii") - t.pass("setup done") - t.end() -}) - -test("glob", function (t) { - var opt = { - cwd: dir, - nocase: true, - mark: true - } - - glob("README?(.*)", opt, function (er, files) { - if (er) - throw er - t.same(files, ["README"]) - t.end() - }) -}) - -test("cleanup", function (t) { - rimraf.sync(dir) - t.pass("clean") - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js deleted file mode 100644 index 3ac5979..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root-nomount.js +++ /dev/null @@ -1,39 +0,0 @@ -var tap = require("tap") - -var origCwd = process.cwd() -process.chdir(__dirname) - -tap.test("changing root and searching for /b*/**", function (t) { - var glob = require('../') - var path = require('path') - t.test('.', function (t) { - glob('/b*/**', { globDebug: true, root: '.', nomount: true }, function (er, matches) { - t.ifError(er) - t.like(matches, []) - t.end() - }) - }) - - t.test('a', function (t) { - glob('/b*/**', { globDebug: true, root: path.resolve('a'), nomount: true }, function (er, matches) { - t.ifError(er) - t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) - t.end() - }) - }) - - t.test('root=a, cwd=a/b', function (t) { - glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b'), nomount: true }, function (er, matches) { - t.ifError(er) - t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) - t.end() - }) - }) - - t.test('cd -', function (t) { - process.chdir(origCwd) - t.end() - }) - - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js deleted file mode 100644 index 95c23f9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/root.js +++ /dev/null @@ -1,46 +0,0 @@ -var t = require("tap") - -var origCwd = process.cwd() -process.chdir(__dirname) - -var glob = require('../') -var path = require('path') - -t.test('.', function (t) { - glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) { - t.ifError(er) - t.like(matches, []) - t.end() - }) -}) - - -t.test('a', function (t) { - console.error("root=" + path.resolve('a')) - glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) { - t.ifError(er) - var wanted = [ - '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' - ].map(function (m) { - return path.join(path.resolve('a'), m).replace(/\\/g, '/') - }) - - t.like(matches, wanted) - t.end() - }) -}) - -t.test('root=a, cwd=a/b', function (t) { - glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) { - t.ifError(er) - t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) { - return path.join(path.resolve('a'), m).replace(/\\/g, '/') - })) - t.end() - }) -}) - -t.test('cd -', function (t) { - process.chdir(origCwd) - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js deleted file mode 100644 index f555b39..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/stat.js +++ /dev/null @@ -1,32 +0,0 @@ -var glob = require('../') -var test = require('tap').test -var path = require('path') - -test('stat all the things', function(t) { - var g = new glob.Glob('a/*abc*/**', { stat: true, cwd: __dirname }) - var matches = [] - g.on('match', function(m) { - matches.push(m) - }) - var stats = [] - g.on('stat', function(m) { - stats.push(m) - }) - g.on('end', function(eof) { - stats = stats.sort() - matches = matches.sort() - eof = eof.sort() - t.same(stats, matches) - t.same(eof, matches) - var cache = Object.keys(this.statCache) - t.same(cache.map(function (f) { - return path.relative(__dirname, f).replace(/\\/g, '/') - }).sort(), matches) - - cache.forEach(function(c) { - t.equal(typeof this.statCache[c], 'object') - }, this) - - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js deleted file mode 100644 index e085f0f..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/node_modules/glob/test/zz-cleanup.js +++ /dev/null @@ -1,11 +0,0 @@ -// remove the fixtures -var tap = require("tap") -, rimraf = require("rimraf") -, path = require("path") - -tap.test("cleanup fixtures", function (t) { - rimraf(path.resolve(__dirname, "a"), function (er) { - t.ifError(er, "removed") - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json deleted file mode 100755 index 44ca437..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/cli/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "cli", - "description": "A tool for rapidly building command line apps", - "version": "0.4.5", - "homepage": "http://github.com/chriso/cli", - "keywords": [ - "cli", - "command line", - "opts", - "parseopt", - "opt", - "args", - "console", - "argsparse", - "optparse", - "daemon", - "autocomplete", - "command", - "autocompletion" - ], - "author": { - "name": "Chris O'Hara", - "email": "cohara87@gmail.com" - }, - "main": "cli.js", - "bugs": { - "url": "http://github.com/chriso/cli/issues" - }, - "repository": { - "type": "git", - "url": "http://github.com/chriso/cli.git" - }, - "dependencies": { - "glob": ">= 3.1.4" - }, - "contributors": [ - { - "name": "Douglas Meyer" - } - ], - "engines": { - "node": ">=0.2.5" - }, - "licenses": [ - { - "type": "MIT" - } - ], - "readme": "**cli is a toolkit for rapidly building command line apps - it includes:**\n\n- Full featured opts/args parser\n- Plugin support for adding common options and switches\n- Helper methods for working with input/output and spawning child processes\n- Output colored/styled messages, [progress bars](https://github.com/chriso/cli/blob/master/examples/progress.js) or [spinners](https://github.com/chriso/cli/blob/master/examples/spinner.js)\n- Command [auto-completion](https://github.com/chriso/cli/blob/master/examples/command.js) and [glob support](https://github.com/chriso/cli/blob/master/examples/glob.js)\n\nInstall using `npm install cli` or just bundle [cli.js](https://github.com/chriso/cli/raw/master/cli-min.js) with your app.\n\n## Example apps\n\n### sort.js\n\n```javascript\n#!/usr/bin/env node\nrequire('cli').withStdinLines(function(lines, newline) {\n this.output(lines.sort().join(newline));\n});\n```\n\nTry it out\n\n```bash\n$ ./sort.js < input.txt\n```\n\nLet's add support for an `-n` switch to use a numeric sort, and a `-r` switch to reverse output - only 5 extra lines of code (!)\n\n```javascript\nvar cli = require('cli'), options = cli.parse();\n\ncli.withStdinLines(function(lines, newline) {\n lines.sort(!options.n ? null : function(a, b) {\n return parseInt(a) > parseInt(b);\n });\n if (options.r) lines.reverse();\n this.output(lines.join(newline));\n});\n```\n\n### static.js\n\nLet's create a static file server with daemon support to see the opts parser + plugins in use - note: this requires `npm install creationix daemon`\n\n```javascript\nvar cli = require('cli').enable('daemon', 'status'); //Enable 2 plugins\n\ncli.parse({\n log: ['l', 'Enable logging'],\n port: ['p', 'Listen on this port', 'number', 8080],\n serve: [false, 'Serve static files from PATH', 'path', './public']\n});\n\ncli.main(function(args, options) {\n var server, middleware = [];\n\n if (options.log) {\n this.debug('Enabling logging');\n middleware.push(require('creationix/log')());\n }\n\n this.debug('Serving files from ' + options.serve);\n middleware.push(require('creationix/static')('/', options.serve, 'index.html'));\n\n server = this.createServer(middleware).listen(options.port);\n\n this.ok('Listening on port ' + options.port);\n});\n```\n\nTo output usage information\n\n```bash\n$ ./static.js --help\n```\n\nTo create a daemon that serves files from */tmp*, run\n\n```bash\n$ ./static.js -ld --serve=/tmp\n```\n\nFor more examples, see [./examples](https://github.com/chriso/cli/tree/master/examples)\n\n## Helper methods\n\ncli has methods that collect stdin (newline is autodetected as \\n or \\r\\n)\n\n```javascript\ncli.withStdin(callback); //callback receives stdin as a string\ncli.withStdinLines(callback); //callback receives stdin split into an array of lines (lines, newline)\n```\n\ncli also has a lower level method for working with input line by line (see [./examples/cat.js](https://github.com/chriso/cli/blob/master/examples/cat.js) for an example). \n\n```javascript\ncli.withInput(file, function (line, newline, eof) {\n if (!eof) {\n this.output(line + newline);\n }\n});\n```\n\n*Note: `file` can be omitted if you want to work with stdin*\n\nTo output a progress bar, call\n\n```javascript\ncli.progress(progress); //Where 0 <= progress <= 1\n```\n\nTo spawn a child process, use\n\n```javascript\ncli.exec(cmd, callback); //callback receives the output of the process (split into lines)\n```\n\ncli also comes bundled with kof's [node-natives](https://github.com/kof/node-natives) (access with cli.native) and creationix' [stack](https://github.com/creationix/stack) (access with cli.createServer)\n\n## Plugins\n\nPlugins are a way of adding common opts and can be enabled using \n\n```javascript\ncli.enable(plugin1, [plugin2, ...]); //To disable, use the equivalent disable() method\n```\n\n**help** - *enabled by default*\n\nAdds `-h,--help` to output auto-generated usage information\n\n**version**\n\nAdds `-v,--version` to output version information for the app. cli will attempt to locate and parse a nearby *package.json*\n\nTo set your own app name and version, use `cli.setApp(app_name, version)`\n\n**status**\n\nAdds options to show/hide the stylized status messages that are output to the console when using one of these methods\n\n```javascript\ncli.debug(msg); //Only shown when using --debug\ncli.error(msg);\ncli.fatal(msg); //Exits the process after outputting msg\ncli.info(msg);\ncli.ok(msg);\n```\n\n`-k,--no-color` will omit ANSI color escapes from the output\n\n**glob** - *requires* `npm install glob`\n\nEnables glob matching of arguments\n\n**daemon** - *requires* `npm install daemon`\n\nAdds `-d,--daemon ARG` for daemonizing the process and controlling the resulting daemon\n\n`ARG` can be either start (default), stop, restart, pid (outputs the daemon's pid if it's running), or log (output the daemon's stdout+stderr)\n\n**timeout**\n\nAdds `-t,--timeout N` to exit the process after N seconds with an error\n\n**catchall**\n\nAdds `-c,--catch` to catch and output uncaughtExceptions and resume execution\n\n*Note: Plugins are automatically disabled if an option or switch of the same name is already defined*\n\n## LICENSE\n\n(MIT license)\n\nCopyright (c) 2010 Chris O'Hara \n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "readmeFilename": "README.md", - "_id": "cli@0.4.5", - "_from": "cli@0.4.x" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.npmignore deleted file mode 100644 index aa3fd4b..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -.DS_Store -.monitor -.*.swp -.nodemonignore -releases -*.log -*.err -fleet.json -public/browserify -bin/*.json -.bin -build -compile -.lock-wscript diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.testem.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.testem.json deleted file mode 100644 index 633c2ba..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.testem.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "launchers": { - "node": { - "command": "npm test" - } - }, - "src_files": [ - "./**/*.js" - ], - "before_tests": "npm run build", - "on_exit": "rm test/static/bundle.js", - "test_page": "test/static/index.html", - "launch_in_dev": ["node", "phantomjs"] -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.travis.yml b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.travis.yml deleted file mode 100644 index ed178f6..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.8 - - 0.9 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/LICENCE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/LICENCE deleted file mode 100644 index a23e08a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/LICENCE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2012 Raynos. - -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/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/README.md deleted file mode 100644 index 5e480ba..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# console-browserify - -[![build status][1]][2] - -[![browser support][3]][4] - -Emulate console for all the browsers - -## Example - -```js -var console = require("console-browserify") - -console.log("hello world!") -``` - -## Installation - -`npm install console-browserify` - -## Contributors - - - Raynos - -## MIT Licenced - - - - [1]: https://secure.travis-ci.org/Raynos/console-browserify.png - [2]: http://travis-ci.org/Raynos/console-browserify - [3]: http://ci.testling.com/Raynos/console-browserify.png - [4]: http://ci.testling.com/Raynos/console-browserify diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/index.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/index.js deleted file mode 100644 index bfdf4b3..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/index.js +++ /dev/null @@ -1,85 +0,0 @@ -/*global window, global*/ -var util = require("util") -var assert = require("assert") - -var slice = Array.prototype.slice -var console -var times = {} - -if (typeof global !== "undefined" && global.console) { - console = global.console -} else if (typeof window !== "undefined" && window.console) { - console = window.console -} else { - console = window.console = {} -} - -var functions = [ - [log, "log"] - , [info, "info"] - , [warn, "warn"] - , [error, "error"] - , [time, "time"] - , [timeEnd, "timeEnd"] - , [trace, "trace"] - , [dir, "dir"] - , [assert, "assert"] -] - -for (var i = 0; i < functions.length; i++) { - var tuple = functions[i] - var f = tuple[0] - var name = tuple[1] - - if (!console[name]) { - console[name] = f - } -} - -module.exports = console - -function log() {} - -function info() { - console.log.apply(console, arguments) -} - -function warn() { - console.log.apply(console, arguments) -} - -function error() { - console.warn.apply(console, arguments) -} - -function time(label) { - times[label] = Date.now() -} - -function timeEnd(label) { - var time = times[label] - if (!time) { - throw new Error("No such label: " + label) - } - - var duration = Date.now() - time - console.log(label + ": " + duration + "ms") -} - -function trace() { - var err = new Error() - err.name = "Trace" - err.message = util.format.apply(null, arguments) - console.error(err.stack) -} - -function dir(object) { - console.log(util.inspect(object) + "\n") -} - -function assert(expression) { - if (!expression) { - var arr = slice.call(arguments, 1) - assert.ok(false, util.format.apply(null, arr)) - } -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/package.json deleted file mode 100644 index dbd58ae..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "console-browserify", - "version": "0.1.6", - "description": "Emulate console for all the browsers", - "keywords": [], - "author": { - "name": "Raynos", - "email": "raynos2@gmail.com" - }, - "repository": { - "type": "git", - "url": "git://github.com/Raynos/console-browserify.git" - }, - "main": "index", - "homepage": "https://github.com/Raynos/console-browserify", - "contributors": [ - { - "name": "Raynos" - } - ], - "bugs": { - "url": "https://github.com/Raynos/console-browserify/issues", - "email": "raynos2@gmail.com" - }, - "dependencies": {}, - "devDependencies": { - "tape": "~0.2.2", - "browserify": "https://github.com/raynos/node-browserify/tarball/master", - "testem": "~0.2.55", - "jsonify": "0.0.0" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/Raynos/console-browserify/raw/master/LICENSE" - } - ], - "scripts": { - "test": "node ./test", - "build": "browserify test/index.js -o test/static/bundle.js", - "testem": "testem" - }, - "testling": { - "files": "test/index.js", - "browsers": { - "ie": [ - "6", - "7", - "8", - "9", - "10" - ], - "firefox": [ - "16", - "17", - "nightly" - ], - "chrome": [ - "22", - "23", - "canary" - ], - "opera": [ - "12", - "next" - ], - "safari": [ - "5.1" - ] - } - }, - "readme": "# console-browserify\n\n[![build status][1]][2]\n\n[![browser support][3]][4]\n\nEmulate console for all the browsers\n\n## Example\n\n```js\nvar console = require(\"console-browserify\")\n\nconsole.log(\"hello world!\")\n```\n\n## Installation\n\n`npm install console-browserify`\n\n## Contributors\n\n - Raynos\n\n## MIT Licenced\n\n\n\n [1]: https://secure.travis-ci.org/Raynos/console-browserify.png\n [2]: http://travis-ci.org/Raynos/console-browserify\n [3]: http://ci.testling.com/Raynos/console-browserify.png\n [4]: http://ci.testling.com/Raynos/console-browserify\n", - "readmeFilename": "README.md", - "_id": "console-browserify@0.1.6", - "_from": "console-browserify@0.1.x" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/index.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/index.js deleted file mode 100644 index 26dfaad..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/index.js +++ /dev/null @@ -1,67 +0,0 @@ -var console = require("../index") -var test = require("tape") - -if (typeof window !== "undefined" && !window.JSON) { - window.JSON = require("jsonify") -} - -test("console has expected methods", function (assert) { - assert.ok(console.log) - assert.ok(console.info) - assert.ok(console.warn) - assert.ok(console.dir) - assert.ok(console.time, "time") - assert.ok(console.timeEnd, "timeEnd") - assert.ok(console.trace, "trace") - assert.ok(console.assert) - - assert.end() -}) - -test("invoke console.log", function (assert) { - console.log("test-log") - - assert.end() -}) - -test("invoke console.info", function (assert) { - console.info("test-info") - - assert.end() -}) - -test("invoke console.warn", function (assert) { - console.warn("test-warn") - - assert.end() -}) - -test("invoke console.time", function (assert) { - console.time("label") - - assert.end() -}) - -test("invoke console.trace", function (assert) { - console.trace("test-trace") - - assert.end() -}) - -test("invoke console.assert", function (assert) { - console.assert(true) - - assert.end() -}) - -test("invoke console.dir", function (assert) { - console.dir("test-dir") - - assert.end() -}) - -test("invoke console.timeEnd", function (assert) { - console.timeEnd("label") - - assert.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/index.html b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/index.html deleted file mode 100644 index dd55012..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - TAPE Example - - - - - - - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js deleted file mode 100644 index 8b4c12d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/console-browserify/test/static/test-adapter.js +++ /dev/null @@ -1,53 +0,0 @@ -(function () { - var Testem = window.Testem - var regex = /^((?:not )?ok) (\d+) (.+)$/ - - Testem.useCustomAdapter(tapAdapter) - - function tapAdapter(socket){ - var results = { - failed: 0 - , passed: 0 - , total: 0 - , tests: [] - } - - socket.emit('tests-start') - - Testem.handleConsoleMessage = function(msg){ - var m = msg.match(regex) - if (m) { - var passed = m[1] === 'ok' - var test = { - passed: passed ? 1 : 0, - failed: passed ? 0 : 1, - total: 1, - id: m[2], - name: m[3], - items: [] - } - - if (passed) { - results.passed++ - } else { - console.error("failure", m) - - results.failed++ - } - - results.total++ - - // console.log("emitted test", test) - socket.emit('test-result', test) - results.tests.push(test) - } else if (msg === '# ok' || msg.match(/^# tests \d+/)){ - // console.log("emitted all test") - socket.emit('all-test-results', results) - } - - // return false if you want to prevent the console message from - // going to the console - // return false - } - } -}()) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md deleted file mode 100644 index 5b3967e..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/README.md +++ /dev/null @@ -1,218 +0,0 @@ -# minimatch - -A minimal matching utility. - -[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) - - -This is the matching library used internally by npm. - -Eventually, it will replace the C binding in node-glob. - -It works by converting glob expressions into JavaScript `RegExp` -objects. - -## Usage - -```javascript -var minimatch = require("minimatch") - -minimatch("bar.foo", "*.foo") // true! -minimatch("bar.foo", "*.bar") // false! -minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! -``` - -## Features - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` - -## Minimatch Class - -Create a minimatch object by instanting the `minimatch.Minimatch` class. - -```javascript -var Minimatch = require("minimatch").Minimatch -var mm = new Minimatch(pattern, options) -``` - -### Properties - -* `pattern` The original pattern the minimatch object represents. -* `options` The options supplied to the constructor. -* `set` A 2-dimensional array of regexp or string expressions. - Each row in the - array corresponds to a brace-expanded pattern. Each item in the row - corresponds to a single path-part. For example, the pattern - `{a,b/c}/d` would expand to a set of patterns like: - - [ [ a, d ] - , [ b, c, d ] ] - - If a portion of the pattern doesn't have any "magic" in it - (that is, it's something like `"foo"` rather than `fo*o?`), then it - will be left as a string rather than converted to a regular - expression. - -* `regexp` Created by the `makeRe` method. A single regular expression - expressing the entire pattern. This is useful in cases where you wish - to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. -* `negate` True if the pattern is negated. -* `comment` True if the pattern is a comment. -* `empty` True if the pattern is `""`. - -### Methods - -* `makeRe` Generate the `regexp` member if necessary, and return it. - Will return `false` if the pattern is invalid. -* `match(fname)` Return true if the filename matches the pattern, or - false otherwise. -* `matchOne(fileArray, patternArray, partial)` Take a `/`-split - filename, and match it against a single row in the `regExpSet`. This - method is mainly for internal use, but is exposed so that it can be - used by a glob-walker that needs to avoid excessive filesystem calls. - -All other methods are internal, and will be called as necessary. - -## Functions - -The top-level exported function has a `cache` property, which is an LRU -cache set to store 100 items. So, calling these methods repeatedly -with the same pattern and options will use the same Minimatch object, -saving the cost of parsing it multiple times. - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```javascript -var isJS = minimatch(file, "*.js", { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```javascript -var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) -``` - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```javascript -var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself 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/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js deleted file mode 100644 index 4539678..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/minimatch.js +++ /dev/null @@ -1,1061 +0,0 @@ -;(function (require, exports, module, platform) { - -if (module) module.exports = minimatch -else exports.minimatch = minimatch - -if (!require) { - require = function (id) { - switch (id) { - case "sigmund": return function sigmund (obj) { - return JSON.stringify(obj) - } - case "path": return { basename: function (f) { - f = f.split(/[\/\\]/) - var e = f.pop() - if (!e) e = f.pop() - return e - }} - case "lru-cache": return function LRUCache () { - // not quite an LRU, but still space-limited. - var cache = {} - var cnt = 0 - this.set = function (k, v) { - cnt ++ - if (cnt >= 100) cache = {} - cache[k] = v - } - this.get = function (k) { return cache[k] } - } - } - } -} - -minimatch.Minimatch = Minimatch - -var LRU = require("lru-cache") - , cache = minimatch.cache = new LRU({max: 100}) - , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} - , sigmund = require("sigmund") - -var path = require("path") - // any single thing other than / - // don't need to escape / when using new RegExp() - , qmark = "[^/]" - - // * => any number of characters - , star = qmark + "*?" - - // ** when dots are allowed. Anything goes, except .. and . - // not (^ or / followed by one or two dots followed by $ or /), - // followed by anything, any number of times. - , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" - - // not a ^ or / followed by a dot, - // followed by anything, any number of times. - , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" - - // characters that need to be escaped in RegExp. - , reSpecials = charSet("().*{}+?[]^$\\!") - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split("").reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - - -function minimatch (p, pattern, options) { - if (typeof pattern !== "string") { - throw new TypeError("glob pattern string required") - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === "#") { - return false - } - - // "" only matches "" - if (pattern.trim() === "") return p === "" - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options, cache) - } - - if (typeof pattern !== "string") { - throw new TypeError("glob pattern string required") - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows: need to use /, not \ - // On other platforms, \ is a valid (albeit bad) filename char. - if (platform === "win32") { - pattern = pattern.split("\\").join("/") - } - - // lru storage. - // these things aren't particularly big, but walking down the string - // and turning it into a regexp can get pretty costly. - var cacheKey = pattern + "\n" + sigmund(options) - var cached = minimatch.cache.get(cacheKey) - if (cached) return cached - minimatch.cache.set(cacheKey, this) - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function() {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === "#") { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return -1 === s.indexOf(false) - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - , negate = false - , options = this.options - , negateOffset = 0 - - if (options.nonegate) return - - for ( var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === "!" - ; i ++) { - negate = !negate - negateOffset ++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return new Minimatch(pattern, options).braceExpand() -} - -Minimatch.prototype.braceExpand = braceExpand -function braceExpand (pattern, options) { - options = options || this.options - pattern = typeof pattern === "undefined" - ? this.pattern : pattern - - if (typeof pattern === "undefined") { - throw new Error("undefined pattern") - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - var escaping = false - - // examples and comments refer to this crazy pattern: - // a{b,c{d,e},{f,g}h}x{y,z} - // expected: - // abxy - // abxz - // acdxy - // acdxz - // acexy - // acexz - // afhxy - // afhxz - // aghxy - // aghxz - - // everything before the first \{ is just a prefix. - // So, we pluck that off, and work with the rest, - // and then prepend it to everything we find. - if (pattern.charAt(0) !== "{") { - this.debug(pattern) - var prefix = null - for (var i = 0, l = pattern.length; i < l; i ++) { - var c = pattern.charAt(i) - this.debug(i, c) - if (c === "\\") { - escaping = !escaping - } else if (c === "{" && !escaping) { - prefix = pattern.substr(0, i) - break - } - } - - // actually no sets, all { were escaped. - if (prefix === null) { - this.debug("no sets") - return [pattern] - } - - var tail = braceExpand.call(this, pattern.substr(i), options) - return tail.map(function (t) { - return prefix + t - }) - } - - // now we have something like: - // {b,c{d,e},{f,g}h}x{y,z} - // walk through the set, expanding each part, until - // the set ends. then, we'll expand the suffix. - // If the set only has a single member, then'll put the {} back - - // first, handle numeric sets, since they're easier - var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/) - if (numset) { - this.debug("numset", numset[1], numset[2]) - var suf = braceExpand.call(this, pattern.substr(numset[0].length), options) - , start = +numset[1] - , end = +numset[2] - , inc = start > end ? -1 : 1 - , set = [] - for (var i = start; i != (end + inc); i += inc) { - // append all the suffixes - for (var ii = 0, ll = suf.length; ii < ll; ii ++) { - set.push(i + suf[ii]) - } - } - return set - } - - // ok, walk through the set - // We hope, somewhat optimistically, that there - // will be a } at the end. - // If the closing brace isn't found, then the pattern is - // interpreted as braceExpand("\\" + pattern) so that - // the leading \{ will be interpreted literally. - var i = 1 // skip the \{ - , depth = 1 - , set = [] - , member = "" - , sawEnd = false - , escaping = false - - function addMember () { - set.push(member) - member = "" - } - - this.debug("Entering for") - FOR: for (i = 1, l = pattern.length; i < l; i ++) { - var c = pattern.charAt(i) - this.debug("", i, c) - - if (escaping) { - escaping = false - member += "\\" + c - } else { - switch (c) { - case "\\": - escaping = true - continue - - case "{": - depth ++ - member += "{" - continue - - case "}": - depth -- - // if this closes the actual set, then we're done - if (depth === 0) { - addMember() - // pluck off the close-brace - i ++ - break FOR - } else { - member += c - continue - } - - case ",": - if (depth === 1) { - addMember() - } else { - member += c - } - continue - - default: - member += c - continue - } // switch - } // else - } // for - - // now we've either finished the set, and the suffix is - // pattern.substr(i), or we have *not* closed the set, - // and need to escape the leading brace - if (depth !== 0) { - this.debug("didn't close", pattern) - return braceExpand.call(this, "\\" + pattern, options) - } - - // x{y,z} -> ["xy", "xz"] - this.debug("set", set) - this.debug("suffix", pattern.substr(i)) - var suf = braceExpand.call(this, pattern.substr(i), options) - // ["b", "c{d,e}","{f,g}h"] -> - // [["b"], ["cd", "ce"], ["fh", "gh"]] - var addBraces = set.length === 1 - this.debug("set pre-expanded", set) - set = set.map(function (p) { - return braceExpand.call(this, p, options) - }, this) - this.debug("set expanded", set) - - - // [["b"], ["cd", "ce"], ["fh", "gh"]] -> - // ["b", "cd", "ce", "fh", "gh"] - set = set.reduce(function (l, r) { - return l.concat(r) - }) - - if (addBraces) { - set = set.map(function (s) { - return "{" + s + "}" - }) - } - - // now attach the suffixes. - var ret = [] - for (var i = 0, l = set.length; i < l; i ++) { - for (var ii = 0, ll = suf.length; ii < ll; ii ++) { - ret.push(set[i] + suf[ii]) - } - } - return ret -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === "**") return GLOBSTAR - if (pattern === "") return "" - - var re = "" - , hasMagic = !!options.nocase - , escaping = false - // ? => one single character - , patternListStack = [] - , plType - , stateChar - , inClass = false - , reClassStart = -1 - , classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - , patternStart = pattern.charAt(0) === "." ? "" // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" - : "(?!\\.)" - , self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case "*": - re += star - hasMagic = true - break - case "?": - re += qmark - hasMagic = true - break - default: - re += "\\"+stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for ( var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i ++ ) { - - this.debug("%s\t%s %s %j", pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += "\\" + c - escaping = false - continue - } - - SWITCH: switch (c) { - case "/": - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case "\\": - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case "?": - case "*": - case "+": - case "@": - case "!": - this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === "!" && i === classStart + 1) c = "^" - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case "(": - if (inClass) { - re += "(" - continue - } - - if (!stateChar) { - re += "\\(" - continue - } - - plType = stateChar - patternListStack.push({ type: plType - , start: i - 1 - , reStart: re.length }) - // negation is (?:(?!js)[^/]*) - re += stateChar === "!" ? "(?:(?!" : "(?:" - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ")": - if (inClass || !patternListStack.length) { - re += "\\)" - continue - } - - clearStateChar() - hasMagic = true - re += ")" - plType = patternListStack.pop().type - // negation is (?:(?!js)[^/]*) - // The others are (?:) - switch (plType) { - case "!": - re += "[^/]*?)" - break - case "?": - case "+": - case "*": re += plType - case "@": break // the default anyway - } - continue - - case "|": - if (inClass || !patternListStack.length || escaping) { - re += "\\|" - escaping = false - continue - } - - clearStateChar() - re += "|" - continue - - // these are mostly the same in regexp and glob - case "[": - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += "\\" + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case "]": - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += "\\" + c - escaping = false - continue - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === "^" && inClass)) { - re += "\\" - } - - re += c - - } // switch - } // for - - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - var cs = pattern.substr(classStart + 1) - , sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + "\\[" + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - var pl - while (pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = "\\" - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + "|" - }) - - this.debug("tail=%j\n %s", tail, tail) - var t = pl.type === "*" ? star - : pl.type === "?" ? qmark - : "\\" + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) - + t + "\\(" - + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += "\\\\" - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case ".": - case "[": - case "(": addPatternStart = true - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== "" && hasMagic) re = "(?=.)" + re - - if (addPatternStart) re = patternStart + re - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [ re, hasMagic ] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? "i" : "" - , regExp = new RegExp("^" + re + "$", flags) - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) return this.regexp = false - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - , flags = options.nocase ? "i" : "" - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === "string") ? regExpEscape(p) - : p._src - }).join("\\\/") - }).join("|") - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = "^(?:" + re + ")$" - - // can match anything, as long as it's not this. - if (this.negate) re = "^(?!" + re + ").*$" - - try { - return this.regexp = new RegExp(re, flags) - } catch (ex) { - return this.regexp = false - } -} - -minimatch.match = function (list, pattern, options) { - 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 \ - // On other platforms, \ is a valid (albeit bad) filename char. - if (platform === "win32") { - f = f.split("\\").join("/") - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, "split", f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, "set", set) - - // Find the basename of the path by looking for the last non-empty segment - var filename; - for (var i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (var i = 0, l = set.length; i < l; i ++) { - var pattern = set[i], file = f - if (options.matchBase && pattern.length === 1) { - file = [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] - , f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - , pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for ( ; fi < fl; fi ++) { - if (file[fi] === "." || file[fi] === ".." || - (!options.dot && file[fi].charAt(0) === ".")) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - WHILE: while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', - file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === "." || swallowee === ".." || - (!options.dot && swallowee.charAt(0) === ".")) { - this.debug("dot detected!", file, fr, pattern, pr) - break WHILE - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr ++ - } - } - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug("\n>>> no match, partial?", file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === "string") { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug("string match", p, f, hit) - } else { - hit = f.match(p) - this.debug("pattern match", p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") - return emptyFileEnd - } - - // should be unreachable. - throw new Error("wtf?") -} - - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, "$1") -} - - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") -} - -})( typeof require === "function" ? require : null, - this, - typeof module === "object" ? module : null, - typeof process === "object" ? process.platform : "win32" - ) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/.npmignore deleted file mode 100644 index 07e6e47..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/.npmignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS deleted file mode 100644 index 4a0bc50..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +++ /dev/null @@ -1,14 +0,0 @@ -# Authors, sorted by whether or not they are me -Isaac Z. Schlueter -Brian Cottingham -Carlos Brito Lage -Jesse Dailey -Kevin O'Hara -Marco Rogers -Mark Cavage -Marko Mikulicic -Nathan Rajlich -Satheesh Natesan -Trent Mick -ashleybrener -n4kz diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md deleted file mode 100644 index 03ee0f9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# lru cache - -A cache object that deletes the least-recently-used items. - -## Usage: - -```javascript -var LRU = require("lru-cache") - , options = { max: 500 - , length: function (n) { return n * 2 } - , dispose: function (key, n) { n.close() } - , maxAge: 1000 * 60 * 60 } - , cache = LRU(options) - , otherCache = LRU(50) // sets just the max size - -cache.set("key", "value") -cache.get("key") // "value" - -cache.reset() // empty the cache -``` - -If you put more stuff in it, then items will fall out. - -If you try to put an oversized thing in it, then it'll fall out right -away. - -## Options - -* `max` The maximum size of the cache, checked by applying the length - function to all values in the cache. Not setting this is kind of - silly, since that's the whole purpose of this lib, but it defaults - to `Infinity`. -* `maxAge` Maximum age in ms. Items are not pro-actively pruned out - as they age, but if you try to get an item that is too old, it'll - drop it and return undefined instead of giving it to you. -* `length` Function that is used to calculate the length of stored - items. If you're storing strings or buffers, then you probably want - to do something like `function(n){return n.length}`. The default is - `function(n){return 1}`, which is fine if you want to store `n` - like-sized things. -* `dispose` Function that is called on items when they are dropped - from the cache. This can be handy if you want to close file - descriptors or do other cleanup tasks when items are no longer - accessible. Called with `key, value`. It's called *before* - actually removing the item from the internal cache, so if you want - to immediately put it back in, you'll have to do that in a - `nextTick` or `setTimeout` callback or it won't do anything. -* `stale` By default, if you set a `maxAge`, it'll only actually pull - stale items out of the cache when you `get(key)`. (That is, it's - not pre-emptively doing a `setTimeout` or anything.) If you set - `stale:true`, it'll return the stale value before deleting it. If - you don't set this, then it'll return `undefined` when you try to - get a stale entry, as if it had already been deleted. - -## API - -* `set(key, value)` -* `get(key) => value` - - Both of these will update the "recently used"-ness of the key. - They do what you think. - -* `peek(key)` - - Returns the key value (or `undefined` if not found) without - updating the "recently used"-ness of the key. - - (If you find yourself using this a lot, you *might* be using the - wrong sort of data structure, but there are some use cases where - it's handy.) - -* `del(key)` - - Deletes a key out of the cache. - -* `reset()` - - Clear the cache entirely, throwing away all values. - -* `has(key)` - - Check if a key is in the cache, without updating the recent-ness - or deleting it for being stale. - -* `forEach(function(value,key,cache), [thisp])` - - Just like `Array.prototype.forEach`. Iterates over all the keys - in the cache, in order of recent-ness. (Ie, more recently used - items are iterated over first.) - -* `keys()` - - Return an array of the keys in the cache. - -* `values()` - - Return an array of the values in the cache. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js deleted file mode 100644 index d1d1381..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +++ /dev/null @@ -1,252 +0,0 @@ -;(function () { // closure for web browsers - -if (typeof module === 'object' && module.exports) { - module.exports = LRUCache -} else { - // just set the global for non-node platforms. - this.LRUCache = LRUCache -} - -function hOP (obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key) -} - -function naiveLength () { return 1 } - -function LRUCache (options) { - if (!(this instanceof LRUCache)) - return new LRUCache(options) - - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - this._max = options.max - // Kind of weird to have a default max of Infinity, but oh well. - if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) - this._max = Infinity - - this._lengthCalculator = options.length || naiveLength - if (typeof this._lengthCalculator !== "function") - this._lengthCalculator = naiveLength - - this._allowStale = options.stale || false - this._maxAge = options.maxAge || null - this._dispose = options.dispose - this.reset() -} - -// resize the cache when the max changes. -Object.defineProperty(LRUCache.prototype, "max", - { set : function (mL) { - if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity - this._max = mL - if (this._length > this._max) trim(this) - } - , get : function () { return this._max } - , enumerable : true - }) - -// resize the cache when the lengthCalculator changes. -Object.defineProperty(LRUCache.prototype, "lengthCalculator", - { set : function (lC) { - if (typeof lC !== "function") { - this._lengthCalculator = naiveLength - this._length = this._itemCount - for (var key in this._cache) { - this._cache[key].length = 1 - } - } else { - this._lengthCalculator = lC - this._length = 0 - for (var key in this._cache) { - this._cache[key].length = this._lengthCalculator(this._cache[key].value) - this._length += this._cache[key].length - } - } - - if (this._length > this._max) trim(this) - } - , get : function () { return this._lengthCalculator } - , enumerable : true - }) - -Object.defineProperty(LRUCache.prototype, "length", - { get : function () { return this._length } - , enumerable : true - }) - - -Object.defineProperty(LRUCache.prototype, "itemCount", - { get : function () { return this._itemCount } - , enumerable : true - }) - -LRUCache.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - var i = 0; - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { - i++ - var hit = this._lruList[k] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { - del(this, hit) - if (!this._allowStale) hit = undefined - } - if (hit) { - fn.call(thisp, hit.value, hit.key, this) - } - } -} - -LRUCache.prototype.keys = function () { - var keys = new Array(this._itemCount) - var i = 0 - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { - var hit = this._lruList[k] - keys[i++] = hit.key - } - return keys -} - -LRUCache.prototype.values = function () { - var values = new Array(this._itemCount) - var i = 0 - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { - var hit = this._lruList[k] - values[i++] = hit.value - } - return values -} - -LRUCache.prototype.reset = function () { - if (this._dispose && this._cache) { - for (var k in this._cache) { - this._dispose(k, this._cache[k].value) - } - } - - this._cache = Object.create(null) // hash of items by key - this._lruList = Object.create(null) // list of items in order of use recency - this._mru = 0 // most recently used - this._lru = 0 // least recently used - this._length = 0 // number of items in the list - this._itemCount = 0 -} - -// Provided for debugging/dev purposes only. No promises whatsoever that -// this API stays stable. -LRUCache.prototype.dump = function () { - return this._cache -} - -LRUCache.prototype.dumpLru = function () { - return this._lruList -} - -LRUCache.prototype.set = function (key, value) { - if (hOP(this._cache, key)) { - // dispose of the old one before overwriting - if (this._dispose) this._dispose(key, this._cache[key].value) - if (this._maxAge) this._cache[key].now = Date.now() - this._cache[key].value = value - this.get(key) - return true - } - - var len = this._lengthCalculator(value) - var age = this._maxAge ? Date.now() : 0 - var hit = new Entry(key, value, this._mru++, len, age) - - // oversized objects fall out of cache automatically. - if (hit.length > this._max) { - if (this._dispose) this._dispose(key, value) - return false - } - - this._length += hit.length - this._lruList[hit.lu] = this._cache[key] = hit - this._itemCount ++ - - if (this._length > this._max) trim(this) - return true -} - -LRUCache.prototype.has = function (key) { - if (!hOP(this._cache, key)) return false - var hit = this._cache[key] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { - return false - } - return true -} - -LRUCache.prototype.get = function (key) { - return get(this, key, true) -} - -LRUCache.prototype.peek = function (key) { - return get(this, key, false) -} - -LRUCache.prototype.pop = function () { - var hit = this._lruList[this._lru] - del(this, hit) - return hit || null -} - -LRUCache.prototype.del = function (key) { - del(this, this._cache[key]) -} - -function get (self, key, doUse) { - var hit = self._cache[key] - if (hit) { - if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { - del(self, hit) - if (!self._allowStale) hit = undefined - } else { - if (doUse) use(self, hit) - } - if (hit) hit = hit.value - } - return hit -} - -function use (self, hit) { - shiftLU(self, hit) - hit.lu = self._mru ++ - self._lruList[hit.lu] = hit -} - -function trim (self) { - while (self._lru < self._mru && self._length > self._max) - del(self, self._lruList[self._lru]) -} - -function shiftLU (self, hit) { - delete self._lruList[ hit.lu ] - while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++ -} - -function del (self, hit) { - if (hit) { - if (self._dispose) self._dispose(hit.key, hit.value) - self._length -= hit.length - self._itemCount -- - delete self._cache[ hit.key ] - shiftLU(self, hit) - } -} - -// classy, since V8 prefers predictable objects. -function Entry (key, value, lu, length, now) { - this.key = key - this.value = value - this.lu = lu - this.length = length - this.now = now -} - -})() diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json deleted file mode 100644 index 4472725..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "lru-cache", - "description": "A cache object that deletes the least-recently-used items.", - "version": "2.5.0", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "scripts": { - "test": "tap test --gc" - }, - "main": "lib/lru-cache.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-lru-cache.git" - }, - "devDependencies": { - "tap": "", - "weak": "" - }, - "license": { - "type": "MIT", - "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" - }, - "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/node-lru-cache/issues" - }, - "homepage": "https://github.com/isaacs/node-lru-cache", - "_id": "lru-cache@2.5.0", - "_from": "lru-cache@2" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js deleted file mode 100644 index f72697c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/basic.js +++ /dev/null @@ -1,369 +0,0 @@ -var test = require("tap").test - , LRU = require("../") - -test("basic", function (t) { - var cache = new LRU({max: 10}) - cache.set("key", "value") - t.equal(cache.get("key"), "value") - t.equal(cache.get("nada"), undefined) - t.equal(cache.length, 1) - t.equal(cache.max, 10) - t.end() -}) - -test("least recently set", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.set("b", "B") - cache.set("c", "C") - t.equal(cache.get("c"), "C") - t.equal(cache.get("b"), "B") - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("lru recently gotten", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.set("b", "B") - cache.get("a") - cache.set("c", "C") - t.equal(cache.get("c"), "C") - t.equal(cache.get("b"), undefined) - t.equal(cache.get("a"), "A") - t.end() -}) - -test("del", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.del("a") - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("max", function (t) { - var cache = new LRU(3) - - // test changing the max, verify that the LRU items get dropped. - cache.max = 100 - for (var i = 0; i < 100; i ++) cache.set(i, i) - t.equal(cache.length, 100) - for (var i = 0; i < 100; i ++) { - t.equal(cache.get(i), i) - } - cache.max = 3 - t.equal(cache.length, 3) - for (var i = 0; i < 97; i ++) { - t.equal(cache.get(i), undefined) - } - for (var i = 98; i < 100; i ++) { - t.equal(cache.get(i), i) - } - - // now remove the max restriction, and try again. - cache.max = "hello" - for (var i = 0; i < 100; i ++) cache.set(i, i) - t.equal(cache.length, 100) - for (var i = 0; i < 100; i ++) { - t.equal(cache.get(i), i) - } - // should trigger an immediate resize - cache.max = 3 - t.equal(cache.length, 3) - for (var i = 0; i < 97; i ++) { - t.equal(cache.get(i), undefined) - } - for (var i = 98; i < 100; i ++) { - t.equal(cache.get(i), i) - } - t.end() -}) - -test("reset", function (t) { - var cache = new LRU(10) - cache.set("a", "A") - cache.set("b", "B") - cache.reset() - t.equal(cache.length, 0) - t.equal(cache.max, 10) - t.equal(cache.get("a"), undefined) - t.equal(cache.get("b"), undefined) - t.end() -}) - - -// Note: `.dump()` is a debugging tool only. No guarantees are made -// about the format/layout of the response. -test("dump", function (t) { - var cache = new LRU(10) - var d = cache.dump(); - t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") - cache.set("a", "A") - var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } - t.ok(d.a) - t.equal(d.a.key, "a") - t.equal(d.a.value, "A") - t.equal(d.a.lu, 0) - - cache.set("b", "B") - cache.get("b") - d = cache.dump() - t.ok(d.b) - t.equal(d.b.key, "b") - t.equal(d.b.value, "B") - t.equal(d.b.lu, 2) - - t.end() -}) - - -test("basic with weighed length", function (t) { - var cache = new LRU({ - max: 100, - length: function (item) { return item.size } - }) - cache.set("key", {val: "value", size: 50}) - t.equal(cache.get("key").val, "value") - t.equal(cache.get("nada"), undefined) - t.equal(cache.lengthCalculator(cache.get("key")), 50) - t.equal(cache.length, 50) - t.equal(cache.max, 100) - t.end() -}) - - -test("weighed length item too large", function (t) { - var cache = new LRU({ - max: 10, - length: function (item) { return item.size } - }) - t.equal(cache.max, 10) - - // should fall out immediately - cache.set("key", {val: "value", size: 50}) - - t.equal(cache.length, 0) - t.equal(cache.get("key"), undefined) - t.end() -}) - -test("least recently set with weighed length", function (t) { - var cache = new LRU({ - max:8, - length: function (item) { return item.length } - }) - cache.set("a", "A") - cache.set("b", "BB") - cache.set("c", "CCC") - cache.set("d", "DDDD") - t.equal(cache.get("d"), "DDDD") - t.equal(cache.get("c"), "CCC") - t.equal(cache.get("b"), undefined) - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("lru recently gotten with weighed length", function (t) { - var cache = new LRU({ - max: 8, - length: function (item) { return item.length } - }) - cache.set("a", "A") - cache.set("b", "BB") - cache.set("c", "CCC") - cache.get("a") - cache.get("b") - cache.set("d", "DDDD") - t.equal(cache.get("c"), undefined) - t.equal(cache.get("d"), "DDDD") - t.equal(cache.get("b"), "BB") - t.equal(cache.get("a"), "A") - t.end() -}) - -test("set returns proper booleans", function(t) { - var cache = new LRU({ - max: 5, - length: function (item) { return item.length } - }) - - t.equal(cache.set("a", "A"), true) - - // should return false for max exceeded - t.equal(cache.set("b", "donuts"), false) - - t.equal(cache.set("b", "B"), true) - t.equal(cache.set("c", "CCCC"), true) - t.end() -}) - -test("drop the old items", function(t) { - var cache = new LRU({ - max: 5, - maxAge: 50 - }) - - cache.set("a", "A") - - setTimeout(function () { - cache.set("b", "b") - t.equal(cache.get("a"), "A") - }, 25) - - setTimeout(function () { - cache.set("c", "C") - // timed out - t.notOk(cache.get("a")) - }, 60) - - setTimeout(function () { - t.notOk(cache.get("b")) - t.equal(cache.get("c"), "C") - }, 90) - - setTimeout(function () { - t.notOk(cache.get("c")) - t.end() - }, 155) -}) - -test("disposal function", function(t) { - var disposed = false - var cache = new LRU({ - max: 1, - dispose: function (k, n) { - disposed = n - } - }) - - cache.set(1, 1) - cache.set(2, 2) - t.equal(disposed, 1) - cache.set(3, 3) - t.equal(disposed, 2) - cache.reset() - t.equal(disposed, 3) - t.end() -}) - -test("disposal function on too big of item", function(t) { - var disposed = false - var cache = new LRU({ - max: 1, - length: function (k) { - return k.length - }, - dispose: function (k, n) { - disposed = n - } - }) - var obj = [ 1, 2 ] - - t.equal(disposed, false) - cache.set("obj", obj) - t.equal(disposed, obj) - t.end() -}) - -test("has()", function(t) { - var cache = new LRU({ - max: 1, - maxAge: 10 - }) - - cache.set('foo', 'bar') - t.equal(cache.has('foo'), true) - cache.set('blu', 'baz') - t.equal(cache.has('foo'), false) - t.equal(cache.has('blu'), true) - setTimeout(function() { - t.equal(cache.has('blu'), false) - t.end() - }, 15) -}) - -test("stale", function(t) { - var cache = new LRU({ - maxAge: 10, - stale: true - }) - - cache.set('foo', 'bar') - t.equal(cache.get('foo'), 'bar') - t.equal(cache.has('foo'), true) - setTimeout(function() { - t.equal(cache.has('foo'), false) - t.equal(cache.get('foo'), 'bar') - t.equal(cache.get('foo'), undefined) - t.end() - }, 15) -}) - -test("lru update via set", function(t) { - var cache = LRU({ max: 2 }); - - cache.set('foo', 1); - cache.set('bar', 2); - cache.del('bar'); - cache.set('baz', 3); - cache.set('qux', 4); - - t.equal(cache.get('foo'), undefined) - t.equal(cache.get('bar'), undefined) - t.equal(cache.get('baz'), 3) - t.equal(cache.get('qux'), 4) - t.end() -}) - -test("least recently set w/ peek", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.set("b", "B") - t.equal(cache.peek("a"), "A") - cache.set("c", "C") - t.equal(cache.get("c"), "C") - t.equal(cache.get("b"), "B") - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("pop the least used item", function (t) { - var cache = new LRU(3) - , last - - cache.set("a", "A") - cache.set("b", "B") - cache.set("c", "C") - - t.equal(cache.length, 3) - t.equal(cache.max, 3) - - // Ensure we pop a, c, b - cache.get("b", "B") - - last = cache.pop() - t.equal(last.key, "a") - t.equal(last.value, "A") - t.equal(cache.length, 2) - t.equal(cache.max, 3) - - last = cache.pop() - t.equal(last.key, "c") - t.equal(last.value, "C") - t.equal(cache.length, 1) - t.equal(cache.max, 3) - - last = cache.pop() - t.equal(last.key, "b") - t.equal(last.value, "B") - t.equal(cache.length, 0) - t.equal(cache.max, 3) - - last = cache.pop() - t.equal(last, null) - t.equal(cache.length, 0) - t.equal(cache.max, 3) - - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js deleted file mode 100644 index eefb80d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +++ /dev/null @@ -1,52 +0,0 @@ -var test = require('tap').test -var LRU = require('../') - -test('forEach', function (t) { - var l = new LRU(5) - for (var i = 0; i < 10; i ++) { - l.set(i.toString(), i.toString(2)) - } - - var i = 9 - l.forEach(function (val, key, cache) { - t.equal(cache, l) - t.equal(key, i.toString()) - t.equal(val, i.toString(2)) - i -= 1 - }) - - // get in order of most recently used - l.get(6) - l.get(8) - - var order = [ 8, 6, 9, 7, 5 ] - var i = 0 - - l.forEach(function (val, key, cache) { - var j = order[i ++] - t.equal(cache, l) - t.equal(key, j.toString()) - t.equal(val, j.toString(2)) - }) - - t.end() -}) - -test('keys() and values()', function (t) { - var l = new LRU(5) - for (var i = 0; i < 10; i ++) { - l.set(i.toString(), i.toString(2)) - } - - t.similar(l.keys(), ['9', '8', '7', '6', '5']) - t.similar(l.values(), ['1001', '1000', '111', '110', '101']) - - // get in order of most recently used - l.get(6) - l.get(8) - - t.similar(l.keys(), ['8', '6', '9', '7', '5']) - t.similar(l.values(), ['1000', '110', '1001', '111', '101']) - - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js deleted file mode 100644 index 7af45b0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env node --expose_gc - -var weak = require('weak'); -var test = require('tap').test -var LRU = require('../') -var l = new LRU({ max: 10 }) -var refs = 0 -function X() { - refs ++ - weak(this, deref) -} - -function deref() { - refs -- -} - -test('no leaks', function (t) { - // fill up the cache - for (var i = 0; i < 100; i++) { - l.set(i, new X); - // throw some gets in there, too. - if (i % 2 === 0) - l.get(i / 2) - } - - gc() - - var start = process.memoryUsage() - - // capture the memory - var startRefs = refs - - // do it again, but more - for (var i = 0; i < 10000; i++) { - l.set(i, new X); - // throw some gets in there, too. - if (i % 2 === 0) - l.get(i / 2) - } - - gc() - - var end = process.memoryUsage() - t.equal(refs, startRefs, 'no leaky refs') - - console.error('start: %j\n' + - 'end: %j', start, end); - t.pass(); - t.end(); -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE deleted file mode 100644 index 0c44ae7..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Isaac Z. Schlueter ("Author") -All rights reserved. - -The BSD License - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/README.md deleted file mode 100644 index 7e36512..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/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 cocain-addled psychoanalyst, there is no way to revive the object -from the signature string that sigmund gives you. In fact, it's -barely even readable. - -As with `sys.inspect` and `JSON.stringify`, larger objects will -produce larger signature strings. - -Because sigmund is a bit less strict than the more thorough -alternatives, the strings will be shorter, and also there is a -slightly higher chance for collisions. For example, these objects -have the same signature: - - var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} - var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} - -Like a good Freudian, sigmund is most effective when you already have -some understanding of what you're looking for. It can help you help -yourself, but you must be willing to do some work as well. - -Cycles are handled, and cyclical objects are silently omitted (though -the key is included in the signature output.) - -The second argument is the maximum depth, which defaults to 10, -because that is the maximum object traversal depth covered by most -insurance carriers. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/bench.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/bench.js deleted file mode 100644 index 5acfd6d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/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/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json deleted file mode 100644 index cb7e2bd..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "sigmund", - "version": "1.0.0", - "description": "Quick and dirty signatures for Objects.", - "main": "sigmund.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.3.0" - }, - "scripts": { - "test": "tap test/*.js", - "bench": "node bench.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/sigmund" - }, - "keywords": [ - "object", - "signature", - "key", - "data", - "psychoanalysis" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "BSD", - "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/sigmund/issues" - }, - "homepage": "https://github.com/isaacs/sigmund", - "_id": "sigmund@1.0.0", - "_from": "sigmund@~1.0.0" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/sigmund.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/sigmund.js deleted file mode 100644 index 82c7ab8..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/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/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/test/basic.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/node_modules/sigmund/test/basic.js deleted file mode 100644 index 50c53a1..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/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/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json deleted file mode 100644 index 99ea739..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "minimatch", - "description": "a glob matcher in javascript", - "version": "0.3.0", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/minimatch.git" - }, - "main": "minimatch.js", - "scripts": { - "test": "tap test/*.js" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "devDependencies": { - "tap": "" - }, - "license": { - "type": "MIT", - "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" - }, - "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself if this option is set. When not set, an empty list\nis returned if there are no matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/minimatch/issues" - }, - "homepage": "https://github.com/isaacs/minimatch", - "_id": "minimatch@0.3.0", - "_shasum": "275d8edaac4f1bb3326472089e7949c8394699dd", - "_from": "minimatch@0.x.x", - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/basic.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/basic.js deleted file mode 100644 index ae7ac73..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/basic.js +++ /dev/null @@ -1,399 +0,0 @@ -// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test -// -// TODO: Some of these tests do very bad things with backslashes, and will -// most likely fail badly on windows. They should probably be skipped. - -var tap = require("tap") - , globalBefore = Object.keys(global) - , mm = require("../") - , files = [ "a", "b", "c", "d", "abc" - , "abd", "abe", "bb", "bcd" - , "ca", "cb", "dd", "de" - , "bdir/", "bdir/cfile"] - , next = files.concat([ "a-b", "aXb" - , ".x", ".y" ]) - - -var patterns = - [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test" - , ["a*", ["a", "abc", "abd", "abe"]] - , ["X*", ["X*"], {nonull: true}] - - // allow null glob expansion - , ["X*", []] - - // isaacs: Slightly different than bash/sh/ksh - // \\* is not un-escaped to literal "*" in a failed match, - // but it does make it get treated as a literal star - , ["\\*", ["\\*"], {nonull: true}] - , ["\\**", ["\\**"], {nonull: true}] - , ["\\*\\*", ["\\*\\*"], {nonull: true}] - - , ["b*/", ["bdir/"]] - , ["c*", ["c", "ca", "cb"]] - , ["**", files] - - , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] - , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] - - , "legendary larry crashes bashes" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] - - , "character classes" - , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] - , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", - "bdir/", "ca", "cb", "dd", "de"]] - , ["a*[^c]", ["abd", "abe"]] - , function () { files.push("a-b", "aXb") } - , ["a[X-]b", ["a-b", "aXb"]] - , function () { files.push(".x", ".y") } - , ["[^a-c]*", ["d", "dd", "de"]] - , function () { files.push("a*b/", "a*b/ooo") } - , ["a\\*b/*", ["a*b/ooo"]] - , ["a\\*?/*", ["a*b/ooo"]] - , ["*\\\\!*", [], {null: true}, ["echo !7"]] - , ["*\\!*", ["echo !7"], null, ["echo !7"]] - , ["*.\\*", ["r.*"], null, ["r.*"]] - , ["a[b]c", ["abc"]] - , ["a[\\b]c", ["abc"]] - , ["a?c", ["abc"]] - , ["a\\*c", [], {null: true}, ["abc"]] - , ["", [""], { null: true }, [""]] - - , "http://www.opensource.apple.com/source/bash/bash-23/" + - "bash/tests/glob-test" - , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } - , ["*/man*/bash.*", ["man/man1/bash.1"]] - , ["man/man1/bash.1", ["man/man1/bash.1"]] - , ["a***c", ["abc"], null, ["abc"]] - , ["a*****?c", ["abc"], null, ["abc"]] - , ["?*****??", ["abc"], null, ["abc"]] - , ["*****??", ["abc"], null, ["abc"]] - , ["?*****?c", ["abc"], null, ["abc"]] - , ["?***?****c", ["abc"], null, ["abc"]] - , ["?***?****?", ["abc"], null, ["abc"]] - , ["?***?****", ["abc"], null, ["abc"]] - , ["*******c", ["abc"], null, ["abc"]] - , ["*******?", ["abc"], null, ["abc"]] - , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["[-abc]", ["-"], null, ["-"]] - , ["[abc-]", ["-"], null, ["-"]] - , ["\\", ["\\"], null, ["\\"]] - , ["[\\\\]", ["\\"], null, ["\\"]] - , ["[[]", ["["], null, ["["]] - , ["[", ["["], null, ["["]] - , ["[*", ["[abc"], null, ["[abc"]] - , "a right bracket shall lose its special meaning and\n" + - "represent itself in a bracket expression if it occurs\n" + - "first in the list. -- POSIX.2 2.8.3.2" - , ["[]]", ["]"], null, ["]"]] - , ["[]-]", ["]"], null, ["]"]] - , ["[a-\z]", ["p"], null, ["p"]] - , ["??**********?****?", [], { null: true }, ["abc"]] - , ["??**********?****c", [], { null: true }, ["abc"]] - , ["?************c****?****", [], { null: true }, ["abc"]] - , ["*c*?**", [], { null: true }, ["abc"]] - , ["a*****c*?**", [], { null: true }, ["abc"]] - , ["a********???*******", [], { null: true }, ["abc"]] - , ["[]", [], { null: true }, ["a"]] - , ["[abc", [], { null: true }, ["["]] - - , "nocase tests" - , ["XYZ", ["xYz"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["ab*", ["ABC"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - - // [ pattern, [matches], MM opts, files, TAP opts] - , "onestar/twostar" - , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] - , ["{/?,*}", ["/a", "bb"], {null: true} - , ["/a", "/b/b", "/a/b/c", "bb"]] - - , "dots should not match unless requested" - , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] - - // .. and . can only match patterns starting with ., - // even when options.dot is set. - , function () { - files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] - } - , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] - , ["a/*/b", ["a/c/b"], {dot:false}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] - - - // this also tests that changing the options needs - // to change the cache key, even if the pattern is - // the same! - , ["**", ["a/b","a/.d",".a/.d"], { dot: true } - , [ ".a/.d", "a/.d", "a/b"]] - - , "paren sets cannot contain slashes" - , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] - - // brace sets trump all else. - // - // invalid glob pattern. fails on bash4 and bsdglob. - // however, in this implementation, it's easier just - // to do the intuitive thing, and let brace-expansion - // actually come before parsing any extglob patterns, - // like the documentation seems to say. - // - // XXX: if anyone complains about this, either fix it - // or tell them to grow up and stop complaining. - // - // bash/bsdglob says this: - // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] - // but we do this instead: - , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] - - // test partial parsing in the presence of comment/negation chars - , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] - , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] - - // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. - , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] - , {} - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] - - - // crazy nested {,,} and *(||) tests. - , function () { - files = [ "a", "b", "c", "d" - , "ab", "ac", "ad" - , "bc", "cb" - , "bc,d", "c,db", "c,d" - , "d)", "(b|c", "*(b|c" - , "b|c", "b|cc", "cb|c" - , "x(a|b|c)", "x(a|c)" - , "(a|b|c)", "(a|c)"] - } - , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] - , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] - // a - // *(b|c) - // *(b|d) - , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] - , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] - - - // test various flag settings. - , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] - , { noext: true } ] - , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} - , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] - , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] - - - // begin channelling Boole and deMorgan... - , "negation tests" - , function () { - files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] - } - - // anything that is NOT a* matches. - , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] - - // anything that IS !a* matches. - , ["!a*", ["!ab", "!abc"], {nonegate: true}] - - // anything that IS a* matches - , ["!!a*", ["a!b"]] - - // anything that is NOT !a* matches - , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] - - // negation nestled within a pattern - , function () { - files = [ "foo.js" - , "foo.bar" - // can't match this one without negative lookbehind. - , "foo.js.js" - , "blar.js" - , "foo." - , "boo.js.boo" ] - } - , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] - - // https://github.com/isaacs/minimatch/issues/5 - , function () { - files = [ 'a/b/.x/c' - , 'a/b/.x/c/d' - , 'a/b/.x/c/d/e' - , 'a/b/.x' - , 'a/b/.x/' - , 'a/.x/b' - , '.x' - , '.x/' - , '.x/a' - , '.x/a/b' - , 'a/.x/b/.x/c' - , '.x/.x' ] - } - , ["**/.x/**", [ '.x/' - , '.x/a' - , '.x/a/b' - , 'a/.x/b' - , 'a/b/.x/' - , 'a/b/.x/c' - , 'a/b/.x/c/d' - , 'a/b/.x/c/d/e' ] ] - - ] - -var regexps = - [ '/^(?:(?=.)a[^/]*?)$/', - '/^(?:(?=.)X[^/]*?)$/', - '/^(?:(?=.)X[^/]*?)$/', - '/^(?:\\*)$/', - '/^(?:(?=.)\\*[^/]*?)$/', - '/^(?:\\*\\*)$/', - '/^(?:(?=.)b[^/]*?\\/)$/', - '/^(?:(?=.)c[^/]*?)$/', - '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', - '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/', - '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/', - '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/', - '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/', - '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/', - '/^(?:(?=.)a[^/]*?[^c])$/', - '/^(?:(?=.)a[X-]b)$/', - '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/', - '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/', - '/^(?:(?=.)a[b]c)$/', - '/^(?:(?=.)a[b]c)$/', - '/^(?:(?=.)a[^/]c)$/', - '/^(?:a\\*c)$/', - 'false', - '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/', - '/^(?:man\\/man1\\/bash\\.1)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', - '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', - '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[-abc])$/', - '/^(?:(?!\\.)(?=.)[abc-])$/', - '/^(?:\\\\)$/', - '/^(?:(?!\\.)(?=.)[\\\\])$/', - '/^(?:(?!\\.)(?=.)[\\[])$/', - '/^(?:\\[)$/', - '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[\\]])$/', - '/^(?:(?!\\.)(?=.)[\\]-])$/', - '/^(?:(?!\\.)(?=.)[a-z])$/', - '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', - '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:\\[\\])$/', - '/^(?:\\[abc)$/', - '/^(?:(?=.)XYZ)$/i', - '/^(?:(?=.)ab[^/]*?)$/i', - '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i', - '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/', - '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', - '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/', - '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', - '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/', - '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', - '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/', - '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', - '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/', - '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/', - '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/', - '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', - '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/', - '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/', - '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/', - '/^(?:(?=.)a[^/]b)$/', - '/^(?:(?=.)#[^/]*?)$/', - '/^(?!^(?:(?=.)a[^/]*?)$).*$/', - '/^(?:(?=.)\\!a[^/]*?)$/', - '/^(?:(?=.)a[^/]*?)$/', - '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/', - '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ] -var re = 0; - -tap.test("basic tests", function (t) { - var start = Date.now() - - // [ pattern, [matches], MM opts, files, TAP opts] - patterns.forEach(function (c) { - if (typeof c === "function") return c() - if (typeof c === "string") return t.comment(c) - - var pattern = c[0] - , expect = c[1].sort(alpha) - , options = c[2] || {} - , f = c[3] || files - , tapOpts = c[4] || {} - - // options.debug = true - var m = new mm.Minimatch(pattern, options) - var r = m.makeRe() - var expectRe = regexps[re++] - tapOpts.re = String(r) || JSON.stringify(r) - tapOpts.files = JSON.stringify(f) - tapOpts.pattern = pattern - tapOpts.set = m.set - tapOpts.negated = m.negate - - var actual = mm.match(f, pattern, options) - actual.sort(alpha) - - t.equivalent( actual, expect - , JSON.stringify(pattern) + " " + JSON.stringify(expect) - , tapOpts ) - - t.equal(tapOpts.re, expectRe, tapOpts) - }) - - t.comment("time=" + (Date.now() - start) + "ms") - t.end() -}) - -tap.test("global leak test", function (t) { - var globalAfter = Object.keys(global) - t.equivalent(globalAfter, globalBefore, "no new globals, please") - t.end() -}) - -function alpha (a, b) { - return a > b ? 1 : -1 -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/brace-expand.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/brace-expand.js deleted file mode 100644 index 7ee278a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/brace-expand.js +++ /dev/null @@ -1,33 +0,0 @@ -var tap = require("tap") - , minimatch = require("../") - -tap.test("brace expansion", function (t) { - // [ pattern, [expanded] ] - ; [ [ "a{b,c{d,e},{f,g}h}x{y,z}" - , [ "abxy" - , "abxz" - , "acdxy" - , "acdxz" - , "acexy" - , "acexz" - , "afhxy" - , "afhxz" - , "aghxy" - , "aghxz" ] ] - , [ "a{1..5}b" - , [ "a1b" - , "a2b" - , "a3b" - , "a4b" - , "a5b" ] ] - , [ "a{b}c", ["a{b}c"] ] - ].forEach(function (tc) { - var p = tc[0] - , expect = tc[1] - t.equivalent(minimatch.braceExpand(p), expect, p) - }) - console.error("ending") - t.end() -}) - - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/caching.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/caching.js deleted file mode 100644 index 0fec4b0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/caching.js +++ /dev/null @@ -1,14 +0,0 @@ -var Minimatch = require("../minimatch.js").Minimatch -var tap = require("tap") -tap.test("cache test", function (t) { - var mm1 = new Minimatch("a?b") - var mm2 = new Minimatch("a?b") - t.equal(mm1, mm2, "should get the same object") - // the lru should drop it after 100 entries - for (var i = 0; i < 100; i ++) { - new Minimatch("a"+i) - } - mm2 = new Minimatch("a?b") - t.notEqual(mm1, mm2, "cache should have dropped") - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/defaults.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/defaults.js deleted file mode 100644 index 75e0571..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/defaults.js +++ /dev/null @@ -1,274 +0,0 @@ -// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test -// -// TODO: Some of these tests do very bad things with backslashes, and will -// most likely fail badly on windows. They should probably be skipped. - -var tap = require("tap") - , globalBefore = Object.keys(global) - , mm = require("../") - , files = [ "a", "b", "c", "d", "abc" - , "abd", "abe", "bb", "bcd" - , "ca", "cb", "dd", "de" - , "bdir/", "bdir/cfile"] - , next = files.concat([ "a-b", "aXb" - , ".x", ".y" ]) - -tap.test("basic tests", function (t) { - var start = Date.now() - - // [ pattern, [matches], MM opts, files, TAP opts] - ; [ "http://www.bashcookbook.com/bashinfo" + - "/source/bash-1.14.7/tests/glob-test" - , ["a*", ["a", "abc", "abd", "abe"]] - , ["X*", ["X*"], {nonull: true}] - - // allow null glob expansion - , ["X*", []] - - // isaacs: Slightly different than bash/sh/ksh - // \\* is not un-escaped to literal "*" in a failed match, - // but it does make it get treated as a literal star - , ["\\*", ["\\*"], {nonull: true}] - , ["\\**", ["\\**"], {nonull: true}] - , ["\\*\\*", ["\\*\\*"], {nonull: true}] - - , ["b*/", ["bdir/"]] - , ["c*", ["c", "ca", "cb"]] - , ["**", files] - - , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] - , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] - - , "legendary larry crashes bashes" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] - - , "character classes" - , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] - , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", - "bdir/", "ca", "cb", "dd", "de"]] - , ["a*[^c]", ["abd", "abe"]] - , function () { files.push("a-b", "aXb") } - , ["a[X-]b", ["a-b", "aXb"]] - , function () { files.push(".x", ".y") } - , ["[^a-c]*", ["d", "dd", "de"]] - , function () { files.push("a*b/", "a*b/ooo") } - , ["a\\*b/*", ["a*b/ooo"]] - , ["a\\*?/*", ["a*b/ooo"]] - , ["*\\\\!*", [], {null: true}, ["echo !7"]] - , ["*\\!*", ["echo !7"], null, ["echo !7"]] - , ["*.\\*", ["r.*"], null, ["r.*"]] - , ["a[b]c", ["abc"]] - , ["a[\\b]c", ["abc"]] - , ["a?c", ["abc"]] - , ["a\\*c", [], {null: true}, ["abc"]] - , ["", [""], { null: true }, [""]] - - , "http://www.opensource.apple.com/source/bash/bash-23/" + - "bash/tests/glob-test" - , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } - , ["*/man*/bash.*", ["man/man1/bash.1"]] - , ["man/man1/bash.1", ["man/man1/bash.1"]] - , ["a***c", ["abc"], null, ["abc"]] - , ["a*****?c", ["abc"], null, ["abc"]] - , ["?*****??", ["abc"], null, ["abc"]] - , ["*****??", ["abc"], null, ["abc"]] - , ["?*****?c", ["abc"], null, ["abc"]] - , ["?***?****c", ["abc"], null, ["abc"]] - , ["?***?****?", ["abc"], null, ["abc"]] - , ["?***?****", ["abc"], null, ["abc"]] - , ["*******c", ["abc"], null, ["abc"]] - , ["*******?", ["abc"], null, ["abc"]] - , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["[-abc]", ["-"], null, ["-"]] - , ["[abc-]", ["-"], null, ["-"]] - , ["\\", ["\\"], null, ["\\"]] - , ["[\\\\]", ["\\"], null, ["\\"]] - , ["[[]", ["["], null, ["["]] - , ["[", ["["], null, ["["]] - , ["[*", ["[abc"], null, ["[abc"]] - , "a right bracket shall lose its special meaning and\n" + - "represent itself in a bracket expression if it occurs\n" + - "first in the list. -- POSIX.2 2.8.3.2" - , ["[]]", ["]"], null, ["]"]] - , ["[]-]", ["]"], null, ["]"]] - , ["[a-\z]", ["p"], null, ["p"]] - , ["??**********?****?", [], { null: true }, ["abc"]] - , ["??**********?****c", [], { null: true }, ["abc"]] - , ["?************c****?****", [], { null: true }, ["abc"]] - , ["*c*?**", [], { null: true }, ["abc"]] - , ["a*****c*?**", [], { null: true }, ["abc"]] - , ["a********???*******", [], { null: true }, ["abc"]] - , ["[]", [], { null: true }, ["a"]] - , ["[abc", [], { null: true }, ["["]] - - , "nocase tests" - , ["XYZ", ["xYz"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["ab*", ["ABC"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - - // [ pattern, [matches], MM opts, files, TAP opts] - , "onestar/twostar" - , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] - , ["{/?,*}", ["/a", "bb"], {null: true} - , ["/a", "/b/b", "/a/b/c", "bb"]] - - , "dots should not match unless requested" - , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] - - // .. and . can only match patterns starting with ., - // even when options.dot is set. - , function () { - files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] - } - , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] - , ["a/*/b", ["a/c/b"], {dot:false}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] - - - // this also tests that changing the options needs - // to change the cache key, even if the pattern is - // the same! - , ["**", ["a/b","a/.d",".a/.d"], { dot: true } - , [ ".a/.d", "a/.d", "a/b"]] - - , "paren sets cannot contain slashes" - , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] - - // brace sets trump all else. - // - // invalid glob pattern. fails on bash4 and bsdglob. - // however, in this implementation, it's easier just - // to do the intuitive thing, and let brace-expansion - // actually come before parsing any extglob patterns, - // like the documentation seems to say. - // - // XXX: if anyone complains about this, either fix it - // or tell them to grow up and stop complaining. - // - // bash/bsdglob says this: - // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] - // but we do this instead: - , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] - - // test partial parsing in the presence of comment/negation chars - , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] - , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] - - // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. - , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] - , {} - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] - - - // crazy nested {,,} and *(||) tests. - , function () { - files = [ "a", "b", "c", "d" - , "ab", "ac", "ad" - , "bc", "cb" - , "bc,d", "c,db", "c,d" - , "d)", "(b|c", "*(b|c" - , "b|c", "b|cc", "cb|c" - , "x(a|b|c)", "x(a|c)" - , "(a|b|c)", "(a|c)"] - } - , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] - , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] - // a - // *(b|c) - // *(b|d) - , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] - , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] - - - // test various flag settings. - , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] - , { noext: true } ] - , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} - , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] - , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] - - - // begin channelling Boole and deMorgan... - , "negation tests" - , function () { - files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] - } - - // anything that is NOT a* matches. - , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] - - // anything that IS !a* matches. - , ["!a*", ["!ab", "!abc"], {nonegate: true}] - - // anything that IS a* matches - , ["!!a*", ["a!b"]] - - // anything that is NOT !a* matches - , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] - - // negation nestled within a pattern - , function () { - files = [ "foo.js" - , "foo.bar" - // can't match this one without negative lookbehind. - , "foo.js.js" - , "blar.js" - , "foo." - , "boo.js.boo" ] - } - , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] - - ].forEach(function (c) { - if (typeof c === "function") return c() - if (typeof c === "string") return t.comment(c) - - var pattern = c[0] - , expect = c[1].sort(alpha) - , options = c[2] - , f = c[3] || files - , tapOpts = c[4] || {} - - // options.debug = true - var Class = mm.defaults(options).Minimatch - var m = new Class(pattern, {}) - var r = m.makeRe() - tapOpts.re = String(r) || JSON.stringify(r) - tapOpts.files = JSON.stringify(f) - tapOpts.pattern = pattern - tapOpts.set = m.set - tapOpts.negated = m.negate - - var actual = mm.match(f, pattern, options) - actual.sort(alpha) - - t.equivalent( actual, expect - , JSON.stringify(pattern) + " " + JSON.stringify(expect) - , tapOpts ) - }) - - t.comment("time=" + (Date.now() - start) + "ms") - t.end() -}) - -tap.test("global leak test", function (t) { - var globalAfter = Object.keys(global) - t.equivalent(globalAfter, globalBefore, "no new globals, please") - t.end() -}) - -function alpha (a, b) { - return a > b ? 1 : -1 -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js deleted file mode 100644 index 6676e26..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/minimatch/test/extglob-ending-with-state-char.js +++ /dev/null @@ -1,8 +0,0 @@ -var test = require('tap').test -var minimatch = require('../') - -test('extglob ending with statechar', function(t) { - t.notOk(minimatch('ax', 'a?(b*)')) - t.ok(minimatch('ax', '?(a*|b)')) - t.end() -}) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.documentup.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.documentup.json deleted file mode 100644 index 57fe301..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.documentup.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ShellJS", - "twitter": [ - "r2r" - ] -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.npmignore deleted file mode 100644 index c2658d7..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.travis.yml b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.travis.yml deleted file mode 100644 index 5caf599..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/LICENSE deleted file mode 100644 index 1b35ee9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2012, Artur Adib -All rights reserved. - -You may use this project under the terms of the New BSD license as follows: - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Artur Adib nor the - names of the contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL ARTUR ADIB BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/README.md deleted file mode 100644 index 8b45592..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/README.md +++ /dev/null @@ -1,513 +0,0 @@ -# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs) - -ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts! - -The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like: - -+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader -+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger -+ [JSHint](http://jshint.com) - Most popular JavaScript linter -+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers -+ [Yeoman](http://yeoman.io/) - Web application stack and development tool -+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation - -and [many more](https://npmjs.org/browse/depended/shelljs). - -## Installing - -Via npm: - -```bash -$ npm install [-g] shelljs -``` - -If the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to -run ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder: - -```bash -$ shjs my_script -``` - -You can also just copy `shell.js` into your project's directory, and `require()` accordingly. - - -## Examples - -### JavaScript - -```javascript -require('shelljs/global'); - -if (!which('git')) { - echo('Sorry, this script requires git'); - exit(1); -} - -// Copy files to release dir -mkdir('-p', 'out/Release'); -cp('-R', 'stuff/*', 'out/Release'); - -// Replace macros in each .js file -cd('lib'); -ls('*.js').forEach(function(file) { - sed('-i', 'BUILD_VERSION', 'v0.1.2', file); - sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file); - sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file); -}); -cd('..'); - -// Run external tool synchronously -if (exec('git commit -am "Auto-commit"').code !== 0) { - echo('Error: Git commit failed'); - exit(1); -} -``` - -### CoffeeScript - -```coffeescript -require 'shelljs/global' - -if not which 'git' - echo 'Sorry, this script requires git' - exit 1 - -# Copy files to release dir -mkdir '-p', 'out/Release' -cp '-R', 'stuff/*', 'out/Release' - -# Replace macros in each .js file -cd 'lib' -for file in ls '*.js' - sed '-i', 'BUILD_VERSION', 'v0.1.2', file - sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file - sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file -cd '..' - -# Run external tool synchronously -if (exec 'git commit -am "Auto-commit"').code != 0 - echo 'Error: Git commit failed' - exit 1 -``` - -## Global vs. Local - -The example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`. - -Example: - -```javascript -var shell = require('shelljs'); -shell.echo('hello world'); -``` - -## Make tool - -A convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script. - -Example (CoffeeScript): - -```coffeescript -require 'shelljs/make' - -target.all = -> - target.bundle() - target.docs() - -target.bundle = -> - cd __dirname - mkdir 'build' - cd 'lib' - (cat '*.js').to '../build/output.js' - -target.docs = -> - cd __dirname - mkdir 'docs' - cd 'lib' - for file in ls '*.js' - text = grep '//@', file # extract special comments - text.replace '//@', '' # remove comment tags - text.to 'docs/my_docs.md' -``` - -To run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`, and so on. - - - - - - -## Command reference - - -All commands run synchronously, unless otherwise stated. - - -### cd('dir') -Changes to directory `dir` for the duration of the script - -### pwd() -Returns the current directory. - -### ls([options ,] path [,path ...]) -### ls([options ,] path_array) -Available options: - -+ `-R`: recursive -+ `-A`: all files (include files beginning with `.`, except for `.` and `..`) - -Examples: - -```javascript -ls('projs/*.js'); -ls('-R', '/users/me', '/tmp'); -ls('-R', ['/users/me', '/tmp']); // same as above -``` - -Returns array of files in the given path, or in current directory if no path provided. - -### find(path [,path ...]) -### find(path_array) -Examples: - -```javascript -find('src', 'lib'); -find(['src', 'lib']); // same as above -find('.').filter(function(file) { return file.match(/\.js$/); }); -``` - -Returns array of all files (however deep) in the given paths. - -The main difference from `ls('-R', path)` is that the resulting file names -include the base directories, e.g. `lib/resources/file1` instead of just `file1`. - -### cp([options ,] source [,source ...], dest) -### cp([options ,] source_array, dest) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -cp('file1', 'dir1'); -cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -``` - -Copies files. The wildcard `*` is accepted. - -### rm([options ,] file [, file ...]) -### rm([options ,] file_array) -Available options: - -+ `-f`: force -+ `-r, -R`: recursive - -Examples: - -```javascript -rm('-rf', '/tmp/*'); -rm('some_file.txt', 'another_file.txt'); -rm(['some_file.txt', 'another_file.txt']); // same as above -``` - -Removes files. The wildcard `*` is accepted. - -### mv(source [, source ...], dest') -### mv(source_array, dest') -Available options: - -+ `f`: force - -Examples: - -```javascript -mv('-f', 'file', 'dir/'); -mv('file1', 'file2', 'dir/'); -mv(['file1', 'file2'], 'dir/'); // same as above -``` - -Moves files. The wildcard `*` is accepted. - -### mkdir([options ,] dir [, dir ...]) -### mkdir([options ,] dir_array) -Available options: - -+ `p`: full path (will create intermediate dirs if necessary) - -Examples: - -```javascript -mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -``` - -Creates directories. - -### test(expression) -Available expression primaries: - -+ `'-b', 'path'`: true if path is a block device -+ `'-c', 'path'`: true if path is a character device -+ `'-d', 'path'`: true if path is a directory -+ `'-e', 'path'`: true if path exists -+ `'-f', 'path'`: true if path is a regular file -+ `'-L', 'path'`: true if path is a symboilc link -+ `'-p', 'path'`: true if path is a pipe (FIFO) -+ `'-S', 'path'`: true if path is a socket - -Examples: - -```javascript -if (test('-d', path)) { /* do something with dir */ }; -if (!test('-f', path)) continue; // skip if it's a regular file -``` - -Evaluates expression using the available primaries and returns corresponding value. - -### cat(file [, file ...]) -### cat(file_array) - -Examples: - -```javascript -var str = cat('file*.txt'); -var str = cat('file1', 'file2'); -var str = cat(['file1', 'file2']); // same as above -``` - -Returns a string containing the given file, or a concatenated string -containing the files if more than one file is given (a new line character is -introduced between each file). Wildcard `*` accepted. - -### 'string'.to(file) - -Examples: - -```javascript -cat('input.txt').to('output.txt'); -``` - -Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as -those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ - -### sed([options ,] search_regex, replace_str, file) -Available options: - -+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ - -Examples: - -```javascript -sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -``` - -Reads an input string from `file` and performs a JavaScript `replace()` on the input -using the given search regex and replacement string. Returns the new string after replacement. - -### grep([options ,] regex_filter, file [, file ...]) -### grep([options ,] regex_filter, file_array) -Available options: - -+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria. - -Examples: - -```javascript -grep('-v', 'GLOBAL_VARIABLE', '*.js'); -grep('GLOBAL_VARIABLE', '*.js'); -``` - -Reads input string from given files and returns a string containing all lines of the -file that match the given `regex_filter`. Wildcard `*` accepted. - -### which(command) - -Examples: - -```javascript -var nodeExec = which('node'); -``` - -Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. -Returns string containing the absolute path to the command. - -### echo(string [,string ...]) - -Examples: - -```javascript -echo('hello world'); -var str = echo('hello world'); -``` - -Prints string to stdout, and returns string with additional utility methods -like `.to()`. - -### dirs([options | '+N' | '-N']) - -Available options: - -+ `-c`: Clears the directory stack by deleting all of the elements. - -Arguments: - -+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. - -Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. - -See also: pushd, popd - -### pushd([options,] [dir | '-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. - -Arguments: - -+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. - -Examples: - -```javascript -// process.cwd() === '/usr' -pushd('/etc'); // Returns /etc /usr -pushd('+1'); // Returns /usr /etc -``` - -Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. - -### popd([options,] ['-N' | '+N']) - -Available options: - -+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. - -Arguments: - -+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. - -Examples: - -```javascript -echo(process.cwd()); // '/usr' -pushd('/etc'); // '/etc /usr' -echo(process.cwd()); // '/etc' -popd(); // '/usr' -echo(process.cwd()); // '/usr' -``` - -When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. - -### exit(code) -Exits the current process with the given exit code. - -### env['VAR_NAME'] -Object containing environment variables (both getter and setter). Shortcut to process.env. - -### exec(command [, options] [, callback]) -Available options (all `false` by default): - -+ `async`: Asynchronous execution. Defaults to true if a callback is provided. -+ `silent`: Do not echo program output to console. - -Examples: - -```javascript -var version = exec('node --version', {silent:true}).output; - -var child = exec('some_long_running_process', {async:true}); -child.stdout.on('data', function(data) { - /* ... do something with data ... */ -}); - -exec('some_long_running_process', function(code, output) { - console.log('Exit code:', code); - console.log('Program output:', output); -}); -``` - -Executes the given `command` _synchronously_, unless otherwise specified. -When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's -`output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and -the `callback` gets the arguments `(code, output)`. - -**Note:** For long-lived processes, it's best to run `exec()` asynchronously as -the current synchronous implementation uses a lot of CPU. This should be getting -fixed soon. - -### chmod(octal_mode || octal_string, file) -### chmod(symbolic_mode, file) - -Available options: - -+ `-v`: output a diagnostic for every file processed -+ `-c`: like verbose but report only when a change is made -+ `-R`: change files and directories recursively - -Examples: - -```javascript -chmod(755, '/Users/brandon'); -chmod('755', '/Users/brandon'); // same as above -chmod('u+x', '/Users/brandon'); -``` - -Alters the permissions of a file or directory by either specifying the -absolute permissions in octal form or expressing the changes in symbols. -This command tries to mimic the POSIX behavior as much as possible. -Notable exceptions: - -+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is - given to the umask. -+ There is no "quiet" option since default behavior is to run silent. - -## Configuration - - -### config.silent -Example: - -```javascript -var silentState = config.silent; // save old silent state -config.silent = true; -/* ... */ -config.silent = silentState; // restore old silent state -``` - -Suppresses all command output if `true`, except for `echo()` calls. -Default is `false`. - -### config.fatal -Example: - -```javascript -config.fatal = true; -cp('this_file_does_not_exist', '/dev/null'); // dies here -/* more commands... */ -``` - -If `true` the script will die on errors. Default is `false`. - -## Non-Unix commands - - -### tempdir() -Searches and returns string containing a writeable, platform-dependent temporary directory. -Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). - -### error() -Tests if error occurred in the last command. Returns `null` if no error occurred, -otherwise returns string explaining the error diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/bin/shjs b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/bin/shjs deleted file mode 100755 index d239a7a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/bin/shjs +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -if (process.argv.length < 3) { - console.log('ShellJS: missing argument (script name)'); - console.log(); - process.exit(1); -} - -var args, - scriptName = process.argv[2]; -env['NODE_PATH'] = __dirname + '/../..'; - -if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) { - if (test('-f', scriptName + '.js')) - scriptName += '.js'; - if (test('-f', scriptName + '.coffee')) - scriptName += '.coffee'; -} - -if (!test('-f', scriptName)) { - console.log('ShellJS: script not found ('+scriptName+')'); - console.log(); - process.exit(1); -} - -args = process.argv.slice(3); - -for (var i = 0, l = args.length; i < l; i++) { - if (args[i][0] !== "-"){ - args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words - } -} - -if (scriptName.match(/\.coffee$/)) { - // - // CoffeeScript - // - if (which('coffee')) { - exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true }); - } else { - console.log('ShellJS: CoffeeScript interpreter not found'); - console.log(); - process.exit(1); - } -} else { - // - // JavaScript - // - exec('node ' + scriptName + ' ' + args.join(' '), { async: true }); -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/global.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/global.js deleted file mode 100644 index 97f0033..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/global.js +++ /dev/null @@ -1,3 +0,0 @@ -var shell = require('./shell.js'); -for (var cmd in shell) - global[cmd] = shell[cmd]; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/jshint.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/jshint.json deleted file mode 100644 index 205ed9c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/jshint.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "loopfunc": true, - "sub": true -} \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/make.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/make.js deleted file mode 100644 index b636447..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/make.js +++ /dev/null @@ -1,48 +0,0 @@ -require('./global'); -config.fatal = true; - -global.target = {}; - -// This ensures we only execute the script targets after the entire script has -// been evaluated -var args = process.argv.slice(2); -setTimeout(function() { - var t; - - if (args.length === 1 && args[0] === '--help') { - console.log('Available targets:'); - for (t in target) - console.log(' ' + t); - return; - } - - // Wrap targets to prevent duplicate execution - for (t in target) { - (function(t, oldTarget){ - - // Wrap it - target[t] = function(force) { - if (oldTarget.done && !force) - return; - oldTarget.done = true; - return oldTarget.apply(oldTarget, arguments); - }; - - })(t, target[t]); - } - - // Execute desired targets - if (args.length > 0) { - args.forEach(function(arg) { - if (arg in target) - target[arg](); - else { - console.log('no such target: ' + arg); - exit(1); - } - }); - } else if ('all' in target) { - target.all(); - } - -}, 0); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/package.json deleted file mode 100644 index 7f815c5..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "shelljs", - "version": "0.1.4", - "author": { - "name": "Artur Adib", - "email": "aadib@mozilla.com" - }, - "description": "Portable Unix shell commands for Node.js", - "keywords": [ - "unix", - "shell", - "makefile", - "make", - "jake", - "synchronous" - ], - "repository": { - "type": "git", - "url": "git://github.com/arturadib/shelljs.git" - }, - "homepage": "http://github.com/arturadib/shelljs", - "main": "./shell.js", - "scripts": { - "test": "node scripts/run-tests" - }, - "bin": { - "shjs": "./bin/shjs" - }, - "dependencies": {}, - "devDependencies": { - "jshint": "~1.1.0" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "readme": "# ShellJS - Unix shell commands for Node.js [![Build Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs)\n\nShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands on top of the Node.js API. You can use it to eliminate your shell script's dependency on Unix while still keeping its familiar and powerful commands. You can also install it globally so you can run it from outside Node projects - say goodbye to those gnarly Bash scripts!\n\nThe project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in projects like:\n\n+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader\n+ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger\n+ [JSHint](http://jshint.com) - Most popular JavaScript linter\n+ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern browsers\n+ [Yeoman](http://yeoman.io/) - Web application stack and development tool\n+ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend generation\n\nand [many more](https://npmjs.org/browse/depended/shelljs).\n\n## Installing\n\nVia npm:\n\n```bash\n$ npm install [-g] shelljs\n```\n\nIf the global option `-g` is specified, the binary `shjs` will be installed. This makes it possible to\nrun ShellJS scripts much like any shell script from the command line, i.e. without requiring a `node_modules` folder:\n\n```bash\n$ shjs my_script\n```\n\nYou can also just copy `shell.js` into your project's directory, and `require()` accordingly.\n\n\n## Examples\n\n### JavaScript\n\n```javascript\nrequire('shelljs/global');\n\nif (!which('git')) {\n echo('Sorry, this script requires git');\n exit(1);\n}\n\n// Copy files to release dir\nmkdir('-p', 'out/Release');\ncp('-R', 'stuff/*', 'out/Release');\n\n// Replace macros in each .js file\ncd('lib');\nls('*.js').forEach(function(file) {\n sed('-i', 'BUILD_VERSION', 'v0.1.2', file);\n sed('-i', /.*REMOVE_THIS_LINE.*\\n/, '', file);\n sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\\n/, cat('macro.js'), file);\n});\ncd('..');\n\n// Run external tool synchronously\nif (exec('git commit -am \"Auto-commit\"').code !== 0) {\n echo('Error: Git commit failed');\n exit(1);\n}\n```\n\n### CoffeeScript\n\n```coffeescript\nrequire 'shelljs/global'\n\nif not which 'git'\n echo 'Sorry, this script requires git'\n exit 1\n\n# Copy files to release dir\nmkdir '-p', 'out/Release'\ncp '-R', 'stuff/*', 'out/Release'\n\n# Replace macros in each .js file\ncd 'lib'\nfor file in ls '*.js'\n sed '-i', 'BUILD_VERSION', 'v0.1.2', file\n sed '-i', /.*REMOVE_THIS_LINE.*\\n/, '', file\n sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\\n/, cat 'macro.js', file\ncd '..'\n\n# Run external tool synchronously\nif (exec 'git commit -am \"Auto-commit\"').code != 0\n echo 'Error: Git commit failed'\n exit 1\n```\n\n## Global vs. Local\n\nThe example above uses the convenience script `shelljs/global` to reduce verbosity. If polluting your global namespace is not desirable, simply require `shelljs`.\n\nExample:\n\n```javascript\nvar shell = require('shelljs');\nshell.echo('hello world');\n```\n\n## Make tool\n\nA convenience script `shelljs/make` is also provided to mimic the behavior of a Unix Makefile. In this case all shell objects are global, and command line arguments will cause the script to execute only the corresponding function in the global `target` object. To avoid redundant calls, target functions are executed only once per script.\n\nExample (CoffeeScript):\n\n```coffeescript\nrequire 'shelljs/make'\n\ntarget.all = ->\n target.bundle()\n target.docs()\n\ntarget.bundle = ->\n cd __dirname\n mkdir 'build'\n cd 'lib'\n (cat '*.js').to '../build/output.js'\n\ntarget.docs = ->\n cd __dirname\n mkdir 'docs'\n cd 'lib'\n for file in ls '*.js'\n text = grep '//@', file # extract special comments\n text.replace '//@', '' # remove comment tags\n text.to 'docs/my_docs.md'\n```\n\nTo run the target `all`, call the above script without arguments: `$ node make`. To run the target `docs`: `$ node make docs`, and so on.\n\n\n\n\n\n\n## Command reference\n\n\nAll commands run synchronously, unless otherwise stated.\n\n\n### cd('dir')\nChanges to directory `dir` for the duration of the script\n\n### pwd()\nReturns the current directory.\n\n### ls([options ,] path [,path ...])\n### ls([options ,] path_array)\nAvailable options:\n\n+ `-R`: recursive\n+ `-A`: all files (include files beginning with `.`, except for `.` and `..`)\n\nExamples:\n\n```javascript\nls('projs/*.js');\nls('-R', '/users/me', '/tmp');\nls('-R', ['/users/me', '/tmp']); // same as above\n```\n\nReturns array of files in the given path, or in current directory if no path provided.\n\n### find(path [,path ...])\n### find(path_array)\nExamples:\n\n```javascript\nfind('src', 'lib');\nfind(['src', 'lib']); // same as above\nfind('.').filter(function(file) { return file.match(/\\.js$/); });\n```\n\nReturns array of all files (however deep) in the given paths.\n\nThe main difference from `ls('-R', path)` is that the resulting file names\ninclude the base directories, e.g. `lib/resources/file1` instead of just `file1`.\n\n### cp([options ,] source [,source ...], dest)\n### cp([options ,] source_array, dest)\nAvailable options:\n\n+ `-f`: force\n+ `-r, -R`: recursive\n\nExamples:\n\n```javascript\ncp('file1', 'dir1');\ncp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');\ncp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above\n```\n\nCopies files. The wildcard `*` is accepted.\n\n### rm([options ,] file [, file ...])\n### rm([options ,] file_array)\nAvailable options:\n\n+ `-f`: force\n+ `-r, -R`: recursive\n\nExamples:\n\n```javascript\nrm('-rf', '/tmp/*');\nrm('some_file.txt', 'another_file.txt');\nrm(['some_file.txt', 'another_file.txt']); // same as above\n```\n\nRemoves files. The wildcard `*` is accepted.\n\n### mv(source [, source ...], dest')\n### mv(source_array, dest')\nAvailable options:\n\n+ `f`: force\n\nExamples:\n\n```javascript\nmv('-f', 'file', 'dir/');\nmv('file1', 'file2', 'dir/');\nmv(['file1', 'file2'], 'dir/'); // same as above\n```\n\nMoves files. The wildcard `*` is accepted.\n\n### mkdir([options ,] dir [, dir ...])\n### mkdir([options ,] dir_array)\nAvailable options:\n\n+ `p`: full path (will create intermediate dirs if necessary)\n\nExamples:\n\n```javascript\nmkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');\nmkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above\n```\n\nCreates directories.\n\n### test(expression)\nAvailable expression primaries:\n\n+ `'-b', 'path'`: true if path is a block device\n+ `'-c', 'path'`: true if path is a character device\n+ `'-d', 'path'`: true if path is a directory\n+ `'-e', 'path'`: true if path exists\n+ `'-f', 'path'`: true if path is a regular file\n+ `'-L', 'path'`: true if path is a symboilc link\n+ `'-p', 'path'`: true if path is a pipe (FIFO)\n+ `'-S', 'path'`: true if path is a socket\n\nExamples:\n\n```javascript\nif (test('-d', path)) { /* do something with dir */ };\nif (!test('-f', path)) continue; // skip if it's a regular file\n```\n\nEvaluates expression using the available primaries and returns corresponding value.\n\n### cat(file [, file ...])\n### cat(file_array)\n\nExamples:\n\n```javascript\nvar str = cat('file*.txt');\nvar str = cat('file1', 'file2');\nvar str = cat(['file1', 'file2']); // same as above\n```\n\nReturns a string containing the given file, or a concatenated string\ncontaining the files if more than one file is given (a new line character is\nintroduced between each file). Wildcard `*` accepted.\n\n### 'string'.to(file)\n\nExamples:\n\n```javascript\ncat('input.txt').to('output.txt');\n```\n\nAnalogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as\nthose returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_\n\n### sed([options ,] search_regex, replace_str, file)\nAvailable options:\n\n+ `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_\n\nExamples:\n\n```javascript\nsed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');\nsed(/.*DELETE_THIS_LINE.*\\n/, '', 'source.js');\n```\n\nReads an input string from `file` and performs a JavaScript `replace()` on the input\nusing the given search regex and replacement string. Returns the new string after replacement.\n\n### grep([options ,] regex_filter, file [, file ...])\n### grep([options ,] regex_filter, file_array)\nAvailable options:\n\n+ `-v`: Inverse the sense of the regex and print the lines not matching the criteria.\n\nExamples:\n\n```javascript\ngrep('-v', 'GLOBAL_VARIABLE', '*.js');\ngrep('GLOBAL_VARIABLE', '*.js');\n```\n\nReads input string from given files and returns a string containing all lines of the\nfile that match the given `regex_filter`. Wildcard `*` accepted.\n\n### which(command)\n\nExamples:\n\n```javascript\nvar nodeExec = which('node');\n```\n\nSearches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions.\nReturns string containing the absolute path to the command.\n\n### echo(string [,string ...])\n\nExamples:\n\n```javascript\necho('hello world');\nvar str = echo('hello world');\n```\n\nPrints string to stdout, and returns string with additional utility methods\nlike `.to()`.\n\n### dirs([options | '+N' | '-N'])\n\nAvailable options:\n\n+ `-c`: Clears the directory stack by deleting all of the elements.\n\nArguments:\n\n+ `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero.\n+ `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero.\n\nDisplay the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified.\n\nSee also: pushd, popd\n\n### pushd([options,] [dir | '-N' | '+N'])\n\nAvailable options:\n\n+ `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated.\n\nArguments:\n\n+ `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`.\n+ `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.\n+ `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack.\n\nExamples:\n\n```javascript\n// process.cwd() === '/usr'\npushd('/etc'); // Returns /etc /usr\npushd('+1'); // Returns /usr /etc\n```\n\nSave the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack.\n\n### popd([options,] ['-N' | '+N'])\n\nAvailable options:\n\n+ `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated.\n\nArguments:\n\n+ `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero.\n+ `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero.\n\nExamples:\n\n```javascript\necho(process.cwd()); // '/usr'\npushd('/etc'); // '/etc /usr'\necho(process.cwd()); // '/etc'\npopd(); // '/usr'\necho(process.cwd()); // '/usr'\n```\n\nWhen no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack.\n\n### exit(code)\nExits the current process with the given exit code.\n\n### env['VAR_NAME']\nObject containing environment variables (both getter and setter). Shortcut to process.env.\n\n### exec(command [, options] [, callback])\nAvailable options (all `false` by default):\n\n+ `async`: Asynchronous execution. Defaults to true if a callback is provided.\n+ `silent`: Do not echo program output to console.\n\nExamples:\n\n```javascript\nvar version = exec('node --version', {silent:true}).output;\n\nvar child = exec('some_long_running_process', {async:true});\nchild.stdout.on('data', function(data) {\n /* ... do something with data ... */\n});\n\nexec('some_long_running_process', function(code, output) {\n console.log('Exit code:', code);\n console.log('Program output:', output);\n});\n```\n\nExecutes the given `command` _synchronously_, unless otherwise specified.\nWhen in synchronous mode returns the object `{ code:..., output:... }`, containing the program's\n`output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and\nthe `callback` gets the arguments `(code, output)`.\n\n**Note:** For long-lived processes, it's best to run `exec()` asynchronously as\nthe current synchronous implementation uses a lot of CPU. This should be getting\nfixed soon.\n\n### chmod(octal_mode || octal_string, file)\n### chmod(symbolic_mode, file)\n\nAvailable options:\n\n+ `-v`: output a diagnostic for every file processed\n+ `-c`: like verbose but report only when a change is made\n+ `-R`: change files and directories recursively\n\nExamples:\n\n```javascript\nchmod(755, '/Users/brandon');\nchmod('755', '/Users/brandon'); // same as above \nchmod('u+x', '/Users/brandon');\n```\n\nAlters the permissions of a file or directory by either specifying the\nabsolute permissions in octal form or expressing the changes in symbols.\nThis command tries to mimic the POSIX behavior as much as possible.\nNotable exceptions:\n\n+ In symbolic modes, 'a-r' and '-r' are identical. No consideration is\n given to the umask.\n+ There is no \"quiet\" option since default behavior is to run silent.\n\n## Configuration\n\n\n### config.silent\nExample:\n\n```javascript\nvar silentState = config.silent; // save old silent state\nconfig.silent = true;\n/* ... */\nconfig.silent = silentState; // restore old silent state\n```\n\nSuppresses all command output if `true`, except for `echo()` calls.\nDefault is `false`.\n\n### config.fatal\nExample:\n\n```javascript\nconfig.fatal = true;\ncp('this_file_does_not_exist', '/dev/null'); // dies here\n/* more commands... */\n```\n\nIf `true` the script will die on errors. Default is `false`.\n\n## Non-Unix commands\n\n\n### tempdir()\nSearches and returns string containing a writeable, platform-dependent temporary directory.\nFollows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).\n\n### error()\nTests if error occurred in the last command. Returns `null` if no error occurred,\notherwise returns string explaining the error\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/arturadib/shelljs/issues" - }, - "_id": "shelljs@0.1.4", - "_from": "shelljs@0.1.x" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/docs.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/docs.js deleted file mode 100755 index 68a2138..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/docs.js +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -echo('Appending docs to README.md'); - -cd(__dirname + '/..'); - -// Extract docs from shell.js -var docs = grep('//@', 'shell.js'); -// Remove '//@' -docs = docs.replace(/\/\/\@ ?/g, ''); -// Append docs to README -sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 'README.md'); - -echo('All done.'); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js deleted file mode 100755 index a9d32fc..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/scripts/run-tests.js +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env node -require('../global'); - -var path = require('path'); - -var failed = false; - -// -// Lint -// -JSHINT_BIN = './node_modules/jshint/bin/jshint'; -cd(__dirname + '/..'); - -if (!test('-f', JSHINT_BIN)) { - echo('JSHint not found. Run `npm install` in the root dir first.'); - exit(1); -} - -if (exec(JSHINT_BIN + ' --config jshint.json *.js test/*.js').code !== 0) { - failed = true; - echo('*** JSHINT FAILED! (return code != 0)'); - echo(); -} else { - echo('All JSHint tests passed'); - echo(); -} - -// -// Unit tests -// -cd(__dirname + '/../test'); -ls('*.js').forEach(function(file) { - echo('Running test:', file); - if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. premature exit) - failed = true; - echo('*** TEST FAILED! (missing exit code "123")'); - echo(); - } -}); - -if (failed) { - echo(); - echo('*******************************************************'); - echo('WARNING: Some tests did not pass!'); - echo('*******************************************************'); - exit(1); -} else { - echo(); - echo('All tests passed.'); -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/shell.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/shell.js deleted file mode 100644 index 7a4f4c8..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/shell.js +++ /dev/null @@ -1,1901 +0,0 @@ -// -// ShellJS -// Unix shell commands on top of Node's API -// -// Copyright (c) 2012 Artur Adib -// http://github.com/arturadib/shelljs -// - -var fs = require('fs'), - path = require('path'), - util = require('util'), - vm = require('vm'), - child = require('child_process'), - os = require('os'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -var config = { - silent: false, - fatal: false -}; - -var state = { - error: null, - currentCmd: 'shell.js', - tempDir: null - }, - platform = os.type().match(/^Win/) ? 'win' : 'unix'; - - -//@ -//@ All commands run synchronously, unless otherwise stated. -//@ - - -//@ -//@ ### cd('dir') -//@ Changes to directory `dir` for the duration of the script -function _cd(options, dir) { - if (!dir) - error('directory not specified'); - - if (!fs.existsSync(dir)) - error('no such file or directory: ' + dir); - - if (!fs.statSync(dir).isDirectory()) - error('not a directory: ' + dir); - - process.chdir(dir); -} -exports.cd = wrap('cd', _cd); - -//@ -//@ ### pwd() -//@ Returns the current directory. -function _pwd(options) { - var pwd = path.resolve(process.cwd()); - return ShellString(pwd); -} -exports.pwd = wrap('pwd', _pwd); - - -//@ -//@ ### ls([options ,] path [,path ...]) -//@ ### ls([options ,] path_array) -//@ Available options: -//@ -//@ + `-R`: recursive -//@ + `-A`: all files (include files beginning with `.`, except for `.` and `..`) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ ls('projs/*.js'); -//@ ls('-R', '/users/me', '/tmp'); -//@ ls('-R', ['/users/me', '/tmp']); // same as above -//@ ``` -//@ -//@ Returns array of files in the given path, or in current directory if no path provided. -function _ls(options, paths) { - options = parseOptions(options, { - 'R': 'recursive', - 'A': 'all', - 'a': 'all_deprecated' - }); - - if (options.all_deprecated) { - // We won't support the -a option as it's hard to image why it's useful - // (it includes '.' and '..' in addition to '.*' files) - // For backwards compatibility we'll dump a deprecated message and proceed as before - log('ls: Option -a is deprecated. Use -A instead'); - options.all = true; - } - - if (!paths) - paths = ['.']; - else if (typeof paths === 'object') - paths = paths; // assume array - else if (typeof paths === 'string') - paths = [].slice.call(arguments, 1); - - var list = []; - - // Conditionally pushes file to list - returns true if pushed, false otherwise - // (e.g. prevents hidden files to be included unless explicitly told so) - function pushFile(file, query) { - // hidden file? - if (path.basename(file)[0] === '.') { - // not explicitly asking for hidden files? - if (!options.all && !(path.basename(query)[0] === '.' && path.basename(query).length > 1)) - return false; - } - - if (platform === 'win') - file = file.replace(/\\/g, '/'); - - list.push(file); - return true; - } - - paths.forEach(function(p) { - if (fs.existsSync(p)) { - var stats = fs.statSync(p); - // Simple file? - if (stats.isFile()) { - pushFile(p, p); - return; // continue - } - - // Simple dir? - if (stats.isDirectory()) { - // Iterate over p contents - fs.readdirSync(p).forEach(function(file) { - if (!pushFile(file, p)) - return; - - // Recursive? - if (options.recursive) { - var oldDir = _pwd(); - _cd('', p); - if (fs.statSync(file).isDirectory()) - list = list.concat(_ls('-R'+(options.all?'A':''), file+'/*')); - _cd('', oldDir); - } - }); - return; // continue - } - } - - // p does not exist - possible wildcard present - - var basename = path.basename(p); - var dirname = path.dirname(p); - // Wildcard present on an existing dir? (e.g. '/tmp/*.js') - if (basename.search(/\*/) > -1 && fs.existsSync(dirname) && fs.statSync(dirname).isDirectory) { - // Escape special regular expression chars - var regexp = basename.replace(/(\^|\$|\(|\)|<|>|\[|\]|\{|\}|\.|\+|\?)/g, '\\$1'); - // Translates wildcard into regex - regexp = '^' + regexp.replace(/\*/g, '.*') + '$'; - // Iterate over directory contents - fs.readdirSync(dirname).forEach(function(file) { - if (file.match(new RegExp(regexp))) { - if (!pushFile(path.normalize(dirname+'/'+file), basename)) - return; - - // Recursive? - if (options.recursive) { - var pp = dirname + '/' + file; - if (fs.lstatSync(pp).isDirectory()) - list = list.concat(_ls('-R'+(options.all?'A':''), pp+'/*')); - } // recursive - } // if file matches - }); // forEach - return; - } - - error('no such file or directory: ' + p, true); - }); - - return list; -} -exports.ls = wrap('ls', _ls); - - -//@ -//@ ### find(path [,path ...]) -//@ ### find(path_array) -//@ Examples: -//@ -//@ ```javascript -//@ find('src', 'lib'); -//@ find(['src', 'lib']); // same as above -//@ find('.').filter(function(file) { return file.match(/\.js$/); }); -//@ ``` -//@ -//@ Returns array of all files (however deep) in the given paths. -//@ -//@ The main difference from `ls('-R', path)` is that the resulting file names -//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. -function _find(options, paths) { - if (!paths) - error('no path specified'); - else if (typeof paths === 'object') - paths = paths; // assume array - else if (typeof paths === 'string') - paths = [].slice.call(arguments, 1); - - var list = []; - - function pushFile(file) { - if (platform === 'win') - file = file.replace(/\\/g, '/'); - list.push(file); - } - - // why not simply do ls('-R', paths)? because the output wouldn't give the base dirs - // to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory - - paths.forEach(function(file) { - pushFile(file); - - if (fs.statSync(file).isDirectory()) { - _ls('-RA', file+'/*').forEach(function(subfile) { - pushFile(subfile); - }); - } - }); - - return list; -} -exports.find = wrap('find', _find); - - -//@ -//@ ### cp([options ,] source [,source ...], dest) -//@ ### cp([options ,] source_array, dest) -//@ Available options: -//@ -//@ + `-f`: force -//@ + `-r, -R`: recursive -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cp('file1', 'dir1'); -//@ cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp'); -//@ cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above -//@ ``` -//@ -//@ Copies files. The wildcard `*` is accepted. -function _cp(options, sources, dest) { - options = parseOptions(options, { - 'f': 'force', - 'R': 'recursive', - 'r': 'recursive' - }); - - // Get sources, dest - if (arguments.length < 3) { - error('missing and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else if ('length' in sources) { - sources = sources; // no-op for array - } else { - error('invalid arguments'); - } - - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) - error('dest is not a directory (too many sources)'); - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && !options.force) - error('dest file already exists: ' + dest); - - if (options.recursive) { - // Recursive allows the shortcut syntax "sourcedir/" for "sourcedir/*" - // (see Github issue #15) - sources.forEach(function(src, i) { - if (src[src.length - 1] === '/') - sources[i] += '*'; - }); - - // Create dest - try { - fs.mkdirSync(dest, parseInt('0777', 8)); - } catch (e) { - // like Unix's cp, keep going even if we can't create dest dir - } - } - - sources = expand(sources); - - sources.forEach(function(src) { - if (!fs.existsSync(src)) { - error('no such file or directory: '+src, true); - return; // skip file - } - - // If here, src exists - if (fs.statSync(src).isDirectory()) { - if (!options.recursive) { - // Non-Recursive - log(src + ' is a directory (not copied)'); - } else { - // Recursive - // 'cp /a/source dest' should create 'source' in 'dest' - var newDest = path.join(dest, path.basename(src)), - checkDir = fs.statSync(src); - try { - fs.mkdirSync(newDest, checkDir.mode); - } catch (e) { - //if the directory already exists, that's okay - if (e.code !== 'EEXIST') throw e; - } - - cpdirSyncRecursive(src, newDest, {force: options.force}); - } - return; // done with dir - } - - // If here, src is a file - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) - thisDest = path.normalize(dest + '/' + path.basename(src)); - - if (fs.existsSync(thisDest) && !options.force) { - error('dest file already exists: ' + thisDest, true); - return; // skip file - } - - copyFileSync(src, thisDest); - }); // forEach(src) -} -exports.cp = wrap('cp', _cp); - -//@ -//@ ### rm([options ,] file [, file ...]) -//@ ### rm([options ,] file_array) -//@ Available options: -//@ -//@ + `-f`: force -//@ + `-r, -R`: recursive -//@ -//@ Examples: -//@ -//@ ```javascript -//@ rm('-rf', '/tmp/*'); -//@ rm('some_file.txt', 'another_file.txt'); -//@ rm(['some_file.txt', 'another_file.txt']); // same as above -//@ ``` -//@ -//@ Removes files. The wildcard `*` is accepted. -function _rm(options, files) { - options = parseOptions(options, { - 'f': 'force', - 'r': 'recursive', - 'R': 'recursive' - }); - if (!files) - error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 1); - // if it's array leave it as it is - - files = expand(files); - - files.forEach(function(file) { - if (!fs.existsSync(file)) { - // Path does not exist, no force flag given - if (!options.force) - error('no such file or directory: '+file, true); - - return; // skip file - } - - // If here, path exists - - var stats = fs.statSync(file); - // Remove simple file - if (stats.isFile()) { - - // Do not check for file writing permissions - if (options.force) { - _unlinkSync(file); - return; - } - - if (isWriteable(file)) - _unlinkSync(file); - else - error('permission denied: '+file, true); - - return; - } // simple file - - // Path is an existing directory, but no -r flag given - if (stats.isDirectory() && !options.recursive) { - error('path is a directory', true); - return; // skip path - } - - // Recursively remove existing directory - if (stats.isDirectory() && options.recursive) { - rmdirSyncRecursive(file, options.force); - } - }); // forEach(file) -} // rm -exports.rm = wrap('rm', _rm); - -//@ -//@ ### mv(source [, source ...], dest') -//@ ### mv(source_array, dest') -//@ Available options: -//@ -//@ + `f`: force -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mv('-f', 'file', 'dir/'); -//@ mv('file1', 'file2', 'dir/'); -//@ mv(['file1', 'file2'], 'dir/'); // same as above -//@ ``` -//@ -//@ Moves files. The wildcard `*` is accepted. -function _mv(options, sources, dest) { - options = parseOptions(options, { - 'f': 'force' - }); - - // Get sources, dest - if (arguments.length < 3) { - error('missing and/or '); - } else if (arguments.length > 3) { - sources = [].slice.call(arguments, 1, arguments.length - 1); - dest = arguments[arguments.length - 1]; - } else if (typeof sources === 'string') { - sources = [sources]; - } else if ('length' in sources) { - sources = sources; // no-op for array - } else { - error('invalid arguments'); - } - - sources = expand(sources); - - var exists = fs.existsSync(dest), - stats = exists && fs.statSync(dest); - - // Dest is not existing dir, but multiple sources given - if ((!exists || !stats.isDirectory()) && sources.length > 1) - error('dest is not a directory (too many sources)'); - - // Dest is an existing file, but no -f given - if (exists && stats.isFile() && !options.force) - error('dest file already exists: ' + dest); - - sources.forEach(function(src) { - if (!fs.existsSync(src)) { - error('no such file or directory: '+src, true); - return; // skip file - } - - // If here, src exists - - // When copying to '/path/dir': - // thisDest = '/path/dir/file1' - var thisDest = dest; - if (fs.existsSync(dest) && fs.statSync(dest).isDirectory()) - thisDest = path.normalize(dest + '/' + path.basename(src)); - - if (fs.existsSync(thisDest) && !options.force) { - error('dest file already exists: ' + thisDest, true); - return; // skip file - } - - if (path.resolve(src) === path.dirname(path.resolve(thisDest))) { - error('cannot move to self: '+src, true); - return; // skip file - } - - fs.renameSync(src, thisDest); - }); // forEach(src) -} // mv -exports.mv = wrap('mv', _mv); - -//@ -//@ ### mkdir([options ,] dir [, dir ...]) -//@ ### mkdir([options ,] dir_array) -//@ Available options: -//@ -//@ + `p`: full path (will create intermediate dirs if necessary) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g'); -//@ mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above -//@ ``` -//@ -//@ Creates directories. -function _mkdir(options, dirs) { - options = parseOptions(options, { - 'p': 'fullpath' - }); - if (!dirs) - error('no paths given'); - - if (typeof dirs === 'string') - dirs = [].slice.call(arguments, 1); - // if it's array leave it as it is - - dirs.forEach(function(dir) { - if (fs.existsSync(dir)) { - if (!options.fullpath) - error('path already exists: ' + dir, true); - return; // skip dir - } - - // Base dir does not exist, and no -p option given - var baseDir = path.dirname(dir); - if (!fs.existsSync(baseDir) && !options.fullpath) { - error('no such file or directory: ' + baseDir, true); - return; // skip dir - } - - if (options.fullpath) - mkdirSyncRecursive(dir); - else - fs.mkdirSync(dir, parseInt('0777', 8)); - }); -} // mkdir -exports.mkdir = wrap('mkdir', _mkdir); - -//@ -//@ ### test(expression) -//@ Available expression primaries: -//@ -//@ + `'-b', 'path'`: true if path is a block device -//@ + `'-c', 'path'`: true if path is a character device -//@ + `'-d', 'path'`: true if path is a directory -//@ + `'-e', 'path'`: true if path exists -//@ + `'-f', 'path'`: true if path is a regular file -//@ + `'-L', 'path'`: true if path is a symboilc link -//@ + `'-p', 'path'`: true if path is a pipe (FIFO) -//@ + `'-S', 'path'`: true if path is a socket -//@ -//@ Examples: -//@ -//@ ```javascript -//@ if (test('-d', path)) { /* do something with dir */ }; -//@ if (!test('-f', path)) continue; // skip if it's a regular file -//@ ``` -//@ -//@ Evaluates expression using the available primaries and returns corresponding value. -function _test(options, path) { - if (!path) - error('no path given'); - - // hack - only works with unary primaries - options = parseOptions(options, { - 'b': 'block', - 'c': 'character', - 'd': 'directory', - 'e': 'exists', - 'f': 'file', - 'L': 'link', - 'p': 'pipe', - 'S': 'socket' - }); - - var canInterpret = false; - for (var key in options) - if (options[key] === true) { - canInterpret = true; - break; - } - - if (!canInterpret) - error('could not interpret expression'); - - if (options.link) { - try { - return fs.lstatSync(path).isSymbolicLink(); - } catch(e) { - return false; - } - } - - if (!fs.existsSync(path)) - return false; - - if (options.exists) - return true; - - var stats = fs.statSync(path); - - if (options.block) - return stats.isBlockDevice(); - - if (options.character) - return stats.isCharacterDevice(); - - if (options.directory) - return stats.isDirectory(); - - if (options.file) - return stats.isFile(); - - if (options.pipe) - return stats.isFIFO(); - - if (options.socket) - return stats.isSocket(); -} // test -exports.test = wrap('test', _test); - - -//@ -//@ ### cat(file [, file ...]) -//@ ### cat(file_array) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var str = cat('file*.txt'); -//@ var str = cat('file1', 'file2'); -//@ var str = cat(['file1', 'file2']); // same as above -//@ ``` -//@ -//@ Returns a string containing the given file, or a concatenated string -//@ containing the files if more than one file is given (a new line character is -//@ introduced between each file). Wildcard `*` accepted. -function _cat(options, files) { - var cat = ''; - - if (!files) - error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 1); - // if it's array leave it as it is - - files = expand(files); - - files.forEach(function(file) { - if (!fs.existsSync(file)) - error('no such file or directory: ' + file); - - cat += fs.readFileSync(file, 'utf8') + '\n'; - }); - - if (cat[cat.length-1] === '\n') - cat = cat.substring(0, cat.length-1); - - return ShellString(cat); -} -exports.cat = wrap('cat', _cat); - -//@ -//@ ### 'string'.to(file) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ cat('input.txt').to('output.txt'); -//@ ``` -//@ -//@ Analogous to the redirection operator `>` in Unix, but works with JavaScript strings (such as -//@ those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will overwrite any existing file!_ -function _to(options, file) { - if (!file) - error('wrong arguments'); - - if (!fs.existsSync( path.dirname(file) )) - error('no such file or directory: ' + path.dirname(file)); - - try { - fs.writeFileSync(file, this.toString(), 'utf8'); - } catch(e) { - error('could not write to file (code '+e.code+'): '+file, true); - } -} -// In the future, when Proxies are default, we can add methods like `.to()` to primitive strings. -// For now, this is a dummy function to bookmark places we need such strings -function ShellString(str) { - return str; -} -String.prototype.to = wrap('to', _to); - -//@ -//@ ### sed([options ,] search_regex, replace_str, file) -//@ Available options: -//@ -//@ + `-i`: Replace contents of 'file' in-place. _Note that no backups will be created!_ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js'); -//@ sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js'); -//@ ``` -//@ -//@ Reads an input string from `file` and performs a JavaScript `replace()` on the input -//@ using the given search regex and replacement string. Returns the new string after replacement. -function _sed(options, regex, replacement, file) { - options = parseOptions(options, { - 'i': 'inplace' - }); - - if (typeof replacement === 'string') - replacement = replacement; // no-op - else if (typeof replacement === 'number') - replacement = replacement.toString(); // fallback - else - error('invalid replacement string'); - - if (!file) - error('no file given'); - - if (!fs.existsSync(file)) - error('no such file or directory: ' + file); - - var result = fs.readFileSync(file, 'utf8').replace(regex, replacement); - if (options.inplace) - fs.writeFileSync(file, result, 'utf8'); - - return ShellString(result); -} -exports.sed = wrap('sed', _sed); - -//@ -//@ ### grep([options ,] regex_filter, file [, file ...]) -//@ ### grep([options ,] regex_filter, file_array) -//@ Available options: -//@ -//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); -//@ grep('GLOBAL_VARIABLE', '*.js'); -//@ ``` -//@ -//@ Reads input string from given files and returns a string containing all lines of the -//@ file that match the given `regex_filter`. Wildcard `*` accepted. -function _grep(options, regex, files) { - options = parseOptions(options, { - 'v': 'inverse' - }); - - if (!files) - error('no paths given'); - - if (typeof files === 'string') - files = [].slice.call(arguments, 2); - // if it's array leave it as it is - - files = expand(files); - - var grep = ''; - files.forEach(function(file) { - if (!fs.existsSync(file)) { - error('no such file or directory: ' + file, true); - return; - } - - var contents = fs.readFileSync(file, 'utf8'), - lines = contents.split(/\r*\n/); - lines.forEach(function(line) { - var matched = line.match(regex); - if ((options.inverse && !matched) || (!options.inverse && matched)) - grep += line + '\n'; - }); - }); - - return ShellString(grep); -} -exports.grep = wrap('grep', _grep); - - -//@ -//@ ### which(command) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var nodeExec = which('node'); -//@ ``` -//@ -//@ Searches for `command` in the system's PATH. On Windows looks for `.exe`, `.cmd`, and `.bat` extensions. -//@ Returns string containing the absolute path to the command. -function _which(options, cmd) { - if (!cmd) - error('must specify command'); - - var pathEnv = process.env.path || process.env.Path || process.env.PATH, - pathArray = splitPath(pathEnv), - where = null; - - // No relative/absolute paths provided? - if (cmd.search(/\//) === -1) { - // Search for command in PATH - pathArray.forEach(function(dir) { - if (where) - return; // already found it - - var attempt = path.resolve(dir + '/' + cmd); - if (fs.existsSync(attempt)) { - where = attempt; - return; - } - - if (platform === 'win') { - var baseAttempt = attempt; - attempt = baseAttempt + '.exe'; - if (fs.existsSync(attempt)) { - where = attempt; - return; - } - attempt = baseAttempt + '.cmd'; - if (fs.existsSync(attempt)) { - where = attempt; - return; - } - attempt = baseAttempt + '.bat'; - if (fs.existsSync(attempt)) { - where = attempt; - return; - } - } // if 'win' - }); - } - - // Command not found anywhere? - if (!fs.existsSync(cmd) && !where) - return null; - - where = where || path.resolve(cmd); - - return ShellString(where); -} -exports.which = wrap('which', _which); - -//@ -//@ ### echo(string [,string ...]) -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo('hello world'); -//@ var str = echo('hello world'); -//@ ``` -//@ -//@ Prints string to stdout, and returns string with additional utility methods -//@ like `.to()`. -function _echo() { - var messages = [].slice.call(arguments, 0); - console.log.apply(this, messages); - return ShellString(messages.join(' ')); -} -exports.echo = _echo; // don't wrap() as it could parse '-options' - -// Pushd/popd/dirs internals -var _dirStack = []; - -function _isStackIndex(index) { - return (/^[\-+]\d+$/).test(index); -} - -function _parseStackIndex(index) { - if (_isStackIndex(index)) { - if (Math.abs(index) < _dirStack.length + 1) { // +1 for pwd - return (/^-/).test(index) ? Number(index) - 1 : Number(index); - } else { - error(index + ': directory stack index out of range'); - } - } else { - error(index + ': invalid number'); - } -} - -function _actualDirStack() { - return [process.cwd()].concat(_dirStack); -} - -//@ -//@ ### dirs([options | '+N' | '-N']) -//@ -//@ Available options: -//@ -//@ + `-c`: Clears the directory stack by deleting all of the elements. -//@ -//@ Arguments: -//@ -//@ + `+N`: Displays the Nth directory (counting from the left of the list printed by dirs when invoked without options), starting with zero. -//@ + `-N`: Displays the Nth directory (counting from the right of the list printed by dirs when invoked without options), starting with zero. -//@ -//@ Display the list of currently remembered directories. Returns an array of paths in the stack, or a single path if +N or -N was specified. -//@ -//@ See also: pushd, popd -function _dirs(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = parseOptions(options, { - 'c' : 'clear' - }); - - if (options['clear']) { - _dirStack = []; - return _dirStack; - } - - var stack = _actualDirStack(); - - if (index) { - index = _parseStackIndex(index); - - if (index < 0) { - index = stack.length + index; - } - - log(stack[index]); - return stack[index]; - } - - log(stack.join(' ')); - - return stack; -} -exports.dirs = wrap("dirs", _dirs); - -//@ -//@ ### pushd([options,] [dir | '-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when adding directories to the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `dir`: Makes the current working directory be the top of the stack, and then executes the equivalent of `cd dir`. -//@ + `+N`: Brings the Nth directory (counting from the left of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ + `-N`: Brings the Nth directory (counting from the right of the list printed by dirs, starting with zero) to the top of the list by rotating the stack. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ // process.cwd() === '/usr' -//@ pushd('/etc'); // Returns /etc /usr -//@ pushd('+1'); // Returns /usr /etc -//@ ``` -//@ -//@ Save the current directory on the top of the directory stack and then cd to `dir`. With no arguments, pushd exchanges the top two directories. Returns an array of paths in the stack. -function _pushd(options, dir) { - if (_isStackIndex(options)) { - dir = options; - options = ''; - } - - options = parseOptions(options, { - 'n' : 'no-cd' - }); - - var dirs = _actualDirStack(); - - if (dir === '+0') { - return dirs; // +0 is a noop - } else if (!dir) { - if (dirs.length > 1) { - dirs = dirs.splice(1, 1).concat(dirs); - } else { - return error('no other directory'); - } - } else if (_isStackIndex(dir)) { - var n = _parseStackIndex(dir); - dirs = dirs.slice(n).concat(dirs.slice(0, n)); - } else { - if (options['no-cd']) { - dirs.splice(1, 0, dir); - } else { - dirs.unshift(dir); - } - } - - if (options['no-cd']) { - dirs = dirs.slice(1); - } else { - dir = path.resolve(dirs.shift()); - _cd('', dir); - } - - _dirStack = dirs; - return _dirs(''); -} -exports.pushd = wrap('pushd', _pushd); - -//@ -//@ ### popd([options,] ['-N' | '+N']) -//@ -//@ Available options: -//@ -//@ + `-n`: Suppresses the normal change of directory when removing directories from the stack, so that only the stack is manipulated. -//@ -//@ Arguments: -//@ -//@ + `+N`: Removes the Nth directory (counting from the left of the list printed by dirs), starting with zero. -//@ + `-N`: Removes the Nth directory (counting from the right of the list printed by dirs), starting with zero. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ echo(process.cwd()); // '/usr' -//@ pushd('/etc'); // '/etc /usr' -//@ echo(process.cwd()); // '/etc' -//@ popd(); // '/usr' -//@ echo(process.cwd()); // '/usr' -//@ ``` -//@ -//@ When no arguments are given, popd removes the top directory from the stack and performs a cd to the new top directory. The elements are numbered from 0 starting at the first directory listed with dirs; i.e., popd is equivalent to popd +0. Returns an array of paths in the stack. -function _popd(options, index) { - if (_isStackIndex(options)) { - index = options; - options = ''; - } - - options = parseOptions(options, { - 'n' : 'no-cd' - }); - - if (!_dirStack.length) { - return error('directory stack empty'); - } - - index = _parseStackIndex(index || '+0'); - - if (options['no-cd'] || index > 0 || _dirStack.length + index === 0) { - index = index > 0 ? index - 1 : index; - _dirStack.splice(index, 1); - } else { - var dir = path.resolve(_dirStack.shift()); - _cd('', dir); - } - - return _dirs(''); -} -exports.popd = wrap("popd", _popd); - -//@ -//@ ### exit(code) -//@ Exits the current process with the given exit code. -exports.exit = process.exit; - -//@ -//@ ### env['VAR_NAME'] -//@ Object containing environment variables (both getter and setter). Shortcut to process.env. -exports.env = process.env; - -//@ -//@ ### exec(command [, options] [, callback]) -//@ Available options (all `false` by default): -//@ -//@ + `async`: Asynchronous execution. Defaults to true if a callback is provided. -//@ + `silent`: Do not echo program output to console. -//@ -//@ Examples: -//@ -//@ ```javascript -//@ var version = exec('node --version', {silent:true}).output; -//@ -//@ var child = exec('some_long_running_process', {async:true}); -//@ child.stdout.on('data', function(data) { -//@ /* ... do something with data ... */ -//@ }); -//@ -//@ exec('some_long_running_process', function(code, output) { -//@ console.log('Exit code:', code); -//@ console.log('Program output:', output); -//@ }); -//@ ``` -//@ -//@ Executes the given `command` _synchronously_, unless otherwise specified. -//@ When in synchronous mode returns the object `{ code:..., output:... }`, containing the program's -//@ `output` (stdout + stderr) and its exit `code`. Otherwise returns the child process object, and -//@ the `callback` gets the arguments `(code, output)`. -//@ -//@ **Note:** For long-lived processes, it's best to run `exec()` asynchronously as -//@ the current synchronous implementation uses a lot of CPU. This should be getting -//@ fixed soon. -function _exec(command, options, callback) { - if (!command) - error('must specify command'); - - // Callback is defined instead of options. - if (typeof options === 'function') { - callback = options; - options = { async: true }; - } - - // Callback is defined with options. - if (typeof options === 'object' && typeof callback === 'function') { - options.async = true; - } - - options = extend({ - silent: config.silent, - async: false - }, options); - - if (options.async) - return execAsync(command, options, callback); - else - return execSync(command, options); -} -exports.exec = wrap('exec', _exec, {notUnix:true}); - -var PERMS = (function (base) { - return { - OTHER_EXEC : base.EXEC, - OTHER_WRITE : base.WRITE, - OTHER_READ : base.READ, - - GROUP_EXEC : base.EXEC << 3, - GROUP_WRITE : base.WRITE << 3, - GROUP_READ : base.READ << 3, - - OWNER_EXEC : base.EXEC << 6, - OWNER_WRITE : base.WRITE << 6, - OWNER_READ : base.READ << 6, - - // Literal octal numbers are apparently not allowed in "strict" javascript. Using parseInt is - // the preferred way, else a jshint warning is thrown. - STICKY : parseInt('01000', 8), - SETGID : parseInt('02000', 8), - SETUID : parseInt('04000', 8), - - TYPE_MASK : parseInt('0770000', 8) - }; -})({ - EXEC : 1, - WRITE : 2, - READ : 4 -}); - - -//@ -//@ ### chmod(octal_mode || octal_string, file) -//@ ### chmod(symbolic_mode, file) -//@ -//@ Available options: -//@ -//@ + `-v`: output a diagnostic for every file processed//@ -//@ + `-c`: like verbose but report only when a change is made//@ -//@ + `-R`: change files and directories recursively//@ -//@ -//@ Examples: -//@ -//@ ```javascript -//@ chmod(755, '/Users/brandon'); -//@ chmod('755', '/Users/brandon'); // same as above -//@ chmod('u+x', '/Users/brandon'); -//@ ``` -//@ -//@ Alters the permissions of a file or directory by either specifying the -//@ absolute permissions in octal form or expressing the changes in symbols. -//@ This command tries to mimic the POSIX behavior as much as possible. -//@ Notable exceptions: -//@ -//@ + In symbolic modes, 'a-r' and '-r' are identical. No consideration is -//@ given to the umask. -//@ + There is no "quiet" option since default behavior is to run silent. -function _chmod(options, mode, filePattern) { - if (!filePattern) { - if (options.length > 0 && options.charAt(0) === '-') { - // Special case where the specified file permissions started with - to subtract perms, which - // get picked up by the option parser as command flags. - // If we are down by one argument and options starts with -, shift everything over. - filePattern = mode; - mode = options; - options = ''; - } - else { - error('You must specify a file.'); - } - } - - options = parseOptions(options, { - 'R': 'recursive', - 'c': 'changes', - 'v': 'verbose' - }); - - if (typeof filePattern === 'string') { - filePattern = [ filePattern ]; - } - - var files; - - if (options.recursive) { - files = []; - expand(filePattern).forEach(function addFile(expandedFile) { - var stat = fs.lstatSync(expandedFile); - - if (!stat.isSymbolicLink()) { - files.push(expandedFile); - - if (stat.isDirectory()) { // intentionally does not follow symlinks. - fs.readdirSync(expandedFile).forEach(function (child) { - addFile(expandedFile + '/' + child); - }); - } - } - }); - } - else { - files = expand(filePattern); - } - - files.forEach(function innerChmod(file) { - file = path.resolve(file); - if (!fs.existsSync(file)) { - error('File not found: ' + file); - } - - // When recursing, don't follow symlinks. - if (options.recursive && fs.lstatSync(file).isSymbolicLink()) { - return; - } - - var perms = fs.statSync(file).mode; - var type = perms & PERMS.TYPE_MASK; - - var newPerms = perms; - - if (isNaN(parseInt(mode, 8))) { - // parse options - mode.split(',').forEach(function (symbolicMode) { - /*jshint regexdash:true */ - var pattern = /([ugoa]*)([=\+-])([rwxXst]*)/i; - var matches = pattern.exec(symbolicMode); - - if (matches) { - var applyTo = matches[1]; - var operator = matches[2]; - var change = matches[3]; - - var changeOwner = applyTo.indexOf('u') != -1 || applyTo === 'a' || applyTo === ''; - var changeGroup = applyTo.indexOf('g') != -1 || applyTo === 'a' || applyTo === ''; - var changeOther = applyTo.indexOf('o') != -1 || applyTo === 'a' || applyTo === ''; - - var changeRead = change.indexOf('r') != -1; - var changeWrite = change.indexOf('w') != -1; - var changeExec = change.indexOf('x') != -1; - var changeSticky = change.indexOf('t') != -1; - var changeSetuid = change.indexOf('s') != -1; - - var mask = 0; - if (changeOwner) { - mask |= (changeRead ? PERMS.OWNER_READ : 0) + (changeWrite ? PERMS.OWNER_WRITE : 0) + (changeExec ? PERMS.OWNER_EXEC : 0) + (changeSetuid ? PERMS.SETUID : 0); - } - if (changeGroup) { - mask |= (changeRead ? PERMS.GROUP_READ : 0) + (changeWrite ? PERMS.GROUP_WRITE : 0) + (changeExec ? PERMS.GROUP_EXEC : 0) + (changeSetuid ? PERMS.SETGID : 0); - } - if (changeOther) { - mask |= (changeRead ? PERMS.OTHER_READ : 0) + (changeWrite ? PERMS.OTHER_WRITE : 0) + (changeExec ? PERMS.OTHER_EXEC : 0); - } - - // Sticky bit is special - it's not tied to user, group or other. - if (changeSticky) { - mask |= PERMS.STICKY; - } - - switch (operator) { - case '+': - newPerms |= mask; - break; - - case '-': - newPerms &= ~mask; - break; - - case '=': - newPerms = type + mask; - - // According to POSIX, when using = to explicitly set the permissions, setuid and setgid can never be cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - break; - } - - if (options.verbose) { - log(file + ' -> ' + newPerms.toString(8)); - } - - if (perms != newPerms) { - if (!options.verbose && options.changes) { - log(file + ' -> ' + newPerms.toString(8)); - } - fs.chmodSync(file, newPerms); - } - } - else { - error('Invalid symbolic mode change: ' + symbolicMode); - } - }); - } - else { - // they gave us a full number - newPerms = type + parseInt(mode, 8); - - // POSIX rules are that setuid and setgid can only be added using numeric form, but not cleared. - if (fs.statSync(file).isDirectory()) { - newPerms |= (PERMS.SETUID + PERMS.SETGID) & perms; - } - - fs.chmodSync(file, newPerms); - } - }); -} -exports.chmod = wrap('chmod', _chmod); - - -//@ -//@ ## Configuration -//@ - - - -exports.config = config; - -//@ -//@ ### config.silent -//@ Example: -//@ -//@ ```javascript -//@ var silentState = config.silent; // save old silent state -//@ config.silent = true; -//@ /* ... */ -//@ config.silent = silentState; // restore old silent state -//@ ``` -//@ -//@ Suppresses all command output if `true`, except for `echo()` calls. -//@ Default is `false`. - -//@ -//@ ### config.fatal -//@ Example: -//@ -//@ ```javascript -//@ config.fatal = true; -//@ cp('this_file_does_not_exist', '/dev/null'); // dies here -//@ /* more commands... */ -//@ ``` -//@ -//@ If `true` the script will die on errors. Default is `false`. - - - - -//@ -//@ ## Non-Unix commands -//@ - - - - - - -//@ -//@ ### tempdir() -//@ Searches and returns string containing a writeable, platform-dependent temporary directory. -//@ Follows Python's [tempfile algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir). -exports.tempdir = wrap('tempdir', tempDir); - - -//@ -//@ ### error() -//@ Tests if error occurred in the last command. Returns `null` if no error occurred, -//@ otherwise returns string explaining the error -exports.error = function() { - return state.error; -}; - - - - - -//////////////////////////////////////////////////////////////////////////////////////////////// -// -// Auxiliary functions (internal use only) -// - -function log() { - if (!config.silent) - console.log.apply(this, arguments); -} - -function deprecate(what, msg) { - console.log('*** ShellJS.'+what+': This function is deprecated.', msg); -} - -function write(msg) { - if (!config.silent) - process.stdout.write(msg); -} - -// Shows error message. Throws unless _continue or config.fatal are true -function error(msg, _continue) { - if (state.error === null) - state.error = ''; - state.error += state.currentCmd + ': ' + msg + '\n'; - - log(state.error); - - if (config.fatal) - process.exit(1); - - if (!_continue) - throw ''; -} - -// Returns {'alice': true, 'bob': false} when passed: -// parseOptions('-a', {'a':'alice', 'b':'bob'}); -function parseOptions(str, map) { - if (!map) - error('parseOptions() internal error: no map given'); - - // All options are false by default - var options = {}; - for (var letter in map) - options[map[letter]] = false; - - if (!str) - return options; // defaults - - if (typeof str !== 'string') - error('parseOptions() internal error: wrong str'); - - // e.g. match[1] = 'Rf' for str = '-Rf' - var match = str.match(/^\-(.+)/); - if (!match) - return options; - - // e.g. chars = ['R', 'f'] - var chars = match[1].split(''); - - chars.forEach(function(c) { - if (c in map) - options[map[c]] = true; - else - error('option not recognized: '+c); - }); - - return options; -} - -// Common wrapper for all Unix-like commands -function wrap(cmd, fn, options) { - return function() { - var retValue = null; - - state.currentCmd = cmd; - state.error = null; - - try { - var args = [].slice.call(arguments, 0); - - if (options && options.notUnix) { - retValue = fn.apply(this, args); - } else { - if (args.length === 0 || typeof args[0] !== 'string' || args[0][0] !== '-') - args.unshift(''); // only add dummy option if '-option' not already present - retValue = fn.apply(this, args); - } - } catch (e) { - if (!state.error) { - // If state.error hasn't been set it's an error thrown by Node, not us - probably a bug... - console.log('shell.js: internal error'); - console.log(e.stack || e); - process.exit(1); - } - if (config.fatal) - throw e; - } - - state.currentCmd = 'shell.js'; - return retValue; - }; -} // wrap - -// Buffered file copy, synchronous -// (Using readFileSync() + writeFileSync() could easily cause a memory overflow -// with large files) -function copyFileSync(srcFile, destFile) { - if (!fs.existsSync(srcFile)) - error('copyFileSync: no such file or directory: ' + srcFile); - - var BUF_LENGTH = 64*1024, - buf = new Buffer(BUF_LENGTH), - bytesRead = BUF_LENGTH, - pos = 0, - fdr = null, - fdw = null; - - try { - fdr = fs.openSync(srcFile, 'r'); - } catch(e) { - error('copyFileSync: could not read src file ('+srcFile+')'); - } - - try { - fdw = fs.openSync(destFile, 'w'); - } catch(e) { - error('copyFileSync: could not write to dest file (code='+e.code+'):'+destFile); - } - - while (bytesRead === BUF_LENGTH) { - bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos); - fs.writeSync(fdw, buf, 0, bytesRead); - pos += bytesRead; - } - - fs.closeSync(fdr); - fs.closeSync(fdw); -} - -// Recursively copies 'sourceDir' into 'destDir' -// Adapted from https://github.com/ryanmcgrath/wrench-js -// -// Copyright (c) 2010 Ryan McGrath -// Copyright (c) 2012 Artur Adib -// -// Licensed under the MIT License -// http://www.opensource.org/licenses/mit-license.php -function cpdirSyncRecursive(sourceDir, destDir, opts) { - if (!opts) opts = {}; - - /* Create the directory where all our junk is moving to; read the mode of the source directory and mirror it */ - var checkDir = fs.statSync(sourceDir); - try { - fs.mkdirSync(destDir, checkDir.mode); - } catch (e) { - //if the directory already exists, that's okay - if (e.code !== 'EEXIST') throw e; - } - - var files = fs.readdirSync(sourceDir); - - for(var i = 0; i < files.length; i++) { - var currFile = fs.lstatSync(sourceDir + "/" + files[i]); - - if (currFile.isDirectory()) { - /* recursion this thing right on back. */ - cpdirSyncRecursive(sourceDir + "/" + files[i], destDir + "/" + files[i], opts); - } else if (currFile.isSymbolicLink()) { - var symlinkFull = fs.readlinkSync(sourceDir + "/" + files[i]); - fs.symlinkSync(symlinkFull, destDir + "/" + files[i]); - } else { - /* At this point, we've hit a file actually worth copying... so copy it on over. */ - if (fs.existsSync(destDir + "/" + files[i]) && !opts.force) { - log('skipping existing file: ' + files[i]); - } else { - copyFileSync(sourceDir + "/" + files[i], destDir + "/" + files[i]); - } - } - - } // for files -} // cpdirSyncRecursive - -// Recursively removes 'dir' -// Adapted from https://github.com/ryanmcgrath/wrench-js -// -// Copyright (c) 2010 Ryan McGrath -// Copyright (c) 2012 Artur Adib -// -// Licensed under the MIT License -// http://www.opensource.org/licenses/mit-license.php -function rmdirSyncRecursive(dir, force) { - var files; - - files = fs.readdirSync(dir); - - // Loop through and delete everything in the sub-tree after checking it - for(var i = 0; i < files.length; i++) { - var file = dir + "/" + files[i], - currFile = fs.lstatSync(file); - - if(currFile.isDirectory()) { // Recursive function back to the beginning - rmdirSyncRecursive(file, force); - } - - else if(currFile.isSymbolicLink()) { // Unlink symlinks - if (force || isWriteable(file)) { - try { - _unlinkSync(file); - } catch (e) { - error('could not remove file (code '+e.code+'): ' + file, true); - } - } - } - - else // Assume it's a file - perhaps a try/catch belongs here? - if (force || isWriteable(file)) { - try { - _unlinkSync(file); - } catch (e) { - error('could not remove file (code '+e.code+'): ' + file, true); - } - } - } - - // Now that we know everything in the sub-tree has been deleted, we can delete the main directory. - // Huzzah for the shopkeep. - - var result; - try { - result = fs.rmdirSync(dir); - } catch(e) { - error('could not remove directory (code '+e.code+'): ' + dir, true); - } - - return result; -} // rmdirSyncRecursive - -// Recursively creates 'dir' -function mkdirSyncRecursive(dir) { - var baseDir = path.dirname(dir); - - // Base dir exists, no recursion necessary - if (fs.existsSync(baseDir)) { - fs.mkdirSync(dir, parseInt('0777', 8)); - return; - } - - // Base dir does not exist, go recursive - mkdirSyncRecursive(baseDir); - - // Base dir created, can create dir - fs.mkdirSync(dir, parseInt('0777', 8)); -} - -// e.g. 'shelljs_a5f185d0443ca...' -function randomFileName() { - function randomHash(count) { - if (count === 1) - return parseInt(16*Math.random(), 10).toString(16); - else { - var hash = ''; - for (var i=0; i&1'; // works on both win/unix - - var script = - "var child = require('child_process')," + - " fs = require('fs');" + - "child.exec('"+escape(cmd)+"', {env: process.env, maxBuffer: 20*1024*1024}, function(err) {" + - " fs.writeFileSync('"+escape(codeFile)+"', err ? err.code.toString() : '0');" + - "});"; - - if (fs.existsSync(scriptFile)) _unlinkSync(scriptFile); - if (fs.existsSync(stdoutFile)) _unlinkSync(stdoutFile); - if (fs.existsSync(codeFile)) _unlinkSync(codeFile); - - fs.writeFileSync(scriptFile, script); - child.exec('"'+process.execPath+'" '+scriptFile, { - env: process.env, - cwd: exports.pwd(), - maxBuffer: 20*1024*1024 - }); - - // The wait loop - // sleepFile is used as a dummy I/O op to mitigate unnecessary CPU usage - // (tried many I/O sync ops, writeFileSync() seems to be only one that is effective in reducing - // CPU usage, though apparently not so much on Windows) - while (!fs.existsSync(codeFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } - while (!fs.existsSync(stdoutFile)) { updateStdout(); fs.writeFileSync(sleepFile, 'a'); } - - // At this point codeFile exists, but it's not necessarily flushed yet. - // Keep reading it until it is. - var code = parseInt('', 10); - while (isNaN(code)) { - code = parseInt(fs.readFileSync(codeFile, 'utf8'), 10); - } - - var stdout = fs.readFileSync(stdoutFile, 'utf8'); - - // No biggie if we can't erase the files now -- they're in a temp dir anyway - try { _unlinkSync(scriptFile); } catch(e) {} - try { _unlinkSync(stdoutFile); } catch(e) {} - try { _unlinkSync(codeFile); } catch(e) {} - try { _unlinkSync(sleepFile); } catch(e) {} - - // True if successful, false if not - var obj = { - code: code, - output: stdout - }; - return obj; -} // execSync() - -// Expands wildcards with matching file names. For a given array of file names 'list', returns -// another array containing all file names as per ls(list[i]). -// For example: -// expand(['file*.js']) = ['file1.js', 'file2.js', ...] -// (if the files 'file1.js', 'file2.js', etc, exist in the current dir) -function expand(list) { - var expanded = []; - list.forEach(function(listEl) { - // Wildcard present? - if (listEl.search(/\*/) > -1) { - _ls('', listEl).forEach(function(file) { - expanded.push(file); - }); - } else { - expanded.push(listEl); - } - }); - return expanded; -} - -// Cross-platform method for splitting environment PATH variables -function splitPath(p) { - if (!p) - return []; - - if (platform === 'win') - return p.split(';'); - else - return p.split(':'); -} - -// extend(target_obj, source_obj1 [, source_obj2 ...]) -// Shallow extend, e.g.: -// extend({A:1}, {b:2}, {c:3}) returns {A:1, b:2, c:3} -function extend(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function(source) { - for (var key in source) - target[key] = source[key]; - }); - - return target; -} - -// Normalizes _unlinkSync() across platforms to match Unix behavior, i.e. -// file can be unlinked even if it's read-only, see joyent/node#3006 -function _unlinkSync(file) { - try { - fs.unlinkSync(file); - } catch(e) { - // Try to override file permission - if (e.code === 'EPERM') { - fs.chmodSync(file, '0666'); - fs.unlinkSync(file); - } else { - throw e; - } - } -} - -// Hack to determine if file has write permissions for current user -// Avoids having to check user, group, etc, but it's probably slow -function isWriteable(file) { - var writePermission = true; - try { - var __fd = fs.openSync(file, 'a'); - fs.closeSync(__fd); - } catch(e) { - writePermission = false; - } - - return writePermission; -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/.npmignore deleted file mode 100644 index a1632ab..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -tmp/ - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cat.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cat.js deleted file mode 100644 index d0d9ddb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cat.js +++ /dev/null @@ -1,57 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -// save current dir -var cur = shell.pwd(); - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.cat(); -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -shell.cat('/adsfasdf'); // file does not exist -assert.ok(shell.error()); - -// -// Valids -// - -// simple -var result = shell.cat('resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, 'test1'); - -// multiple files -var result = shell.cat('resources/file2', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, 'test2\ntest1'); - -// multiple files, array syntax -var result = shell.cat(['resources/file2', 'resources/file1']); -assert.equal(shell.error(), null); -assert.equal(result, 'test2\ntest1'); - -var result = shell.cat('resources/file*.txt'); -assert.equal(shell.error(), null); -assert.ok(result.search('test1') > -1); // file order might be random -assert.ok(result.search('test2') > -1); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cd.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cd.js deleted file mode 100644 index e6f6c38..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cd.js +++ /dev/null @@ -1,64 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -// save current dir -var cur = shell.pwd(); - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.cd(); -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -shell.cd('/adsfasdf'); // dir does not exist -assert.ok(shell.error()); - -assert.equal(fs.existsSync('resources/file1'), true); // sanity check -shell.cd('resources/file1'); // file, not dir -assert.ok(shell.error()); - -// -// Valids -// - -shell.cd(cur); -shell.cd('tmp'); -assert.equal(shell.error(), null); -assert.equal(path.basename(process.cwd()), 'tmp'); - -shell.cd(cur); -shell.cd('/'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), path.resolve('/')); - -// cd + other commands - -shell.cd(cur); -shell.rm('-f', 'tmp/*'); -assert.equal(fs.existsSync('tmp/file1'), false); -shell.cd('resources'); -assert.equal(shell.error(), null); -shell.cp('file1', '../tmp'); -assert.equal(shell.error(), null); -shell.cd('../tmp'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), true); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/chmod.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/chmod.js deleted file mode 100644 index b31e25e..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/chmod.js +++ /dev/null @@ -1,81 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -shell.config.silent = true; - -// -// Invalids -// - -shell.chmod('blah'); // missing args -assert.ok(shell.error()); -shell.chmod('893', 'resources/chmod'); // invalid permissions - mode must be in octal -assert.ok(shell.error()); - -// -// Valids -// - -// Test files - the bitmasking is to ignore the upper bits. -shell.chmod('755', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('755', 8)); -shell.chmod('644', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); - -shell.chmod('o+x', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('007', 8), parseInt('005', 8)); -shell.chmod('644', 'resources/chmod/file1'); - -shell.chmod('+x', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('755', 8)); -shell.chmod('644', 'resources/chmod/file1'); - -// Test setuid -shell.chmod('u+s', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('4000', 8), parseInt('4000', 8)); -shell.chmod('u-s', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); - -// according to POSIX standards at http://linux.die.net/man/1/chmod, -// setuid is never cleared from a directory unless explicitly asked for. -shell.chmod('u+s', 'resources/chmod/c'); -shell.chmod('755', 'resources/chmod/c'); -assert.equal(fs.statSync('resources/chmod/c').mode & parseInt('4000', 8), parseInt('4000', 8)); -shell.chmod('u-s', 'resources/chmod/c'); - -// Test setgid -shell.chmod('g+s', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('2000', 8), parseInt('2000', 8)); -shell.chmod('g-s', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); - -// Test sticky bit -shell.chmod('+t', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('1000', 8), parseInt('1000', 8)); -shell.chmod('-t', 'resources/chmod/file1'); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('777', 8), parseInt('644', 8)); -assert.equal(fs.statSync('resources/chmod/file1').mode & parseInt('1000', 8), 0); - -// Test directories -shell.chmod('a-w', 'resources/chmod/b/a/b'); -assert.equal(fs.statSync('resources/chmod/b/a/b').mode & parseInt('777', 8), parseInt('555', 8)); -shell.chmod('755', 'resources/chmod/b/a/b'); - -// Test recursion -shell.chmod('-R', 'a+w', 'resources/chmod/b'); -assert.equal(fs.statSync('resources/chmod/b/a/b').mode & parseInt('777', 8), parseInt('777', 8)); -shell.chmod('-R', '755', 'resources/chmod/b'); -assert.equal(fs.statSync('resources/chmod/b/a/b').mode & parseInt('777', 8), parseInt('755', 8)); - -// Test symbolic links w/ recursion - WARNING: *nix only -fs.symlinkSync('resources/chmod/b/a', 'resources/chmod/a/b/c/link', 'dir'); -shell.chmod('-R', 'u-w', 'resources/chmod/a/b'); -assert.equal(fs.statSync('resources/chmod/a/b/c').mode & parseInt('700', 8), parseInt('500', 8)); -assert.equal(fs.statSync('resources/chmod/b/a').mode & parseInt('700', 8), parseInt('700', 8)); -shell.chmod('-R', 'u+w', 'resources/chmod/a/b'); -fs.unlinkSync('resources/chmod/a/b/c/link'); - -shell.exit(123); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/config.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/config.js deleted file mode 100644 index bd81ec0..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/config.js +++ /dev/null @@ -1,50 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - child = require('child_process'); - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -// -// config.silent -// - -assert.equal(shell.config.silent, false); // default - -shell.config.silent = true; -assert.equal(shell.config.silent, true); - -shell.config.silent = false; -assert.equal(shell.config.silent, false); - -// -// config.fatal -// - -assert.equal(shell.config.fatal, false); // default - -// -// config.fatal = false -// -shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); config.silent=true; config.fatal=false; cp("this_file_doesnt_exist", "."); echo("got here");'; -script.to(file); -child.exec('node '+file, function(err, stdout, stderr) { - assert.ok(stdout.match('got here')); - - // - // config.fatal = true - // - shell.mkdir('-p', 'tmp'); - var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); config.silent=true; config.fatal=true; cp("this_file_doesnt_exist", "."); echo("got here");'; - script.to(file); - child.exec('node '+file, function(err, stdout, stderr) { - assert.ok(!stdout.match('got here')); - - shell.exit(123); - }); -}); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cp.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cp.js deleted file mode 100644 index 39b3ba9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/cp.js +++ /dev/null @@ -1,143 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.cp(); -assert.ok(shell.error()); - -shell.cp('file1'); -assert.ok(shell.error()); - -shell.cp('-f'); -assert.ok(shell.error()); - -shell.rm('-rf', 'tmp/*'); -shell.cp('-@', 'resources/file1', 'tmp/file1'); // option not supported, files OK -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), false); - -shell.cp('-Z', 'asdfasdf', 'tmp/file2'); // option not supported, files NOT OK -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file2'), false); - -shell.cp('asdfasdf', 'tmp'); // source does not exist -assert.ok(shell.error()); -assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/asdfasdf'), false); - -shell.cp('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist -assert.ok(shell.error()); -assert.equal(numLines(shell.error()), 2); -assert.equal(fs.existsSync('tmp/asdfasdf1'), false); -assert.equal(fs.existsSync('tmp/asdfasdf2'), false); - -shell.cp('asdfasdf1', 'asdfasdf2', 'resources/file1'); // too many sources (dest is file) -assert.ok(shell.error()); - -shell.cp('resources/file1', 'resources/file2'); // dest already exists -assert.ok(shell.error()); - -shell.cp('resources/file1', 'resources/file2', 'tmp/a_file'); // too many sources -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/a_file'), false); - -// -// Valids -// - -// simple - to dir -shell.cp('resources/file1', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), true); - -// simple - to file -shell.cp('resources/file2', 'tmp/file2'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file2'), true); - -// simple - file list -shell.rm('-rf', 'tmp/*'); -shell.cp('resources/file1', 'resources/file2', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); - -// simple - file list, array syntax -shell.rm('-rf', 'tmp/*'); -shell.cp(['resources/file1', 'resources/file2'], 'tmp'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); - -shell.cp('resources/file2', 'tmp/file3'); -assert.equal(fs.existsSync('tmp/file3'), true); -shell.cp('-f', 'resources/file2', 'tmp/file3'); // file exists, but -f specified -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file3'), true); - -// wildcard -shell.rm('tmp/file1', 'tmp/file2'); -shell.cp('resources/file*', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); - -//recursive, nothing exists -shell.rm('-rf', 'tmp/*'); -shell.cp('-R', 'resources/cp', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(shell.ls('-R', 'resources/cp') + '', shell.ls('-R', 'tmp/cp') + ''); - -//recursive, nothing exists, source ends in '/' (see Github issue #15) -shell.rm('-rf', 'tmp/*'); -shell.cp('-R', 'resources/cp/', 'tmp/'); -assert.equal(shell.error(), null); -assert.equal(shell.ls('-R', 'resources/cp') + '', shell.ls('-R', 'tmp') + ''); - -//recursive, everything exists, no force flag -shell.rm('-rf', 'tmp/*'); -shell.cp('-R', 'resources/cp', 'tmp'); -shell.cp('-R', 'resources/cp', 'tmp'); -assert.equal(shell.error(), null); // crash test only - -//recursive, everything exists, with force flag -shell.rm('-rf', 'tmp/*'); -shell.cp('-R', 'resources/cp', 'tmp'); -'changing things around'.to('tmp/cp/dir_a/z'); -assert.notEqual(shell.cat('resources/cp/dir_a/z'), shell.cat('tmp/cp/dir_a/z')); // before cp -shell.cp('-Rf', 'resources/cp', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(shell.cat('resources/cp/dir_a/z'), shell.cat('tmp/cp/dir_a/z')); // after cp - -//recursive, creates dest dir since it's only one level deep (see Github issue #44) -shell.rm('-rf', 'tmp/*'); -shell.cp('-r', 'resources/issue44/*', 'tmp/dir2'); -assert.equal(shell.error(), null); -assert.equal(shell.ls('-R', 'resources/issue44') + '', shell.ls('-R', 'tmp/dir2') + ''); -assert.equal(shell.cat('resources/issue44/main.js'), shell.cat('tmp/dir2/main.js')); - -//recursive, does *not* create dest dir since it's too deep (see Github issue #44) -shell.rm('-rf', 'tmp/*'); -shell.cp('-r', 'resources/issue44/*', 'tmp/dir2/dir3'); -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/dir2'), false); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/dirs.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/dirs.js deleted file mode 100644 index e9f11e6..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/dirs.js +++ /dev/null @@ -1,37 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -var root = path.resolve(); - -shell.pushd('resources/pushd'); -shell.pushd('a'); - -var trail = [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]; - -assert.deepEqual(shell.dirs(), trail); - -// Single items -assert.equal(shell.dirs('+0'), trail[0]); -assert.equal(shell.dirs('+1'), trail[1]); -assert.equal(shell.dirs('+2'), trail[2]); -assert.equal(shell.dirs('-0'), trail[2]); -assert.equal(shell.dirs('-1'), trail[1]); -assert.equal(shell.dirs('-2'), trail[0]); - -// Clearing items -assert.deepEqual(shell.dirs('-c'), []); -assert(!shell.error()); - -shell.exit(123); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/echo.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/echo.js deleted file mode 100644 index 82faa51..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/echo.js +++ /dev/null @@ -1,50 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'), - child = require('child_process'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - - -// From here on we use child.exec() to intercept the stdout - - -// simple test with defaults -shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); echo("-asdf", "111");'; // test '-' bug (see issue #20) -script.to(file); -child.exec('node '+file, function(err, stdout, stderr) { - assert.ok(stdout === '-asdf 111\n' || stdout === '-asdf 111\nundefined\n'); // 'undefined' for v0.4 - - // simple test with silent(true) - shell.mkdir('-p', 'tmp'); - var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../global.js\'); config.silent=true; echo(555);'; - script.to(file); - child.exec('node '+file, function(err, stdout, stderr) { - assert.ok(stdout === '555\n' || stdout === '555\nundefined\n'); // 'undefined' for v0.4 - - theEnd(); - }); -}); - -function theEnd() { - shell.exit(123); -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/env.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/env.js deleted file mode 100644 index 0e041d6..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/env.js +++ /dev/null @@ -1,19 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'); - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - -assert.equal(shell.env['PATH'], process.env['PATH']); - -shell.env['SHELLJS_TEST'] = 'hello world'; -assert.equal(shell.env['SHELLJS_TEST'], process.env['SHELLJS_TEST']); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/exec.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/exec.js deleted file mode 100644 index e721808..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/exec.js +++ /dev/null @@ -1,109 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'), - util = require('util'), - child = require('child_process'); - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -// -// Invalids -// - -shell.exec(); -assert.ok(shell.error()); - -var result = shell.exec('asdfasdf'); // could not find command -assert.ok(result.code > 0); - - -// -// Valids -// - -// -// sync -// - -// check if stdout goes to output -var result = shell.exec('node -e \"console.log(1234);\"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.output === '1234\n' || result.output === '1234\nundefined\n'); // 'undefined' for v0.4 - -// check if stderr goes to output -var result = shell.exec('node -e \"console.error(1234);\"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.output === '1234\n' || result.output === '1234\nundefined\n'); // 'undefined' for v0.4 - -// check if stdout + stderr go to output -var result = shell.exec('node -e \"console.error(1234); console.log(666);\"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.ok(result.output === '1234\n666\n' || result.output === '1234\n666\nundefined\n'); // 'undefined' for v0.4 - -// check exit code -var result = shell.exec('node -e \"process.exit(12);\"'); -assert.equal(shell.error(), null); -assert.equal(result.code, 12); - -// interaction with cd -shell.cd('resources/external'); -var result = shell.exec('node node_script.js'); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.output, 'node_script_1234\n'); -shell.cd('../..'); - -// check quotes escaping -var result = shell.exec( util.format('node -e "console.log(%s);"', "\\\"\\'+\\'_\\'+\\'\\\"") ); -assert.equal(shell.error(), null); -assert.equal(result.code, 0); -assert.equal(result.output, "'+'_'+'\n"); - -// -// async -// - -// no callback -var c = shell.exec('node -e \"console.log(1234)\"', {async:true}); -assert.equal(shell.error(), null); -assert.ok('stdout' in c, 'async exec returns child process object'); - -// -// callback as 2nd argument -// -shell.exec('node -e \"console.log(5678);\"', function(code, output) { - assert.equal(code, 0); - assert.ok(output === '5678\n' || output === '5678\nundefined\n'); // 'undefined' for v0.4 - - // - // callback as 3rd argument - // - shell.exec('node -e \"console.log(5566);\"', {async:true}, function(code, output) { - assert.equal(code, 0); - assert.ok(output === '5566\n' || output === '5566\nundefined\n'); // 'undefined' for v0.4 - - // - // callback as 3rd argument (slient:true) - // - shell.exec('node -e \"console.log(5678);\"', {silent:true}, function(code, output) { - assert.equal(code, 0); - assert.ok(output === '5678\n' || output === '5678\nundefined\n'); // 'undefined' for v0.4 - - shell.exit(123); - - }); - - }); - -}); - -assert.equal(shell.error(), null); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/find.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/find.js deleted file mode 100644 index d375f86..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/find.js +++ /dev/null @@ -1,56 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result = shell.find(); // no paths given -assert.ok(shell.error()); - -// -// Valids -// - -// current path -shell.cd('resources/find'); -var result = shell.find('.'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('.hidden') > -1, true); -assert.equal(result.indexOf('dir1/dir11/a_dir11') > -1, true); -assert.equal(result.length, 11); -shell.cd('../..'); - -// simple path -var result = shell.find('resources/find'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('resources/find/.hidden') > -1, true); -assert.equal(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1, true); -assert.equal(result.length, 11); - -// multiple paths - comma -var result = shell.find('resources/find/dir1', 'resources/find/dir2'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1, true); -assert.equal(result.indexOf('resources/find/dir2/a_dir1') > -1, true); -assert.equal(result.length, 6); - -// multiple paths - array -var result = shell.find(['resources/find/dir1', 'resources/find/dir2']); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('resources/find/dir1/dir11/a_dir11') > -1, true); -assert.equal(result.indexOf('resources/find/dir2/a_dir1') > -1, true); -assert.equal(result.length, 6); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/grep.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/grep.js deleted file mode 100644 index 71db982..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/grep.js +++ /dev/null @@ -1,59 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.grep(); -assert.ok(shell.error()); - -shell.grep(/asdf/g); // too few args -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -shell.grep(/asdf/g, '/asdfasdf'); // no such file -assert.ok(shell.error()); - -// -// Valids -// - -var result = shell.grep('line', 'resources/a.txt'); -assert.equal(shell.error(), null); -assert.equal(result.split('\n').length - 1, 4); - -var result = shell.grep('-v', 'line', 'resources/a.txt'); -assert.equal(shell.error(), null); -assert.equal(result.split('\n').length - 1, 8); - -var result = shell.grep('line one', 'resources/a.txt'); -assert.equal(shell.error(), null); -assert.equal(result, 'This is line one\n'); - -// multiple files -var result = shell.grep(/test/, 'resources/file1.txt', 'resources/file2.txt'); -assert.equal(shell.error(), null); -assert.equal(result, 'test1\ntest2\n'); - -// multiple files, array syntax -var result = shell.grep(/test/, ['resources/file1.txt', 'resources/file2.txt']); -assert.equal(shell.error(), null); -assert.equal(result, 'test1\ntest2\n'); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/ls.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/ls.js deleted file mode 100644 index 5067b7d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/ls.js +++ /dev/null @@ -1,202 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -var result = shell.ls('/asdfasdf'); // no such file or dir -assert.ok(shell.error()); -assert.equal(result.length, 0); - -// -// Valids -// - -var result = shell.ls(); -assert.equal(shell.error(), null); - -var result = shell.ls('/'); -assert.equal(shell.error(), null); - -// no args -shell.cd('resources/ls'); -var result = shell.ls(); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.length, 6); -shell.cd('../..'); - -// simple arg -var result = shell.ls('resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.length, 6); - -// no args, 'all' option -shell.cd('resources/ls'); -var result = shell.ls('-A'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('.hidden_file') > -1, true); -assert.equal(result.indexOf('.hidden_dir') > -1, true); -assert.equal(result.length, 8); -shell.cd('../..'); - -// no args, 'all' option -shell.cd('resources/ls'); -var result = shell.ls('-a'); // (deprecated) backwards compatibility test -assert.equal(shell.error(), null); -assert.equal(result.indexOf('file1') > -1, true); -assert.equal(result.indexOf('file2') > -1, true); -assert.equal(result.indexOf('file1.js') > -1, true); -assert.equal(result.indexOf('file2.js') > -1, true); -assert.equal(result.indexOf('filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('.hidden_file') > -1, true); -assert.equal(result.indexOf('.hidden_dir') > -1, true); -assert.equal(result.length, 8); -shell.cd('../..'); - -// wildcard, simple -var result = shell.ls('resources/ls/*'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('resources/ls/file1') > -1, true); -assert.equal(result.indexOf('resources/ls/file2') > -1, true); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir') > -1, true); -assert.equal(result.length, 6); - -// wildcard, hidden only -var result = shell.ls('resources/ls/.*'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('resources/ls/.hidden_file') > -1, true); -assert.equal(result.indexOf('resources/ls/.hidden_dir') > -1, true); -assert.equal(result.length, 2); - -// wildcard, mid-file -var result = shell.ls('resources/ls/f*le*'); -assert.equal(shell.error(), null); -assert.equal(result.length, 5); -assert.equal(result.indexOf('resources/ls/file1') > -1, true); -assert.equal(result.indexOf('resources/ls/file2') > -1, true); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); - -// wildcard, mid-file with dot (should escape dot for regex) -var result = shell.ls('resources/ls/f*le*.js'); -assert.equal(shell.error(), null); -assert.equal(result.length, 2); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); - -// wildcard, should not do partial matches -var result = shell.ls('resources/ls/*.j'); // shouldn't get .js -assert.equal(shell.error(), null); -assert.equal(result.length, 0); - -// wildcard, all files with extension -var result = shell.ls('resources/ls/*.*'); -assert.equal(shell.error(), null); -assert.equal(result.length, 3); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/filename(with)[chars$]^that.must+be-escaped') > -1, true); - -// wildcard, with additional path -var result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir'); -assert.equal(shell.error(), null); -assert.equal(result.length, 4); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('b_dir') > -1, true); // no wildcard == no path prefix -assert.equal(result.indexOf('nada') > -1, true); // no wildcard == no path prefix - -// wildcard for both paths -var result = shell.ls('resources/ls/f*le*.js', 'resources/ls/a_dir/*'); -assert.equal(shell.error(), null); -assert.equal(result.length, 4); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/nada') > -1, true); - -// wildcard for both paths, array -var result = shell.ls(['resources/ls/f*le*.js', 'resources/ls/a_dir/*']); -assert.equal(shell.error(), null); -assert.equal(result.length, 4); -assert.equal(result.indexOf('resources/ls/file1.js') > -1, true); -assert.equal(result.indexOf('resources/ls/file2.js') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/nada') > -1, true); - -// recursive, no path -shell.cd('resources/ls'); -var result = shell.ls('-R'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.length, 9); -shell.cd('../..'); - -// recusive, path given -var result = shell.ls('-R', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.length, 9); - -// recusive, path given - 'all' flag -var result = shell.ls('-RA', 'resources/ls'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('a_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('a_dir/b_dir/z') > -1, true); -assert.equal(result.indexOf('a_dir/.hidden_dir/nada') > -1, true); -assert.equal(result.length, 14); - -// recursive, wildcard -var result = shell.ls('-R', 'resources/ls/*'); -assert.equal(shell.error(), null); -assert.equal(result.indexOf('resources/ls/a_dir') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/b_dir') > -1, true); -assert.equal(result.indexOf('resources/ls/a_dir/b_dir/z') > -1, true); -assert.equal(result.length, 9); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/make.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/make.js deleted file mode 100644 index 3edbd8c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/make.js +++ /dev/null @@ -1,20 +0,0 @@ -var shell = require('..'), - child = require('child_process'), - assert = require('assert'); - -shell.mkdir('-p', 'tmp'); -var file = 'tmp/tempscript'+Math.random()+'.js', - script = 'require(\'../../make.js\');' + - 'target.all=function(){' + - ' echo("first"); '+ - ' cp("this_file_doesnt_exist", ".");' + - ' echo("second");' + - '}'; - -script.to(file); -child.exec('node '+file, function(err, stdout, stderr) { - assert.ok(stdout.match('first')); - assert.ok(!stdout.match('second')); // Make should die on errors, so this should never get echoed - - shell.exit(123); -}); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mkdir.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mkdir.js deleted file mode 100644 index 1f93422..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mkdir.js +++ /dev/null @@ -1,79 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.mkdir(); -assert.ok(shell.error()); - -var mtime = fs.statSync('tmp').mtime.toString(); -shell.mkdir('tmp'); // dir already exists -assert.ok(shell.error()); -assert.equal(fs.statSync('tmp').mtime.toString(), mtime); // didn't mess with dir - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -shell.mkdir('/asdfasdf/asdfasdf'); // root path does not exist -assert.ok(shell.error()); -assert.equal(fs.existsSync('/asdfasdf'), false); - -// -// Valids -// - -assert.equal(fs.existsSync('tmp/t1'), false); -shell.mkdir('tmp/t1'); // simple dir -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/t1'), true); - -assert.equal(fs.existsSync('tmp/t2'), false); -assert.equal(fs.existsSync('tmp/t3'), false); -shell.mkdir('tmp/t2', 'tmp/t3'); // multiple dirs -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/t2'), true); -assert.equal(fs.existsSync('tmp/t3'), true); - -assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t4'), false); -shell.mkdir('tmp/t1', 'tmp/t4'); // one dir exists, one doesn't -assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/t1'), true); -assert.equal(fs.existsSync('tmp/t4'), true); - -assert.equal(fs.existsSync('tmp/a'), false); -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -shell.rm('-Rf', 'tmp/a'); // revert - -// multiple dirs -shell.mkdir('-p', 'tmp/zzza', 'tmp/zzzb', 'tmp/zzzc'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/zzza'), true); -assert.equal(fs.existsSync('tmp/zzzb'), true); -assert.equal(fs.existsSync('tmp/zzzc'), true); - -// multiple dirs, array syntax -shell.mkdir('-p', ['tmp/yyya', 'tmp/yyyb', 'tmp/yyyc']); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/yyya'), true); -assert.equal(fs.existsSync('tmp/yyyb'), true); -assert.equal(fs.existsSync('tmp/yyyc'), true); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mv.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mv.js deleted file mode 100644 index 89bca91..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/mv.js +++ /dev/null @@ -1,130 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// Prepare tmp/ -shell.cp('resources/*', 'tmp'); - -// -// Invalids -// - -shell.mv(); -assert.ok(shell.error()); - -shell.mv('file1'); -assert.ok(shell.error()); - -shell.mv('-f'); -assert.ok(shell.error()); - -shell.mv('-Z', 'tmp/file1', 'tmp/file1'); // option not supported -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), true); - -shell.mv('asdfasdf', 'tmp'); // source does not exist -assert.ok(shell.error()); -assert.equal(numLines(shell.error()), 1); -assert.equal(fs.existsSync('tmp/asdfasdf'), false); - -shell.mv('asdfasdf1', 'asdfasdf2', 'tmp'); // sources do not exist -assert.ok(shell.error()); -assert.equal(numLines(shell.error()), 2); -assert.equal(fs.existsSync('tmp/asdfasdf1'), false); -assert.equal(fs.existsSync('tmp/asdfasdf2'), false); - -shell.mv('asdfasdf1', 'asdfasdf2', 'tmp/file1'); // too many sources (dest is file) -assert.ok(shell.error()); - -shell.mv('tmp/file1', 'tmp/file2'); // dest already exists -assert.ok(shell.error()); - -shell.mv('tmp/file1', 'tmp/file2', 'tmp/a_file'); // too many sources (exist, but dest is file) -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/a_file'), false); - -shell.mv('tmp/file*', 'tmp/file1'); // can't use wildcard when dest is file -assert.ok(shell.error()); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); -assert.equal(fs.existsSync('tmp/file1.js'), true); -assert.equal(fs.existsSync('tmp/file2.js'), true); - -// -// Valids -// - -shell.cd('tmp'); - -// handles self OK -shell.mkdir('tmp2'); -shell.mv('*', 'tmp2'); // has to handle self (tmp2 --> tmp2) without throwing error -assert.ok(shell.error()); // there's an error, but not fatal -assert.equal(fs.existsSync('tmp2/file1'), true); // moved OK -shell.mv('tmp2/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); // moved OK - -shell.mv('file1', 'file3'); // one source -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file3'), true); -shell.mv('file3', 'file1'); // revert -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), true); - -// two sources -shell.rm('-rf', 't'); -shell.mkdir('-p', 't'); -shell.mv('file1', 'file2', 't'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), false); -assert.equal(fs.existsSync('t/file1'), true); -assert.equal(fs.existsSync('t/file2'), true); -shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); -assert.equal(fs.existsSync('file2'), true); - -// two sources, array style -shell.rm('-rf', 't'); -shell.mkdir('-p', 't'); -shell.mv(['file1', 'file2'], 't'); // two sources -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), false); -assert.equal(fs.existsSync('t/file1'), true); -assert.equal(fs.existsSync('t/file2'), true); -shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1'), true); -assert.equal(fs.existsSync('file2'), true); - -shell.mv('file*.js', 't'); // wildcard -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1.js'), false); -assert.equal(fs.existsSync('file2.js'), false); -assert.equal(fs.existsSync('t/file1.js'), true); -assert.equal(fs.existsSync('t/file2.js'), true); -shell.mv('t/*', '.'); // revert -assert.equal(fs.existsSync('file1.js'), true); -assert.equal(fs.existsSync('file2.js'), true); - -shell.mv('-f', 'file1', 'file2'); // dest exists, but -f given -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('file1'), false); -assert.equal(fs.existsSync('file2'), true); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/popd.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/popd.js deleted file mode 100644 index fd79533..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/popd.js +++ /dev/null @@ -1,118 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -var root = path.resolve(), trail; - -function reset() { - shell.dirs('-c'); - shell.cd(root); -} - -// Valid -shell.pushd('resources/pushd'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); - -shell.pushd('resources/pushd'); -shell.pushd('a'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -shell.pushd('b'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -shell.pushd('b'); -shell.pushd('c'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(trail.length, 1); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); - -// Valid by index -shell.pushd('resources/pushd'); -trail = shell.popd('+0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); - -shell.pushd('resources/pushd'); -trail = shell.popd('+1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ path.resolve(root, 'resources/pushd') ]); - -reset(); shell.pushd('resources/pushd'); -trail = shell.popd('-0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ path.resolve(root, 'resources/pushd') ]); - -reset(); shell.pushd('resources/pushd'); -trail = shell.popd('-1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ root ]); - - -reset(); shell.pushd('resources/pushd'); -trail = shell.popd('-n'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ path.resolve(root, 'resources/pushd') ]); - -// Invalid -trail = shell.popd(); -assert.ok(shell.error('popd: directory stack empty\n')); - -// Test that the root dir is not stored -shell.cd('resources/pushd'); -shell.pushd('b'); -trail = shell.popd(); -assert.equal(shell.error(), null); -assert.equal(trail[0], path.resolve(root, 'resources/pushd')); -assert.equal(process.cwd(), trail[0]); -shell.popd(); -assert.ok(shell.error(), null); - -shell.cd(root); - -shell.exit(123); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pushd.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pushd.js deleted file mode 100644 index 32089dc..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pushd.js +++ /dev/null @@ -1,228 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -var root = path.resolve(), trail; - -function reset() { - shell.dirs('-c'); - shell.cd(root); -} - -// Push valid directories -trail = shell.pushd('resources/pushd'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('a'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('../b'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('c'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -// Push stuff around with positive indices -trail = shell.pushd('+0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('+1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c') -]); - -trail = shell.pushd('+2'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a') -]); - -trail = shell.pushd('+3'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c') -]); - -trail = shell.pushd('+4'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -// Push stuff around with negative indices -trail = shell.pushd('-0'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd') -]); - -trail = shell.pushd('-1'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b') -]); - -trail = shell.pushd('-2'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd') -]); - -trail = shell.pushd('-3'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -trail = shell.pushd('-4'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - path.resolve(root, 'resources/pushd/b/c'), - path.resolve(root, 'resources/pushd/b'), - path.resolve(root, 'resources/pushd/a'), - path.resolve(root, 'resources/pushd'), - root -]); - -// Push without changing directory or resolving paths -reset(); trail = shell.pushd('-n', 'resources/pushd'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - 'resources/pushd' -]); - -trail = shell.pushd('-n', 'resources/pushd/a'); -assert.equal(shell.error(), null); -assert.equal(process.cwd(), trail[0]); -assert.deepEqual(trail, [ - root, - 'resources/pushd/a', - 'resources/pushd' -]); - -// Push invalid directory -shell.pushd('does/not/exist'); -assert.equal(shell.error(), 'pushd: no such file or directory: ' + path.resolve('.', 'does/not/exist') + '\n'); -assert.equal(process.cwd(), trail[0]); - -// Push without arguments should swap top two directories when stack length is 2 -reset(); trail = shell.pushd('resources/pushd'); -assert.equal(shell.error(), null); -assert.equal(trail.length, 2); -assert.equal(path.relative(root, trail[0]), 'resources/pushd'); -assert.equal(trail[1], root); -assert.equal(process.cwd(), trail[0]); -trail = shell.pushd(); -assert.equal(shell.error(), null); -assert.equal(trail.length, 2); -assert.equal(trail[0], root); -assert.equal(path.relative(root, trail[1]), 'resources/pushd'); -assert.equal(process.cwd(), trail[0]); - -// Push without arguments should swap top two directories when stack length is > 2 -trail = shell.pushd('resources/pushd/a'); -assert.equal(shell.error(), null); -assert.equal(trail.length, 3); -assert.equal(path.relative(root, trail[0]), 'resources/pushd/a'); -assert.equal(trail[1], root); -assert.equal(path.relative(root, trail[2]), 'resources/pushd'); -assert.equal(process.cwd(), trail[0]); - -trail = shell.pushd(); -assert.equal(shell.error(), null); -assert.equal(trail.length, 3); -assert.equal(trail[0], root); -assert.equal(path.relative(root, trail[1]), 'resources/pushd/a'); -assert.equal(path.relative(root, trail[2]), 'resources/pushd'); -assert.equal(process.cwd(), trail[0]); - -// Push without arguments invalid when stack is empty -reset(); shell.pushd(); -assert.equal(shell.error(), 'pushd: no other directory\n'); - -shell.exit(123); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pwd.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pwd.js deleted file mode 100644 index d1f563f..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/pwd.js +++ /dev/null @@ -1,28 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'); - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - -var _pwd = shell.pwd(); -assert.equal(shell.error(), null); -assert.equal(_pwd, path.resolve('.')); - -shell.cd('tmp'); -var _pwd = shell.pwd(); -assert.equal(shell.error(), null); -assert.equal(path.basename(_pwd), 'tmp'); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/a.txt b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/a.txt deleted file mode 100644 index 356ce49..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/a.txt +++ /dev/null @@ -1,11 +0,0 @@ -This is line one -This is line two - -This is line four -. -. -More content here -. -. - -This is line eleven diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/a/b/c/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/a/b/c/.npmignore deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/b/a/b/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/b/a/b/.npmignore deleted file mode 100755 index e69de29..0000000 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/c/a/b/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/c/a/b/.npmignore deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/file1 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/file1 deleted file mode 100644 index db3f9ca..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/chmod/file1 +++ /dev/null @@ -1,2 +0,0 @@ -this is test file 1 -default state should be 0644 (rw-r--r--) diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/a b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/a deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/a +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/b b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/b deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/b +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_a/z b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_a/z deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_a/z +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/cp/dir_b/dir_b_a/dir_b_a_a/z +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/external/node_script.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/external/node_script.js deleted file mode 100755 index 3b2d24a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/external/node_script.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('node_script_1234'); - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1 deleted file mode 100644 index f079749..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1 +++ /dev/null @@ -1 +0,0 @@ -test1 \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.js deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.txt b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.txt deleted file mode 100644 index a5bce3f..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file1.txt +++ /dev/null @@ -1 +0,0 @@ -test1 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2 deleted file mode 100644 index d606037..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2 +++ /dev/null @@ -1 +0,0 @@ -test2 \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.js deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.txt b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.txt deleted file mode 100644 index 180cf83..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/file2.txt +++ /dev/null @@ -1 +0,0 @@ -test2 diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/.hidden b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/.hidden deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/.hidden +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/a b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/a deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/a +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/b b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/b deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/b +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/a_dir1 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/a_dir1 deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/a_dir1 +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/dir11/a_dir11 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/dir11/a_dir11 deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir1/dir11/a_dir11 +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir2/a_dir1 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir2/a_dir1 deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/find/dir2/a_dir1 +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/issue44/main.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/issue44/main.js deleted file mode 100644 index d800886..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/issue44/main.js +++ /dev/null @@ -1 +0,0 @@ -123 \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_dir/nada b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_dir/nada deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_dir/nada +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_file b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_file deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/.hidden_file +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/.hidden_dir/nada b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/.hidden_dir/nada deleted file mode 100644 index 5fedf57..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/.hidden_dir/nada +++ /dev/null @@ -1 +0,0 @@ -nada \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/b_dir/z b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/b_dir/z deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/b_dir/z +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/nada b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/nada deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/a_dir/nada +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1 deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1 +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1.js deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file1.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2 b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2 deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2 +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2.js deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/file2.js +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/filename(with)[chars$]^that.must+be-escaped b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/filename(with)[chars$]^that.must+be-escaped deleted file mode 100644 index 8bd6648..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/ls/filename(with)[chars$]^that.must+be-escaped +++ /dev/null @@ -1 +0,0 @@ -asdf diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/a/dummy b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/a/dummy deleted file mode 100644 index 72e12a9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/a/dummy +++ /dev/null @@ -1 +0,0 @@ -meh \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/b/c/dummy b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/b/c/dummy deleted file mode 100644 index 72e12a9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/resources/pushd/b/c/dummy +++ /dev/null @@ -1 +0,0 @@ -meh \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/rm.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/rm.js deleted file mode 100644 index 61182a1..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/rm.js +++ /dev/null @@ -1,183 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.rm(); -assert.ok(shell.error()); - -shell.rm('asdfasdf'); // file does not exist -assert.ok(shell.error()); - -shell.rm('-f'); // no file -assert.ok(shell.error()); - -shell.rm('-@', 'resources/file1'); // invalid option -assert.ok(shell.error()); -assert.equal(fs.existsSync('resources/file1'), true); - -// -// Valids -// - -// file does not exist, but -f specified -shell.rm('-f', 'asdfasdf'); -assert.equal(shell.error(), null); - -// simple rm -shell.cp('-f', 'resources/file1', 'tmp/file1'); -assert.equal(fs.existsSync('tmp/file1'), true); -shell.rm('tmp/file1'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), false); - -// recursive dir removal - small-caps '-r' -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -shell.rm('-rf', 'tmp/a'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/a'), false); - -// recursive dir removal - capital '-R' -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -shell.rm('-Rf', 'tmp/a'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/a'), false); - -// recursive dir removal - absolute path -shell.mkdir('-p', 'tmp/a/b/c'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -shell.rm('-Rf', path.resolve('./tmp/a')); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/a'), false); - -// wildcard -shell.cp('-f', 'resources/file*', 'tmp'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), true); -assert.equal(fs.existsSync('tmp/file2'), true); -assert.equal(fs.existsSync('tmp/file1.js'), true); -assert.equal(fs.existsSync('tmp/file2.js'), true); -shell.rm('tmp/file*'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync('tmp/file1'), false); -assert.equal(fs.existsSync('tmp/file2'), false); -assert.equal(fs.existsSync('tmp/file1.js'), false); -assert.equal(fs.existsSync('tmp/file2.js'), false); - -// recursive dir removal -shell.mkdir('-p', 'tmp/a/b/c'); -shell.mkdir('-p', 'tmp/b'); -shell.mkdir('-p', 'tmp/c'); -shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); -shell.rm('-rf', 'tmp/*'); -assert.equal(shell.error(), null); -var contents = fs.readdirSync('tmp'); -assert.equal(contents.length, 1); -assert.equal(contents[0], '.hidden'); // shouldn't remove hiddden if no .* given - -// recursive dir removal -shell.mkdir('-p', 'tmp/a/b/c'); -shell.mkdir('-p', 'tmp/b'); -shell.mkdir('-p', 'tmp/c'); -shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); -shell.rm('-rf', 'tmp/*', 'tmp/.*'); -assert.equal(shell.error(), null); -var contents = fs.readdirSync('tmp'); -assert.equal(contents.length, 0); - -// recursive dir removal - array-syntax -shell.mkdir('-p', 'tmp/a/b/c'); -shell.mkdir('-p', 'tmp/b'); -shell.mkdir('-p', 'tmp/c'); -shell.mkdir('-p', 'tmp/.hidden'); -assert.equal(fs.existsSync('tmp/a/b/c'), true); -assert.equal(fs.existsSync('tmp/b'), true); -assert.equal(fs.existsSync('tmp/c'), true); -assert.equal(fs.existsSync('tmp/.hidden'), true); -shell.rm('-rf', ['tmp/*', 'tmp/.*']); -assert.equal(shell.error(), null); -var contents = fs.readdirSync('tmp'); -assert.equal(contents.length, 0); - -// removal of a read-only file (unforced) -shell.mkdir('-p', 'tmp/readonly'); -'asdf'.to('tmp/readonly/file1'); -fs.chmodSync('tmp/readonly/file1', '0444'); // -r--r--r-- -shell.rm('tmp/readonly/file1'); -assert.equal(fs.existsSync('tmp/readonly/file1'), true); // bash's rm always asks before removing read-only files - // here we just assume "no" - -// removal of a read-only file (forced) -shell.mkdir('-p', 'tmp/readonly'); -'asdf'.to('tmp/readonly/file2'); -fs.chmodSync('tmp/readonly/file2', '0444'); // -r--r--r-- -shell.rm('-f', 'tmp/readonly/file2'); -assert.equal(fs.existsSync('tmp/readonly/file2'), false); - -// removal of a tree containing read-only files (unforced) -shell.mkdir('-p', 'tmp/tree2'); -'asdf'.to('tmp/tree2/file1'); -'asdf'.to('tmp/tree2/file2'); -fs.chmodSync('tmp/tree2/file1', '0444'); // -r--r--r-- -shell.rm('-r', 'tmp/tree2'); -assert.equal(fs.existsSync('tmp/tree2/file1'), true); -assert.equal(fs.existsSync('tmp/tree2/file2'), false); - -// removal of a tree containing read-only files (forced) -shell.mkdir('-p', 'tmp/tree'); -'asdf'.to('tmp/tree/file1'); -'asdf'.to('tmp/tree/file2'); -fs.chmodSync('tmp/tree/file1', '0444'); // -r--r--r-- -shell.rm('-rf', 'tmp/tree'); -assert.equal(fs.existsSync('tmp/tree'), false); - -// removal of a sub-tree containing read-only and hidden files - rm('dir/*') -shell.mkdir('-p', 'tmp/tree3'); -shell.mkdir('-p', 'tmp/tree3/subtree'); -shell.mkdir('-p', 'tmp/tree3/.hidden'); -'asdf'.to('tmp/tree3/subtree/file'); -'asdf'.to('tmp/tree3/.hidden/file'); -'asdf'.to('tmp/tree3/file'); -fs.chmodSync('tmp/tree3/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree3/subtree/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree3/.hidden/file', '0444'); // -r--r--r-- -shell.rm('-rf', 'tmp/tree3/*', 'tmp/tree3/.*'); // erase dir contents -assert.equal(shell.ls('tmp/tree3').length, 0); - -// removal of a sub-tree containing read-only and hidden files - rm('dir') -shell.mkdir('-p', 'tmp/tree4'); -shell.mkdir('-p', 'tmp/tree4/subtree'); -shell.mkdir('-p', 'tmp/tree4/.hidden'); -'asdf'.to('tmp/tree4/subtree/file'); -'asdf'.to('tmp/tree4/.hidden/file'); -'asdf'.to('tmp/tree4/file'); -fs.chmodSync('tmp/tree4/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree4/subtree/file', '0444'); // -r--r--r-- -fs.chmodSync('tmp/tree4/.hidden/file', '0444'); // -r--r--r-- -shell.rm('-rf', 'tmp/tree4'); // erase dir contents -assert.equal(fs.existsSync('tmp/tree4'), false); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/sed.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/sed.js deleted file mode 100644 index d3d66b1..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/sed.js +++ /dev/null @@ -1,58 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.sed(); -assert.ok(shell.error()); - -shell.sed(/asdf/g); // too few args -assert.ok(shell.error()); - -shell.sed(/asdf/g, 'nada'); // too few args -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -shell.sed(/asdf/g, 'nada', '/asdfasdf'); // no such file -assert.ok(shell.error()); - -// -// Valids -// - -shell.cp('-f', 'resources/file1', 'tmp/file1'); -var result = shell.sed('test1', 'hello', 'tmp/file1'); // search string -assert.equal(shell.error(), null); -assert.equal(result, 'hello'); - -var result = shell.sed(/test1/, 'hello', 'tmp/file1'); // search regex -assert.equal(shell.error(), null); -assert.equal(result, 'hello'); - -var result = shell.sed(/test1/, 1234, 'tmp/file1'); // numeric replacement -assert.equal(shell.error(), null); -assert.equal(result, '1234'); - -var result = shell.sed('-i', /test1/, 'hello', 'tmp/file1'); -assert.equal(shell.error(), null); -assert.equal(result, 'hello'); -assert.equal(shell.cat('tmp/file1'), 'hello'); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/tempdir.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/tempdir.js deleted file mode 100644 index 704ca56..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/tempdir.js +++ /dev/null @@ -1,27 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Valids -// - -var tmp = shell.tempdir(); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync(tmp), true); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/test.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/test.js deleted file mode 100644 index a824edb..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/test.js +++ /dev/null @@ -1,91 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -var result = shell.test(); // no expression given -assert.ok(shell.error()); - -var result = shell.test('asdf'); // bad expression -assert.ok(shell.error()); - -var result = shell.test('f', 'resources/file1'); // bad expression -assert.ok(shell.error()); - -var result = shell.test('-f'); // no file -assert.ok(shell.error()); - -// -// Valids -// - -//exists -var result = shell.test('-e', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, true);//true - -var result = shell.test('-e', 'resources/404'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -//directory -var result = shell.test('-d', 'resources'); -assert.equal(shell.error(), null); -assert.equal(result, true);//true - -var result = shell.test('-f', 'resources'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -var result = shell.test('-L', 'resources'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -//file -var result = shell.test('-d', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -var result = shell.test('-f', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, true);//true - -var result = shell.test('-L', 'resources/file1'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -//link -var result = shell.test('-d', 'resources/link'); -assert.equal(shell.error(), null); -assert.equal(result, false); - -var result = shell.test('-f', 'resources/link'); -assert.equal(shell.error(), null); -assert.equal(result, true);//true - -var result = shell.test('-L', 'resources/link'); -assert.equal(shell.error(), null); -assert.equal(result, true);//true - -var result = shell.test('-L', 'resources/badlink'); -assert.equal(shell.error(), null); -assert.equal(result, true);//true - -var result = shell.test('-L', 'resources/404'); -assert.equal(shell.error(), null); -assert.equal(result, false);//false - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/to.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/to.js deleted file mode 100644 index 2e1253d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/to.js +++ /dev/null @@ -1,39 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -'hello world'.to(); -assert.ok(shell.error()); - -assert.equal(fs.existsSync('/asdfasdf'), false); // sanity check -'hello world'.to('/asdfasdf/file'); -assert.ok(shell.error()); - -// -// Valids -// - -'hello world'.to('tmp/to1'); -var result = shell.cat('tmp/to1'); -assert.equal(shell.error(), null); -assert.equal(result, 'hello world'); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/which.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/which.js deleted file mode 100644 index ac9a04d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/shelljs/test/which.js +++ /dev/null @@ -1,38 +0,0 @@ -var shell = require('..'); - -var assert = require('assert'), - path = require('path'), - fs = require('fs'); - -// Node shims for < v0.7 -fs.existsSync = fs.existsSync || path.existsSync; - -shell.config.silent = true; - -function numLines(str) { - return typeof str === 'string' ? str.match(/\n/g).length : 0; -} - -shell.rm('-rf', 'tmp'); -shell.mkdir('tmp'); - -// -// Invalids -// - -shell.which(); -assert.ok(shell.error()); - -var result = shell.which('asdfasdfasdfasdfasdf'); // what are the odds... -assert.equal(shell.error(), null); -assert.equal(result, null); - -// -// Valids -// - -var result = shell.which('node'); -assert.equal(shell.error(), null); -assert.equal(fs.existsSync(result), true); - -shell.exit(123); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.npmignore b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.npmignore deleted file mode 100644 index 4e5886d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -test/ -Rakefile -docs/ -raw/ diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.travis.yml b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.travis.yml deleted file mode 100644 index 99dc771..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.8 -notifications: - email: false diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CNAME b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CNAME deleted file mode 100644 index a007e65..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CNAME +++ /dev/null @@ -1 +0,0 @@ -underscorejs.org diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CONTRIBUTING.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CONTRIBUTING.md deleted file mode 100644 index de5d562..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/CONTRIBUTING.md +++ /dev/null @@ -1,9 +0,0 @@ -## How to contribute to Underscore.js - -* Before you open a ticket or send a pull request, [search](https://github.com/documentcloud/underscore/issues) for previous discussions about the same feature or issue. Add to the earlier ticket if you find one. - -* Before sending a pull request for a feature, be sure to have [tests](http://underscorejs.org/test/). - -* Use the same coding style as the rest of the [codebase](https://github.com/documentcloud/underscore/blob/master/underscore.js). - -* In your pull request, do not add documentation or re-build the minified `underscore-min.js` file. We'll do those things before cutting a new release. diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/LICENSE b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/LICENSE deleted file mode 100644 index 0d8dbe4..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2013 Jeremy Ashkenas, DocumentCloud - -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/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/README.md b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/README.md deleted file mode 100644 index b1f3e50..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/README.md +++ /dev/null @@ -1,19 +0,0 @@ - __ - /\ \ __ - __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ - /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ - \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ - \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ - \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ - \ \____/ - \/___/ - -Underscore.js is a utility-belt library for JavaScript that provides -support for the usual functional suspects (each, map, reduce, filter...) -without extending any core JavaScript objects. - -For Docs, License, Tests, and pre-packed downloads, see: -http://underscorejs.org - -Many thanks to our contributors: -https://github.com/documentcloud/underscore/contributors diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/favicon.ico b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/favicon.ico deleted file mode 100644 index 03049683875ee7207b4ee62241fc6977956723c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R|w+!H~hqz#zuJz@P!dKp_SNAO?x!16vCj7#y|msTh?T4S~@R7;Yi( a|NnmmMkru{0(Aax^D{300E2>o91H*{%ptM> diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.html b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.html deleted file mode 100644 index 8c5793a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.html +++ /dev/null @@ -1,2467 +0,0 @@ - - - - - - - - - Underscore.js - - - - - - -
- -

- -

- -

- Underscore is a - utility-belt library for JavaScript that provides a lot of the - functional programming support that you would expect in - Prototype.js - (or Ruby), - but without extending any of the built-in JavaScript objects. It's the - tie to go along with jQuery's tux, - and Backbone.js's suspenders. -

- -

- Underscore provides 80-odd functions that support both the usual - functional suspects: map, select, invoke — - as well as more specialized helpers: function binding, javascript - templating, deep equality testing, and so on. It delegates to built-in - functions, if present, so modern browsers will use the - native implementations of forEach, map, reduce, - filter, every, some and indexOf. -

- -

- A complete Test & Benchmark Suite - is included for your perusal. -

- -

- You may also read through the annotated source code. -

- -

- The project is - hosted on GitHub. - You can report bugs and discuss features on the - issues page, - on Freenode in the #documentcloud channel, - or send tweets to @documentcloud. -

- -

- Underscore is an open-source component of DocumentCloud. -

- -

Downloads (Right-click, and use "Save As")

- - - - - - - - - - - - - - - - - -
Development Version (1.4.4)40kb, Uncompressed with Plentiful Comments
Production Version (1.4.4)4kb, Minified and Gzipped
Edge VersionUnreleased, current master, use at your own risk
- -
- -

Collection Functions (Arrays or Objects)

- -

- each_.each(list, iterator, [context]) - Alias: forEach -
- Iterates over a list of elements, yielding each in turn to an iterator - function. The iterator is bound to the context object, if one is - passed. Each invocation of iterator is called with three arguments: - (element, index, list). If list is a JavaScript object, iterator's - arguments will be (value, key, list). Delegates to the native - forEach function if it exists. -

-
-_.each([1, 2, 3], alert);
-=> alerts each number in turn...
-_.each({one : 1, two : 2, three : 3}, alert);
-=> alerts each number value in turn...
- -

- map_.map(list, iterator, [context]) - Alias: collect -
- Produces a new array of values by mapping each value in list - through a transformation function (iterator). If the native map method - exists, it will be used instead. If list is a JavaScript object, - iterator's arguments will be (value, key, list). -

-
-_.map([1, 2, 3], function(num){ return num * 3; });
-=> [3, 6, 9]
-_.map({one : 1, two : 2, three : 3}, function(num, key){ return num * 3; });
-=> [3, 6, 9]
- -

- reduce_.reduce(list, iterator, memo, [context]) - Aliases: inject, foldl -
- Also known as inject and foldl, reduce boils down a - list of values into a single value. Memo is the initial state - of the reduction, and each successive step of it should be returned by - iterator. The iterator is passed four arguments: the memo, - then the value and index (or key) of the iteration, - and finally a reference to the entire list. -

-
-var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
-=> 6
-
- -

- reduceRight_.reduceRight(list, iterator, memo, [context]) - Alias: foldr -
- The right-associative version of reduce. Delegates to the - JavaScript 1.8 version of reduceRight, if it exists. Foldr - is not as useful in JavaScript as it would be in a language with lazy - evaluation. -

-
-var list = [[0, 1], [2, 3], [4, 5]];
-var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
-=> [4, 5, 2, 3, 0, 1]
-
- -

- find_.find(list, iterator, [context]) - Alias: detect -
- Looks through each value in the list, returning the first one that - passes a truth test (iterator). The function returns as - soon as it finds an acceptable element, and doesn't traverse the - entire list. -

-
-var even = _.find([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
-=> 2
-
- -

- filter_.filter(list, iterator, [context]) - Alias: select -
- Looks through each value in the list, returning an array of all - the values that pass a truth test (iterator). Delegates to the - native filter method, if it exists. -

-
-var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
-=> [2, 4, 6]
-
- -

- where_.where(list, properties) -
- Looks through each value in the list, returning an array of all - the values that contain all of the key-value pairs listed in properties. -

-
-_.where(listOfPlays, {author: "Shakespeare", year: 1611});
-=> [{title: "Cymbeline", author: "Shakespeare", year: 1611},
-    {title: "The Tempest", author: "Shakespeare", year: 1611}]
-
- -

- findWhere_.findWhere(list, properties) -
- Looks through the list and returns the first value that matches - all of the key-value pairs listed in properties. -

-
-_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"});
-=> {year: 1918, newsroom: "The New York Times",
-  reason: "For its public service in publishing in full so many official reports,
-  documents and speeches by European statesmen relating to the progress and
-  conduct of the war."}
-
- -

- reject_.reject(list, iterator, [context]) -
- Returns the values in list without the elements that the truth - test (iterator) passes. The opposite of filter. -

-
-var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
-=> [1, 3, 5]
-
- -

- every_.every(list, iterator, [context]) - Alias: all -
- Returns true if all of the values in the list pass the iterator - truth test. Delegates to the native method every, if present. -

-
-_.every([true, 1, null, 'yes'], _.identity);
-=> false
-
- -

- some_.some(list, [iterator], [context]) - Alias: any -
- Returns true if any of the values in the list pass the - iterator truth test. Short-circuits and stops traversing the list - if a true element is found. Delegates to the native method some, - if present. -

-
-_.some([null, 0, 'yes', false]);
-=> true
-
- -

- contains_.contains(list, value) - Alias: include -
- Returns true if the value is present in the list. - Uses indexOf internally, if list is an Array. -

-
-_.contains([1, 2, 3], 3);
-=> true
-
- -

- invoke_.invoke(list, methodName, [*arguments]) -
- Calls the method named by methodName on each value in the list. - Any extra arguments passed to invoke will be forwarded on to the - method invocation. -

-
-_.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
-=> [[1, 5, 7], [1, 2, 3]]
-
- -

- pluck_.pluck(list, propertyName) -
- A convenient version of what is perhaps the most common use-case for - map: extracting a list of property values. -

-
-var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
-_.pluck(stooges, 'name');
-=> ["moe", "larry", "curly"]
-
- -

- max_.max(list, [iterator], [context]) -
- Returns the maximum value in list. If iterator is passed, - it will be used on each value to generate the criterion by which the - value is ranked. -

-
-var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
-_.max(stooges, function(stooge){ return stooge.age; });
-=> {name : 'curly', age : 60};
-
- -

- min_.min(list, [iterator], [context]) -
- Returns the minimum value in list. If iterator is passed, - it will be used on each value to generate the criterion by which the - value is ranked. -

-
-var numbers = [10, 5, 100, 2, 1000];
-_.min(numbers);
-=> 2
-
- -

- sortBy_.sortBy(list, iterator, [context]) -
- Returns a sorted copy of list, ranked in ascending order by the - results of running each value through iterator. Iterator may - also be the string name of the property to sort by (eg. length). -

-
-_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });
-=> [5, 4, 6, 3, 1, 2]
-
- -

- groupBy_.groupBy(list, iterator, [context]) -
- Splits a collection into sets, grouped by the result of running each - value through iterator. If iterator is a string instead of - a function, groups by the property named by iterator on each of - the values. -

-
-_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
-=> {1: [1.3], 2: [2.1, 2.4]}
-
-_.groupBy(['one', 'two', 'three'], 'length');
-=> {3: ["one", "two"], 5: ["three"]}
-
- -

- countBy_.countBy(list, iterator, [context]) -
- Sorts a list into groups and returns a count for the number of objects - in each group. - Similar to groupBy, but instead of returning a list of values, - returns a count for the number of values in that group. -

-
-_.countBy([1, 2, 3, 4, 5], function(num) {
-  return num % 2 == 0 ? 'even' : 'odd';
-});
-=> {odd: 3, even: 2}
-
- -

- shuffle_.shuffle(list) -
- Returns a shuffled copy of the list, using a version of the - Fisher-Yates shuffle. -

-
-_.shuffle([1, 2, 3, 4, 5, 6]);
-=> [4, 1, 6, 3, 5, 2]
-
- -

- toArray_.toArray(list) -
- Converts the list (anything that can be iterated over), into a - real Array. Useful for transmuting the arguments object. -

-
-(function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
-=> [2, 3, 4]
-
- -

- size_.size(list) -
- Return the number of values in the list. -

-
-_.size({one : 1, two : 2, three : 3});
-=> 3
-
- -

Array Functions

- -

- - Note: All array functions will also work on the arguments object. - However, Underscore functions are not designed to work on "sparse" arrays. - -

- -

- first_.first(array, [n]) - Alias: head, take -
- Returns the first element of an array. Passing n will - return the first n elements of the array. -

-
-_.first([5, 4, 3, 2, 1]);
-=> 5
-
- -

- initial_.initial(array, [n]) -
- Returns everything but the last entry of the array. Especially useful on - the arguments object. Pass n to exclude the last n elements - from the result. -

-
-_.initial([5, 4, 3, 2, 1]);
-=> [5, 4, 3, 2]
-
- -

- last_.last(array, [n]) -
- Returns the last element of an array. Passing n will return - the last n elements of the array. -

-
-_.last([5, 4, 3, 2, 1]);
-=> 1
-
- -

- rest_.rest(array, [index]) - Alias: tail, drop -
- Returns the rest of the elements in an array. Pass an index - to return the values of the array from that index onward. -

-
-_.rest([5, 4, 3, 2, 1]);
-=> [4, 3, 2, 1]
-
- -

- compact_.compact(array) -
- Returns a copy of the array with all falsy values removed. - In JavaScript, false, null, 0, "", - undefined and NaN are all falsy. -

-
-_.compact([0, 1, false, 2, '', 3]);
-=> [1, 2, 3]
-
- -

- flatten_.flatten(array, [shallow]) -
- Flattens a nested array (the nesting can be to any depth). If you - pass shallow, the array will only be flattened a single level. -

-
-_.flatten([1, [2], [3, [[4]]]]);
-=> [1, 2, 3, 4];
-
-_.flatten([1, [2], [3, [[4]]]], true);
-=> [1, 2, 3, [[4]]];
-
- -

- without_.without(array, [*values]) -
- Returns a copy of the array with all instances of the values - removed. -

-
-_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
-=> [2, 3, 4]
-
- -

- union_.union(*arrays) -
- Computes the union of the passed-in arrays: the list of unique items, - in order, that are present in one or more of the arrays. -

-
-_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
-=> [1, 2, 3, 101, 10]
-
- -

- intersection_.intersection(*arrays) -
- Computes the list of values that are the intersection of all the arrays. - Each value in the result is present in each of the arrays. -

-
-_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
-=> [1, 2]
-
- -

- difference_.difference(array, *others) -
- Similar to without, but returns the values from array that - are not present in the other arrays. -

-
-_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
-=> [1, 3, 4]
-
- -

- uniq_.uniq(array, [isSorted], [iterator]) - Alias: unique -
- Produces a duplicate-free version of the array, using === to test - object equality. If you know in advance that the array is sorted, - passing true for isSorted will run a much faster algorithm. - If you want to compute unique items based on a transformation, pass an - iterator function. -

-
-_.uniq([1, 2, 1, 3, 1, 4]);
-=> [1, 2, 3, 4]
-
- -

- zip_.zip(*arrays) -
- Merges together the values of each of the arrays with the - values at the corresponding position. Useful when you have separate - data sources that are coordinated through matching array indexes. - If you're working with a matrix of nested arrays, zip.apply - can transpose the matrix in a similar fashion. -

-
-_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
-=> [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
-
- -

- object_.object(list, [values]) -
- Converts arrays into objects. Pass either a single list of - [key, value] pairs, or a list of keys, and a list of values. -

-
-_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
-=> {moe: 30, larry: 40, curly: 50}
-
-_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
-=> {moe: 30, larry: 40, curly: 50}
-
- -

- indexOf_.indexOf(array, value, [isSorted]) -
- Returns the index at which value can be found in the array, - or -1 if value is not present in the array. Uses the native - indexOf function unless it's missing. If you're working with a - large array, and you know that the array is already sorted, pass true - for isSorted to use a faster binary search ... or, pass a number as - the third argument in order to look for the first matching value in the - array after the given index. -

-
-_.indexOf([1, 2, 3], 2);
-=> 1
-
- -

- lastIndexOf_.lastIndexOf(array, value, [fromIndex]) -
- Returns the index of the last occurrence of value in the array, - or -1 if value is not present. Uses the native lastIndexOf - function if possible. Pass fromIndex to start your search at a - given index. -

-
-_.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
-=> 4
-
- -

- sortedIndex_.sortedIndex(list, value, [iterator], [context]) -
- Uses a binary search to determine the index at which the value - should be inserted into the list in order to maintain the list's - sorted order. If an iterator is passed, it will be used to compute - the sort ranking of each value, including the value you pass. -

-
-_.sortedIndex([10, 20, 30, 40, 50], 35);
-=> 3
-
- -

- range_.range([start], stop, [step]) -
- A function to create flexibly-numbered lists of integers, handy for - each and map loops. start, if omitted, defaults - to 0; step defaults to 1. Returns a list of integers - from start to stop, incremented (or decremented) by step, - exclusive. -

-
-_.range(10);
-=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
-_.range(1, 11);
-=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
-_.range(0, 30, 5);
-=> [0, 5, 10, 15, 20, 25]
-_.range(0, -10, -1);
-=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
-_.range(0);
-=> []
-
- -

Function (uh, ahem) Functions

- -

- bind_.bind(function, object, [*arguments]) -
- Bind a function to an object, meaning that whenever - the function is called, the value of this will be the object. - Optionally, pass arguments to the function to pre-fill them, - also known as partial application. -

-
-var func = function(greeting){ return greeting + ': ' + this.name };
-func = _.bind(func, {name : 'moe'}, 'hi');
-func();
-=> 'hi: moe'
-
- -

- bindAll_.bindAll(object, [*methodNames]) -
- Binds a number of methods on the object, specified by - methodNames, to be run in the context of that object whenever they - are invoked. Very handy for binding functions that are going to be used - as event handlers, which would otherwise be invoked with a fairly useless - this. If no methodNames are provided, all of the object's - function properties will be bound to it. -

-
-var buttonView = {
-  label   : 'underscore',
-  onClick : function(){ alert('clicked: ' + this.label); },
-  onHover : function(){ console.log('hovering: ' + this.label); }
-};
-_.bindAll(buttonView);
-jQuery('#underscore_button').bind('click', buttonView.onClick);
-=> When the button is clicked, this.label will have the correct value...
-
- -

- partial_.partial(function, [*arguments]) -
- Partially apply a function by filling in any number of its arguments, - without changing its dynamic this value. A close cousin - of bind. -

-
-var add = function(a, b) { return a + b; };
-add5 = _.partial(add, 5);
-add5(10);
-=> 15
-
- -

- memoize_.memoize(function, [hashFunction]) -
- Memoizes a given function by caching the computed result. Useful - for speeding up slow-running computations. If passed an optional - hashFunction, it will be used to compute the hash key for storing - the result, based on the arguments to the original function. The default - hashFunction just uses the first argument to the memoized function - as the key. -

-
-var fibonacci = _.memoize(function(n) {
-  return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
-});
-
- -

- delay_.delay(function, wait, [*arguments]) -
- Much like setTimeout, invokes function after wait - milliseconds. If you pass the optional arguments, they will be - forwarded on to the function when it is invoked. -

-
-var log = _.bind(console.log, console);
-_.delay(log, 1000, 'logged later');
-=> 'logged later' // Appears after one second.
-
- -

- defer_.defer(function, [*arguments]) -
- Defers invoking the function until the current call stack has cleared, - similar to using setTimeout with a delay of 0. Useful for performing - expensive computations or HTML rendering in chunks without blocking the UI thread - from updating. If you pass the optional arguments, they will be - forwarded on to the function when it is invoked. -

-
-_.defer(function(){ alert('deferred'); });
-// Returns from the function before the alert runs.
-
- -

- throttle_.throttle(function, wait) -
- Creates and returns a new, throttled version of the passed function, - that, when invoked repeatedly, will only actually call the original function - at most once per every wait - milliseconds. Useful for rate-limiting events that occur faster than you - can keep up with. -

-
-var throttled = _.throttle(updatePosition, 100);
-$(window).scroll(throttled);
-
- -

- debounce_.debounce(function, wait, [immediate]) -
- Creates and returns a new debounced version of the passed function that - will postpone its execution until after - wait milliseconds have elapsed since the last time it - was invoked. Useful for implementing behavior that should only happen - after the input has stopped arriving. For example: rendering a - preview of a Markdown comment, recalculating a layout after the window - has stopped being resized, and so on. -

- -

- Pass true for the immediate parameter to cause - debounce to trigger the function on the leading instead of the - trailing edge of the wait interval. Useful in circumstances like - preventing accidental double-clicks on a "submit" button from firing a - second time. -

- -
-var lazyLayout = _.debounce(calculateLayout, 300);
-$(window).resize(lazyLayout);
-
- -

- once_.once(function) -
- Creates a version of the function that can only be called one time. - Repeated calls to the modified function will have no effect, returning - the value from the original call. Useful for initialization functions, - instead of having to set a boolean flag and then check it later. -

-
-var initialize = _.once(createApplication);
-initialize();
-initialize();
-// Application is only created once.
-
- -

- after_.after(count, function) -
- Creates a version of the function that will only be run after first - being called count times. Useful for grouping asynchronous responses, - where you want to be sure that all the async calls have finished, before - proceeding. -

-
-var renderNotes = _.after(notes.length, render);
-_.each(notes, function(note) {
-  note.asyncSave({success: renderNotes});
-});
-// renderNotes is run once, after all notes have saved.
-
- -

- wrap_.wrap(function, wrapper) -
- Wraps the first function inside of the wrapper function, - passing it as the first argument. This allows the wrapper to - execute code before and after the function runs, adjust the arguments, - and execute it conditionally. -

-
-var hello = function(name) { return "hello: " + name; };
-hello = _.wrap(hello, function(func) {
-  return "before, " + func("moe") + ", after";
-});
-hello();
-=> 'before, hello: moe, after'
-
- -

- compose_.compose(*functions) -
- Returns the composition of a list of functions, where each function - consumes the return value of the function that follows. In math terms, - composing the functions f(), g(), and h() produces - f(g(h())). -

-
-var greet    = function(name){ return "hi: " + name; };
-var exclaim  = function(statement){ return statement + "!"; };
-var welcome = _.compose(exclaim, greet);
-welcome('moe');
-=> 'hi: moe!'
-
- -

Object Functions

- -

- keys_.keys(object) -
- Retrieve all the names of the object's properties. -

-
-_.keys({one : 1, two : 2, three : 3});
-=> ["one", "two", "three"]
-
- -

- values_.values(object) -
- Return all of the values of the object's properties. -

-
-_.values({one : 1, two : 2, three : 3});
-=> [1, 2, 3]
-
- -

- pairs_.pairs(object) -
- Convert an object into a list of [key, value] pairs. -

-
-_.pairs({one: 1, two: 2, three: 3});
-=> [["one", 1], ["two", 2], ["three", 3]]
-
- -

- invert_.invert(object) -
- Returns a copy of the object where the keys have become the values - and the values the keys. For this to work, all of your object's values - should be unique and string serializable. -

-
-_.invert({Moe: "Moses", Larry: "Louis", Curly: "Jerome"});
-=> {Moses: "Moe", Louis: "Larry", Jerome: "Curly"};
-
- -

- functions_.functions(object) - Alias: methods -
- Returns a sorted list of the names of every method in an object — - that is to say, the name of every function property of the object. -

-
-_.functions(_);
-=> ["all", "any", "bind", "bindAll", "clone", "compact", "compose" ...
-
- -

- extend_.extend(destination, *sources) -
- Copy all of the properties in the source objects over to the - destination object, and return the destination object. - It's in-order, so the last source will override properties of the same - name in previous arguments. -

-
-_.extend({name : 'moe'}, {age : 50});
-=> {name : 'moe', age : 50}
-
- -

- pick_.pick(object, *keys) -
- Return a copy of the object, filtered to only have values for - the whitelisted keys (or array of valid keys). -

-
-_.pick({name : 'moe', age: 50, userid : 'moe1'}, 'name', 'age');
-=> {name : 'moe', age : 50}
-
- -

- omit_.omit(object, *keys) -
- Return a copy of the object, filtered to omit the blacklisted - keys (or array of keys). -

-
-_.omit({name : 'moe', age : 50, userid : 'moe1'}, 'userid');
-=> {name : 'moe', age : 50}
-
- -

- defaults_.defaults(object, *defaults) -
- Fill in null and undefined properties in object with values from the - defaults objects, and return the object. As soon as the - property is filled, further defaults will have no effect. -

-
-var iceCream = {flavor : "chocolate"};
-_.defaults(iceCream, {flavor : "vanilla", sprinkles : "lots"});
-=> {flavor : "chocolate", sprinkles : "lots"}
-
- -

- clone_.clone(object) -
- Create a shallow-copied clone of the object. Any nested objects - or arrays will be copied by reference, not duplicated. -

-
-_.clone({name : 'moe'});
-=> {name : 'moe'};
-
- -

- tap_.tap(object, interceptor) -
- Invokes interceptor with the object, and then returns object. - The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain. -

-
-_.chain([1,2,3,200])
-  .filter(function(num) { return num % 2 == 0; })
-  .tap(alert)
-  .map(function(num) { return num * num })
-  .value();
-=> // [2, 200] (alerted)
-=> [4, 40000]
-
- -

- has_.has(object, key) -
- Does the object contain the given key? Identical to - object.hasOwnProperty(key), but uses a safe reference to the - hasOwnProperty function, in case it's been - overridden accidentally. -

-
-_.has({a: 1, b: 2, c: 3}, "b");
-=> true
-
- -

- isEqual_.isEqual(object, other) -
- Performs an optimized deep comparison between the two objects, to determine - if they should be considered equal. -

-
-var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
-var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
-moe == clone;
-=> false
-_.isEqual(moe, clone);
-=> true
-
- -

- isEmpty_.isEmpty(object) -
- Returns true if object contains no values. -

-
-_.isEmpty([1, 2, 3]);
-=> false
-_.isEmpty({});
-=> true
-
- -

- isElement_.isElement(object) -
- Returns true if object is a DOM element. -

-
-_.isElement(jQuery('body')[0]);
-=> true
-
- -

- isArray_.isArray(object) -
- Returns true if object is an Array. -

-
-(function(){ return _.isArray(arguments); })();
-=> false
-_.isArray([1,2,3]);
-=> true
-
- -

- isObject_.isObject(value) -
- Returns true if value is an Object. Note that JavaScript - arrays and functions are objects, while (normal) strings and numbers are not. -

-
-_.isObject({});
-=> true
-_.isObject(1);
-=> false
-
- -

- isArguments_.isArguments(object) -
- Returns true if object is an Arguments object. -

-
-(function(){ return _.isArguments(arguments); })(1, 2, 3);
-=> true
-_.isArguments([1,2,3]);
-=> false
-
- -

- isFunction_.isFunction(object) -
- Returns true if object is a Function. -

-
-_.isFunction(alert);
-=> true
-
- -

- isString_.isString(object) -
- Returns true if object is a String. -

-
-_.isString("moe");
-=> true
-
- -

- isNumber_.isNumber(object) -
- Returns true if object is a Number (including NaN). -

-
-_.isNumber(8.4 * 5);
-=> true
-
- -

- isFinite_.isFinite(object) -
- Returns true if object is a finite Number. -

-
-_.isFinite(-101);
-=> true
-
-_.isFinite(-Infinity);
-=> false
-
- -

- isBoolean_.isBoolean(object) -
- Returns true if object is either true or false. -

-
-_.isBoolean(null);
-=> false
-
- -

- isDate_.isDate(object) -
- Returns true if object is a Date. -

-
-_.isDate(new Date());
-=> true
-
- -

- isRegExp_.isRegExp(object) -
- Returns true if object is a RegExp. -

-
-_.isRegExp(/moe/);
-=> true
-
- -

- isNaN_.isNaN(object) -
- Returns true if object is NaN.
Note: this is not - the same as the native isNaN function, which will also return - true if the variable is undefined. -

-
-_.isNaN(NaN);
-=> true
-isNaN(undefined);
-=> true
-_.isNaN(undefined);
-=> false
-
- -

- isNull_.isNull(object) -
- Returns true if the value of object is null. -

-
-_.isNull(null);
-=> true
-_.isNull(undefined);
-=> false
-
- -

- isUndefined_.isUndefined(value) -
- Returns true if value is undefined. -

-
-_.isUndefined(window.missingVariable);
-=> true
-
- -

Utility Functions

- -

- noConflict_.noConflict() -
- Give control of the "_" variable back to its previous owner. Returns - a reference to the Underscore object. -

-
-var underscore = _.noConflict();
- -

- identity_.identity(value) -
- Returns the same value that is used as the argument. In math: - f(x) = x
- This function looks useless, but is used throughout Underscore as - a default iterator. -

-
-var moe = {name : 'moe'};
-moe === _.identity(moe);
-=> true
- -

- times_.times(n, iterator, [context]) -
- Invokes the given iterator function n times. Each invocation of - iterator is called with an index argument. -
- Note: this example uses the chaining syntax. -

-
-_(3).times(function(n){ genie.grantWishNumber(n); });
- -

- random_.random(min, max) -
- Returns a random integer between min and max, inclusive. - If you only pass one argument, it will return a number between 0 - and that number. -

-
-_.random(0, 100);
-=> 42
- -

- mixin_.mixin(object) -
- Allows you to extend Underscore with your own utility functions. Pass - a hash of {name: function} definitions to have your functions - added to the Underscore object, as well as the OOP wrapper. -

-
-_.mixin({
-  capitalize : function(string) {
-    return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
-  }
-});
-_("fabio").capitalize();
-=> "Fabio"
-
- -

- uniqueId_.uniqueId([prefix]) -
- Generate a globally-unique id for client-side models or DOM elements - that need one. If prefix is passed, the id will be appended to it. -

-
-_.uniqueId('contact_');
-=> 'contact_104'
- -

- escape_.escape(string) -
- Escapes a string for insertion into HTML, replacing - &, <, >, ", ', and / characters. -

-
-_.escape('Curly, Larry & Moe');
-=> "Curly, Larry &amp; Moe"
- -

- unescape_.unescape(string) -
- The opposite of escape, replaces - &amp;, &lt;, &gt;, - &quot;, &#x27;, and &#x2F; - with their unescaped counterparts. -

-
-_.unescape('Curly, Larry &amp; Moe');
-=> "Curly, Larry & Moe"
- -

- result_.result(object, property) -
- If the value of the named property is a function then invoke it; otherwise, return it. -

-
-var object = {cheese: 'crumpets', stuff: function(){ return 'nonsense'; }};
-_.result(object, 'cheese');
-=> "crumpets"
-_.result(object, 'stuff');
-=> "nonsense"
- -

- template_.template(templateString, [data], [settings]) -
- Compiles JavaScript templates into functions that can be evaluated - for rendering. Useful for rendering complicated bits of HTML from JSON - data sources. Template functions can both interpolate variables, using - <%= … %>, as well as execute arbitrary JavaScript code, with - <% … %>. If you wish to interpolate a value, and have - it be HTML-escaped, use <%- … %> When you evaluate a template function, pass in a - data object that has properties corresponding to the template's free - variables. If you're writing a one-off, you can pass the data - object as the second parameter to template in order to render - immediately instead of returning a template function. The settings argument - should be a hash containing any _.templateSettings that should be overridden. -

- -
-var compiled = _.template("hello: <%= name %>");
-compiled({name : 'moe'});
-=> "hello: moe"
-
-var list = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>";
-_.template(list, {people : ['moe', 'curly', 'larry']});
-=> "<li>moe</li><li>curly</li><li>larry</li>"
-
-var template = _.template("<b><%- value %></b>");
-template({value : '<script>'});
-=> "<b>&lt;script&gt;</b>"
- -

- You can also use print from within JavaScript code. This is - sometimes more convenient than using <%= ... %>. -

- -
-var compiled = _.template("<% print('Hello ' + epithet); %>");
-compiled({epithet: "stooge"});
-=> "Hello stooge."
- -

- If ERB-style delimiters aren't your cup of tea, you can change Underscore's - template settings to use different symbols to set off interpolated code. - Define an interpolate regex to match expressions that should be - interpolated verbatim, an escape regex to match expressions that should - be inserted after being HTML escaped, and an evaluate regex to match - expressions that should be evaluated without insertion into the resulting - string. You may define or omit any combination of the three. - For example, to perform - Mustache.js - style templating: -

- -
-_.templateSettings = {
-  interpolate : /\{\{(.+?)\}\}/g
-};
-
-var template = _.template("Hello {{ name }}!");
-template({name : "Mustache"});
-=> "Hello Mustache!"
- -

- By default, template places the values from your data in the local scope - via the with statement. However, you can specify a single variable name - with the variable setting. This can significantly improve the speed - at which a template is able to render. -

- -
-_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
-=> "Using 'with': no"
- -

- Precompiling your templates can be a big help when debugging errors you can't - reproduce. This is because precompiled templates can provide line numbers and - a stack trace, something that is not possible when compiling templates on the client. - The source property is available on the compiled template - function for easy precompilation. -

- -
<script>
-  JST.project = <%= _.template(jstText).source %>;
-</script>
- - -

Chaining

- -

- You can use Underscore in either an object-oriented or a functional style, - depending on your preference. The following two lines of code are - identical ways to double a list of numbers. -

- -
-_.map([1, 2, 3], function(n){ return n * 2; });
-_([1, 2, 3]).map(function(n){ return n * 2; });
- -

- Calling chain will cause all future method calls to return - wrapped objects. When you've finished the computation, use - value to retrieve the final value. Here's an example of chaining - together a map/flatten/reduce, in order to get the word count of - every word in a song. -

- -
-var lyrics = [
-  {line : 1, words : "I'm a lumberjack and I'm okay"},
-  {line : 2, words : "I sleep all night and I work all day"},
-  {line : 3, words : "He's a lumberjack and he's okay"},
-  {line : 4, words : "He sleeps all night and he works all day"}
-];
-
-_.chain(lyrics)
-  .map(function(line) { return line.words.split(' '); })
-  .flatten()
-  .reduce(function(counts, word) {
-    counts[word] = (counts[word] || 0) + 1;
-    return counts;
-  }, {})
-  .value();
-
-=> {lumberjack : 2, all : 4, night : 2 ... }
- -

- In addition, the - Array prototype's methods - are proxied through the chained Underscore object, so you can slip a - reverse or a push into your chain, and continue to - modify the array. -

- -

- chain_.chain(obj) -
- Returns a wrapped object. Calling methods on this object will continue - to return wrapped objects until value is used. -

-
-var stooges = [{name : 'curly', age : 25}, {name : 'moe', age : 21}, {name : 'larry', age : 23}];
-var youngest = _.chain(stooges)
-  .sortBy(function(stooge){ return stooge.age; })
-  .map(function(stooge){ return stooge.name + ' is ' + stooge.age; })
-  .first()
-  .value();
-=> "moe is 21"
-
- -

- value_(obj).value() -
- Extracts the value of a wrapped object. -

-
-_([1, 2, 3]).value();
-=> [1, 2, 3]
-
- - - -

- The Underscore documentation is also available in - Simplified Chinese. -

- -

- Underscore.lua, - a Lua port of the functions that are applicable in both languages. - Includes OOP-wrapping and chaining. - (source) -

- -

- Underscore.m, an Objective-C port - of many of the Underscore.js functions, using a syntax that encourages - chaining. - (source) -

- -

- _.m, an alternative - Objective-C port that tries to stick a little closer to the original - Underscore.js API. - (source) -

- -

- Underscore.php, - a PHP port of the functions that are applicable in both languages. - Includes OOP-wrapping and chaining. - (source) -

- -

- Underscore-perl, - a Perl port of many of the Underscore.js functions, - aimed at on Perl hashes and arrays. - (source) -

- -

- Underscore.cfc, - a Coldfusion port of many of the Underscore.js functions. - (source) -

- -

- Underscore.string, - an Underscore extension that adds functions for string-manipulation: - trim, startsWith, contains, capitalize, - reverse, sprintf, and more. -

- -

- Ruby's Enumerable module. -

- -

- Prototype.js, which provides - JavaScript with collection functions in the manner closest to Ruby's Enumerable. -

- -

- Oliver Steele's - Functional JavaScript, - which includes comprehensive higher-order function support as well as string lambdas. -

- -

- Michael Aufreiter's Data.js, - a data manipulation + persistence library for JavaScript. -

- -

- Python's itertools. -

- -

Change Log

- -

- 1.4.4Jan. 30, 2013Diff
-

    -
  • - Added _.findWhere, for finding the first element in a list - that matches a particular set of keys and values. -
  • -
  • - Added _.partial, for partially applying a function without - changing its dynamic reference to this. -
  • -
  • - Simplified bind by removing some edge cases involving - constructor functions. In short: don't _.bind your - constructors. -
  • -
  • - A minor optimization to invoke. -
  • -
  • - Fix bug in the minified version due to the minifier incorrectly - optimizing-away isFunction. -
  • -
-

- -

- 1.4.3Dec. 4, 2012Diff
-

    -
  • - Improved Underscore compatibility with Adobe's JS engine that can be - used to script Illustrator, Photoshop, and friends. -
  • -
  • - Added a default _.identity iterator to countBy and - groupBy. -
  • -
  • - The uniq function can now take array, iterator, context - as the argument list. -
  • -
  • - The times function now returns the mapped array of iterator - results. -
  • -
  • - Simplified and fixed bugs in throttle. -
  • -
-

- -

- 1.4.2Oct. 1, 2012Diff
-

    -
  • - For backwards compatibility, returned to pre-1.4.0 behavior when - passing null to iteration functions. They now become no-ops - again. -
  • -
-

- -

- 1.4.1Oct. 1, 2012Diff
-

    -
  • - Fixed a 1.4.0 regression in the lastIndexOf function. -
  • -
-

- -

- 1.4.0Sept. 27, 2012Diff
-

    -
  • - Added a pairs function, for turning a JavaScript object - into [key, value] pairs ... as well as an object - function, for converting an array of [key, value] pairs - into an object. -
  • -
  • - Added a countBy function, for counting the number of objects - in a list that match a certain criteria. -
  • -
  • - Added an invert function, for performing a simple inversion - of the keys and values in an object. -
  • -
  • - Added a where function, for easy cases of filtering a list - for objects with specific values. -
  • -
  • - Added an omit function, for filtering an object to remove - certain keys. -
  • -
  • - Added a random function, to return a random number in a - given range. -
  • -
  • - _.debounce'd functions now return their last updated value, - just like _.throttle'd functions do. -
  • -
  • - The sortBy function now runs a stable sort algorithm. -
  • -
  • - Added the optional fromIndex option to indexOf and - lastIndexOf. -
  • -
  • - "Sparse" arrays are no longer supported in Underscore iteration - functions. Use a for loop instead (or better yet, an object). -
  • -
  • - The min and max functions may now be called on - very large arrays. -
  • -
  • - Interpolation in templates now represents null and - undefined as the empty string. -
  • -
  • - Underscore iteration functions no longer accept null values - as a no-op argument. You'll get an early error instead. -
  • -
  • - A number of edge-cases fixes and tweaks, which you can spot in the - diff. - Depending on how you're using Underscore, 1.4.0 may be more - backwards-incompatible than usual — please test when you upgrade. -
  • -
-

- -

- 1.3.3April 10, 2012
-

    -
  • - Many improvements to _.template, which now provides the - source of the template function as a property, for potentially - even more efficient pre-compilation on the server-side. You may now - also set the variable option when creating a template, - which will cause your passed-in data to be made available under the - variable you named, instead of using a with statement — - significantly improving the speed of rendering the template. -
  • -
  • - Added the pick function, which allows you to filter an - object literal with a whitelist of allowed property names. -
  • -
  • - Added the result function, for convenience when working - with APIs that allow either functions or raw properties. -
  • -
  • - Added the isFinite function, because sometimes knowing that - a value is a number just ain't quite enough. -
  • -
  • - The sortBy function may now also be passed the string name - of a property to use as the sort order on each object. -
  • -
  • - Fixed uniq to work with sparse arrays. -
  • -
  • - The difference function now performs a shallow flatten - instead of a deep one when computing array differences. -
  • -
  • - The debounce function now takes an immediate - parameter, which will cause the callback to fire on the leading - instead of the trailing edge. -
  • -
-

- -

- 1.3.1Jan. 23, 2012
-

    -
  • - Added an _.has function, as a safer way to use hasOwnProperty. -
  • -
  • - Added _.collect as an alias for _.map. Smalltalkers, rejoice. -
  • -
  • - Reverted an old change so that _.extend will correctly copy - over keys with undefined values again. -
  • -
  • - Bugfix to stop escaping slashes within interpolations in _.template. -
  • -
-

- -

- 1.3.0Jan. 11, 2012
-

    -
  • - Removed AMD (RequireJS) support from Underscore. If you'd like to use - Underscore with RequireJS, you can load it as a normal script, wrap - or patch your copy, or download a forked version. -
  • -
-

- -

- 1.2.4Jan. 4, 2012
-

    -
  • - You now can (and probably should, as it's simpler) - write _.chain(list) - instead of _(list).chain(). -
  • -
  • - Fix for escaped characters in Underscore templates, and for supporting - customizations of _.templateSettings that only define one or - two of the required regexes. -
  • -
  • - Fix for passing an array as the first argument to an _.wrap'd function. -
  • -
  • - Improved compatibility with ClojureScript, which adds a call - function to String.prototype. -
  • -
-

- -

- 1.2.3Dec. 7, 2011
-

    -
  • - Dynamic scope is now preserved for compiled _.template functions, - so you can use the value of this if you like. -
  • -
  • - Sparse array support of _.indexOf, _.lastIndexOf. -
  • -
  • - Both _.reduce and _.reduceRight can now be passed an - explicitly undefined value. (There's no reason why you'd - want to do this.) -
  • -
-

- -

- 1.2.2Nov. 14, 2011
-

    -
  • - Continued tweaks to _.isEqual semantics. Now JS primitives are - considered equivalent to their wrapped versions, and arrays are compared - by their numeric properties only (#351). -
  • -
  • - _.escape no longer tries to be smart about not double-escaping - already-escaped HTML entities. Now it just escapes regardless (#350). -
  • -
  • - In _.template, you may now leave semicolons out of evaluated - statements if you wish: <% }) %> (#369). -
  • -
  • - _.after(callback, 0) will now trigger the callback immediately, - making "after" easier to use with asynchronous APIs (#366). -
  • -
-

- -

- 1.2.1Oct. 24, 2011
-

    -
  • - Several important bug fixes for _.isEqual, which should now - do better on mutated Arrays, and on non-Array objects with - length properties. (#329) -
  • -
  • - jrburke contributed Underscore exporting for AMD module loaders, - and tonylukasavage for Appcelerator Titanium. - (#335, #338) -
  • -
  • - You can now _.groupBy(list, 'property') as a shortcut for - grouping values by a particular common property. -
  • -
  • - _.throttle'd functions now fire immediately upon invocation, - and are rate-limited thereafter (#170, #266). -
  • -
  • - Most of the _.is[Type] checks no longer ducktype. -
  • -
  • - The _.bind function now also works on constructors, a-la - ES5 ... but you would never want to use _.bind on a - constructor function. -
  • -
  • - _.clone no longer wraps non-object types in Objects. -
  • -
  • - _.find and _.filter are now the preferred names for - _.detect and _.select. -
  • -
-

- -

- 1.2.0Oct. 5, 2011
-

    -
  • - The _.isEqual function now - supports true deep equality comparisons, with checks for cyclic structures, - thanks to Kit Cambridge. -
  • -
  • - Underscore templates now support HTML escaping interpolations, using - <%- ... %> syntax. -
  • -
  • - Ryan Tenney contributed _.shuffle, which uses a modified - Fisher-Yates to give you a shuffled copy of an array. -
  • -
  • - _.uniq can now be passed an optional iterator, to determine by - what criteria an object should be considered unique. -
  • -
  • - _.last now takes an optional argument which will return the last - N elements of the list. -
  • -
  • - A new _.initial function was added, as a mirror of _.rest, - which returns all the initial values of a list (except the last N). -
  • -
-

- -

- 1.1.7July 13, 2011
- Added _.groupBy, which aggregates a collection into groups of like items. - Added _.union and _.difference, to complement the - (re-named) _.intersection. - Various improvements for support of sparse arrays. - _.toArray now returns a clone, if directly passed an array. - _.functions now also returns the names of functions that are present - in the prototype chain. -

- -

- 1.1.6April 18, 2011
- Added _.after, which will return a function that only runs after - first being called a specified number of times. - _.invoke can now take a direct function reference. - _.every now requires an iterator function to be passed, which - mirrors the ECMA5 API. - _.extend no longer copies keys when the value is undefined. - _.bind now errors when trying to bind an undefined value. -

- -

- 1.1.5Mar 20, 2011
- Added an _.defaults function, for use merging together JS objects - representing default options. - Added an _.once function, for manufacturing functions that should - only ever execute a single time. - _.bind now delegates to the native ECMAScript 5 version, - where available. - _.keys now throws an error when used on non-Object values, as in - ECMAScript 5. - Fixed a bug with _.keys when used over sparse arrays. -

- -

- 1.1.4Jan 9, 2011
- Improved compliance with ES5's Array methods when passing null - as a value. _.wrap now correctly sets this for the - wrapped function. _.indexOf now takes an optional flag for - finding the insertion index in an array that is guaranteed to already - be sorted. Avoiding the use of .callee, to allow _.isArray - to work properly in ES5's strict mode. -

- -

- 1.1.3Dec 1, 2010
- In CommonJS, Underscore may now be required with just:
- var _ = require("underscore"). - Added _.throttle and _.debounce functions. - Removed _.breakLoop, in favor of an ECMA5-style un-break-able - each implementation — this removes the try/catch, and you'll now have - better stack traces for exceptions that are thrown within an Underscore iterator. - Improved the isType family of functions for better interoperability - with Internet Explorer host objects. - _.template now correctly escapes backslashes in templates. - Improved _.reduce compatibility with the ECMA5 version: - if you don't pass an initial value, the first item in the collection is used. - _.each no longer returns the iterated collection, for improved - consistency with ES5's forEach. -

- -

- 1.1.2
- Fixed _.contains, which was mistakenly pointing at - _.intersect instead of _.include, like it should - have been. Added _.unique as an alias for _.uniq. -

- -

- 1.1.1
- Improved the speed of _.template, and its handling of multiline - interpolations. Ryan Tenney contributed optimizations to many Underscore - functions. An annotated version of the source code is now available. -

- -

- 1.1.0
- The method signature of _.reduce has been changed to match - the ECMAScript 5 signature, instead of the Ruby/Prototype.js version. - This is a backwards-incompatible change. _.template may now be - called with no arguments, and preserves whitespace. _.contains - is a new alias for _.include. -

- -

- 1.0.4
- Andri Möll contributed the _.memoize - function, which can be used to speed up expensive repeated computations - by caching the results. -

- -

- 1.0.3
- Patch that makes _.isEqual return false if any property - of the compared object has a NaN value. Technically the correct - thing to do, but of questionable semantics. Watch out for NaN comparisons. -

- -

- 1.0.2
- Fixes _.isArguments in recent versions of Opera, which have - arguments objects as real Arrays. -

- -

- 1.0.1
- Bugfix for _.isEqual, when comparing two objects with the same - number of undefined keys, but with different names. -

- -

- 1.0.0
- Things have been stable for many months now, so Underscore is now - considered to be out of beta, at 1.0. Improvements since 0.6 - include _.isBoolean, and the ability to have _.extend - take multiple source objects. -

- -

- 0.6.0
- Major release. Incorporates a number of - Mile Frawley's refactors for - safer duck-typing on collection functions, and cleaner internals. A new - _.mixin method that allows you to extend Underscore with utility - functions of your own. Added _.times, which works the same as in - Ruby or Prototype.js. Native support for ECMAScript 5's Array.isArray, - and Object.keys. -

- -

- 0.5.8
- Fixed Underscore's collection functions to work on - NodeLists and - HTMLCollections - once more, thanks to - Justin Tulloss. -

- -

- 0.5.7
- A safer implementation of _.isArguments, and a - faster _.isNumber,
thanks to - Jed Schmidt. -

- -

- 0.5.6
- Customizable delimiters for _.template, contributed by - Noah Sloan. -

- -

- 0.5.5
- Fix for a bug in MobileSafari's OOP-wrapper, with the arguments object. -

- -

- 0.5.4
- Fix for multiple single quotes within a template string for - _.template. See: - Rick Strahl's blog post. -

- -

- 0.5.2
- New implementations of isArray, isDate, isFunction, - isNumber, isRegExp, and isString, thanks to - a suggestion from - Robert Kieffer. - Instead of doing Object#toString - comparisons, they now check for expected properties, which is less safe, - but more than an order of magnitude faster. Most other Underscore - functions saw minor speed improvements as a result. - Evgeniy Dolzhenko - contributed _.tap, - similar to Ruby 1.9's, - which is handy for injecting side effects (like logging) into chained calls. -

- -

- 0.5.1
- Added an _.isArguments function. Lots of little safety checks - and optimizations contributed by - Noah Sloan and - Andri Möll. -

- -

- 0.5.0
- [API Changes] _.bindAll now takes the context object as - its first parameter. If no method names are passed, all of the context - object's methods are bound to it, enabling chaining and easier binding. - _.functions now takes a single argument and returns the names - of its Function properties. Calling _.functions(_) will get you - the previous behavior. - Added _.isRegExp so that isEqual can now test for RegExp equality. - All of the "is" functions have been shrunk down into a single definition. - Karl Guertin contributed patches. -

- -

- 0.4.7
- Added isDate, isNaN, and isNull, for completeness. - Optimizations for isEqual when checking equality between Arrays - or Dates. _.keys is now 25%–2X faster (depending on your - browser) which speeds up the functions that rely on it, such as _.each. -

- -

- 0.4.6
- Added the range function, a port of the - Python - function of the same name, for generating flexibly-numbered lists - of integers. Original patch contributed by - Kirill Ishanov. -

- -

- 0.4.5
- Added rest for Arrays and arguments objects, and aliased - first as head, and rest as tail, - thanks to Luke Sutton's patches. - Added tests ensuring that all Underscore Array functions also work on - arguments objects. -

- -

- 0.4.4
- Added isString, and isNumber, for consistency. Fixed - _.isEqual(NaN, NaN) to return true (which is debatable). -

- -

- 0.4.3
- Started using the native StopIteration object in browsers that support it. - Fixed Underscore setup for CommonJS environments. -

- -

- 0.4.2
- Renamed the unwrapping function to value, for clarity. -

- -

- 0.4.1
- Chained Underscore objects now support the Array prototype methods, so - that you can perform the full range of operations on a wrapped array - without having to break your chain. Added a breakLoop method - to break in the middle of any Underscore iteration. Added an - isEmpty function that works on arrays and objects. -

- -

- 0.4.0
- All Underscore functions can now be called in an object-oriented style, - like so: _([1, 2, 3]).map(...);. Original patch provided by - Marc-André Cournoyer. - Wrapped objects can be chained through multiple - method invocations. A functions method - was added, providing a sorted list of all the functions in Underscore. -

- -

- 0.3.3
- Added the JavaScript 1.8 function reduceRight. Aliased it - as foldr, and aliased reduce as foldl. -

- -

- 0.3.2
- Now runs on stock Rhino - interpreters with: load("underscore.js"). - Added identity as a utility function. -

- -

- 0.3.1
- All iterators are now passed in the original collection as their third - argument, the same as JavaScript 1.6's forEach. Iterating over - objects is now called with (value, key, collection), for details - see _.each. -

- -

- 0.3.0
- Added Dmitry Baranovskiy's - comprehensive optimizations, merged in - Kris Kowal's patches to make Underscore - CommonJS and - Narwhal compliant. -

- -

- 0.2.0
- Added compose and lastIndexOf, renamed inject to - reduce, added aliases for inject, filter, - every, some, and forEach. -

- -

- 0.1.1
- Added noConflict, so that the "Underscore" object can be assigned to - other variables. -

- -

- 0.1.0
- Initial release of Underscore.js. -

- -

- - A DocumentCloud Project - -

- -
- -
- - - - - - diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.js deleted file mode 100644 index 2cf0ca5..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./underscore'); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json deleted file mode 100644 index 4c89a67..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "underscore", - "description": "JavaScript's functional programming helper library.", - "homepage": "http://underscorejs.org", - "keywords": [ - "util", - "functional", - "server", - "client", - "browser" - ], - "author": { - "name": "Jeremy Ashkenas", - "email": "jeremy@documentcloud.org" - }, - "repository": { - "type": "git", - "url": "git://github.com/documentcloud/underscore.git" - }, - "main": "underscore.js", - "version": "1.4.4", - "devDependencies": { - "phantomjs": "0.2.2" - }, - "scripts": { - "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true" - }, - "readme": " __\n /\\ \\ __\n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____\n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\\n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/\n \\ \\____/\n \\/___/\n\nUnderscore.js is a utility-belt library for JavaScript that provides\nsupport for the usual functional suspects (each, map, reduce, filter...)\nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://underscorejs.org\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/documentcloud/underscore/issues" - }, - "_id": "underscore@1.4.4", - "_from": "underscore@1.4.x" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore-min.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore-min.js deleted file mode 100644 index c1d9d3a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore-min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.4";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2),e=w.isFunction(t);return w.map(n,function(n){return(e?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t,r){return w.isEmpty(t)?r?null:[]:w[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.findWhere=function(n,t){return w.where(n,t,!0)},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var k=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=k(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i},w.bind=function(n,t){if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));var r=o.call(arguments,2);return function(){return n.apply(t,r.concat(o.call(arguments)))}},w.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},w.bindAll=function(n){var t=o.call(arguments,1);return 0===t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var I=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=I(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&I(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return I(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),"function"!=typeof/./&&(w.isFunction=function(n){return"function"==typeof n}),w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return n===void 0},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var M={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};M.unescape=w.invert(M.escape);var S={escape:RegExp("["+w.keys(M.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(M.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(S[n],function(t){return M[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=++N+"";return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){var e;r=w.defaults({},r,w.templateSettings);var u=RegExp([(r.escape||T).source,(r.interpolate||T).source,(r.evaluate||T).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(B,function(n){return"\\"+q[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,w);var c=function(n){return e.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},w.chain=function(n){return w(n).chain()};var D=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore.js deleted file mode 100644 index a12f0d9..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/underscore.js +++ /dev/null @@ -1,1226 +0,0 @@ -// Underscore.js 1.4.4 -// http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore may be freely distributed under the MIT license. - -(function() { - - // Baseline setup - // -------------- - - // Establish the root object, `window` in the browser, or `global` on the server. - var root = this; - - // Save the previous value of the `_` variable. - var previousUnderscore = root._; - - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; - - // Create quick reference variables for speed access to core prototypes. - var push = ArrayProto.push, - slice = ArrayProto.slice, - concat = ArrayProto.concat, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // All **ECMAScript 5** native function implementations that we hope to use - // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; - - // Create a safe reference to the Underscore object for use below. - var _ = function(obj) { - if (obj instanceof _) return obj; - if (!(this instanceof _)) return new _(obj); - this._wrapped = obj; - }; - - // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { - exports = module.exports = _; - } - exports._ = _; - } else { - root._ = _; - } - - // Current version. - _.VERSION = '1.4.4'; - - // Collection Functions - // -------------------- - - // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - for (var key in obj) { - if (_.has(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } - } - } - }; - - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); - return results; - }; - - var reduceError = 'Reduce of empty array with no initial value'; - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; - - // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var length = obj.length; - if (length !== +length) { - var keys = _.keys(obj); - length = keys.length; - } - each(obj, function(value, index, list) { - index = keys ? keys[--length] : --length; - if (!initial) { - memo = obj[index]; - initial = true; - } else { - memo = iterator.call(context, memo, obj[index], index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; - - // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; - }; - - // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. - // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - return _.filter(obj, function(value, index, list) { - return !iterator.call(context, value, index, list); - }, context); - }; - - // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. - // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. - // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if the array or object contains a given value (using `===`). - // Aliased as `include`. - _.contains = _.include = function(obj, target) { - if (obj == null) return false; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - return any(obj, function(value) { - return value === target; - }); - }; - - // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - var isFunc = _.isFunction(method); - return _.map(obj, function(value) { - return (isFunc ? method : value[method]).apply(value, args); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); - }; - - // Convenience version of a common use case of `filter`: selecting only objects - // containing specific `key:value` pairs. - _.where = function(obj, attrs, first) { - if (_.isEmpty(attrs)) return first ? null : []; - return _[first ? 'find' : 'filter'](obj, function(value) { - for (var key in attrs) { - if (attrs[key] !== value[key]) return false; - } - return true; - }); - }; - - // Convenience version of a common use case of `find`: getting the first object - // containing specific `key:value` pairs. - _.findWhere = function(obj, attrs) { - return _.where(obj, attrs, true); - }; - - // Return the maximum element or (element-based computation). - // Can't optimize arrays of integers longer than 65,535 elements. - // See: https://bugs.webkit.org/show_bug.cgi?id=80797 - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.max.apply(Math, obj); - } - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity, value: -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.min.apply(Math, obj); - } - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity, value: Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Shuffle an array. - _.shuffle = function(obj) { - var rand; - var index = 0; - var shuffled = []; - each(obj, function(value) { - rand = _.random(index++); - shuffled[index - 1] = shuffled[rand]; - shuffled[rand] = value; - }); - return shuffled; - }; - - // An internal function to generate lookup iterators. - var lookupIterator = function(value) { - return _.isFunction(value) ? value : function(obj){ return obj[value]; }; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, value, context) { - var iterator = lookupIterator(value); - return _.pluck(_.map(obj, function(value, index, list) { - return { - value : value, - index : index, - criteria : iterator.call(context, value, index, list) - }; - }).sort(function(left, right) { - var a = left.criteria; - var b = right.criteria; - if (a !== b) { - if (a > b || a === void 0) return 1; - if (a < b || b === void 0) return -1; - } - return left.index < right.index ? -1 : 1; - }), 'value'); - }; - - // An internal function used for aggregate "group by" operations. - var group = function(obj, value, context, behavior) { - var result = {}; - var iterator = lookupIterator(value || _.identity); - each(obj, function(value, index) { - var key = iterator.call(context, value, index, obj); - behavior(result, key, value); - }); - return result; - }; - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - _.groupBy = function(obj, value, context) { - return group(obj, value, context, function(result, key, value) { - (_.has(result, key) ? result[key] : (result[key] = [])).push(value); - }); - }; - - // Counts instances of an object that group by a certain criterion. Pass - // either a string attribute to count by, or a function that returns the - // criterion. - _.countBy = function(obj, value, context) { - return group(obj, value, context, function(result, key) { - if (!_.has(result, key)) result[key] = 0; - result[key]++; - }); - }; - - // Use a comparator function to figure out the smallest index at which - // an object should be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator, context) { - iterator = iterator == null ? _.identity : lookupIterator(iterator); - var value = iterator.call(context, obj); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >>> 1; - iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; - } - return low; - }; - - // Safely convert anything iterable into a real, live array. - _.toArray = function(obj) { - if (!obj) return []; - if (_.isArray(obj)) return slice.call(obj); - if (obj.length === +obj.length) return _.map(obj, _.identity); - return _.values(obj); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - if (obj == null) return 0; - return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; - }; - - // Array Functions - // --------------- - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. Aliased as `head` and `take`. The **guard** check - // allows it to work with `_.map`. - _.first = _.head = _.take = function(array, n, guard) { - if (array == null) return void 0; - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; - }; - - // Returns everything but the last entry of the array. Especially useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. - _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); - }; - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. - _.last = function(array, n, guard) { - if (array == null) return void 0; - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } - }; - - // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. - // Especially useful on the arguments object. Passing an **n** will return - // the rest N values in the array. The **guard** - // check allows it to work with `_.map`. - _.rest = _.tail = _.drop = function(array, n, guard) { - return slice.call(array, (n == null) || guard ? 1 : n); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, _.identity); - }; - - // Internal implementation of a recursive `flatten` function. - var flatten = function(input, shallow, output) { - each(input, function(value) { - if (_.isArray(value)) { - shallow ? push.apply(output, value) : flatten(value, shallow, output); - } else { - output.push(value); - } - }); - return output; - }; - - // Return a completely flattened version of an array. - _.flatten = function(array, shallow) { - return flatten(array, shallow, []); - }; - - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator, context) { - if (_.isFunction(isSorted)) { - context = iterator; - iterator = isSorted; - isSorted = false; - } - var initial = iterator ? _.map(array, iterator, context) : array; - var results = []; - var seen = []; - each(initial, function(value, index) { - if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { - seen.push(value); - results.push(array[index]); - } - }); - return results; - }; - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - _.union = function() { - return _.uniq(concat.apply(ArrayProto, arguments)); - }; - - // Produce an array that contains every item shared between all the - // passed-in arrays. - _.intersection = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); - }; - - // Take the difference between one array and a number of other arrays. - // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); - return _.filter(array, function(value){ return !_.contains(rest, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); - for (var i = 0; i < length; i++) { - results[i] = _.pluck(args, "" + i); - } - return results; - }; - - // Converts lists into objects. Pass either a single array of `[key, value]` - // pairs, or two parallel arrays of the same length -- one of keys, and one of - // the corresponding values. - _.object = function(list, values) { - if (list == null) return {}; - var result = {}; - for (var i = 0, l = list.length; i < l; i++) { - if (values) { - result[list[i]] = values[i]; - } else { - result[list[i][0]] = list[i][1]; - } - } - return result; - }; - - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i = 0, l = array.length; - if (isSorted) { - if (typeof isSorted == 'number') { - i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); - } else { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; - } - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); - for (; i < l; i++) if (array[i] === item) return i; - return -1; - }; - - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item, from) { - if (array == null) return -1; - var hasIndex = from != null; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { - return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); - } - var i = (hasIndex ? from : array.length); - while (i--) if (array[i] === item) return i; - return -1; - }; - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](http://docs.python.org/library/functions.html#range). - _.range = function(start, stop, step) { - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - step = arguments[2] || 1; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while(idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }; - - // Function (ahem) Functions - // ------------------ - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if - // available. - _.bind = function(func, context) { - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - var args = slice.call(arguments, 2); - return function() { - return func.apply(context, args.concat(slice.call(arguments))); - }; - }; - - // Partially apply a function by creating a version that has had some of its - // arguments pre-filled, without changing its dynamic `this` context. - _.partial = function(func) { - var args = slice.call(arguments, 1); - return function() { - return func.apply(this, args.concat(slice.call(arguments))); - }; - }; - - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length === 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; - - // Memoize an expensive function by storing its results. - _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); - }; - }; - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(null, args); }, wait); - }; - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, result; - var previous = 0; - var later = function() { - previous = new Date; - timeout = null; - result = func.apply(context, args); - }; - return function() { - var now = new Date; - var remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0) { - clearTimeout(timeout); - timeout = null; - previous = now; - result = func.apply(context, args); - } else if (!timeout) { - timeout = setTimeout(later, remaining); - } - return result; - }; - }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // N milliseconds. If `immediate` is passed, trigger the function on the - // leading edge, instead of the trailing. - _.debounce = function(func, wait, immediate) { - var timeout, result; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - if (!immediate) result = func.apply(context, args); - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) result = func.apply(context, args); - return result; - }; - }; - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; - }; - }; - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - _.wrap = function(func, wrapper) { - return function() { - var args = [func]; - push.apply(args, arguments); - return wrapper.apply(this, args); - }; - }; - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - _.compose = function() { - var funcs = arguments; - return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; - }; - }; - - // Returns a function that will only be executed after being called N times. - _.after = function(times, func) { - if (times <= 0) return func(); - return function() { - if (--times < 1) { - return func.apply(this, arguments); - } - }; - }; - - // Object Functions - // ---------------- - - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); - var keys = []; - for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; - return keys; - }; - - // Retrieve the values of an object's properties. - _.values = function(obj) { - var values = []; - for (var key in obj) if (_.has(obj, key)) values.push(obj[key]); - return values; - }; - - // Convert an object into a list of `[key, value]` pairs. - _.pairs = function(obj) { - var pairs = []; - for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]); - return pairs; - }; - - // Invert the keys and values of an object. The values must be serializable. - _.invert = function(obj) { - var result = {}; - for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key; - return result; - }; - - // Return a sorted list of the function names available on the object. - // Aliased as `methods` - _.functions = _.methods = function(obj) { - var names = []; - for (var key in obj) { - if (_.isFunction(obj[key])) names.push(key); - } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - obj[prop] = source[prop]; - } - } - }); - return obj; - }; - - // Return a copy of the object only containing the whitelisted properties. - _.pick = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - each(keys, function(key) { - if (key in obj) copy[key] = obj[key]; - }); - return copy; - }; - - // Return a copy of the object without the blacklisted properties. - _.omit = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - for (var key in obj) { - if (!_.contains(keys, key)) copy[key] = obj[key]; - } - return copy; - }; - - // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } - } - }); - return obj; - }; - - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; - - // Invokes interceptor with the obj, and then returns obj. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - _.tap = function(obj, interceptor) { - interceptor(obj); - return obj; - }; - - // Internal recursive comparison function for `isEqual`. - var eq = function(a, b, aStack, bStack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; - // Unwrap any wrapped objects. - if (a instanceof _) a = a._wrapped; - if (b instanceof _) b = b._wrapped; - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className != toString.call(b)) return false; - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return a == String(b); - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') return false; - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = aStack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (aStack[length] == a) return bStack[length] == b; - } - // Add the first object to the stack of traversed objects. - aStack.push(a); - bStack.push(b); - var size = 0, result = true; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - if (!(result = eq(a[size], b[size], aStack, bStack))) break; - } - } - } else { - // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && - _.isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; - } - // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - return result; - }; - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b, [], []); - }; - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - _.isEmpty = function(obj) { - if (obj == null) return true; - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (_.has(obj, key)) return false; - return true; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType === 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - return obj === Object(obj); - }; - - // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. - each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { - _['is' + name] = function(obj) { - return toString.call(obj) == '[object ' + name + ']'; - }; - }); - - // Define a fallback version of the method in browsers (ahem, IE), where - // there isn't any inspectable "Arguments" type. - if (!_.isArguments(arguments)) { - _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); - }; - } - - // Optimize `isFunction` if appropriate. - if (typeof (/./) !== 'function') { - _.isFunction = function(obj) { - return typeof obj === 'function'; - }; - } - - // Is a given object a finite number? - _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); - }; - - // Is the given value `NaN`? (NaN is the only number which does not equal itself). - _.isNaN = function(obj) { - return _.isNumber(obj) && obj != +obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // Shortcut function for checking if an object has a given property directly - // on itself (in other words, not on a prototype). - _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); - }; - - // Utility Functions - // ----------------- - - // Run Underscore.js in *noConflict* mode, returning the `_` variable to its - // previous owner. Returns a reference to the Underscore object. - _.noConflict = function() { - root._ = previousUnderscore; - return this; - }; - - // Keep the identity function around for default iterators. - _.identity = function(value) { - return value; - }; - - // Run a function **n** times. - _.times = function(n, iterator, context) { - var accum = Array(n); - for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); - return accum; - }; - - // Return a random integer between min and max (inclusive). - _.random = function(min, max) { - if (max == null) { - max = min; - min = 0; - } - return min + Math.floor(Math.random() * (max - min + 1)); - }; - - // List of HTML entities for escaping. - var entityMap = { - escape: { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/' - } - }; - entityMap.unescape = _.invert(entityMap.escape); - - // Regexes containing the keys and values listed immediately above. - var entityRegexes = { - escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), - unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') - }; - - // Functions for escaping and unescaping strings to/from HTML interpolation. - _.each(['escape', 'unescape'], function(method) { - _[method] = function(string) { - if (string == null) return ''; - return ('' + string).replace(entityRegexes[method], function(match) { - return entityMap[method][match]; - }); - }; - }); - - // If the value of the named property is a function then invoke it; - // otherwise, return it. - _.result = function(object, property) { - if (object == null) return null; - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; - }; - - // Add your own custom functions to the Underscore object. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - var func = _[name] = obj[name]; - _.prototype[name] = function() { - var args = [this._wrapped]; - push.apply(args, arguments); - return result.call(this, func.apply(_, args)); - }; - }); - }; - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - _.uniqueId = function(prefix) { - var id = ++idCounter + ''; - return prefix ? prefix + id : id; - }; - - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g - }; - - // When customizing `templateSettings`, if you don't want to define an - // interpolation, evaluation or escaping regex, we need one that is - // guaranteed not to match. - var noMatch = /(.)^/; - - // Certain characters need to be escaped so that they can be put into a - // string literal. - var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', - '\t': 't', - '\u2028': 'u2028', - '\u2029': 'u2029' - }; - - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - _.template = function(text, data, settings) { - var render; - settings = _.defaults({}, settings, _.templateSettings); - - // Combine delimiters into one regular expression via alternation. - var matcher = new RegExp([ - (settings.escape || noMatch).source, - (settings.interpolate || noMatch).source, - (settings.evaluate || noMatch).source - ].join('|') + '|$', 'g'); - - // Compile the template source, escaping string literals appropriately. - var index = 0; - var source = "__p+='"; - text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset) - .replace(escaper, function(match) { return '\\' + escapes[match]; }); - - if (escape) { - source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; - } - if (interpolate) { - source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } - if (evaluate) { - source += "';\n" + evaluate + "\n__p+='"; - } - index = offset + match.length; - return match; - }); - source += "';\n"; - - // If a variable is not specified, place data values in local scope. - if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; - - source = "var __t,__p='',__j=Array.prototype.join," + - "print=function(){__p+=__j.call(arguments,'');};\n" + - source + "return __p;\n"; - - try { - render = new Function(settings.variable || 'obj', '_', source); - } catch (e) { - e.source = source; - throw e; - } - - if (data) return render(data, _); - var template = function(data) { - return render.call(this, data, _); - }; - - // Provide the compiled function source as a convenience for precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; - - return template; - }; - - // Add a "chain" function, which will delegate to the wrapper. - _.chain = function(obj) { - return _(obj).chain(); - }; - - // OOP - // --------------- - // If Underscore is called as a function, it returns a wrapped object that - // can be used OO-style. This wrapper holds altered versions of all the - // underscore functions. Wrapped objects may be chained. - - // Helper function to continue chaining intermediate results. - var result = function(obj) { - return this._chain ? _(obj).chain() : obj; - }; - - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); - - // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - _.prototype[name] = function() { - var obj = this._wrapped; - method.apply(obj, arguments); - if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; - return result.call(this, obj); - }; - }); - - // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - _.prototype[name] = function() { - return result.call(this, method.apply(this._wrapped, arguments)); - }; - }); - - _.extend(_.prototype, { - - // Start chaining a wrapped Underscore object. - chain: function() { - this._chain = true; - return this; - }, - - // Extracts the result from a wrapped and chained object. - value: function() { - return this._wrapped; - } - - }); - -}).call(this); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/package.json deleted file mode 100644 index 1e90b22..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/package.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "name": "jshint", - "version": "2.1.11", - "homepage": "http://jshint.com/", - "description": "Static analysis tool for JavaScript", - "author": { - "name": "Anton Kovalyov", - "email": "anton@kovalyov.net", - "url": "http://anton.kovalyov.net/" - }, - "repository": { - "type": "git", - "url": "https://github.com/jshint/jshint.git" - }, - "bugs": { - "url": "https://github.com/jshint/jshint/issues" - }, - "bin": { - "jshint": "./bin/jshint" - }, - "scripts": { - "build": "node bin/build", - "test": "nodeunit tests tests/regression tests/unit", - "pretest": "jshint src" - }, - "main": "./src/jshint.js", - "dependencies": { - "shelljs": "0.1.x", - "underscore": "1.4.x", - "cli": "0.4.x", - "minimatch": "0.x.x", - "console-browserify": "0.1.x" - }, - "devDependencies": { - "jshint": "2.1.x", - "shelljs": "0.1.x", - "browserify": "2.12.x", - "coveraje": "0.2.x", - "nodeunit": "0.8.x", - "sinon": "1.7.x" - }, - "jshintConfig": { - "boss": true, - "node": true, - "strict": true, - "white": true, - "smarttabs": true, - "maxlen": 100, - "newcap": false, - "undef": true, - "unused": true, - "onecase": true, - "indent": 2 - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/jshint/jshint/blob/master/LICENSE" - } - ], - "preferGlobal": true, - "files": [ - "bin", - "src" - ], - "readme": "JSHint, A Static Code Analysis Tool for JavaScript\n--------------------------------------------------\n\n\\[ [Use it online](http://jshint.com/) • [About](http://jshint.com/about/) • \n[Docs](http://jshint.com/docs/) • [FAQ](http://jshint.com/docs/faq) • \n[Install](http://jshint.com/install/) • [Hack](http://jshint.com/hack/) • \n[Blog](http://jshint.com/blog/) • [Twitter](https://twitter.com/jshint/) \\]\n\n[![Build Status](https://travis-ci.org/jshint/jshint.png?branch=master)](https://travis-ci.org/jshint/jshint)\n[![NPM version](https://badge.fury.io/js/jshint.png)](http://badge.fury.io/js/jshint)\n\nJSHint is a community-driven tool to detect errors and potential problems\nin JavaScript code and to enforce your team’s coding conventions. It is\nvery flexible so you can easily adjust it to your particular coding guidelines\nand the environment you expect your code to execute in.\n\n#### Reporting a bug\n\nTo report a bug simply create a\n[new GitHub Issue](https://github.com/jshint/jshint/issues/new) and describe\nyour problem or suggestion. We welcome all kind of feedback regarding\nJSHint including but not limited to:\n\n * When JSHint doesn't work as expected\n * When JSHint complains about valid JavaScript code that works in all browsers\n * When you simply want a new option or feature\n\nBefore reporting a bug look around to see if there are any open or closed tickets\nthat cover your issue. And remember the wisdom: pull request > bug report > tweet.\n\n\n#### License\n\nJSHint is distributed under the MIT License. One file and one file only\n(src/stable/jshint.js) is distributed under the slightly modified MIT License.\n\n\n#### Thank you!\n\nWe really appreciate all kind of feedback and contributions. Thanks for using and supporting JSHint!\n", - "readmeFilename": "README.md", - "_id": "jshint@2.1.11", - "_from": "jshint@~2.1.10" -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/cli.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/cli.js deleted file mode 100644 index d4fcd47..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/cli.js +++ /dev/null @@ -1,506 +0,0 @@ -"use strict"; - -var cli = require("cli"); -var path = require("path"); -var shjs = require("shelljs"); -var minimatch = require("minimatch"); -var JSHINT = require("./jshint.js").JSHINT; -var defReporter = require("./reporters/default").reporter; - -var OPTIONS = { - "config": ["c", "Custom configuration file", "string", false ], - "reporter": ["reporter", "Custom reporter (|jslint|checkstyle)", "string", undefined ], - "exclude": ["exclude", - "Exclude files matching the given filename pattern (same as .jshintignore)", "string", null], - "verbose": ["verbose", "Show message codes"], - "show-non-errors": ["show-non-errors", "Show additional data generated by jshint"], - "extra-ext": ["e", - "Comma-separated list of file extensions to use (default is .js)", "string", ""], - - // Deprecated options. - "jslint-reporter": [ - "jslint-reporter", - deprecated("Use a jslint compatible reporter", "--reporter=jslint") - ], - - "checkstyle-reporter": [ - "checkstyle-reporter", - deprecated("Use a CheckStyle compatible XML reporter", "--reporter=checkstyle") - ] -}; - -/** - * Returns the same text but with a deprecation notice. - * Useful for options descriptions. - * - * @param {string} text - * @param {string} alt (optional) Alternative command to include in the - * deprecation notice. - * - * @returns {string} - */ -function deprecated(text, alt) { - if (!alt) { - return text + " (DEPRECATED)"; - } - - return text + " (DEPRECATED, use " + alt + " instead)"; -} - -/** - * Removes JavaScript comments from a string by replacing - * everything between block comments and everything after - * single-line comments in a non-greedy way. - * - * English version of the regex: - * match '/*' - * then match zero or more instances of any character (incl. \n) - * except for instances of '* /' (without a space, obv.) - * then match '* /' (again, without a space) - * - * @param {string} str a string with potential JavaScript comments. - * @returns {string} a string without JavaScript comments. - */ -function removeComments(str) { - str = str || ""; - - str = str.replace(/\/\*(?:(?!\*\/)[\s\S])*\*\//g, ""); - str = str.replace(/\/\/[^\n\r]*/g, ""); // Everything after '//' - - return str; -} - -/** - * Tries to find a configuration file in either project directory - * or in the home directory. Configuration files are named - * '.jshintrc'. - * - * @param {string} file path to the file to be linted - * @returns {string} a path to the config file - */ -function findConfig(file) { - var dir = path.dirname(path.resolve(file)); - var envs = process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE; - var home = path.normalize(path.join(envs, ".jshintrc")); - - var proj = findFile(".jshintrc", dir); - if (proj) - return proj; - - if (shjs.test("-e", home)) - return home; - - return null; -} - -/** - * Tries to find JSHint configuration within a package.json file - * (if any). It search in the current directory and then goes up - * all the way to the root just like findFile. - * - * @param {string} file path to the file to be linted - * @returns {object} config object - */ -function loadNpmConfig(file) { - var dir = path.dirname(path.resolve(file)); - var fp = findFile("package.json", dir); - - if (!fp) - return null; - - return require(fp).jshintConfig || null; -} - -/** - * Tries to import a reporter file and returns its reference. - * - * @param {string} fp a path to the reporter file - * @returns {object} imported module for the reporter or 'null' - * if a module cannot be imported. - */ -function loadReporter(fp) { - try { - return require(fp).reporter; - } catch (err) { - return null; - } -} - -// Storage for memoized results from find file -// Should prevent lots of directory traversal & -// lookups when liniting an entire project -var findFileResults = {}; - -/** - * Searches for a file with a specified name starting with - * 'dir' and going all the way up either until it finds the file - * or hits the root. - * - * @param {string} name filename to search for (e.g. .jshintrc) - * @param {string} dir directory to start search from (default: - * current working directory) - * - * @returns {string} normalized filename - */ -function findFile(name, dir) { - dir = dir || process.cwd(); - - var filename = path.normalize(path.join(dir, name)); - if (findFileResults[filename] !== undefined) { - return findFileResults[filename]; - } - - var parent = path.resolve(dir, "../"); - - if (shjs.test("-e", filename)) { - findFileResults[filename] = filename; - return filename; - } - - if (dir === parent) { - findFileResults[filename] = null; - return null; - } - - return findFile(name, parent); -} - -/** - * Loads a list of files that have to be skipped. JSHint assumes that - * the list is located in a file called '.jshintignore'. - * - * @return {array} a list of files to ignore. - */ -function loadIgnores(exclude) { - var file = findFile(".jshintignore"); - - if (!file && !exclude) { - return []; - } - - var lines = (file ? shjs.cat(file) : "").split("\n"); - lines.unshift(exclude || ""); - - return lines - .filter(function (line) { - return !!line.trim(); - }) - .map(function (line) { - if (line[0] === "!") - return "!" + path.resolve(path.dirname(file), line.substr(1).trim()); - - return path.resolve(path.dirname(file), line.trim()); - }); -} - -/** - * Checks whether we should ignore a file or not. - * - * @param {string} fp a path to a file - * @param {array} patterns a list of patterns for files to ignore - * - * @return {boolean} 'true' if file should be ignored, 'false' otherwise. - */ -function isIgnored(fp, patterns) { - return patterns.some(function (ip) { - if (minimatch(path.resolve(fp), ip, { nocase: true })) { - return true; - } - - if (path.resolve(fp) === ip) { - return true; - } - - if (shjs.test("-d", fp) && ip.match(/^[^\/]*\/?$/) && - fp.match(new RegExp("^" + ip + ".*"))) { - return true; - } - }); -} - -/** - * Recursively gather all files that need to be linted, - * excluding those that user asked to ignore. - * - * @param {string} fp a path to a file or directory to lint - * @param {array} files a pointer to an array that stores a list of files - * @param {array} ignores a list of patterns for files to ignore - * @param {array} ext a list of non-dot-js extensions to lint - */ -function collect(fp, files, ignores, ext) { - if (ignores && isIgnored(fp, ignores)) { - return; - } - - if (!shjs.test("-e", fp)) { - cli.error("Can't open " + fp); - return; - } - - if (shjs.test("-d", fp)) { - shjs.ls(fp).forEach(function (item) { - var itempath = path.join(fp, item); - if (shjs.test("-d", itempath) || item.match(ext)) { - collect(itempath, files, ignores, ext); - } - }); - - return; - } - - files.push(fp); -} - -/** - * Runs JSHint against provided file and saves the result - * - * @param {string} code code that needs to be linted - * @param {object} results a pointer to an object with results - * @param {object} config an object with JSHint configuration - * @param {object} data a pointer to an object with extra data - * @param {string} file (optional) file name that is being linted - */ -function lint(code, results, config, data, file) { - var globals; - var lintData; - var buffer = []; - - config = config || {}; - config = JSON.parse(JSON.stringify(config)); - - if (config.prereq) { - config.prereq.forEach(function (fp) { - fp = path.join(config.dirname, fp); - if (shjs.test("-e", fp)) - buffer.push(shjs.cat(fp)); - }); - delete config.prereq; - } - - if (config.globals) { - globals = config.globals; - delete config.globals; - } - - delete config.dirname; - buffer.push(code); - buffer = buffer.join("\n"); - buffer = buffer.replace(/^\uFEFF/, ""); // Remove potential Unicode BOM. - - if (!JSHINT(buffer, config, globals)) { - JSHINT.errors.forEach(function (err) { - if (err) { - results.push({ file: file || "stdin", error: err }); - } - }); - } - - lintData = JSHINT.data(); - - if (lintData) { - lintData.file = file || "stdin"; - data.push(lintData); - } -} - -var exports = { - /** - * Loads and parses a configuration file. - * - * @param {string} fp a path to the config file - * @returns {object} config object - */ - loadConfig: function (fp) { - if (!fp) { - return {}; - } - - if (!shjs.test("-e", fp)) { - cli.error("Can't find config file: " + fp); - process.exit(1); - } - - try { - var config = JSON.parse(removeComments(shjs.cat(fp))); - config.dirname = path.dirname(fp); - return config; - } catch (err) { - cli.error("Can't parse config file: " + fp); - process.exit(1); - } - }, - - /** - * Gathers all files that need to be linted - * - * @param {object} post-processed options from 'interpret': - * args - CLI arguments - * ignores - A list of files/dirs to ignore (defaults to .jshintignores) - * extensions - A list of non-dot-js extensions to check - */ - gather: function (opts) { - var files = []; - - var reg = new RegExp("\\.(js" + - (!opts.extensions ? "" : "|" + - opts.extensions.replace(/,/g, "|").replace(/[\. ]/g, "")) + ")$"); - - var ignores = !opts.ignores ? loadIgnores() : opts.ignores.map(function (target) { - return path.resolve(target); - }); - - opts.args.forEach(function (target) { - collect(target, files, ignores, reg); - }); - - return files; - }, - - /** - * Gathers all files that need to be linted, lints them, sends them to - * a reporter and returns the overall result. - * - * @param {object} post-processed options from 'interpret': - * args - CLI arguments - * config - Configuration object - * reporter - Reporter function - * ignores - A list of files/dirs to ignore - * extensions - A list of non-dot-js extensions to check - * @param {function} cb a callback to call when function is finished - * asynchronously. - * - * @returns {bool} 'true' if all files passed, 'false' otherwise and 'null' - * when function will be finished asynchronously. - */ - run: function (opts, cb) { - var files = exports.gather(opts); - var results = []; - var data = []; - - if (opts.useStdin) { - cli.withStdin(function (code) { - lint(code, results, opts.config || {}, data); - (opts.reporter || defReporter)(results, data, { verbose: opts.verbose }); - cb(results.length === 0); - }); - - return null; - } - - files.forEach(function (file) { - var config = opts.config || loadNpmConfig(file) || exports.loadConfig(findConfig(file)); - var code; - - try { - code = shjs.cat(file); - } catch (err) { - cli.error("Can't open " + file); - process.exit(1); - } - - lint(code, results, config, data, file); - }); - - (opts.reporter || defReporter)(results, data, { verbose: opts.verbose }); - return results.length === 0; - }, - - /** - * Helper exposed for testing. - * Used to determine is stdout has any buffered output before exiting the program - */ - getBufferSize: function () { - return process.stdout.bufferSize; - }, - - /** - * Main entrance function. Parses arguments and calls 'run' when - * its done. This function is called from bin/jshint file. - * - * @param {object} args, arguments in the process.argv format. - */ - interpret: function (args) { - cli.setArgv(args); - cli.options = {}; - - cli.enable("version", "glob", "help"); - cli.setApp(path.resolve(__dirname + "/../package.json")); - - var options = cli.parse(OPTIONS); - // Use config file if specified - var config; - if (options.config) { - config = exports.loadConfig(options.config); - } - - switch (true) { - // JSLint reporter - case options.reporter === "jslint": - case options["jslint-reporter"]: - options.reporter = "./reporters/jslint_xml.js"; - break; - - // CheckStyle (XML) reporter - case options.reporter === "checkstyle": - case options["checkstyle-reporter"]: - options.reporter = "./reporters/checkstyle.js"; - break; - - // Reporter that displays additional JSHint data - case options["show-non-errors"]: - options.reporter = "./reporters/non_error.js"; - break; - - // Custom reporter - case options.reporter !== undefined: - options.reporter = path.resolve(process.cwd(), options.reporter); - } - - var reporter; - if (options.reporter) { - reporter = loadReporter(options.reporter); - - if (reporter === null) { - cli.error("Can't load reporter file: " + options.reporter); - process.exit(1); - } - } - - // This is a hack. exports.run is both sync and async function - // because I needed stdin support (and cli.withStdin is async) - // and was too lazy to change tests. - - function done(passed) { - /*jshint eqnull:true */ - - if (passed == null) - return; - - // Patch as per https://github.com/visionmedia/mocha/issues/333 - // fixes issues with piped output on Windows. - // Root issue is here https://github.com/joyent/node/issues/3584 - function exit() { process.exit(passed ? 0 : 2); } - try { - if (exports.getBufferSize()) { - process.stdout.once('drain', exit); - } else { - exit(); - } - } catch (err) { - exit(); - } - } - - done(exports.run({ - args: cli.args, - config: config, - reporter: reporter, - ignores: loadIgnores(options.exclude), - extensions: options["extra-ext"], - verbose: options.verbose, - useStdin: {"-": true, "/dev/stdin": true}[args[args.length - 1]] - }, done)); - } -}; - -module.exports = exports; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/jshint.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/jshint.js deleted file mode 100644 index 37ff87c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/jshint.js +++ /dev/null @@ -1,4872 +0,0 @@ -/*! - * JSHint, by JSHint Community. - * - * This file (and this file only) is licensed under the same slightly modified - * MIT license that JSLint is. It stops evil-doers everywhere: - * - * Copyright (c) 2002 Douglas Crockford (www.JSLint.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 shall be used for Good, not Evil. - * - * 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. - * - */ - -/*jshint quotmark:double */ -/*global console:true */ -/*exported console */ - -var _ = require("underscore"); -var events = require("events"); -var vars = require("./vars.js"); -var messages = require("./messages.js"); -var Lexer = require("./lex.js").Lexer; -var reg = require("./reg.js"); -var state = require("./state.js").state; -var style = require("./style.js"); - -// We need this module here because environments such as IE and Rhino -// don't necessarilly expose the 'console' API and browserify uses -// it to log things. It's a sad state of affair, really. -var console = require("console-browserify"); - -// We build the application inside a function so that we produce only a singleton -// variable. That function will be invoked immediately, and its return value is -// the JSHINT function itself. - -var JSHINT = (function () { - "use strict"; - - var anonname, // The guessed name for anonymous functions. - api, // Extension API - - // These are operators that should not be used with the ! operator. - bang = { - "<" : true, - "<=" : true, - "==" : true, - "===": true, - "!==": true, - "!=" : true, - ">" : true, - ">=" : true, - "+" : true, - "-" : true, - "*" : true, - "/" : true, - "%" : true - }, - - // These are the JSHint boolean options. - boolOptions = { - asi : true, // if automatic semicolon insertion should be tolerated - bitwise : true, // if bitwise operators should not be allowed - boss : true, // if advanced usage of assignments should be allowed - browser : true, // if the standard browser globals should be predefined - camelcase : true, // if identifiers should be required in camel case - couch : true, // if CouchDB globals should be predefined - curly : true, // if curly braces around all blocks should be required - debug : true, // if debugger statements should be allowed - devel : true, // if logging globals should be predefined (console, alert, etc.) - dojo : true, // if Dojo Toolkit globals should be predefined - eqeqeq : true, // if === should be required - eqnull : true, // if == null comparisons should be tolerated - es3 : true, // if ES3 syntax should be allowed - es5 : true, // if ES5 syntax should be allowed (is now set per default) - esnext : true, // if es.next specific syntax should be allowed - moz : true, // if mozilla specific syntax should be allowed - evil : true, // if eval should be allowed - expr : true, // if ExpressionStatement should be allowed as Programs - forin : true, // if for in statements must filter - funcscope : true, // if only function scope should be used for scope tests - gcl : true, // if JSHint should be compatible with Google Closure Linter - globalstrict: true, // if global "use strict"; should be allowed (also enables 'strict') - immed : true, // if immediate invocations must be wrapped in parens - iterator : true, // if the `__iterator__` property should be allowed - jquery : true, // if jQuery globals should be predefined - lastsemic : true, // if semicolons may be ommitted for the trailing - // statements inside of a one-line blocks. - laxbreak : true, // if line breaks should not be checked - laxcomma : true, // if line breaks should not be checked around commas - loopfunc : true, // if functions should be allowed to be defined within - // loops - mootools : true, // if MooTools globals should be predefined - multistr : true, // allow multiline strings - newcap : true, // if constructor names must be capitalized - noarg : true, // if arguments.caller and arguments.callee should be - // disallowed - node : true, // if the Node.js environment globals should be - // predefined - noempty : true, // if empty blocks should be disallowed - nonew : true, // if using `new` for side-effects should be disallowed - nonstandard : true, // if non-standard (but widely adopted) globals should - // be predefined - nomen : true, // if names should be checked - onevar : true, // if only one var statement per function should be - // allowed - passfail : true, // if the scan should stop on first error - phantom : true, // if PhantomJS symbols should be allowed - plusplus : true, // if increment/decrement should not be allowed - proto : true, // if the `__proto__` property should be allowed - prototypejs : true, // if Prototype and Scriptaculous globals should be - // predefined - rhino : true, // if the Rhino environment globals should be predefined - shelljs : true, // if ShellJS globals should be predefined - typed : true, // if typed array globals should be predefined - undef : true, // if variables should be declared before used - scripturl : true, // if script-targeted URLs should be tolerated - shadow : true, // if variable shadowing should be tolerated - smarttabs : true, // if smarttabs should be tolerated - // (http://www.emacswiki.org/emacs/SmartTabs) - strict : true, // require the "use strict"; pragma - sub : true, // if all forms of subscript notation are tolerated - supernew : true, // if `new function () { ... };` and `new Object;` - // should be tolerated - trailing : true, // if trailing whitespace rules apply - validthis : true, // if 'this' inside a non-constructor function is valid. - // This is a function scoped option only. - withstmt : true, // if with statements should be allowed - white : true, // if strict whitespace rules apply - worker : true, // if Web Worker script symbols should be allowed - wsh : true, // if the Windows Scripting Host environment globals - // should be predefined - yui : true, // YUI variables should be predefined - - // Obsolete options - onecase : true, // if one case switch statements should be allowed - regexp : true, // if the . should not be allowed in regexp literals - regexdash : true // if unescaped first/last dash (-) inside brackets - // should be tolerated - }, - - // These are the JSHint options that can take any value - // (we use this object to detect invalid options) - valOptions = { - maxlen : false, - indent : false, - maxerr : false, - predef : false, - quotmark : false, //'single'|'double'|true - scope : false, - maxstatements: false, // {int} max statements per function - maxdepth : false, // {int} max nested block depth per function - maxparams : false, // {int} max params per function - maxcomplexity: false, // {int} max cyclomatic complexity per function - unused : true, // warn if variables are unused. Available options: - // false - don't check for unused variables - // true - "vars" + check last function param - // "vars" - skip checking unused function params - // "strict" - "vars" + check all function params - latedef : false // warn if the variable is used before its definition - // false - don't emit any warnings - // true - warn if any variable is used before its definition - // "nofunc" - warn for any variable but function declarations - }, - - // These are JSHint boolean options which are shared with JSLint - // where the definition in JSHint is opposite JSLint - invertedOptions = { - bitwise : true, - forin : true, - newcap : true, - nomen : true, - plusplus: true, - regexp : true, - undef : true, - white : true, - - // Inverted and renamed, use JSHint name here - eqeqeq : true, - onevar : true, - strict : true - }, - - // These are JSHint boolean options which are shared with JSLint - // where the name has been changed but the effect is unchanged - renamedOptions = { - eqeq : "eqeqeq", - vars : "onevar", - windows: "wsh", - sloppy : "strict" - }, - - declared, // Globals that were declared using /*global ... */ syntax. - exported, // Variables that are used outside of the current file. - - functionicity = [ - "closure", "exception", "global", "label", - "outer", "unused", "var" - ], - - funct, // The current function - functions, // All of the functions - - global, // The global scope - implied, // Implied globals - inblock, - indent, - lookahead, - lex, - member, - membersOnly, - noreach, - predefined, // Global variables defined by option - - scope, // The current scope - stack, - unuseds, - urls, - warnings, - - extraModules = [], - emitter = new events.EventEmitter(); - - function checkOption(name, t) { - name = name.trim(); - - if (/^[+-]W\d{3}$/g.test(name)) { - return true; - } - - if (valOptions[name] === undefined && boolOptions[name] === undefined) { - if (t.type !== "jslint") { - error("E001", t, name); - return false; - } - } - - return true; - } - - function isString(obj) { - return Object.prototype.toString.call(obj) === "[object String]"; - } - - function isIdentifier(tkn, value) { - if (!tkn) - return false; - - if (!tkn.identifier || tkn.value !== value) - return false; - - return true; - } - - function isReserved(token) { - if (!token.reserved) { - return false; - } - var meta = token.meta; - - if (meta && meta.isFutureReservedWord && state.option.inES5()) { - // ES3 FutureReservedWord in an ES5 environment. - if (!meta.es5) { - return false; - } - - // Some ES5 FutureReservedWord identifiers are active only - // within a strict mode environment. - if (meta.strictOnly) { - if (!state.option.strict && !state.directive["use strict"]) { - return false; - } - } - - if (token.isProperty) { - return false; - } - } - - return true; - } - - function supplant(str, data) { - return str.replace(/\{([^{}]*)\}/g, function (a, b) { - var r = data[b]; - return typeof r === "string" || typeof r === "number" ? r : a; - }); - } - - function combine(t, o) { - var n; - for (n in o) { - if (_.has(o, n) && !_.has(JSHINT.blacklist, n)) { - t[n] = o[n]; - } - } - } - - function updatePredefined() { - Object.keys(JSHINT.blacklist).forEach(function (key) { - delete predefined[key]; - }); - } - - function assume() { - if (state.option.es5) { - warning("I003"); - } - if (state.option.couch) { - combine(predefined, vars.couch); - } - - if (state.option.rhino) { - combine(predefined, vars.rhino); - } - - if (state.option.shelljs) { - combine(predefined, vars.shelljs); - combine(predefined, vars.node); - } - if (state.option.typed) { - combine(predefined, vars.typed); - } - - if (state.option.phantom) { - combine(predefined, vars.phantom); - } - - if (state.option.prototypejs) { - combine(predefined, vars.prototypejs); - } - - if (state.option.node) { - combine(predefined, vars.node); - combine(predefined, vars.typed); - } - - if (state.option.devel) { - combine(predefined, vars.devel); - } - - if (state.option.dojo) { - combine(predefined, vars.dojo); - } - - if (state.option.browser) { - combine(predefined, vars.browser); - combine(predefined, vars.typed); - } - - if (state.option.nonstandard) { - combine(predefined, vars.nonstandard); - } - - if (state.option.jquery) { - combine(predefined, vars.jquery); - } - - if (state.option.mootools) { - combine(predefined, vars.mootools); - } - - if (state.option.worker) { - combine(predefined, vars.worker); - } - - if (state.option.wsh) { - combine(predefined, vars.wsh); - } - - if (state.option.globalstrict && state.option.strict !== false) { - state.option.strict = true; - } - - if (state.option.yui) { - combine(predefined, vars.yui); - } - - // Let's assume that chronologically ES3 < ES5 < ES6/ESNext < Moz - - state.option.inMoz = function (strict) { - if (strict) { - return state.option.moz && !state.option.esnext; - } - return state.option.moz; - }; - - state.option.inESNext = function (strict) { - if (strict) { - return !state.option.moz && state.option.esnext; - } - return state.option.moz || state.option.esnext; - }; - - state.option.inES5 = function (/* strict */) { - return !state.option.es3; - }; - - state.option.inES3 = function (strict) { - if (strict) { - return !state.option.moz && !state.option.esnext && state.option.es3; - } - return state.option.es3; - }; - } - - // Produce an error warning. - function quit(code, line, chr) { - var percentage = Math.floor((line / state.lines.length) * 100); - var message = messages.errors[code].desc; - - throw { - name: "JSHintError", - line: line, - character: chr, - message: message + " (" + percentage + "% scanned).", - raw: message, - code: code - }; - } - - function isundef(scope, code, token, a) { - return JSHINT.undefs.push([scope, code, token, a]); - } - - function warning(code, t, a, b, c, d) { - var ch, l, w, msg; - - if (/^W\d{3}$/.test(code)) { - if (state.ignored[code]) - return; - - msg = messages.warnings[code]; - } else if (/E\d{3}/.test(code)) { - msg = messages.errors[code]; - } else if (/I\d{3}/.test(code)) { - msg = messages.info[code]; - } - - t = t || state.tokens.next; - if (t.id === "(end)") { // `~ - t = state.tokens.curr; - } - - l = t.line || 0; - ch = t.from || 0; - - w = { - id: "(error)", - raw: msg.desc, - code: msg.code, - evidence: state.lines[l - 1] || "", - line: l, - character: ch, - scope: JSHINT.scope, - a: a, - b: b, - c: c, - d: d - }; - - w.reason = supplant(msg.desc, w); - JSHINT.errors.push(w); - - if (state.option.passfail) { - quit("E042", l, ch); - } - - warnings += 1; - if (warnings >= state.option.maxerr) { - quit("E043", l, ch); - } - - return w; - } - - function warningAt(m, l, ch, a, b, c, d) { - return warning(m, { - line: l, - from: ch - }, a, b, c, d); - } - - function error(m, t, a, b, c, d) { - warning(m, t, a, b, c, d); - } - - function errorAt(m, l, ch, a, b, c, d) { - return error(m, { - line: l, - from: ch - }, a, b, c, d); - } - - // Tracking of "internal" scripts, like eval containing a static string - function addInternalSrc(elem, src) { - var i; - i = { - id: "(internal)", - elem: elem, - value: src - }; - JSHINT.internals.push(i); - return i; - } - - function addlabel(t, type, tkn, islet) { - // Define t in the current function in the current scope. - if (type === "exception") { - if (_.has(funct["(context)"], t)) { - if (funct[t] !== true && !state.option.node) { - warning("W002", state.tokens.next, t); - } - } - } - - if (_.has(funct, t) && !funct["(global)"]) { - if (funct[t] === true) { - if (state.option.latedef) { - if ((state.option.latedef === true && _.contains([funct[t], type], "unction")) || - !_.contains([funct[t], type], "unction")) { - warning("W003", state.tokens.next, t); - } - } - } else { - if (!state.option.shadow && type !== "exception" || - (funct["(blockscope)"].getlabel(t))) { - warning("W004", state.tokens.next, t); - } - } - } - - // a double definition of a let variable in same block throws a TypeError - if (funct["(blockscope)"] && funct["(blockscope)"].current.has(t)) { - error("E044", state.tokens.next, t); - } - - // if the identifier is from a let, adds it only to the current blockscope - if (islet) { - funct["(blockscope)"].current.add(t, type, state.tokens.curr); - } else { - - funct[t] = type; - - if (tkn) { - funct["(tokens)"][t] = tkn; - } - - if (funct["(global)"]) { - global[t] = funct; - if (_.has(implied, t)) { - if (state.option.latedef) { - if ((state.option.latedef === true && _.contains([funct[t], type], "unction")) || - !_.contains([funct[t], type], "unction")) { - warning("W003", state.tokens.next, t); - } - } - - delete implied[t]; - } - } else { - scope[t] = funct; - } - } - } - - function doOption() { - var nt = state.tokens.next; - var body = nt.body.split(",").map(function (s) { return s.trim(); }); - var predef = {}; - - if (nt.type === "globals") { - body.forEach(function (g) { - g = g.split(":"); - var key = (g[0] || "").trim(); - var val = (g[1] || "").trim(); - - if (key.charAt(0) === "-") { - key = key.slice(1); - val = false; - - JSHINT.blacklist[key] = key; - updatePredefined(); - } else { - predef[key] = (val === "true"); - } - }); - - combine(predefined, predef); - - for (var key in predef) { - if (_.has(predef, key)) { - declared[key] = nt; - } - } - } - - if (nt.type === "exported") { - body.forEach(function (e) { - exported[e] = true; - }); - } - - if (nt.type === "members") { - membersOnly = membersOnly || {}; - - body.forEach(function (m) { - var ch1 = m.charAt(0); - var ch2 = m.charAt(m.length - 1); - - if (ch1 === ch2 && (ch1 === "\"" || ch1 === "'")) { - m = m - .substr(1, m.length - 2) - .replace("\\b", "\b") - .replace("\\t", "\t") - .replace("\\n", "\n") - .replace("\\v", "\v") - .replace("\\f", "\f") - .replace("\\r", "\r") - .replace("\\\\", "\\") - .replace("\\\"", "\""); - } - - membersOnly[m] = false; - }); - } - - var numvals = [ - "maxstatements", - "maxparams", - "maxdepth", - "maxcomplexity", - "maxerr", - "maxlen", - "indent" - ]; - - if (nt.type === "jshint" || nt.type === "jslint") { - body.forEach(function (g) { - g = g.split(":"); - var key = (g[0] || "").trim(); - var val = (g[1] || "").trim(); - - if (!checkOption(key, nt)) { - return; - } - - if (numvals.indexOf(key) >= 0) { - - // GH988 - numeric options can be disabled by setting them to `false` - if (val !== "false") { - val = +val; - - if (typeof val !== "number" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) { - error("E032", nt, g[1].trim()); - return; - } - - if (key === "indent") { - state.option["(explicitIndent)"] = true; - } - state.option[key] = val; - } else { - if (key === "indent") { - state.option["(explicitIndent)"] = false; - } else { - state.option[key] = false; - } - } - - return; - } - - if (key === "validthis") { - // `validthis` is valid only within a function scope. - if (funct["(global)"]) { - error("E009"); - } else { - if (val === "true" || val === "false") { - state.option.validthis = (val === "true"); - } else { - error("E002", nt); - } - } - return; - } - - if (key === "quotmark") { - switch (val) { - case "true": - case "false": - state.option.quotmark = (val === "true"); - break; - case "double": - case "single": - state.option.quotmark = val; - break; - default: - error("E002", nt); - } - return; - } - - if (key === "unused") { - switch (val) { - case "true": - state.option.unused = true; - break; - case "false": - state.option.unused = false; - break; - case "vars": - case "strict": - state.option.unused = val; - break; - default: - error("E002", nt); - } - return; - } - - if (key === "latedef") { - switch (val) { - case "true": - state.option.latedef = true; - break; - case "false": - state.option.latedef = false; - break; - case "nofunc": - state.option.latedef = "nofunc"; - break; - default: - error("E002", nt); - } - return; - } - - var match = /^([+-])(W\d{3})$/g.exec(key); - if (match) { - // ignore for -W..., unignore for +W... - state.ignored[match[2]] = (match[1] === "-"); - return; - } - - var tn; - if (val === "true" || val === "false") { - if (nt.type === "jslint") { - tn = renamedOptions[key] || key; - state.option[tn] = (val === "true"); - - if (invertedOptions[tn] !== undefined) { - state.option[tn] = !state.option[tn]; - } - } else { - state.option[key] = (val === "true"); - } - - if (key === "newcap") { - state.option["(explicitNewcap)"] = true; - } - return; - } - - error("E002", nt); - }); - - assume(); - } - } - - // We need a peek function. If it has an argument, it peeks that much farther - // ahead. It is used to distinguish - // for ( var i in ... - // from - // for ( var i = ... - - function peek(p) { - var i = p || 0, j = 0, t; - - while (j <= i) { - t = lookahead[j]; - if (!t) { - t = lookahead[j] = lex.token(); - } - j += 1; - } - return t; - } - - // Produce the next token. It looks for programming errors. - - function advance(id, t) { - switch (state.tokens.curr.id) { - case "(number)": - if (state.tokens.next.id === ".") { - warning("W005", state.tokens.curr); - } - break; - case "-": - if (state.tokens.next.id === "-" || state.tokens.next.id === "--") { - warning("W006"); - } - break; - case "+": - if (state.tokens.next.id === "+" || state.tokens.next.id === "++") { - warning("W007"); - } - break; - } - - if (state.tokens.curr.type === "(string)" || state.tokens.curr.identifier) { - anonname = state.tokens.curr.value; - } - - if (id && state.tokens.next.id !== id) { - if (t) { - if (state.tokens.next.id === "(end)") { - error("E019", t, t.id); - } else { - error("E020", state.tokens.next, id, t.id, t.line, state.tokens.next.value); - } - } else if (state.tokens.next.type !== "(identifier)" || state.tokens.next.value !== id) { - warning("W116", state.tokens.next, id, state.tokens.next.value); - } - } - - state.tokens.prev = state.tokens.curr; - state.tokens.curr = state.tokens.next; - for (;;) { - state.tokens.next = lookahead.shift() || lex.token(); - - if (!state.tokens.next) { // No more tokens left, give up - quit("E041", state.tokens.curr.line); - } - - if (state.tokens.next.id === "(end)" || state.tokens.next.id === "(error)") { - return; - } - - if (state.tokens.next.check) { - state.tokens.next.check(); - } - - if (state.tokens.next.isSpecial) { - doOption(); - } else { - if (state.tokens.next.id !== "(endline)") { - break; - } - } - } - } - - function isInfix(token) { - return token.infix || (!token.identifier && !!token.led); - } - - function isEndOfExpr() { - var curr = state.tokens.curr; - var next = state.tokens.next; - if (next.id === ";" || next.id === "}" || next.id === ":") { - return true; - } - if (isInfix(next) === isInfix(curr) || (curr.id === "yield" && state.option.inMoz(true))) { - return curr.line !== next.line; - } - return false; - } - - // This is the heart of JSHINT, the Pratt parser. In addition to parsing, it - // is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is - // like .nud except that it is only used on the first token of a statement. - // Having .fud makes it much easier to define statement-oriented languages like - // JavaScript. I retained Pratt's nomenclature. - - // .nud Null denotation - // .fud First null denotation - // .led Left denotation - // lbp Left binding power - // rbp Right binding power - - // They are elements of the parsing method called Top Down Operator Precedence. - - function expression(rbp, initial) { - var left, isArray = false, isObject = false, isLetExpr = false; - - // if current expression is a let expression - if (!initial && state.tokens.next.value === "let" && peek(0).value === "(") { - if (!state.option.inMoz(true)) { - warning("W118", state.tokens.next, "let expressions"); - } - isLetExpr = true; - // create a new block scope we use only for the current expression - funct["(blockscope)"].stack(); - advance("let"); - advance("("); - state.syntax["let"].fud.call(state.syntax["let"].fud, false); - advance(")"); - } - - if (state.tokens.next.id === "(end)") - error("E006", state.tokens.curr); - - advance(); - - if (initial) { - anonname = "anonymous"; - funct["(verb)"] = state.tokens.curr.value; - } - - if (initial === true && state.tokens.curr.fud) { - left = state.tokens.curr.fud(); - } else { - if (state.tokens.curr.nud) { - left = state.tokens.curr.nud(); - } else { - error("E030", state.tokens.curr, state.tokens.curr.id); - } - - while (rbp < state.tokens.next.lbp && !isEndOfExpr()) { - isArray = state.tokens.curr.value === "Array"; - isObject = state.tokens.curr.value === "Object"; - - // #527, new Foo.Array(), Foo.Array(), new Foo.Object(), Foo.Object() - // Line breaks in IfStatement heads exist to satisfy the checkJSHint - // "Line too long." error. - if (left && (left.value || (left.first && left.first.value))) { - // If the left.value is not "new", or the left.first.value is a "." - // then safely assume that this is not "new Array()" and possibly - // not "new Object()"... - if (left.value !== "new" || - (left.first && left.first.value && left.first.value === ".")) { - isArray = false; - // ...In the case of Object, if the left.value and state.tokens.curr.value - // are not equal, then safely assume that this not "new Object()" - if (left.value !== state.tokens.curr.value) { - isObject = false; - } - } - } - - advance(); - - if (isArray && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { - warning("W009", state.tokens.curr); - } - - if (isObject && state.tokens.curr.id === "(" && state.tokens.next.id === ")") { - warning("W010", state.tokens.curr); - } - - if (left && state.tokens.curr.led) { - left = state.tokens.curr.led(left); - } else { - error("E033", state.tokens.curr, state.tokens.curr.id); - } - } - } - if (isLetExpr) { - funct["(blockscope)"].unstack(); - } - return left; - } - - -// Functions for conformance of style. - - function adjacent(left, right) { - left = left || state.tokens.curr; - right = right || state.tokens.next; - if (state.option.white) { - if (left.character !== right.from && left.line === right.line) { - left.from += (left.character - left.from); - warning("W011", left, left.value); - } - } - } - - function nobreak(left, right) { - left = left || state.tokens.curr; - right = right || state.tokens.next; - if (state.option.white && (left.character !== right.from || left.line !== right.line)) { - warning("W012", right, right.value); - } - } - - function nospace(left, right) { - left = left || state.tokens.curr; - right = right || state.tokens.next; - if (state.option.white && !left.comment) { - if (left.line === right.line) { - adjacent(left, right); - } - } - } - - function nonadjacent(left, right) { - if (state.option.white) { - left = left || state.tokens.curr; - right = right || state.tokens.next; - - if (left.value === ";" && right.value === ";") { - return; - } - - if (left.line === right.line && left.character === right.from) { - left.from += (left.character - left.from); - warning("W013", left, left.value); - } - } - } - - function nobreaknonadjacent(left, right) { - left = left || state.tokens.curr; - right = right || state.tokens.next; - if (!state.option.laxbreak && left.line !== right.line) { - warning("W014", right, right.value); - } else if (state.option.white) { - left = left || state.tokens.curr; - right = right || state.tokens.next; - if (left.character === right.from) { - left.from += (left.character - left.from); - warning("W013", left, left.value); - } - } - } - - function indentation(bias) { - if (!state.option.white && !state.option["(explicitIndent)"]) { - return; - } - - if (state.tokens.next.id === "(end)") { - return; - } - - var i = indent + (bias || 0); - if (state.tokens.next.from !== i) { - warning("W015", state.tokens.next, state.tokens.next.value, i, state.tokens.next.from); - } - } - - function nolinebreak(t) { - t = t || state.tokens.curr; - if (t.line !== state.tokens.next.line) { - warning("E022", t, t.value); - } - } - - function nobreakcomma(left, right) { - if (left.line !== right.line) { - if (!state.option.laxcomma) { - if (comma.first) { - warning("I001"); - comma.first = false; - } - warning("W014", left, right.value); - } - } else if (!left.comment && left.character !== right.from && state.option.white) { - left.from += (left.character - left.from); - warning("W011", left, left.value); - } - } - - function comma(opts) { - opts = opts || {}; - - if (!opts.peek) { - nobreakcomma(state.tokens.curr, state.tokens.next); - advance(","); - } else { - nobreakcomma(state.tokens.prev, state.tokens.curr); - } - - // TODO: This is a temporary solution to fight against false-positives in - // arrays and objects with trailing commas (see GH-363). The best solution - // would be to extract all whitespace rules out of parser. - - if (state.tokens.next.value !== "]" && state.tokens.next.value !== "}") { - nonadjacent(state.tokens.curr, state.tokens.next); - } - - if (state.tokens.next.identifier && !(opts.property && state.option.inES5())) { - // Keywords that cannot follow a comma operator. - switch (state.tokens.next.value) { - case "break": - case "case": - case "catch": - case "continue": - case "default": - case "do": - case "else": - case "finally": - case "for": - case "if": - case "in": - case "instanceof": - case "return": - case "switch": - case "throw": - case "try": - case "var": - case "let": - case "while": - case "with": - error("E024", state.tokens.next, state.tokens.next.value); - return false; - } - } - - if (state.tokens.next.type === "(punctuator)") { - switch (state.tokens.next.value) { - case "}": - case "]": - case ",": - if (opts.allowTrailing) { - return true; - } - - /* falls through */ - case ")": - error("E024", state.tokens.next, state.tokens.next.value); - return false; - } - } - return true; - } - - // Functional constructors for making the symbols that will be inherited by - // tokens. - - function symbol(s, p) { - var x = state.syntax[s]; - if (!x || typeof x !== "object") { - state.syntax[s] = x = { - id: s, - lbp: p, - value: s - }; - } - return x; - } - - function delim(s) { - return symbol(s, 0); - } - - function stmt(s, f) { - var x = delim(s); - x.identifier = x.reserved = true; - x.fud = f; - return x; - } - - function blockstmt(s, f) { - var x = stmt(s, f); - x.block = true; - return x; - } - - function reserveName(x) { - var c = x.id.charAt(0); - if ((c >= "a" && c <= "z") || (c >= "A" && c <= "Z")) { - x.identifier = x.reserved = true; - } - return x; - } - - function prefix(s, f) { - var x = symbol(s, 150); - reserveName(x); - x.nud = (typeof f === "function") ? f : function () { - this.right = expression(150); - this.arity = "unary"; - if (this.id === "++" || this.id === "--") { - if (state.option.plusplus) { - warning("W016", this, this.id); - } else if ((!this.right.identifier || isReserved(this.right)) && - this.right.id !== "." && this.right.id !== "[") { - warning("W017", this); - } - } - return this; - }; - return x; - } - - function type(s, f) { - var x = delim(s); - x.type = s; - x.nud = f; - return x; - } - - function reserve(name, func) { - var x = type(name, func); - x.identifier = true; - x.reserved = true; - return x; - } - - function FutureReservedWord(name, meta) { - var x = type(name, (meta && meta.nud) || function () { - return this; - }); - - meta = meta || {}; - meta.isFutureReservedWord = true; - - x.value = name; - x.identifier = true; - x.reserved = true; - x.meta = meta; - - return x; - } - - function reservevar(s, v) { - return reserve(s, function () { - if (typeof v === "function") { - v(this); - } - return this; - }); - } - - function infix(s, f, p, w) { - var x = symbol(s, p); - reserveName(x); - x.infix = true; - x.led = function (left) { - if (!w) { - nobreaknonadjacent(state.tokens.prev, state.tokens.curr); - nonadjacent(state.tokens.curr, state.tokens.next); - } - if (s === "in" && left.id === "!") { - warning("W018", left, "!"); - } - if (typeof f === "function") { - return f(left, this); - } else { - this.left = left; - this.right = expression(p); - return this; - } - }; - return x; - } - - - function application(s) { - var x = symbol(s, 42); - - x.led = function (left) { - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "arrow function syntax (=>)"); - } - - nobreaknonadjacent(state.tokens.prev, state.tokens.curr); - nonadjacent(state.tokens.curr, state.tokens.next); - - this.left = left; - this.right = doFunction(undefined, undefined, false, left); - return this; - }; - return x; - } - - function relation(s, f) { - var x = symbol(s, 100); - - x.led = function (left) { - nobreaknonadjacent(state.tokens.prev, state.tokens.curr); - nonadjacent(state.tokens.curr, state.tokens.next); - var right = expression(100); - - if (isIdentifier(left, "NaN") || isIdentifier(right, "NaN")) { - warning("W019", this); - } else if (f) { - f.apply(this, [left, right]); - } - - if (!left || !right) { - quit("E041", state.tokens.curr.line); - } - - if (left.id === "!") { - warning("W018", left, "!"); - } - - if (right.id === "!") { - warning("W018", right, "!"); - } - - this.left = left; - this.right = right; - return this; - }; - return x; - } - - function isPoorRelation(node) { - return node && - ((node.type === "(number)" && +node.value === 0) || - (node.type === "(string)" && node.value === "") || - (node.type === "null" && !state.option.eqnull) || - node.type === "true" || - node.type === "false" || - node.type === "undefined"); - } - - function assignop(s, f, p) { - var x = infix(s, typeof f === "function" ? f : function (left, that) { - that.left = left; - - if (left) { - if (predefined[left.value] === false && - scope[left.value]["(global)"] === true) { - warning("W020", left); - } else if (left["function"]) { - warning("W021", left, left.value); - } - - if (funct[left.value] === "const") { - error("E013", left, left.value); - } - - if (left.id === ".") { - if (!left.left) { - warning("E031", that); - } else if (left.left.value === "arguments" && !state.directive["use strict"]) { - warning("E031", that); - } - - that.right = expression(10); - return that; - } else if (left.id === "[") { - if (state.tokens.curr.left.first) { - state.tokens.curr.left.first.forEach(function (t) { - if (funct[t.value] === "const") { - error("E013", t, t.value); - } - }); - } else if (!left.left) { - warning("E031", that); - } else if (left.left.value === "arguments" && !state.directive["use strict"]) { - warning("E031", that); - } - that.right = expression(10); - return that; - } else if (left.identifier && !isReserved(left)) { - if (funct[left.value] === "exception") { - warning("W022", left); - } - that.right = expression(10); - return that; - } - - if (left === state.syntax["function"]) { - warning("W023", state.tokens.curr); - } - } - - error("E031", that); - }, p); - - x.exps = true; - x.assign = true; - return x; - } - - - function bitwise(s, f, p) { - var x = symbol(s, p); - reserveName(x); - x.led = (typeof f === "function") ? f : function (left) { - if (state.option.bitwise) { - warning("W016", this, this.id); - } - this.left = left; - this.right = expression(p); - return this; - }; - return x; - } - - - function bitwiseassignop(s) { - return assignop(s, function (left, that) { - if (state.option.bitwise) { - warning("W016", that, that.id); - } - nonadjacent(state.tokens.prev, state.tokens.curr); - nonadjacent(state.tokens.curr, state.tokens.next); - if (left) { - if (left.id === "." || left.id === "[" || - (left.identifier && !isReserved(left))) { - expression(10); - return that; - } - if (left === state.syntax["function"]) { - warning("W023", state.tokens.curr); - } - return that; - } - error("E031", that); - }, 20); - } - - - function suffix(s) { - var x = symbol(s, 150); - - x.led = function (left) { - if (state.option.plusplus) { - warning("W016", this, this.id); - } else if ((!left.identifier || isReserved(left)) && left.id !== "." && left.id !== "[") { - warning("W017", this); - } - - this.left = left; - return this; - }; - return x; - } - - // fnparam means that this identifier is being defined as a function - // argument (see identifier()) - // prop means that this identifier is that of an object property - - function optionalidentifier(fnparam, prop) { - if (!state.tokens.next.identifier) { - return; - } - - advance(); - - var curr = state.tokens.curr; - var val = state.tokens.curr.value; - - if (!isReserved(curr)) { - return val; - } - - if (prop) { - if (state.option.inES5()) { - return val; - } - } - - if (fnparam && val === "undefined") { - return val; - } - - // Display an info message about reserved words as properties - // and ES5 but do it only once. - if (prop && !api.getCache("displayed:I002")) { - api.setCache("displayed:I002", true); - warning("I002"); - } - - warning("W024", state.tokens.curr, state.tokens.curr.id); - return val; - } - - // fnparam means that this identifier is being defined as a function - // argument - // prop means that this identifier is that of an object property - function identifier(fnparam, prop) { - var i = optionalidentifier(fnparam, prop); - if (i) { - return i; - } - if (state.tokens.curr.id === "function" && state.tokens.next.id === "(") { - warning("W025"); - } else { - error("E030", state.tokens.next, state.tokens.next.value); - } - } - - - function reachable(s) { - var i = 0, t; - if (state.tokens.next.id !== ";" || noreach) { - return; - } - for (;;) { - do { - t = peek(i); - i += 1; - } while (t.id != "(end)" && t.id === "(comment)"); - - if (t.reach) { - return; - } - if (t.id !== "(endline)") { - if (t.id === "function") { - if (!state.option.latedef) { - break; - } - - warning("W026", t); - break; - } - - warning("W027", t, t.value, s); - break; - } - } - } - - - function statement(noindent) { - var values; - var i = indent, r, s = scope, t = state.tokens.next; - - if (t.id === ";") { - advance(";"); - return; - } - - // Is this a labelled statement? - var res = isReserved(t); - - // We're being more tolerant here: if someone uses - // a FutureReservedWord as a label, we warn but proceed - // anyway. - - if (res && t.meta && t.meta.isFutureReservedWord && peek().id === ":") { - warning("W024", t, t.id); - res = false; - } - - // detect a destructuring assignment - if (_.has(["[", "{"], t.value)) { - if (lookupBlockType().isDestAssign) { - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "destructuring expression"); - } - values = destructuringExpression(); - values.forEach(function (tok) { - isundef(funct, "W117", tok.token, tok.id); - }); - advance("="); - destructuringExpressionMatch(values, expression(10, true)); - advance(";"); - return; - } - } - if (t.identifier && !res && peek().id === ":") { - advance(); - advance(":"); - scope = Object.create(s); - addlabel(t.value, "label"); - - if (!state.tokens.next.labelled && state.tokens.next.value !== "{") { - warning("W028", state.tokens.next, t.value, state.tokens.next.value); - } - - state.tokens.next.label = t.value; - t = state.tokens.next; - } - - // Is it a lonely block? - - if (t.id === "{") { - block(true, true); - return; - } - - // Parse the statement. - - if (!noindent) { - indentation(); - } - r = expression(0, true); - - // Look for the final semicolon. - - if (!t.block) { - if (!state.option.expr && (!r || !r.exps)) { - warning("W030", state.tokens.curr); - } else if (state.option.nonew && r && r.left && r.id === "(" && r.left.id === "new") { - warning("W031", t); - } - - if (state.tokens.next.id !== ";") { - if (!state.option.asi) { - // If this is the last statement in a block that ends on - // the same line *and* option lastsemic is on, ignore the warning. - // Otherwise, complain about missing semicolon. - if (!state.option.lastsemic || state.tokens.next.id !== "}" || - state.tokens.next.line !== state.tokens.curr.line) { - warningAt("W033", state.tokens.curr.line, state.tokens.curr.character); - } - } - } else { - adjacent(state.tokens.curr, state.tokens.next); - advance(";"); - nonadjacent(state.tokens.curr, state.tokens.next); - } - } - - // Restore the indentation. - - indent = i; - scope = s; - return r; - } - - - function statements(startLine) { - var a = [], p; - - while (!state.tokens.next.reach && state.tokens.next.id !== "(end)") { - if (state.tokens.next.id === ";") { - p = peek(); - - if (!p || (p.id !== "(" && p.id !== "[")) { - warning("W032"); - } - - advance(";"); - } else { - a.push(statement(startLine === state.tokens.next.line)); - } - } - return a; - } - - - /* - * read all directives - * recognizes a simple form of asi, but always - * warns, if it is used - */ - function directives() { - var i, p, pn; - - for (;;) { - if (state.tokens.next.id === "(string)") { - p = peek(0); - if (p.id === "(endline)") { - i = 1; - do { - pn = peek(i); - i = i + 1; - } while (pn.id === "(endline)"); - - if (pn.id !== ";") { - if (pn.id !== "(string)" && pn.id !== "(number)" && - pn.id !== "(regexp)" && pn.identifier !== true && - pn.id !== "}") { - break; - } - warning("W033", state.tokens.next); - } else { - p = pn; - } - } else if (p.id === "}") { - // Directive with no other statements, warn about missing semicolon - warning("W033", p); - } else if (p.id !== ";") { - break; - } - - indentation(); - advance(); - if (state.directive[state.tokens.curr.value]) { - warning("W034", state.tokens.curr, state.tokens.curr.value); - } - - if (state.tokens.curr.value === "use strict") { - if (!state.option["(explicitNewcap)"]) - state.option.newcap = true; - state.option.undef = true; - } - - // there's no directive negation, so always set to true - state.directive[state.tokens.curr.value] = true; - - if (p.id === ";") { - advance(";"); - } - continue; - } - break; - } - } - - - /* - * Parses a single block. A block is a sequence of statements wrapped in - * braces. - * - * ordinary - true for everything but function bodies and try blocks. - * stmt - true if block can be a single statement (e.g. in if/for/while). - * isfunc - true if block is a function body - */ - function block(ordinary, stmt, isfunc, isfatarrow) { - var a, - b = inblock, - old_indent = indent, - m, - s = scope, - t, - line, - d; - - inblock = ordinary; - - if (!ordinary || !state.option.funcscope) - scope = Object.create(scope); - - nonadjacent(state.tokens.curr, state.tokens.next); - t = state.tokens.next; - - var metrics = funct["(metrics)"]; - metrics.nestedBlockDepth += 1; - metrics.verifyMaxNestedBlockDepthPerFunction(); - - if (state.tokens.next.id === "{") { - advance("{"); - - // create a new block scope - funct["(blockscope)"].stack(); - - line = state.tokens.curr.line; - if (state.tokens.next.id !== "}") { - indent += state.option.indent; - while (!ordinary && state.tokens.next.from > indent) { - indent += state.option.indent; - } - - if (isfunc) { - m = {}; - for (d in state.directive) { - if (_.has(state.directive, d)) { - m[d] = state.directive[d]; - } - } - directives(); - - if (state.option.strict && funct["(context)"]["(global)"]) { - if (!m["use strict"] && !state.directive["use strict"]) { - warning("E007"); - } - } - } - - a = statements(line); - - metrics.statementCount += a.length; - - if (isfunc) { - state.directive = m; - } - - indent -= state.option.indent; - if (line !== state.tokens.next.line) { - indentation(); - } - } else if (line !== state.tokens.next.line) { - indentation(); - } - advance("}", t); - - funct["(blockscope)"].unstack(); - - indent = old_indent; - } else if (!ordinary) { - if (isfunc) { - m = {}; - if (stmt && !isfatarrow && !state.option.inMoz(true)) { - error("W118", state.tokens.curr, "function closure expressions"); - } - - if (!stmt) { - for (d in state.directive) { - if (_.has(state.directive, d)) { - m[d] = state.directive[d]; - } - } - } - expression(10); - - if (state.option.strict && funct["(context)"]["(global)"]) { - if (!m["use strict"] && !state.directive["use strict"]) { - warning("E007"); - } - } - } else { - error("E021", state.tokens.next, "{", state.tokens.next.value); - } - } else { - - // check to avoid let declaration not within a block - funct["(nolet)"] = true; - - if (!stmt || state.option.curly) { - warning("W116", state.tokens.next, "{", state.tokens.next.value); - } - - noreach = true; - indent += state.option.indent; - // test indentation only if statement is in new line - a = [statement(state.tokens.next.line === state.tokens.curr.line)]; - indent -= state.option.indent; - noreach = false; - - delete funct["(nolet)"]; - } - funct["(verb)"] = null; - if (!ordinary || !state.option.funcscope) scope = s; - inblock = b; - if (ordinary && state.option.noempty && (!a || a.length === 0)) { - warning("W035"); - } - metrics.nestedBlockDepth -= 1; - return a; - } - - - function countMember(m) { - if (membersOnly && typeof membersOnly[m] !== "boolean") { - warning("W036", state.tokens.curr, m); - } - if (typeof member[m] === "number") { - member[m] += 1; - } else { - member[m] = 1; - } - } - - - function note_implied(tkn) { - var name = tkn.value, line = tkn.line, a = implied[name]; - if (typeof a === "function") { - a = false; - } - - if (!a) { - a = [line]; - implied[name] = a; - } else if (a[a.length - 1] !== line) { - a.push(line); - } - } - - - // Build the syntax table by declaring the syntactic elements of the language. - - type("(number)", function () { - return this; - }); - - type("(string)", function () { - return this; - }); - - state.syntax["(identifier)"] = { - type: "(identifier)", - lbp: 0, - identifier: true, - nud: function () { - var v = this.value, - s = scope[v], - f; - - if (typeof s === "function") { - // Protection against accidental inheritance. - s = undefined; - } else if (typeof s === "boolean") { - f = funct; - funct = functions[0]; - addlabel(v, "var"); - s = funct; - funct = f; - } - var block; - if (_.has(funct, "(blockscope)")) { - block = funct["(blockscope)"].getlabel(v); - } - - // The name is in scope and defined in the current function. - if (funct === s || block) { - // Change 'unused' to 'var', and reject labels. - // the name is in a block scope - switch (block ? block[v]["(type)"] : funct[v]) { - case "unused": - if (block) block[v]["(type)"] = "var"; - else funct[v] = "var"; - break; - case "unction": - if (block) block[v]["(type)"] = "function"; - else funct[v] = "function"; - this["function"] = true; - break; - case "function": - this["function"] = true; - break; - case "label": - warning("W037", state.tokens.curr, v); - break; - } - } else if (funct["(global)"]) { - // The name is not defined in the function. If we are in the global - // scope, then we have an undefined variable. - // - // Operators typeof and delete do not raise runtime errors even if - // the base object of a reference is null so no need to display warning - // if we're inside of typeof or delete. - - if (typeof predefined[v] !== "boolean") { - // Attempting to subscript a null reference will throw an - // error, even within the typeof and delete operators - if (!(anonname === "typeof" || anonname === "delete") || - (state.tokens.next && (state.tokens.next.value === "." || - state.tokens.next.value === "["))) { - - // if we're in a list comprehension, variables are declared - // locally and used before being defined. So we check - // the presence of the given variable in the comp array - // before declaring it undefined. - - if (!funct["(comparray)"].check(v)) { - isundef(funct, "W117", state.tokens.curr, v); - } - } - } - - note_implied(state.tokens.curr); - } else { - // If the name is already defined in the current - // function, but not as outer, then there is a scope error. - - switch (funct[v]) { - case "closure": - case "function": - case "var": - case "unused": - warning("W038", state.tokens.curr, v); - break; - case "label": - warning("W037", state.tokens.curr, v); - break; - case "outer": - case "global": - break; - default: - // If the name is defined in an outer function, make an outer entry, - // and if it was unused, make it var. - if (s === true) { - funct[v] = true; - } else if (s === null) { - warning("W039", state.tokens.curr, v); - note_implied(state.tokens.curr); - } else if (typeof s !== "object") { - // Operators typeof and delete do not raise runtime errors even - // if the base object of a reference is null so no need to - // - // display warning if we're inside of typeof or delete. - // Attempting to subscript a null reference will throw an - // error, even within the typeof and delete operators - if (!(anonname === "typeof" || anonname === "delete") || - (state.tokens.next && - (state.tokens.next.value === "." || state.tokens.next.value === "["))) { - - isundef(funct, "W117", state.tokens.curr, v); - } - funct[v] = true; - note_implied(state.tokens.curr); - } else { - switch (s[v]) { - case "function": - case "unction": - this["function"] = true; - s[v] = "closure"; - funct[v] = s["(global)"] ? "global" : "outer"; - break; - case "var": - case "unused": - s[v] = "closure"; - funct[v] = s["(global)"] ? "global" : "outer"; - break; - case "closure": - funct[v] = s["(global)"] ? "global" : "outer"; - break; - case "label": - warning("W037", state.tokens.curr, v); - } - } - } - } - return this; - }, - led: function () { - error("E033", state.tokens.next, state.tokens.next.value); - } - }; - - type("(regexp)", function () { - return this; - }); - - // ECMAScript parser - - delim("(endline)"); - delim("(begin)"); - delim("(end)").reach = true; - delim("(error)").reach = true; - delim("}").reach = true; - delim(")"); - delim("]"); - delim("\"").reach = true; - delim("'").reach = true; - delim(";"); - delim(":").reach = true; - delim("#"); - - reserve("else"); - reserve("case").reach = true; - reserve("catch"); - reserve("default").reach = true; - reserve("finally"); - reservevar("arguments", function (x) { - if (state.directive["use strict"] && funct["(global)"]) { - warning("E008", x); - } - }); - reservevar("eval"); - reservevar("false"); - reservevar("Infinity"); - reservevar("null"); - reservevar("this", function (x) { - if (state.directive["use strict"] && !state.option.validthis && ((funct["(statement)"] && - funct["(name)"].charAt(0) > "Z") || funct["(global)"])) { - warning("W040", x); - } - }); - reservevar("true"); - reservevar("undefined"); - - assignop("=", "assign", 20); - assignop("+=", "assignadd", 20); - assignop("-=", "assignsub", 20); - assignop("*=", "assignmult", 20); - assignop("/=", "assigndiv", 20).nud = function () { - error("E014"); - }; - assignop("%=", "assignmod", 20); - - bitwiseassignop("&=", "assignbitand", 20); - bitwiseassignop("|=", "assignbitor", 20); - bitwiseassignop("^=", "assignbitxor", 20); - bitwiseassignop("<<=", "assignshiftleft", 20); - bitwiseassignop(">>=", "assignshiftright", 20); - bitwiseassignop(">>>=", "assignshiftrightunsigned", 20); - infix(",", function (left, that) { - var expr; - that.exprs = [left]; - if (!comma({peek: true})) { - return that; - } - while (true) { - if (!(expr = expression(10))) { - break; - } - that.exprs.push(expr); - if (state.tokens.next.value !== "," || !comma()) { - break; - } - } - return that; - }, 10, true); - - infix("?", function (left, that) { - increaseComplexityCount(); - that.left = left; - that.right = expression(10); - advance(":"); - that["else"] = expression(10); - return that; - }, 30); - - var orPrecendence = 40; - infix("||", function (left, that) { - increaseComplexityCount(); - that.left = left; - that.right = expression(orPrecendence); - return that; - }, orPrecendence); - infix("&&", "and", 50); - bitwise("|", "bitor", 70); - bitwise("^", "bitxor", 80); - bitwise("&", "bitand", 90); - relation("==", function (left, right) { - var eqnull = state.option.eqnull && (left.value === "null" || right.value === "null"); - - if (!eqnull && state.option.eqeqeq) - warning("W116", this, "===", "=="); - else if (isPoorRelation(left)) - warning("W041", this, "===", left.value); - else if (isPoorRelation(right)) - warning("W041", this, "===", right.value); - - return this; - }); - relation("==="); - relation("!=", function (left, right) { - var eqnull = state.option.eqnull && - (left.value === "null" || right.value === "null"); - - if (!eqnull && state.option.eqeqeq) { - warning("W116", this, "!==", "!="); - } else if (isPoorRelation(left)) { - warning("W041", this, "!==", left.value); - } else if (isPoorRelation(right)) { - warning("W041", this, "!==", right.value); - } - return this; - }); - relation("!=="); - relation("<"); - relation(">"); - relation("<="); - relation(">="); - bitwise("<<", "shiftleft", 120); - bitwise(">>", "shiftright", 120); - bitwise(">>>", "shiftrightunsigned", 120); - infix("in", "in", 120); - infix("instanceof", "instanceof", 120); - infix("+", function (left, that) { - var right = expression(130); - if (left && right && left.id === "(string)" && right.id === "(string)") { - left.value += right.value; - left.character = right.character; - if (!state.option.scripturl && reg.javascriptURL.test(left.value)) { - warning("W050", left); - } - return left; - } - that.left = left; - that.right = right; - return that; - }, 130); - prefix("+", "num"); - prefix("+++", function () { - warning("W007"); - this.right = expression(150); - this.arity = "unary"; - return this; - }); - infix("+++", function (left) { - warning("W007"); - this.left = left; - this.right = expression(130); - return this; - }, 130); - infix("-", "sub", 130); - prefix("-", "neg"); - prefix("---", function () { - warning("W006"); - this.right = expression(150); - this.arity = "unary"; - return this; - }); - infix("---", function (left) { - warning("W006"); - this.left = left; - this.right = expression(130); - return this; - }, 130); - infix("*", "mult", 140); - infix("/", "div", 140); - infix("%", "mod", 140); - - suffix("++", "postinc"); - prefix("++", "preinc"); - state.syntax["++"].exps = true; - - suffix("--", "postdec"); - prefix("--", "predec"); - state.syntax["--"].exps = true; - prefix("delete", function () { - var p = expression(10); - if (!p || (p.id !== "." && p.id !== "[")) { - warning("W051"); - } - this.first = p; - return this; - }).exps = true; - - prefix("~", function () { - if (state.option.bitwise) { - warning("W052", this, "~"); - } - expression(150); - return this; - }); - - prefix("...", function () { - if (!state.option.inESNext()) { - warning("W104", this, "spread/rest operator"); - } - if (!state.tokens.next.identifier) { - error("E030", state.tokens.next, state.tokens.next.value); - } - expression(150); - return this; - }); - - prefix("!", function () { - this.right = expression(150); - this.arity = "unary"; - - if (!this.right) { // '!' followed by nothing? Give up. - quit("E041", this.line || 0); - } - - if (bang[this.right.id] === true) { - warning("W018", this, "!"); - } - return this; - }); - - prefix("typeof", "typeof"); - prefix("new", function () { - var c = expression(155), i; - if (c && c.id !== "function") { - if (c.identifier) { - c["new"] = true; - switch (c.value) { - case "Number": - case "String": - case "Boolean": - case "Math": - case "JSON": - warning("W053", state.tokens.prev, c.value); - break; - case "Function": - if (!state.option.evil) { - warning("W054"); - } - break; - case "Date": - case "RegExp": - break; - default: - if (c.id !== "function") { - i = c.value.substr(0, 1); - if (state.option.newcap && (i < "A" || i > "Z") && !_.has(global, c.value)) { - warning("W055", state.tokens.curr); - } - } - } - } else { - if (c.id !== "." && c.id !== "[" && c.id !== "(") { - warning("W056", state.tokens.curr); - } - } - } else { - if (!state.option.supernew) - warning("W057", this); - } - adjacent(state.tokens.curr, state.tokens.next); - if (state.tokens.next.id !== "(" && !state.option.supernew) { - warning("W058", state.tokens.curr, state.tokens.curr.value); - } - this.first = c; - return this; - }); - state.syntax["new"].exps = true; - - prefix("void").exps = true; - - infix(".", function (left, that) { - adjacent(state.tokens.prev, state.tokens.curr); - nobreak(); - var m = identifier(false, true); - - if (typeof m === "string") { - countMember(m); - } - - that.left = left; - that.right = m; - - if (m && m === "hasOwnProperty" && state.tokens.next.value === "=") { - warning("W001"); - } - - if (left && left.value === "arguments" && (m === "callee" || m === "caller")) { - if (state.option.noarg) - warning("W059", left, m); - else if (state.directive["use strict"]) - error("E008"); - } else if (!state.option.evil && left && left.value === "document" && - (m === "write" || m === "writeln")) { - warning("W060", left); - } - - if (!state.option.evil && (m === "eval" || m === "execScript")) { - warning("W061"); - } - - return that; - }, 160, true); - - infix("(", function (left, that) { - if (state.tokens.prev.id !== "}" && state.tokens.prev.id !== ")") { - nobreak(state.tokens.prev, state.tokens.curr); - } - - nospace(); - if (state.option.immed && left && !left.immed && left.id === "function") { - warning("W062"); - } - - var n = 0; - var p = []; - - if (left) { - if (left.type === "(identifier)") { - if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { - if ("Number String Boolean Date Object".indexOf(left.value) === -1) { - if (left.value === "Math") { - warning("W063", left); - } else if (state.option.newcap) { - warning("W064", left); - } - } - } - } - } - - if (state.tokens.next.id !== ")") { - for (;;) { - p[p.length] = expression(10); - n += 1; - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - } - - advance(")"); - nospace(state.tokens.prev, state.tokens.curr); - - if (typeof left === "object") { - if (left.value === "parseInt" && n === 1) { - warning("W065", state.tokens.curr); - } - if (!state.option.evil) { - if (left.value === "eval" || left.value === "Function" || - left.value === "execScript") { - warning("W061", left); - - if (p[0] && [0].id === "(string)") { - addInternalSrc(left, p[0].value); - } - } else if (p[0] && p[0].id === "(string)" && - (left.value === "setTimeout" || - left.value === "setInterval")) { - warning("W066", left); - addInternalSrc(left, p[0].value); - - // window.setTimeout/setInterval - } else if (p[0] && p[0].id === "(string)" && - left.value === "." && - left.left.value === "window" && - (left.right === "setTimeout" || - left.right === "setInterval")) { - warning("W066", left); - addInternalSrc(left, p[0].value); - } - } - if (!left.identifier && left.id !== "." && left.id !== "[" && - left.id !== "(" && left.id !== "&&" && left.id !== "||" && - left.id !== "?") { - warning("W067", left); - } - } - - that.left = left; - return that; - }, 155, true).exps = true; - - prefix("(", function () { - nospace(); - var bracket, brackets = []; - var pn, pn1, i = 0; - var ret; - - do { - pn = peek(i); - i += 1; - pn1 = peek(i); - i += 1; - } while (pn.value !== ")" && pn1.value !== "=>" && pn1.value !== ";" && pn1.type !== "(end)"); - - if (state.tokens.next.id === "function") { - state.tokens.next.immed = true; - } - - var exprs = []; - - if (state.tokens.next.id !== ")") { - for (;;) { - if (pn1.value === "=>" && state.tokens.next.value === "{") { - bracket = state.tokens.next; - bracket.left = destructuringExpression(); - brackets.push(bracket); - for (var t in bracket.left) { - exprs.push(bracket.left[t].token); - } - } else { - exprs.push(expression(10)); - } - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - } - - advance(")", this); - nospace(state.tokens.prev, state.tokens.curr); - if (state.option.immed && exprs[0] && exprs[0].id === "function") { - if (state.tokens.next.id !== "(" && - (state.tokens.next.id !== "." || (peek().value !== "call" && peek().value !== "apply"))) { - warning("W068", this); - } - } - - if (state.tokens.next.value === "=>") { - return exprs; - } - if (!exprs.length) { - return; - } - if (exprs.length > 1) { - ret = Object.create(state.syntax[","]); - ret.exprs = exprs; - } else { - ret = exprs[0]; - } - if (ret) { - ret.paren = true; - } - return ret; - }); - - application("=>"); - - infix("[", function (left, that) { - nobreak(state.tokens.prev, state.tokens.curr); - nospace(); - var e = expression(10), s; - if (e && e.type === "(string)") { - if (!state.option.evil && (e.value === "eval" || e.value === "execScript")) { - warning("W061", that); - } - - countMember(e.value); - if (!state.option.sub && reg.identifier.test(e.value)) { - s = state.syntax[e.value]; - if (!s || !isReserved(s)) { - warning("W069", state.tokens.prev, e.value); - } - } - } - advance("]", that); - - if (e && e.value === "hasOwnProperty" && state.tokens.next.value === "=") { - warning("W001"); - } - - nospace(state.tokens.prev, state.tokens.curr); - that.left = left; - that.right = e; - return that; - }, 160, true); - - function comprehensiveArrayExpression() { - var res = {}; - res.exps = true; - funct["(comparray)"].stack(); - - // Handle reversed for expressions, used in spidermonkey - var reversed = false; - if (state.tokens.next.value !== "for") { - reversed = true; - if (!state.option.inMoz(true)) { - warning("W116", state.tokens.next, "for", state.tokens.next.value); - } - funct["(comparray)"].setState("use"); - res.right = expression(10); - } - - advance("for"); - if (state.tokens.next.value === "each") { - advance("each"); - if (!state.option.inMoz(true)) { - warning("W118", state.tokens.curr, "for each"); - } - } - advance("("); - funct["(comparray)"].setState("define"); - res.left = expression(130); - if (_.contains(["in", "of"], state.tokens.next.value)) { - advance(); - } else { - error("E045", state.tokens.curr); - } - funct["(comparray)"].setState("generate"); - expression(10); - - advance(")"); - if (state.tokens.next.value === "if") { - advance("if"); - advance("("); - funct["(comparray)"].setState("filter"); - res.filter = expression(10); - advance(")"); - } - - if (!reversed) { - funct["(comparray)"].setState("use"); - res.right = expression(10); - } - - advance("]"); - funct["(comparray)"].unstack(); - return res; - } - - prefix("[", function () { - var blocktype = lookupBlockType(true); - if (blocktype.isCompArray) { - if (!state.option.inESNext()) { - warning("W119", state.tokens.curr, "array comprehension"); - } - return comprehensiveArrayExpression(); - } else if (blocktype.isDestAssign && !state.option.inESNext()) { - warning("W104", state.tokens.curr, "destructuring assignment"); - } - var b = state.tokens.curr.line !== state.tokens.next.line; - this.first = []; - if (b) { - indent += state.option.indent; - if (state.tokens.next.from === indent + state.option.indent) { - indent += state.option.indent; - } - } - while (state.tokens.next.id !== "(end)") { - while (state.tokens.next.id === ",") { - if (!state.option.inES5()) - warning("W070"); - advance(","); - } - if (state.tokens.next.id === "]") { - break; - } - if (b && state.tokens.curr.line !== state.tokens.next.line) { - indentation(); - } - this.first.push(expression(10)); - if (state.tokens.next.id === ",") { - comma({ allowTrailing: true }); - if (state.tokens.next.id === "]" && !state.option.inES5(true)) { - warning("W070", state.tokens.curr); - break; - } - } else { - break; - } - } - if (b) { - indent -= state.option.indent; - indentation(); - } - advance("]", this); - return this; - }, 160); - - - function property_name() { - var id = optionalidentifier(false, true); - - if (!id) { - if (state.tokens.next.id === "(string)") { - id = state.tokens.next.value; - advance(); - } else if (state.tokens.next.id === "(number)") { - id = state.tokens.next.value.toString(); - advance(); - } - } - - if (id === "hasOwnProperty") { - warning("W001"); - } - - return id; - } - - - function functionparams(parsed) { - var curr, next; - var params = []; - var ident; - var tokens = []; - var t; - var pastDefault = false; - - if (parsed) { - if (parsed instanceof Array) { - for (var i in parsed) { - curr = parsed[i]; - if (_.contains(["{", "["], curr.id)) { - for (t in curr.left) { - t = tokens[t]; - if (t.id) { - params.push(t.id); - addlabel(t.id, "unused", t.token); - } - } - } else if (curr.value === "...") { - if (!state.option.inESNext()) { - warning("W104", curr, "spread/rest operator"); - } - continue; - } else { - addlabel(curr.value, "unused", curr); - } - } - return params; - } else { - if (parsed.identifier === true) { - addlabel(parsed.value, "unused", parsed); - return [parsed]; - } - } - } - - next = state.tokens.next; - - advance("("); - nospace(); - - if (state.tokens.next.id === ")") { - advance(")"); - return; - } - - for (;;) { - if (_.contains(["{", "["], state.tokens.next.id)) { - tokens = destructuringExpression(); - for (t in tokens) { - t = tokens[t]; - if (t.id) { - params.push(t.id); - addlabel(t.id, "unused", t.token); - } - } - } else if (state.tokens.next.value === "...") { - if (!state.option.inESNext()) { - warning("W104", state.tokens.next, "spread/rest operator"); - } - advance("..."); - nospace(); - ident = identifier(true); - params.push(ident); - addlabel(ident, "unused", state.tokens.curr); - } else { - ident = identifier(true); - params.push(ident); - addlabel(ident, "unused", state.tokens.curr); - } - - // it is a syntax error to have a regular argument after a default argument - if (pastDefault) { - if (state.tokens.next.id !== "=") { - error("E051", state.tokens.current); - } - } - if (state.tokens.next.id === "=") { - if (!state.option.inESNext()) { - warning("W119", state.tokens.next, "default parameters"); - } - advance("="); - pastDefault = true; - expression(10); - } - if (state.tokens.next.id === ",") { - comma(); - } else { - advance(")", next); - nospace(state.tokens.prev, state.tokens.curr); - return params; - } - } - } - - - function doFunction(name, statement, generator, fatarrowparams) { - var f; - var oldOption = state.option; - var oldIgnored = state.ignored; - var oldScope = scope; - - state.option = Object.create(state.option); - state.ignored = Object.create(state.ignored); - scope = Object.create(scope); - - funct = { - "(name)" : name || "\"" + anonname + "\"", - "(line)" : state.tokens.next.line, - "(character)" : state.tokens.next.character, - "(context)" : funct, - "(breakage)" : 0, - "(loopage)" : 0, - "(metrics)" : createMetrics(state.tokens.next), - "(scope)" : scope, - "(statement)" : statement, - "(tokens)" : {}, - "(blockscope)": funct["(blockscope)"], - "(comparray)" : funct["(comparray)"] - }; - - if (generator) { - funct["(generator)"] = true; - } - - f = funct; - state.tokens.curr.funct = funct; - - functions.push(funct); - - if (name) { - addlabel(name, "function"); - } - - funct["(params)"] = functionparams(fatarrowparams); - funct["(metrics)"].verifyMaxParametersPerFunction(funct["(params)"]); - - block(false, true, true, fatarrowparams ? true:false); - - if (generator && funct["(generator)"] !== "yielded") { - error("E047", state.tokens.curr); - } - - funct["(metrics)"].verifyMaxStatementsPerFunction(); - funct["(metrics)"].verifyMaxComplexityPerFunction(); - funct["(unusedOption)"] = state.option.unused; - - scope = oldScope; - state.option = oldOption; - state.ignored = oldIgnored; - funct["(last)"] = state.tokens.curr.line; - funct["(lastcharacter)"] = state.tokens.curr.character; - funct = funct["(context)"]; - - return f; - } - - function createMetrics(functionStartToken) { - return { - statementCount: 0, - nestedBlockDepth: -1, - ComplexityCount: 1, - - verifyMaxStatementsPerFunction: function () { - if (state.option.maxstatements && - this.statementCount > state.option.maxstatements) { - warning("W071", functionStartToken, this.statementCount); - } - }, - - verifyMaxParametersPerFunction: function (params) { - params = params || []; - - if (state.option.maxparams && params.length > state.option.maxparams) { - warning("W072", functionStartToken, params.length); - } - }, - - verifyMaxNestedBlockDepthPerFunction: function () { - if (state.option.maxdepth && - this.nestedBlockDepth > 0 && - this.nestedBlockDepth === state.option.maxdepth + 1) { - warning("W073", null, this.nestedBlockDepth); - } - }, - - verifyMaxComplexityPerFunction: function () { - var max = state.option.maxcomplexity; - var cc = this.ComplexityCount; - if (max && cc > max) { - warning("W074", functionStartToken, cc); - } - } - }; - } - - function increaseComplexityCount() { - funct["(metrics)"].ComplexityCount += 1; - } - - // Parse assignments that were found instead of conditionals. - // For example: if (a = 1) { ... } - - function checkCondAssignment(expr) { - var id, paren; - if (expr) { - id = expr.id; - paren = expr.paren; - if (id === "," && (expr = expr.exprs[expr.exprs.length - 1])) { - id = expr.id; - paren = paren || expr.paren; - } - } - switch (id) { - case "=": - case "+=": - case "-=": - case "*=": - case "%=": - case "&=": - case "|=": - case "^=": - case "/=": - if (!paren && !state.option.boss) { - warning("W084"); - } - } - } - - - (function (x) { - x.nud = function (isclassdef) { - var b, f, i, p, t, g; - var props = {}; // All properties, including accessors - var tag = ""; - - function saveProperty(name, tkn) { - if (props[name] && _.has(props, name)) - warning("W075", state.tokens.next, i); - else - props[name] = {}; - - props[name].basic = true; - props[name].basictkn = tkn; - } - - function saveSetter(name, tkn) { - if (props[name] && _.has(props, name)) { - if (props[name].basic || props[name].setter) - warning("W075", state.tokens.next, i); - } else { - props[name] = {}; - } - - props[name].setter = true; - props[name].setterToken = tkn; - } - - function saveGetter(name) { - if (props[name] && _.has(props, name)) { - if (props[name].basic || props[name].getter) - warning("W075", state.tokens.next, i); - } else { - props[name] = {}; - } - - props[name].getter = true; - props[name].getterToken = state.tokens.curr; - } - - b = state.tokens.curr.line !== state.tokens.next.line; - if (b) { - indent += state.option.indent; - if (state.tokens.next.from === indent + state.option.indent) { - indent += state.option.indent; - } - } - - for (;;) { - if (state.tokens.next.id === "}") { - break; - } - - if (b) { - indentation(); - } - - if (isclassdef && state.tokens.next.value === "static") { - advance("static"); - tag = "static "; - } - - if (state.tokens.next.value === "get" && peek().id !== ":") { - advance("get"); - - if (!state.option.inES5(!isclassdef)) { - error("E034"); - } - - i = property_name(); - if (!i) { - error("E035"); - } - - // It is a Syntax Error if PropName of MethodDefinition is - // "constructor" and SpecialMethod of MethodDefinition is true. - if (isclassdef && i === "constructor") { - error("E049", state.tokens.next, "class getter method", i); - } - - saveGetter(tag + i); - t = state.tokens.next; - adjacent(state.tokens.curr, state.tokens.next); - f = doFunction(); - p = f["(params)"]; - - if (p) { - warning("W076", t, p[0], i); - } - - adjacent(state.tokens.curr, state.tokens.next); - } else if (state.tokens.next.value === "set" && peek().id !== ":") { - advance("set"); - - if (!state.option.inES5(!isclassdef)) { - error("E034"); - } - - i = property_name(); - if (!i) { - error("E035"); - } - - // It is a Syntax Error if PropName of MethodDefinition is - // "constructor" and SpecialMethod of MethodDefinition is true. - if (isclassdef && i === "constructor") { - error("E049", state.tokens.next, "class setter method", i); - } - - saveSetter(tag + i, state.tokens.next); - t = state.tokens.next; - adjacent(state.tokens.curr, state.tokens.next); - f = doFunction(); - p = f["(params)"]; - - if (!p || p.length !== 1) { - warning("W077", t, i); - } - } else { - g = false; - if (state.tokens.next.value === "*" && state.tokens.next.type === "(punctuator)") { - if (!state.option.inESNext()) { - warning("W104", state.tokens.next, "generator functions"); - } - advance("*"); - g = true; - } - i = property_name(); - saveProperty(tag + i, state.tokens.next); - - if (typeof i !== "string") { - break; - } - - if (state.tokens.next.value === "(") { - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "concise methods"); - } - doFunction(i, undefined, g); - } else if (!isclassdef) { - advance(":"); - nonadjacent(state.tokens.curr, state.tokens.next); - expression(10); - } - } - // It is a Syntax Error if PropName of MethodDefinition is "prototype". - if (isclassdef && i === "prototype") { - error("E049", state.tokens.next, "class method", i); - } - - countMember(i); - if (isclassdef) { - tag = ""; - continue; - } - if (state.tokens.next.id === ",") { - comma({ allowTrailing: true, property: true }); - if (state.tokens.next.id === ",") { - warning("W070", state.tokens.curr); - } else if (state.tokens.next.id === "}" && !state.option.inES5(true)) { - warning("W070", state.tokens.curr); - } - } else { - break; - } - } - if (b) { - indent -= state.option.indent; - indentation(); - } - advance("}", this); - - // Check for lonely setters if in the ES5 mode. - if (state.option.inES5()) { - for (var name in props) { - if (_.has(props, name) && props[name].setter && !props[name].getter) { - warning("W078", props[name].setterToken); - } - } - } - return this; - }; - x.fud = function () { - error("E036", state.tokens.curr); - }; - }(delim("{"))); - - function destructuringExpression() { - var id, ids; - var identifiers = []; - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "destructuring expression"); - } - var nextInnerDE = function () { - var ident; - if (_.contains(["[", "{"], state.tokens.next.value)) { - ids = destructuringExpression(); - for (var id in ids) { - id = ids[id]; - identifiers.push({ id: id.id, token: id.token }); - } - } else if (state.tokens.next.value === ",") { - identifiers.push({ id: null, token: state.tokens.curr }); - } else { - ident = identifier(); - if (ident) - identifiers.push({ id: ident, token: state.tokens.curr }); - } - }; - if (state.tokens.next.value === "[") { - advance("["); - nextInnerDE(); - while (state.tokens.next.value !== "]") { - advance(","); - nextInnerDE(); - } - advance("]"); - } else if (state.tokens.next.value === "{") { - advance("{"); - id = identifier(); - if (state.tokens.next.value === ":") { - advance(":"); - nextInnerDE(); - } else { - identifiers.push({ id: id, token: state.tokens.curr }); - } - while (state.tokens.next.value !== "}") { - advance(","); - id = identifier(); - if (state.tokens.next.value === ":") { - advance(":"); - nextInnerDE(); - } else { - identifiers.push({ id: id, token: state.tokens.curr }); - } - } - advance("}"); - } - return identifiers; - } - function destructuringExpressionMatch(tokens, value) { - if (value.first) { - _.zip(tokens, value.first).forEach(function (val) { - var token = val[0]; - var value = val[1]; - if (token && value) { - token.first = value; - } else if (token && token.first && !value) { - warning("W080", token.first, token.first.value); - } /* else { - XXX value is discarded: wouldn't it need a warning ? - } */ - }); - } - } - - var conststatement = stmt("const", function (prefix) { - var tokens, value; - // state variable to know if it is a lone identifier, or a destructuring statement. - var lone; - - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "const"); - } - - this.first = []; - for (;;) { - var names = []; - nonadjacent(state.tokens.curr, state.tokens.next); - if (_.contains(["{", "["], state.tokens.next.value)) { - tokens = destructuringExpression(); - lone = false; - } else { - tokens = [ { id: identifier(), token: state.tokens.curr } ]; - lone = true; - } - for (var t in tokens) { - t = tokens[t]; - if (funct[t.id] === "const") { - warning("E011", null, t.id); - } - if (funct["(global)"] && predefined[t.id] === false) { - warning("W079", t.token, t.id); - } - if (t.id) { - addlabel(t.id, "const"); - names.push(t.token); - } - } - if (prefix) { - break; - } - - this.first = this.first.concat(names); - - if (state.tokens.next.id !== "=") { - warning("E012", state.tokens.curr, state.tokens.curr.value); - } - - if (state.tokens.next.id === "=") { - nonadjacent(state.tokens.curr, state.tokens.next); - advance("="); - nonadjacent(state.tokens.curr, state.tokens.next); - if (state.tokens.next.id === "undefined") { - warning("W080", state.tokens.prev, state.tokens.prev.value); - } - if (peek(0).id === "=" && state.tokens.next.identifier) { - warning("W120", state.tokens.next, state.tokens.next.value); - } - value = expression(10); - if (lone) { - tokens[0].first = value; - } else { - destructuringExpressionMatch(names, value); - } - } - - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - return this; - }); - conststatement.exps = true; - var varstatement = stmt("var", function (prefix) { - // JavaScript does not have block scope. It only has function scope. So, - // declaring a variable in a block can have unexpected consequences. - var tokens, lone, value; - - if (funct["(onevar)"] && state.option.onevar) { - warning("W081"); - } else if (!funct["(global)"]) { - funct["(onevar)"] = true; - } - - this.first = []; - for (;;) { - var names = []; - nonadjacent(state.tokens.curr, state.tokens.next); - if (_.contains(["{", "["], state.tokens.next.value)) { - tokens = destructuringExpression(); - lone = false; - } else { - tokens = [ { id: identifier(), token: state.tokens.curr } ]; - lone = true; - } - for (var t in tokens) { - t = tokens[t]; - if (state.option.inESNext() && funct[t.id] === "const") { - warning("E011", null, t.id); - } - if (funct["(global)"] && predefined[t.id] === false) { - warning("W079", t.token, t.id); - } - if (t.id) { - addlabel(t.id, "unused", t.token); - names.push(t.token); - } - } - if (prefix) { - break; - } - - this.first = this.first.concat(names); - - if (state.tokens.next.id === "=") { - nonadjacent(state.tokens.curr, state.tokens.next); - advance("="); - nonadjacent(state.tokens.curr, state.tokens.next); - if (state.tokens.next.id === "undefined") { - warning("W080", state.tokens.prev, state.tokens.prev.value); - } - if (peek(0).id === "=" && state.tokens.next.identifier) { - warning("W120", state.tokens.next, state.tokens.next.value); - } - value = expression(10); - if (lone) { - tokens[0].first = value; - } else { - destructuringExpressionMatch(names, value); - } - } - - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - return this; - }); - varstatement.exps = true; - var letstatement = stmt("let", function (prefix) { - var tokens, lone, value, letblock; - - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "let"); - } - - if (state.tokens.next.value === "(") { - if (!state.option.inMoz(true)) { - warning("W118", state.tokens.next, "let block"); - } - advance("("); - funct["(blockscope)"].stack(); - letblock = true; - } else if (funct["(nolet)"]) { - error("E048", state.tokens.curr); - } - - if (funct["(onevar)"] && state.option.onevar) { - warning("W081"); - } else if (!funct["(global)"]) { - funct["(onevar)"] = true; - } - - this.first = []; - for (;;) { - var names = []; - nonadjacent(state.tokens.curr, state.tokens.next); - if (_.contains(["{", "["], state.tokens.next.value)) { - tokens = destructuringExpression(); - lone = false; - } else { - tokens = [ { id: identifier(), token: state.tokens.curr.value } ]; - lone = true; - } - for (var t in tokens) { - t = tokens[t]; - if (state.option.inESNext() && funct[t.id] === "const") { - warning("E011", null, t.id); - } - if (funct["(global)"] && predefined[t.id] === false) { - warning("W079", t.token, t.id); - } - if (t.id && !funct["(nolet)"]) { - addlabel(t.id, "unused", t.token, true); - names.push(t.token); - } - } - if (prefix) { - break; - } - - this.first = this.first.concat(names); - - if (state.tokens.next.id === "=") { - nonadjacent(state.tokens.curr, state.tokens.next); - advance("="); - nonadjacent(state.tokens.curr, state.tokens.next); - if (state.tokens.next.id === "undefined") { - warning("W080", state.tokens.prev, state.tokens.prev.value); - } - if (peek(0).id === "=" && state.tokens.next.identifier) { - warning("W120", state.tokens.next, state.tokens.next.value); - } - value = expression(10); - if (lone) { - tokens[0].first = value; - } else { - destructuringExpressionMatch(names, value); - } - } - - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - if (letblock) { - advance(")"); - block(true, true); - this.block = true; - funct["(blockscope)"].unstack(); - } - - return this; - }); - letstatement.exps = true; - - blockstmt("class", function () { - return classdef.call(this, true); - }); - - function classdef(stmt) { - /*jshint validthis:true */ - if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "class"); - } - if (stmt) { - // BindingIdentifier - this.name = identifier(); - addlabel(this.name, "unused", state.tokens.curr); - } else if (state.tokens.next.identifier && state.tokens.next.value !== "extends") { - // BindingIdentifier(opt) - this.name = identifier(); - } - classtail(this); - return this; - } - - function classtail(c) { - var strictness = state.directive["use strict"]; - - // ClassHeritage(opt) - if (state.tokens.next.value === "extends") { - advance("extends"); - c.heritage = expression(10); - } - - // A ClassBody is always strict code. - state.directive["use strict"] = true; - advance("{"); - // ClassBody(opt) - c.body = state.syntax["{"].nud(true); - state.directive["use strict"] = strictness; - } - - blockstmt("function", function () { - var generator = false; - if (state.tokens.next.value === "*") { - advance("*"); - if (state.option.inESNext(true)) { - generator = true; - } else { - warning("W119", state.tokens.curr, "function*"); - } - } - if (inblock) { - warning("W082", state.tokens.curr); - - } - var i = identifier(); - if (funct[i] === "const") { - warning("E011", null, i); - } - adjacent(state.tokens.curr, state.tokens.next); - addlabel(i, "unction", state.tokens.curr); - - doFunction(i, { statement: true }, generator); - if (state.tokens.next.id === "(" && state.tokens.next.line === state.tokens.curr.line) { - error("E039"); - } - return this; - }); - - prefix("function", function () { - var generator = false; - if (state.tokens.next.value === "*") { - if (!state.option.inESNext()) { - warning("W119", state.tokens.curr, "function*"); - } - advance("*"); - generator = true; - } - var i = optionalidentifier(); - if (i || state.option.gcl) { - adjacent(state.tokens.curr, state.tokens.next); - } else { - nonadjacent(state.tokens.curr, state.tokens.next); - } - doFunction(i, undefined, generator); - if (!state.option.loopfunc && funct["(loopage)"]) { - warning("W083"); - } - return this; - }); - - blockstmt("if", function () { - var t = state.tokens.next; - increaseComplexityCount(); - state.condition = true; - advance("("); - nonadjacent(this, t); - nospace(); - checkCondAssignment(expression(0)); - advance(")", t); - state.condition = false; - nospace(state.tokens.prev, state.tokens.curr); - block(true, true); - if (state.tokens.next.id === "else") { - nonadjacent(state.tokens.curr, state.tokens.next); - advance("else"); - if (state.tokens.next.id === "if" || state.tokens.next.id === "switch") { - statement(true); - } else { - block(true, true); - } - } - return this; - }); - - blockstmt("try", function () { - var b; - - function doCatch() { - var oldScope = scope; - var e; - - advance("catch"); - nonadjacent(state.tokens.curr, state.tokens.next); - advance("("); - - scope = Object.create(oldScope); - - e = state.tokens.next.value; - if (state.tokens.next.type !== "(identifier)") { - e = null; - warning("E030", state.tokens.next, e); - } - - advance(); - - funct = { - "(name)" : "(catch)", - "(line)" : state.tokens.next.line, - "(character)": state.tokens.next.character, - "(context)" : funct, - "(breakage)" : funct["(breakage)"], - "(loopage)" : funct["(loopage)"], - "(scope)" : scope, - "(statement)": false, - "(metrics)" : createMetrics(state.tokens.next), - "(catch)" : true, - "(tokens)" : {}, - "(blockscope)": funct["(blockscope)"], - "(comparray)": funct["(comparray)"] - }; - - if (e) { - addlabel(e, "exception"); - } - - if (state.tokens.next.value === "if") { - if (!state.option.inMoz(true)) { - warning("W118", state.tokens.curr, "catch filter"); - } - advance("if"); - expression(0); - } - - advance(")"); - - state.tokens.curr.funct = funct; - functions.push(funct); - - block(false); - - scope = oldScope; - - funct["(last)"] = state.tokens.curr.line; - funct["(lastcharacter)"] = state.tokens.curr.character; - funct = funct["(context)"]; - } - - block(false); - - while (state.tokens.next.id === "catch") { - increaseComplexityCount(); - if (b && (!state.option.inMoz(true))) { - warning("W118", state.tokens.next, "multiple catch blocks"); - } - doCatch(); - b = true; - } - - if (state.tokens.next.id === "finally") { - advance("finally"); - block(false); - return; - } - - if (!b) { - error("E021", state.tokens.next, "catch", state.tokens.next.value); - } - - return this; - }); - - blockstmt("while", function () { - var t = state.tokens.next; - funct["(breakage)"] += 1; - funct["(loopage)"] += 1; - increaseComplexityCount(); - advance("("); - nonadjacent(this, t); - nospace(); - checkCondAssignment(expression(0)); - advance(")", t); - nospace(state.tokens.prev, state.tokens.curr); - block(true, true); - funct["(breakage)"] -= 1; - funct["(loopage)"] -= 1; - return this; - }).labelled = true; - - blockstmt("with", function () { - var t = state.tokens.next; - if (state.directive["use strict"]) { - error("E010", state.tokens.curr); - } else if (!state.option.withstmt) { - warning("W085", state.tokens.curr); - } - - advance("("); - nonadjacent(this, t); - nospace(); - expression(0); - advance(")", t); - nospace(state.tokens.prev, state.tokens.curr); - block(true, true); - - return this; - }); - - blockstmt("switch", function () { - var t = state.tokens.next, - g = false; - funct["(breakage)"] += 1; - advance("("); - nonadjacent(this, t); - nospace(); - checkCondAssignment(expression(0)); - advance(")", t); - nospace(state.tokens.prev, state.tokens.curr); - nonadjacent(state.tokens.curr, state.tokens.next); - t = state.tokens.next; - advance("{"); - nonadjacent(state.tokens.curr, state.tokens.next); - indent += state.option.indent; - this.cases = []; - - for (;;) { - switch (state.tokens.next.id) { - case "case": - switch (funct["(verb)"]) { - case "yield": - case "break": - case "case": - case "continue": - case "return": - case "switch": - case "throw": - break; - default: - // You can tell JSHint that you don't use break intentionally by - // adding a comment /* falls through */ on a line just before - // the next `case`. - if (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) { - warning("W086", state.tokens.curr, "case"); - } - } - indentation(-state.option.indent); - advance("case"); - this.cases.push(expression(20)); - increaseComplexityCount(); - g = true; - advance(":"); - funct["(verb)"] = "case"; - break; - case "default": - switch (funct["(verb)"]) { - case "yield": - case "break": - case "continue": - case "return": - case "throw": - break; - default: - // Do not display a warning if 'default' is the first statement or if - // there is a special /* falls through */ comment. - if (this.cases.length) { - if (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) { - warning("W086", state.tokens.curr, "default"); - } - } - } - indentation(-state.option.indent); - advance("default"); - g = true; - advance(":"); - break; - case "}": - indent -= state.option.indent; - indentation(); - advance("}", t); - funct["(breakage)"] -= 1; - funct["(verb)"] = undefined; - return; - case "(end)": - error("E023", state.tokens.next, "}"); - return; - default: - if (g) { - switch (state.tokens.curr.id) { - case ",": - error("E040"); - return; - case ":": - g = false; - statements(); - break; - default: - error("E025", state.tokens.curr); - return; - } - } else { - if (state.tokens.curr.id === ":") { - advance(":"); - error("E024", state.tokens.curr, ":"); - statements(); - } else { - error("E021", state.tokens.next, "case", state.tokens.next.value); - return; - } - } - } - } - }).labelled = true; - - stmt("debugger", function () { - if (!state.option.debug) { - warning("W087", this); - } - return this; - }).exps = true; - - (function () { - var x = stmt("do", function () { - funct["(breakage)"] += 1; - funct["(loopage)"] += 1; - increaseComplexityCount(); - - this.first = block(true, true); - advance("while"); - var t = state.tokens.next; - nonadjacent(state.tokens.curr, t); - advance("("); - nospace(); - checkCondAssignment(expression(0)); - advance(")", t); - nospace(state.tokens.prev, state.tokens.curr); - funct["(breakage)"] -= 1; - funct["(loopage)"] -= 1; - return this; - }); - x.labelled = true; - x.exps = true; - }()); - - blockstmt("for", function () { - var s, t = state.tokens.next; - var letscope = false; - var foreachtok = null; - - if (t.value === "each") { - foreachtok = t; - advance("each"); - if (!state.option.inMoz(true)) { - warning("W118", state.tokens.curr, "for each"); - } - } - - funct["(breakage)"] += 1; - funct["(loopage)"] += 1; - increaseComplexityCount(); - advance("("); - nonadjacent(this, t); - nospace(); - - // what kind of for(…) statement it is? for(…of…)? for(…in…)? for(…;…;…)? - var nextop; // contains the token of the "in" or "of" operator - var i = 0; - var inof = ["in", "of"]; - do { - nextop = peek(i); - ++i; - } while (!_.contains(inof, nextop.value) && nextop.value !== ";" && - nextop.type !== "(end)"); - - // if we're in a for (… in|of …) statement - if (_.contains(inof, nextop.value)) { - if (!state.option.inESNext() && nextop.value === "of") { - error("W104", nextop, "for of"); - } - if (state.tokens.next.id === "var") { - advance("var"); - state.syntax["var"].fud.call(state.syntax["var"].fud, true); - } else if (state.tokens.next.id === "let") { - advance("let"); - // create a new block scope - letscope = true; - funct["(blockscope)"].stack(); - state.syntax["let"].fud.call(state.syntax["let"].fud, true); - } else { - switch (funct[state.tokens.next.value]) { - case "unused": - funct[state.tokens.next.value] = "var"; - break; - case "var": - break; - default: - if (!funct["(blockscope)"].getlabel(state.tokens.next.value)) - warning("W088", state.tokens.next, state.tokens.next.value); - } - advance(); - } - advance(nextop.value); - expression(20); - advance(")", t); - s = block(true, true); - if (state.option.forin && s && (s.length > 1 || typeof s[0] !== "object" || - s[0].value !== "if")) { - warning("W089", this); - } - funct["(breakage)"] -= 1; - funct["(loopage)"] -= 1; - } else { - if (foreachtok) { - error("E045", foreachtok); - } - if (state.tokens.next.id !== ";") { - if (state.tokens.next.id === "var") { - advance("var"); - state.syntax["var"].fud.call(state.syntax["var"].fud); - } else if (state.tokens.next.id === "let") { - advance("let"); - // create a new block scope - letscope = true; - funct["(blockscope)"].stack(); - state.syntax["let"].fud.call(state.syntax["let"].fud); - } else { - for (;;) { - expression(0, "for"); - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - } - } - nolinebreak(state.tokens.curr); - advance(";"); - if (state.tokens.next.id !== ";") { - checkCondAssignment(expression(0)); - } - nolinebreak(state.tokens.curr); - advance(";"); - if (state.tokens.next.id === ";") { - error("E021", state.tokens.next, ")", ";"); - } - if (state.tokens.next.id !== ")") { - for (;;) { - expression(0, "for"); - if (state.tokens.next.id !== ",") { - break; - } - comma(); - } - } - advance(")", t); - nospace(state.tokens.prev, state.tokens.curr); - block(true, true); - funct["(breakage)"] -= 1; - funct["(loopage)"] -= 1; - - } - // unstack loop blockscope - if (letscope) { - funct["(blockscope)"].unstack(); - } - return this; - }).labelled = true; - - - stmt("break", function () { - var v = state.tokens.next.value; - - if (funct["(breakage)"] === 0) - warning("W052", state.tokens.next, this.value); - - if (!state.option.asi) - nolinebreak(this); - - if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { - if (state.tokens.curr.line === state.tokens.next.line) { - if (funct[v] !== "label") { - warning("W090", state.tokens.next, v); - } else if (scope[v] !== funct) { - warning("W091", state.tokens.next, v); - } - this.first = state.tokens.next; - advance(); - } - } - reachable("break"); - return this; - }).exps = true; - - - stmt("continue", function () { - var v = state.tokens.next.value; - - if (funct["(breakage)"] === 0) - warning("W052", state.tokens.next, this.value); - - if (!state.option.asi) - nolinebreak(this); - - if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { - if (state.tokens.curr.line === state.tokens.next.line) { - if (funct[v] !== "label") { - warning("W090", state.tokens.next, v); - } else if (scope[v] !== funct) { - warning("W091", state.tokens.next, v); - } - this.first = state.tokens.next; - advance(); - } - } else if (!funct["(loopage)"]) { - warning("W052", state.tokens.next, this.value); - } - reachable("continue"); - return this; - }).exps = true; - - - stmt("return", function () { - if (this.line === state.tokens.next.line) { - if (state.tokens.next.id === "(regexp)") - warning("W092"); - - if (state.tokens.next.id !== ";" && !state.tokens.next.reach) { - nonadjacent(state.tokens.curr, state.tokens.next); - this.first = expression(0); - - if (this.first && - this.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) { - warningAt("W093", this.first.line, this.first.character); - } - } - } else { - if (state.tokens.next.type === "(punctuator)" && - ["[", "{", "+", "-"].indexOf(state.tokens.next.value) > -1) { - nolinebreak(this); // always warn (Line breaking error) - } - } - reachable("return"); - return this; - }).exps = true; - - (function (x) { - x.exps = true; - x.lbp = 25; - }(prefix("yield", function () { - var prev = state.tokens.prev; - if (state.option.inESNext(true) && !funct["(generator)"]) { - error("E046", state.tokens.curr, "yield"); - } else if (!state.option.inESNext()) { - warning("W104", state.tokens.curr, "yield"); - } - funct["(generator)"] = "yielded"; - if (this.line === state.tokens.next.line || !state.option.inMoz(true)) { - if (state.tokens.next.id === "(regexp)") - warning("W092"); - - if (state.tokens.next.id !== ";" && !state.tokens.next.reach && state.tokens.next.nud) { - nobreaknonadjacent(state.tokens.curr, state.tokens.next); - this.first = expression(10); - - if (this.first.type === "(punctuator)" && this.first.value === "=" && !state.option.boss) { - warningAt("W093", this.first.line, this.first.character); - } - } - - if (state.option.inMoz(true) && state.tokens.next.id !== ")" && - (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === "yield")) { - error("E050", this); - } - } else if (!state.option.asi) { - nolinebreak(this); // always warn (Line breaking error) - } - return this; - }))); - - - stmt("throw", function () { - nolinebreak(this); - nonadjacent(state.tokens.curr, state.tokens.next); - this.first = expression(20); - reachable("throw"); - return this; - }).exps = true; - - stmt("import", function () { - if (!state.option.inESNext()) { - warning("W119", state.tokens.curr, "import"); - } - - if (state.tokens.next.identifier) { - this.name = identifier(); - addlabel(this.name, "unused", state.tokens.curr); - } else { - advance("{"); - for (;;) { - var importName; - if (state.tokens.next.type === "default") { - importName = "default"; - advance("default"); - } else { - importName = identifier(); - } - if (state.tokens.next.value === "as") { - advance("as"); - importName = identifier(); - } - addlabel(importName, "unused", state.tokens.curr); - - if (state.tokens.next.value === ",") { - advance(","); - } else if (state.tokens.next.value === "}") { - advance("}"); - break; - } else { - error("E024", state.tokens.next, state.tokens.next.value); - break; - } - } - } - - advance("from"); - advance("(string)"); - return this; - }).exps = true; - - stmt("export", function () { - if (!state.option.inESNext()) { - warning("W119", state.tokens.curr, "export"); - } - - if (state.tokens.next.type === "default") { - advance("default"); - if (state.tokens.next.id === "function" || state.tokens.next.id === "class") { - this.block = true; - } - this.exportee = expression(10); - - return this; - } - - if (state.tokens.next.value === "{") { - advance("{"); - for (;;) { - identifier(); - - if (state.tokens.next.value === ",") { - advance(","); - } else if (state.tokens.next.value === "}") { - advance("}"); - break; - } else { - error("E024", state.tokens.next, state.tokens.next.value); - break; - } - } - return this; - } - - if (state.tokens.next.id === "var") { - advance("var"); - state.syntax["var"].fud.call(state.syntax["var"].fud); - } else if (state.tokens.next.id === "let") { - advance("let"); - state.syntax["let"].fud.call(state.syntax["let"].fud); - } else if (state.tokens.next.id === "const") { - advance("const"); - state.syntax["const"].fud.call(state.syntax["const"].fud); - } else if (state.tokens.next.id === "function") { - this.block = true; - advance("function"); - state.syntax["function"].fud(); - } else if (state.tokens.next.id === "class") { - this.block = true; - advance("class"); - state.syntax["class"].fud(); - } else { - error("E024", state.tokens.next, state.tokens.next.value); - } - - return this; - }).exps = true; - - // Future Reserved Words - - FutureReservedWord("abstract"); - FutureReservedWord("boolean"); - FutureReservedWord("byte"); - FutureReservedWord("char"); - FutureReservedWord("class", { es5: true, nud: classdef }); - FutureReservedWord("double"); - FutureReservedWord("enum", { es5: true }); - FutureReservedWord("export", { es5: true }); - FutureReservedWord("extends", { es5: true }); - FutureReservedWord("final"); - FutureReservedWord("float"); - FutureReservedWord("goto"); - FutureReservedWord("implements", { es5: true, strictOnly: true }); - FutureReservedWord("import", { es5: true }); - FutureReservedWord("int"); - FutureReservedWord("interface", { es5: true, strictOnly: true }); - FutureReservedWord("long"); - FutureReservedWord("native"); - FutureReservedWord("package", { es5: true, strictOnly: true }); - FutureReservedWord("private", { es5: true, strictOnly: true }); - FutureReservedWord("protected", { es5: true, strictOnly: true }); - FutureReservedWord("public", { es5: true, strictOnly: true }); - FutureReservedWord("short"); - FutureReservedWord("static", { es5: true, strictOnly: true }); - FutureReservedWord("super", { es5: true }); - FutureReservedWord("synchronized"); - FutureReservedWord("throws"); - FutureReservedWord("transient"); - FutureReservedWord("volatile"); - - // this function is used to determine wether a squarebracket or a curlybracket - // expression is a comprehension array, destructuring assignment or a json value. - - var lookupBlockType = function () { - var pn, pn1; - var i = -1; - var bracketStack = 0; - var ret = {}; - if (_.contains(["[", "{"], state.tokens.curr.value)) - bracketStack += 1; - do { - pn = (i === -1) ? state.tokens.next : peek(i); - pn1 = peek(i + 1); - i = i + 1; - if (_.contains(["[", "{"], pn.value)) { - bracketStack += 1; - } else if (_.contains(["]", "}"], pn.value)) { - bracketStack -= 1; - } - if (pn.identifier && pn.value === "for" && bracketStack === 1) { - ret.isCompArray = true; - ret.notJson = true; - break; - } - if (_.contains(["}", "]"], pn.value) && pn1.value === "=" && bracketStack === 0) { - ret.isDestAssign = true; - ret.notJson = true; - break; - } - if (pn.value === ";") { - ret.isBlock = true; - ret.notJson = true; - } - } while (bracketStack > 0 && pn.id !== "(end)" && i < 15); - return ret; - }; - - // Check whether this function has been reached for a destructuring assign with undeclared values - function destructuringAssignOrJsonValue() { - // lookup for the assignment (esnext only) - // if it has semicolons, it is a block, so go parse it as a block - // or it's not a block, but there are assignments, check for undeclared variables - - var block = lookupBlockType(); - if (block.notJson) { - if (!state.option.inESNext() && block.isDestAssign) { - warning("W104", state.tokens.curr, "destructuring assignment"); - } - statements(); - // otherwise parse json value - } else { - state.option.laxbreak = true; - state.jsonMode = true; - jsonValue(); - } - } - - // array comprehension parsing function - // parses and defines the three states of the list comprehension in order - // to avoid defining global variables, but keeping them to the list comprehension scope - // only. The order of the states are as follows: - // * "use" which will be the returned iterative part of the list comprehension - // * "define" which will define the variables local to the list comprehension - // * "filter" which will help filter out values - - var arrayComprehension = function () { - var CompArray = function () { - this.mode = "use"; - this.variables = []; - }; - var _carrays = []; - var _current; - function declare(v) { - var l = _current.variables.filter(function (elt) { - // if it has, change its undef state - if (elt.value === v) { - elt.undef = false; - return v; - } - }).length; - return l !== 0; - } - function use(v) { - var l = _current.variables.filter(function (elt) { - // and if it has been defined - if (elt.value === v && !elt.undef) { - if (elt.unused === true) { - elt.unused = false; - } - return v; - } - }).length; - // otherwise we warn about it - return (l === 0); - } - return {stack: function () { - _current = new CompArray(); - _carrays.push(_current); - }, - unstack: function () { - _current.variables.filter(function (v) { - if (v.unused) - warning("W098", v.token, v.value); - if (v.undef) - isundef(v.funct, "W117", v.token, v.value); - }); - _carrays.splice(-1, 1); - _current = _carrays[_carrays.length - 1]; - }, - setState: function (s) { - if (_.contains(["use", "define", "generate", "filter"], s)) - _current.mode = s; - }, - check: function (v) { - if (!_current) { - return; - } - // When we are in "use" state of the list comp, we enqueue that var - if (_current && _current.mode === "use") { - if (use(v)) { - _current.variables.push({ - funct: funct, - token: state.tokens.curr, - value: v, - undef: true, - unused: false - }); - } - return true; - // When we are in "define" state of the list comp, - } else if (_current && _current.mode === "define") { - // check if the variable has been used previously - if (!declare(v)) { - _current.variables.push({ - funct: funct, - token: state.tokens.curr, - value: v, - undef: false, - unused: true - }); - } - return true; - // When we are in the "generate" state of the list comp, - } else if (_current && _current.mode === "generate") { - isundef(funct, "W117", state.tokens.curr, v); - return true; - // When we are in "filter" state, - } else if (_current && _current.mode === "filter") { - // we check whether current variable has been declared - if (use(v)) { - // if not we warn about it - isundef(funct, "W117", state.tokens.curr, v); - } - return true; - } - return false; - } - }; - }; - - - // Parse JSON - - function jsonValue() { - - function jsonObject() { - var o = {}, t = state.tokens.next; - advance("{"); - if (state.tokens.next.id !== "}") { - for (;;) { - if (state.tokens.next.id === "(end)") { - error("E026", state.tokens.next, t.line); - } else if (state.tokens.next.id === "}") { - warning("W094", state.tokens.curr); - break; - } else if (state.tokens.next.id === ",") { - error("E028", state.tokens.next); - } else if (state.tokens.next.id !== "(string)") { - warning("W095", state.tokens.next, state.tokens.next.value); - } - if (o[state.tokens.next.value] === true) { - warning("W075", state.tokens.next, state.tokens.next.value); - } else if ((state.tokens.next.value === "__proto__" && - !state.option.proto) || (state.tokens.next.value === "__iterator__" && - !state.option.iterator)) { - warning("W096", state.tokens.next, state.tokens.next.value); - } else { - o[state.tokens.next.value] = true; - } - advance(); - advance(":"); - jsonValue(); - if (state.tokens.next.id !== ",") { - break; - } - advance(","); - } - } - advance("}"); - } - - function jsonArray() { - var t = state.tokens.next; - advance("["); - if (state.tokens.next.id !== "]") { - for (;;) { - if (state.tokens.next.id === "(end)") { - error("E027", state.tokens.next, t.line); - } else if (state.tokens.next.id === "]") { - warning("W094", state.tokens.curr); - break; - } else if (state.tokens.next.id === ",") { - error("E028", state.tokens.next); - } - jsonValue(); - if (state.tokens.next.id !== ",") { - break; - } - advance(","); - } - } - advance("]"); - } - - switch (state.tokens.next.id) { - case "{": - jsonObject(); - break; - case "[": - jsonArray(); - break; - case "true": - case "false": - case "null": - case "(number)": - case "(string)": - advance(); - break; - case "-": - advance("-"); - if (state.tokens.curr.character !== state.tokens.next.from) { - warning("W011", state.tokens.curr); - } - adjacent(state.tokens.curr, state.tokens.next); - advance("(number)"); - break; - default: - error("E003", state.tokens.next); - } - } - - var blockScope = function () { - var _current = {}; - var _variables = [_current]; - - function _checkBlockLabels() { - for (var t in _current) { - if (_current[t]["(type)"] === "unused") { - if (state.option.unused) { - var tkn = _current[t]["(token)"]; - var line = tkn.line; - var chr = tkn.character; - warningAt("W098", line, chr, t); - } - } - } - } - - return { - stack: function () { - _current = {}; - _variables.push(_current); - }, - - unstack: function () { - _checkBlockLabels(); - _variables.splice(_variables.length - 1, 1); - _current = _.last(_variables); - }, - - getlabel: function (l) { - for (var i = _variables.length - 1 ; i >= 0; --i) { - if (_.has(_variables[i], l)) { - return _variables[i]; - } - } - }, - - current: { - has: function (t) { - return _.has(_current, t); - }, - add: function (t, type, tok) { - _current[t] = { "(type)" : type, - "(token)": tok }; - } - } - }; - }; - - // The actual JSHINT function itself. - var itself = function (s, o, g) { - var i, k, x; - var optionKeys; - var newOptionObj = {}; - var newIgnoredObj = {}; - - state.reset(); - - if (o && o.scope) { - JSHINT.scope = o.scope; - } else { - JSHINT.errors = []; - JSHINT.undefs = []; - JSHINT.internals = []; - JSHINT.blacklist = {}; - JSHINT.scope = "(main)"; - } - - predefined = Object.create(null); - combine(predefined, vars.ecmaIdentifiers); - combine(predefined, vars.reservedVars); - - combine(predefined, g || {}); - - declared = Object.create(null); - exported = Object.create(null); - - function each(obj, cb) { - if (!obj) - return; - - if (!Array.isArray(obj) && typeof obj === "object") - obj = Object.keys(obj); - - obj.forEach(cb); - } - - if (o) { - each(o.predef || null, function (item) { - var slice, prop; - - if (item[0] === "-") { - slice = item.slice(1); - JSHINT.blacklist[slice] = slice; - } else { - prop = Object.getOwnPropertyDescriptor(o.predef, item); - predefined[item] = prop ? prop.value : false; - } - }); - - each(o.exported || null, function (item) { - exported[item] = true; - }); - - delete o.predef; - delete o.exported; - - optionKeys = Object.keys(o); - for (x = 0; x < optionKeys.length; x++) { - if (/^-W\d{3}$/g.test(optionKeys[x])) { - newIgnoredObj[optionKeys[x].slice(1)] = true; - } else { - newOptionObj[optionKeys[x]] = o[optionKeys[x]]; - - if (optionKeys[x] === "newcap" && o[optionKeys[x]] === false) - newOptionObj["(explicitNewcap)"] = true; - - if (optionKeys[x] === "indent") - newOptionObj["(explicitIndent)"] = o[optionKeys[x]] === false ? false : true; - } - } - } - - state.option = newOptionObj; - state.ignored = newIgnoredObj; - - state.option.indent = state.option.indent || 4; - state.option.maxerr = state.option.maxerr || 50; - - indent = 1; - global = Object.create(predefined); - scope = global; - funct = { - "(global)": true, - "(name)": "(global)", - "(scope)": scope, - "(breakage)": 0, - "(loopage)": 0, - "(tokens)": {}, - "(metrics)": createMetrics(state.tokens.next), - "(blockscope)": blockScope(), - "(comparray)": arrayComprehension() - }; - functions = [funct]; - urls = []; - stack = null; - member = {}; - membersOnly = null; - implied = {}; - inblock = false; - lookahead = []; - warnings = 0; - unuseds = []; - - if (!isString(s) && !Array.isArray(s)) { - errorAt("E004", 0); - return false; - } - - api = { - get isJSON() { - return state.jsonMode; - }, - - getOption: function (name) { - return state.option[name] || null; - }, - - getCache: function (name) { - return state.cache[name]; - }, - - setCache: function (name, value) { - state.cache[name] = value; - }, - - warn: function (code, data) { - warningAt.apply(null, [ code, data.line, data.char ].concat(data.data)); - }, - - on: function (names, listener) { - names.split(" ").forEach(function (name) { - emitter.on(name, listener); - }.bind(this)); - } - }; - - emitter.removeAllListeners(); - (extraModules || []).forEach(function (func) { - func(api); - }); - - state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax["(begin)"]; - - lex = new Lexer(s); - - lex.on("warning", function (ev) { - warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data)); - }); - - lex.on("error", function (ev) { - errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data)); - }); - - lex.on("fatal", function (ev) { - quit("E041", ev.line, ev.from); - }); - - lex.on("Identifier", function (ev) { - emitter.emit("Identifier", ev); - }); - - lex.on("String", function (ev) { - emitter.emit("String", ev); - }); - - lex.on("Number", function (ev) { - emitter.emit("Number", ev); - }); - - lex.start(); - - // Check options - for (var name in o) { - if (_.has(o, name)) { - checkOption(name, state.tokens.curr); - } - } - - assume(); - - // combine the passed globals after we've assumed all our options - combine(predefined, g || {}); - - //reset values - comma.first = true; - - try { - advance(); - switch (state.tokens.next.id) { - case "{": - case "[": - destructuringAssignOrJsonValue(); - break; - default: - directives(); - - if (state.directive["use strict"]) { - if (!state.option.globalstrict && !(state.option.node || state.option.phantom)) { - warning("W097", state.tokens.prev); - } - } - - statements(); - } - advance((state.tokens.next && state.tokens.next.value !== ".") ? "(end)" : undefined); - funct["(blockscope)"].unstack(); - - var markDefined = function (name, context) { - do { - if (typeof context[name] === "string") { - // JSHINT marks unused variables as 'unused' and - // unused function declaration as 'unction'. This - // code changes such instances back 'var' and - // 'closure' so that the code in JSHINT.data() - // doesn't think they're unused. - - if (context[name] === "unused") - context[name] = "var"; - else if (context[name] === "unction") - context[name] = "closure"; - - return true; - } - - context = context["(context)"]; - } while (context); - - return false; - }; - - var clearImplied = function (name, line) { - if (!implied[name]) - return; - - var newImplied = []; - for (var i = 0; i < implied[name].length; i += 1) { - if (implied[name][i] !== line) - newImplied.push(implied[name][i]); - } - - if (newImplied.length === 0) - delete implied[name]; - else - implied[name] = newImplied; - }; - - var warnUnused = function (name, tkn, type, unused_opt) { - var line = tkn.line; - var chr = tkn.character; - - if (unused_opt === undefined) { - unused_opt = state.option.unused; - } - - if (unused_opt === true) { - unused_opt = "last-param"; - } - - var warnable_types = { - "vars": ["var"], - "last-param": ["var", "param"], - "strict": ["var", "param", "last-param"] - }; - - if (unused_opt) { - if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) { - warningAt("W098", line, chr, name); - } - } - - unuseds.push({ - name: name, - line: line, - character: chr - }); - }; - - var checkUnused = function (func, key) { - var type = func[key]; - var tkn = func["(tokens)"][key]; - - if (key.charAt(0) === "(") - return; - - if (type !== "unused" && type !== "unction") - return; - - // Params are checked separately from other variables. - if (func["(params)"] && func["(params)"].indexOf(key) !== -1) - return; - - // Variable is in global scope and defined as exported. - if (func["(global)"] && _.has(exported, key)) { - return; - } - - warnUnused(key, tkn, "var"); - }; - - // Check queued 'x is not defined' instances to see if they're still undefined. - for (i = 0; i < JSHINT.undefs.length; i += 1) { - k = JSHINT.undefs[i].slice(0); - - if (markDefined(k[2].value, k[0])) { - clearImplied(k[2].value, k[2].line); - } else if (state.option.undef) { - warning.apply(warning, k.slice(1)); - } - } - - functions.forEach(function (func) { - if (func["(unusedOption)"] === false) { - return; - } - - for (var key in func) { - if (_.has(func, key)) { - checkUnused(func, key); - } - } - - if (!func["(params)"]) - return; - - var params = func["(params)"].slice(); - var param = params.pop(); - var type, unused_opt; - - while (param) { - type = func[param]; - unused_opt = func["(unusedOption)"] || state.option.unused; - unused_opt = unused_opt === true ? "last-param" : unused_opt; - - // 'undefined' is a special case for (function (window, undefined) { ... })(); - // patterns. - - if (param === "undefined") - return; - - if (type === "unused" || type === "unction") { - warnUnused(param, func["(tokens)"][param], "param", func["(unusedOption)"]); - } else if (unused_opt === "last-param") { - return; - } - - param = params.pop(); - } - }); - - for (var key in declared) { - if (_.has(declared, key) && !_.has(global, key)) { - warnUnused(key, declared[key], "var"); - } - } - - } catch (err) { - if (err && err.name === "JSHintError") { - var nt = state.tokens.next || {}; - JSHINT.errors.push({ - scope : "(main)", - raw : err.raw, - code : err.code, - reason : err.message, - line : err.line || nt.line, - character : err.character || nt.from - }, null); - } else { - throw err; - } - } - - // Loop over the listed "internals", and check them as well. - - if (JSHINT.scope === "(main)") { - o = o || {}; - - for (i = 0; i < JSHINT.internals.length; i += 1) { - k = JSHINT.internals[i]; - o.scope = k.elem; - itself(k.value, o, g); - } - } - - return JSHINT.errors.length === 0; - }; - - // Modules. - itself.addModule = function (func) { - extraModules.push(func); - }; - - itself.addModule(style.register); - - // Data summary. - itself.data = function () { - var data = { - functions: [], - options: state.option - }; - - var implieds = []; - var members = []; - var fu, f, i, j, n, globals; - - if (itself.errors.length) { - data.errors = itself.errors; - } - - if (state.jsonMode) { - data.json = true; - } - - for (n in implied) { - if (_.has(implied, n)) { - implieds.push({ - name: n, - line: implied[n] - }); - } - } - - if (implieds.length > 0) { - data.implieds = implieds; - } - - if (urls.length > 0) { - data.urls = urls; - } - - globals = Object.keys(scope); - if (globals.length > 0) { - data.globals = globals; - } - - for (i = 1; i < functions.length; i += 1) { - f = functions[i]; - fu = {}; - - for (j = 0; j < functionicity.length; j += 1) { - fu[functionicity[j]] = []; - } - - for (j = 0; j < functionicity.length; j += 1) { - if (fu[functionicity[j]].length === 0) { - delete fu[functionicity[j]]; - } - } - - fu.name = f["(name)"]; - fu.param = f["(params)"]; - fu.line = f["(line)"]; - fu.character = f["(character)"]; - fu.last = f["(last)"]; - fu.lastcharacter = f["(lastcharacter)"]; - - fu.metrics = { - complexity: f["(metrics)"].ComplexityCount, - parameters: (f["(params)"] || []).length, - statements: f["(metrics)"].statementCount - }; - - data.functions.push(fu); - } - - if (unuseds.length > 0) { - data.unused = unuseds; - } - - members = []; - for (n in member) { - if (typeof member[n] === "number") { - data.member = member; - break; - } - } - - return data; - }; - - itself.jshint = itself; - - return itself; -}()); - -// Make JSHINT a Node module, if possible. -if (typeof exports === "object" && exports) { - exports.JSHINT = JSHINT; -} diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/lex.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/lex.js deleted file mode 100644 index ccdb4cc..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/lex.js +++ /dev/null @@ -1,1694 +0,0 @@ -/* - * Lexical analysis and token construction. - */ - -"use strict"; - -var _ = require("underscore"); -var events = require("events"); -var reg = require("./reg.js"); -var state = require("./state.js").state; - -// Some of these token types are from JavaScript Parser API -// while others are specific to JSHint parser. -// JS Parser API: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API - -var Token = { - Identifier: 1, - Punctuator: 2, - NumericLiteral: 3, - StringLiteral: 4, - Comment: 5, - Keyword: 6, - NullLiteral: 7, - BooleanLiteral: 8, - RegExp: 9 -}; - -// This is auto generated from the unicode tables. -// The tables are at: -// http://www.fileformat.info/info/unicode/category/Lu/list.htm -// http://www.fileformat.info/info/unicode/category/Ll/list.htm -// http://www.fileformat.info/info/unicode/category/Lt/list.htm -// http://www.fileformat.info/info/unicode/category/Lm/list.htm -// http://www.fileformat.info/info/unicode/category/Lo/list.htm -// http://www.fileformat.info/info/unicode/category/Nl/list.htm - -var unicodeLetterTable = [ - 170, 170, 181, 181, 186, 186, 192, 214, - 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, - 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, - 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, - 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, - 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, - 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, - 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, - 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2308, 2361, - 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, - 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, - 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, - 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, - 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, - 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, - 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, - 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, - 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, - 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, - 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, - 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, - 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, - 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, - 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, - 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, - 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, - 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, - 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, - 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, - 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, - 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, - 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, - 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4304, 4346, - 4348, 4348, 4352, 4680, 4682, 4685, 4688, 4694, 4696, 4696, - 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, - 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, - 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, - 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, - 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, - 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, - 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, - 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, - 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7104, 7141, - 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, - 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, - 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, - 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, - 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, - 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, - 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, - 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, - 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, - 11360, 11492, 11499, 11502, 11520, 11557, 11568, 11621, - 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, - 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, - 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, - 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, - 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, - 12593, 12686, 12704, 12730, 12784, 12799, 13312, 13312, - 19893, 19893, 19968, 19968, 40907, 40907, 40960, 42124, - 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, - 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, - 42786, 42888, 42891, 42894, 42896, 42897, 42912, 42921, - 43002, 43009, 43011, 43013, 43015, 43018, 43020, 43042, - 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, - 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, - 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, - 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, - 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, - 43739, 43741, 43777, 43782, 43785, 43790, 43793, 43798, - 43808, 43814, 43816, 43822, 43968, 44002, 44032, 44032, - 55203, 55203, 55216, 55238, 55243, 55291, 63744, 64045, - 64048, 64109, 64112, 64217, 64256, 64262, 64275, 64279, - 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, - 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, - 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, - 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, - 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, - 65498, 65500, 65536, 65547, 65549, 65574, 65576, 65594, - 65596, 65597, 65599, 65613, 65616, 65629, 65664, 65786, - 65856, 65908, 66176, 66204, 66208, 66256, 66304, 66334, - 66352, 66378, 66432, 66461, 66464, 66499, 66504, 66511, - 66513, 66517, 66560, 66717, 67584, 67589, 67592, 67592, - 67594, 67637, 67639, 67640, 67644, 67644, 67647, 67669, - 67840, 67861, 67872, 67897, 68096, 68096, 68112, 68115, - 68117, 68119, 68121, 68147, 68192, 68220, 68352, 68405, - 68416, 68437, 68448, 68466, 68608, 68680, 69635, 69687, - 69763, 69807, 73728, 74606, 74752, 74850, 77824, 78894, - 92160, 92728, 110592, 110593, 119808, 119892, 119894, 119964, - 119966, 119967, 119970, 119970, 119973, 119974, 119977, 119980, - 119982, 119993, 119995, 119995, 119997, 120003, 120005, 120069, - 120071, 120074, 120077, 120084, 120086, 120092, 120094, 120121, - 120123, 120126, 120128, 120132, 120134, 120134, 120138, 120144, - 120146, 120485, 120488, 120512, 120514, 120538, 120540, 120570, - 120572, 120596, 120598, 120628, 120630, 120654, 120656, 120686, - 120688, 120712, 120714, 120744, 120746, 120770, 120772, 120779, - 131072, 131072, 173782, 173782, 173824, 173824, 177972, 177972, - 177984, 177984, 178205, 178205, 194560, 195101 -]; - -var identifierStartTable = []; - -for (var i = 0; i < 128; i++) { - identifierStartTable[i] = - i === 36 || // $ - i >= 65 && i <= 90 || // A-Z - i === 95 || // _ - i >= 97 && i <= 122; // a-z -} - -var identifierPartTable = []; - -for (var i = 0; i < 128; i++) { - identifierPartTable[i] = - identifierStartTable[i] || // $, _, A-Z, a-z - i >= 48 && i <= 57; // 0-9 -} - -// Object that handles postponed lexing verifications that checks the parsed -// environment state. - -function asyncTrigger() { - var _checks = []; - - return { - push: function (fn) { - _checks.push(fn); - }, - - check: function () { - for (var check = 0; check < _checks.length; ++check) { - _checks[check](); - } - - _checks.splice(0, _checks.length); - } - }; -} - -/* - * Lexer for JSHint. - * - * This object does a char-by-char scan of the provided source code - * and produces a sequence of tokens. - * - * var lex = new Lexer("var i = 0;"); - * lex.start(); - * lex.token(); // returns the next token - * - * You have to use the token() method to move the lexer forward - * but you don't have to use its return value to get tokens. In addition - * to token() method returning the next token, the Lexer object also - * emits events. - * - * lex.on("Identifier", function (data) { - * if (data.name.indexOf("_") >= 0) { - * // Produce a warning. - * } - * }); - * - * Note that the token() method returns tokens in a JSLint-compatible - * format while the event emitter uses a slightly modified version of - * Mozilla's JavaScript Parser API. Eventually, we will move away from - * JSLint format. - */ -function Lexer(source) { - var lines = source; - - if (typeof lines === "string") { - lines = lines - .replace(/\r\n/g, "\n") - .replace(/\r/g, "\n") - .split("\n"); - } - - // If the first line is a shebang (#!), make it a blank and move on. - // Shebangs are used by Node scripts. - - if (lines[0] && lines[0].substr(0, 2) === "#!") { - lines[0] = ""; - } - - this.emitter = new events.EventEmitter(); - this.source = source; - this.setLines(lines); - this.prereg = true; - - this.line = 0; - this.char = 1; - this.from = 1; - this.input = ""; - - for (var i = 0; i < state.option.indent; i += 1) { - state.tab += " "; - } -} - -Lexer.prototype = { - _lines: [], - - getLines: function () { - this._lines = state.lines; - return this._lines; - }, - - setLines: function (val) { - this._lines = val; - state.lines = this._lines; - }, - - /* - * Return the next i character without actually moving the - * char pointer. - */ - peek: function (i) { - return this.input.charAt(i || 0); - }, - - /* - * Move the char pointer forward i times. - */ - skip: function (i) { - i = i || 1; - this.char += i; - this.input = this.input.slice(i); - }, - - /* - * Subscribe to a token event. The API for this method is similar - * Underscore.js i.e. you can subscribe to multiple events with - * one call: - * - * lex.on("Identifier Number", function (data) { - * // ... - * }); - */ - on: function (names, listener) { - names.split(" ").forEach(function (name) { - this.emitter.on(name, listener); - }.bind(this)); - }, - - /* - * Trigger a token event. All arguments will be passed to each - * listener. - */ - trigger: function () { - this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments)); - }, - - /* - * Postpone a token event. the checking condition is set as - * last parameter, and the trigger function is called in a - * stored callback. To be later called using the check() function - * by the parser. This avoids parser's peek() to give the lexer - * a false context. - */ - triggerAsync: function (type, args, checks, fn) { - checks.push(function () { - if (fn()) { - this.trigger(type, args); - } - }.bind(this)); - }, - - /* - * Extract a punctuator out of the next sequence of characters - * or return 'null' if its not possible. - * - * This method's implementation was heavily influenced by the - * scanPunctuator function in the Esprima parser's source code. - */ - scanPunctuator: function () { - var ch1 = this.peek(); - var ch2, ch3, ch4; - - switch (ch1) { - // Most common single-character punctuators - case ".": - if ((/^[0-9]$/).test(this.peek(1))) { - return null; - } - if (this.peek(1) === "." && this.peek(2) === ".") { - return { - type: Token.Punctuator, - value: "..." - }; - } - /* falls through */ - case "(": - case ")": - case ";": - case ",": - case "{": - case "}": - case "[": - case "]": - case ":": - case "~": - case "?": - return { - type: Token.Punctuator, - value: ch1 - }; - - // A pound sign (for Node shebangs) - case "#": - return { - type: Token.Punctuator, - value: ch1 - }; - - // We're at the end of input - case "": - return null; - } - - // Peek more characters - - ch2 = this.peek(1); - ch3 = this.peek(2); - ch4 = this.peek(3); - - // 4-character punctuator: >>>= - - if (ch1 === ">" && ch2 === ">" && ch3 === ">" && ch4 === "=") { - return { - type: Token.Punctuator, - value: ">>>=" - }; - } - - // 3-character punctuators: === !== >>> <<= >>= - - if (ch1 === "=" && ch2 === "=" && ch3 === "=") { - return { - type: Token.Punctuator, - value: "===" - }; - } - - if (ch1 === "!" && ch2 === "=" && ch3 === "=") { - return { - type: Token.Punctuator, - value: "!==" - }; - } - - if (ch1 === ">" && ch2 === ">" && ch3 === ">") { - return { - type: Token.Punctuator, - value: ">>>" - }; - } - - if (ch1 === "<" && ch2 === "<" && ch3 === "=") { - return { - type: Token.Punctuator, - value: "<<=" - }; - } - - if (ch1 === ">" && ch2 === ">" && ch3 === "=") { - return { - type: Token.Punctuator, - value: ">>=" - }; - } - - // Fat arrow punctuator - if (ch1 === "=" && ch2 === ">") { - return { - type: Token.Punctuator, - value: ch1 + ch2 - }; - } - - // 2-character punctuators: <= >= == != ++ -- << >> && || - // += -= *= %= &= |= ^= (but not /=, see below) - if (ch1 === ch2 && ("+-<>&|".indexOf(ch1) >= 0)) { - return { - type: Token.Punctuator, - value: ch1 + ch2 - }; - } - - if ("<>=!+-*%&|^".indexOf(ch1) >= 0) { - if (ch2 === "=") { - return { - type: Token.Punctuator, - value: ch1 + ch2 - }; - } - - return { - type: Token.Punctuator, - value: ch1 - }; - } - - // Special case: /=. We need to make sure that this is an - // operator and not a regular expression. - - if (ch1 === "/") { - if (ch2 === "=" && /\/=(?!(\S*\/[gim]?))/.test(this.input)) { - // /= is not a part of a regular expression, return it as a - // punctuator. - return { - type: Token.Punctuator, - value: "/=" - }; - } - - return { - type: Token.Punctuator, - value: "/" - }; - } - - return null; - }, - - /* - * Extract a comment out of the next sequence of characters and/or - * lines or return 'null' if its not possible. Since comments can - * span across multiple lines this method has to move the char - * pointer. - * - * In addition to normal JavaScript comments (// and /*) this method - * also recognizes JSHint- and JSLint-specific comments such as - * /*jshint, /*jslint, /*globals and so on. - */ - scanComments: function () { - var ch1 = this.peek(); - var ch2 = this.peek(1); - var rest = this.input.substr(2); - var startLine = this.line; - var startChar = this.char; - - // Create a comment token object and make sure it - // has all the data JSHint needs to work with special - // comments. - - function commentToken(label, body, opt) { - var special = ["jshint", "jslint", "members", "member", "globals", "global", "exported"]; - var isSpecial = false; - var value = label + body; - var commentType = "plain"; - opt = opt || {}; - - if (opt.isMultiline) { - value += "*/"; - } - - special.forEach(function (str) { - if (isSpecial) { - return; - } - - // Don't recognize any special comments other than jshint for single-line - // comments. This introduced many problems with legit comments. - if (label === "//" && str !== "jshint") { - return; - } - - if (body.substr(0, str.length) === str) { - isSpecial = true; - label = label + str; - body = body.substr(str.length); - } - - if (!isSpecial && body.charAt(0) === " " && body.substr(1, str.length) === str) { - isSpecial = true; - label = label + " " + str; - body = body.substr(str.length + 1); - } - - if (!isSpecial) { - return; - } - - switch (str) { - case "member": - commentType = "members"; - break; - case "global": - commentType = "globals"; - break; - default: - commentType = str; - } - }); - - return { - type: Token.Comment, - commentType: commentType, - value: value, - body: body, - isSpecial: isSpecial, - isMultiline: opt.isMultiline || false, - isMalformed: opt.isMalformed || false - }; - } - - // End of unbegun comment. Raise an error and skip that input. - if (ch1 === "*" && ch2 === "/") { - this.trigger("error", { - code: "E018", - line: startLine, - character: startChar - }); - - this.skip(2); - return null; - } - - // Comments must start either with // or /* - if (ch1 !== "/" || (ch2 !== "*" && ch2 !== "/")) { - return null; - } - - // One-line comment - if (ch2 === "/") { - this.skip(this.input.length); // Skip to the EOL. - return commentToken("//", rest); - } - - var body = ""; - - /* Multi-line comment */ - if (ch2 === "*") { - this.skip(2); - - while (this.peek() !== "*" || this.peek(1) !== "/") { - if (this.peek() === "") { // End of Line - body += "\n"; - - // If we hit EOF and our comment is still unclosed, - // trigger an error and end the comment implicitly. - if (!this.nextLine()) { - this.trigger("error", { - code: "E017", - line: startLine, - character: startChar - }); - - return commentToken("/*", body, { - isMultiline: true, - isMalformed: true - }); - } - } else { - body += this.peek(); - this.skip(); - } - } - - this.skip(2); - return commentToken("/*", body, { isMultiline: true }); - } - }, - - /* - * Extract a keyword out of the next sequence of characters or - * return 'null' if its not possible. - */ - scanKeyword: function () { - var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input); - var keywords = [ - "if", "in", "do", "var", "for", "new", - "try", "let", "this", "else", "case", - "void", "with", "enum", "while", "break", - "catch", "throw", "const", "yield", "class", - "super", "return", "typeof", "delete", - "switch", "export", "import", "default", - "finally", "extends", "function", "continue", - "debugger", "instanceof" - ]; - - if (result && keywords.indexOf(result[0]) >= 0) { - return { - type: Token.Keyword, - value: result[0] - }; - } - - return null; - }, - - /* - * Extract a JavaScript identifier out of the next sequence of - * characters or return 'null' if its not possible. In addition, - * to Identifier this method can also produce BooleanLiteral - * (true/false) and NullLiteral (null). - */ - scanIdentifier: function () { - var id = ""; - var index = 0; - var type, char; - - // Detects any character in the Unicode categories "Uppercase - // letter (Lu)", "Lowercase letter (Ll)", "Titlecase letter - // (Lt)", "Modifier letter (Lm)", "Other letter (Lo)", or - // "Letter number (Nl)". - // - // Both approach and unicodeLetterTable were borrowed from - // Google's Traceur. - - function isUnicodeLetter(code) { - for (var i = 0; i < unicodeLetterTable.length;) { - if (code < unicodeLetterTable[i++]) { - return false; - } - - if (code <= unicodeLetterTable[i++]) { - return true; - } - } - - return false; - } - - function isHexDigit(str) { - return (/^[0-9a-fA-F]$/).test(str); - } - - var readUnicodeEscapeSequence = function () { - /*jshint validthis:true */ - index += 1; - - if (this.peek(index) !== "u") { - return null; - } - - var ch1 = this.peek(index + 1); - var ch2 = this.peek(index + 2); - var ch3 = this.peek(index + 3); - var ch4 = this.peek(index + 4); - var code; - - if (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) { - code = parseInt(ch1 + ch2 + ch3 + ch4, 16); - - if (isUnicodeLetter(code)) { - index += 5; - return "\\u" + ch1 + ch2 + ch3 + ch4; - } - - return null; - } - - return null; - }.bind(this); - - var getIdentifierStart = function () { - /*jshint validthis:true */ - var chr = this.peek(index); - var code = chr.charCodeAt(0); - - if (code === 92) { - return readUnicodeEscapeSequence(); - } - - if (code < 128) { - if (identifierStartTable[code]) { - index += 1; - return chr; - } - - return null; - } - - if (isUnicodeLetter(code)) { - index += 1; - return chr; - } - - return null; - }.bind(this); - - var getIdentifierPart = function () { - /*jshint validthis:true */ - var chr = this.peek(index); - var code = chr.charCodeAt(0); - - if (code === 92) { - return readUnicodeEscapeSequence(); - } - - if (code < 128) { - if (identifierPartTable[code]) { - index += 1; - return chr; - } - - return null; - } - - if (isUnicodeLetter(code)) { - index += 1; - return chr; - } - - return null; - }.bind(this); - - char = getIdentifierStart(); - if (char === null) { - return null; - } - - id = char; - for (;;) { - char = getIdentifierPart(); - - if (char === null) { - break; - } - - id += char; - } - - switch (id) { - case "true": - case "false": - type = Token.BooleanLiteral; - break; - case "null": - type = Token.NullLiteral; - break; - default: - type = Token.Identifier; - } - - return { - type: type, - value: id - }; - }, - - /* - * Extract a numeric literal out of the next sequence of - * characters or return 'null' if its not possible. This method - * supports all numeric literals described in section 7.8.3 - * of the EcmaScript 5 specification. - * - * This method's implementation was heavily influenced by the - * scanNumericLiteral function in the Esprima parser's source code. - */ - scanNumericLiteral: function () { - var index = 0; - var value = ""; - var length = this.input.length; - var char = this.peek(index); - var bad; - - function isDecimalDigit(str) { - return (/^[0-9]$/).test(str); - } - - function isOctalDigit(str) { - return (/^[0-7]$/).test(str); - } - - function isHexDigit(str) { - return (/^[0-9a-fA-F]$/).test(str); - } - - function isIdentifierStart(ch) { - return (ch === "$") || (ch === "_") || (ch === "\\") || - (ch >= "a" && ch <= "z") || (ch >= "A" && ch <= "Z"); - } - - // Numbers must start either with a decimal digit or a point. - - if (char !== "." && !isDecimalDigit(char)) { - return null; - } - - if (char !== ".") { - value = this.peek(index); - index += 1; - char = this.peek(index); - - if (value === "0") { - // Base-16 numbers. - if (char === "x" || char === "X") { - index += 1; - value += char; - - while (index < length) { - char = this.peek(index); - if (!isHexDigit(char)) { - break; - } - value += char; - index += 1; - } - - if (value.length <= 2) { // 0x - return { - type: Token.NumericLiteral, - value: value, - isMalformed: true - }; - } - - if (index < length) { - char = this.peek(index); - if (isIdentifierStart(char)) { - return null; - } - } - - return { - type: Token.NumericLiteral, - value: value, - base: 16, - isMalformed: false - }; - } - - // Base-8 numbers. - if (isOctalDigit(char)) { - index += 1; - value += char; - bad = false; - - while (index < length) { - char = this.peek(index); - - // Numbers like '019' (note the 9) are not valid octals - // but we still parse them and mark as malformed. - - if (isDecimalDigit(char)) { - bad = true; - } else if (!isOctalDigit(char)) { - break; - } - value += char; - index += 1; - } - - if (index < length) { - char = this.peek(index); - if (isIdentifierStart(char)) { - return null; - } - } - - return { - type: Token.NumericLiteral, - value: value, - base: 8, - isMalformed: false - }; - } - - // Decimal numbers that start with '0' such as '09' are illegal - // but we still parse them and return as malformed. - - if (isDecimalDigit(char)) { - index += 1; - value += char; - } - } - - while (index < length) { - char = this.peek(index); - if (!isDecimalDigit(char)) { - break; - } - value += char; - index += 1; - } - } - - // Decimal digits. - - if (char === ".") { - value += char; - index += 1; - - while (index < length) { - char = this.peek(index); - if (!isDecimalDigit(char)) { - break; - } - value += char; - index += 1; - } - } - - // Exponent part. - - if (char === "e" || char === "E") { - value += char; - index += 1; - char = this.peek(index); - - if (char === "+" || char === "-") { - value += this.peek(index); - index += 1; - } - - char = this.peek(index); - if (isDecimalDigit(char)) { - value += char; - index += 1; - - while (index < length) { - char = this.peek(index); - if (!isDecimalDigit(char)) { - break; - } - value += char; - index += 1; - } - } else { - return null; - } - } - - if (index < length) { - char = this.peek(index); - if (isIdentifierStart(char)) { - return null; - } - } - - return { - type: Token.NumericLiteral, - value: value, - base: 10, - isMalformed: !isFinite(value) - }; - }, - - /* - * Extract a string out of the next sequence of characters and/or - * lines or return 'null' if its not possible. Since strings can - * span across multiple lines this method has to move the char - * pointer. - * - * This method recognizes pseudo-multiline JavaScript strings: - * - * var str = "hello\ - * world"; - */ - scanStringLiteral: function (checks) { - /*jshint loopfunc:true */ - var quote = this.peek(); - - // String must start with a quote. - if (quote !== "\"" && quote !== "'") { - return null; - } - - // In JSON strings must always use double quotes. - this.triggerAsync("warning", { - code: "W108", - line: this.line, - character: this.char // +1? - }, checks, function () { return state.jsonMode && quote !== "\""; }); - - var value = ""; - var startLine = this.line; - var startChar = this.char; - var allowNewLine = false; - - this.skip(); - - while (this.peek() !== quote) { - while (this.peek() === "") { // End Of Line - - // If an EOL is not preceded by a backslash, show a warning - // and proceed like it was a legit multi-line string where - // author simply forgot to escape the newline symbol. - // - // Another approach is to implicitly close a string on EOL - // but it generates too many false positives. - - if (!allowNewLine) { - this.trigger("warning", { - code: "W112", - line: this.line, - character: this.char - }); - } else { - allowNewLine = false; - - // Otherwise show a warning if multistr option was not set. - // For JSON, show warning no matter what. - - this.triggerAsync("warning", { - code: "W043", - line: this.line, - character: this.char - }, checks, function () { return !state.option.multistr; }); - - this.triggerAsync("warning", { - code: "W042", - line: this.line, - character: this.char - }, checks, function () { return state.jsonMode && state.option.multistr; }); - } - - // If we get an EOF inside of an unclosed string, show an - // error and implicitly close it at the EOF point. - - if (!this.nextLine()) { - this.trigger("error", { - code: "E029", - line: startLine, - character: startChar - }); - - return { - type: Token.StringLiteral, - value: value, - isUnclosed: true, - quote: quote - }; - } - } - - allowNewLine = false; - var char = this.peek(); - var jump = 1; // A length of a jump, after we're done - // parsing this character. - - if (char < " ") { - // Warn about a control character in a string. - this.trigger("warning", { - code: "W113", - line: this.line, - character: this.char, - data: [ "" ] - }); - } - - // Special treatment for some escaped characters. - - if (char === "\\") { - this.skip(); - char = this.peek(); - - switch (char) { - case "'": - this.triggerAsync("warning", { - code: "W114", - line: this.line, - character: this.char, - data: [ "\\'" ] - }, checks, function () {return state.jsonMode; }); - break; - case "b": - char = "\b"; - break; - case "f": - char = "\f"; - break; - case "n": - char = "\n"; - break; - case "r": - char = "\r"; - break; - case "t": - char = "\t"; - break; - case "0": - char = "\0"; - - // Octal literals fail in strict mode. - // Check if the number is between 00 and 07. - var n = parseInt(this.peek(1), 10); - this.triggerAsync("warning", { - code: "W115", - line: this.line, - character: this.char - }, checks, - function () { return n >= 0 && n <= 7 && state.directive["use strict"]; }); - break; - case "u": - char = String.fromCharCode(parseInt(this.input.substr(1, 4), 16)); - jump = 5; - break; - case "v": - this.triggerAsync("warning", { - code: "W114", - line: this.line, - character: this.char, - data: [ "\\v" ] - }, checks, function () { return state.jsonMode; }); - - char = "\v"; - break; - case "x": - var x = parseInt(this.input.substr(1, 2), 16); - - this.triggerAsync("warning", { - code: "W114", - line: this.line, - character: this.char, - data: [ "\\x-" ] - }, checks, function () { return state.jsonMode; }); - - char = String.fromCharCode(x); - jump = 3; - break; - case "\\": - case "\"": - case "/": - break; - case "": - allowNewLine = true; - char = ""; - break; - case "!": - if (value.slice(value.length - 2) === "<") { - break; - } - - /*falls through */ - default: - // Weird escaping. - this.trigger("warning", { - code: "W044", - line: this.line, - character: this.char - }); - } - } - - value += char; - this.skip(jump); - } - - this.skip(); - return { - type: Token.StringLiteral, - value: value, - isUnclosed: false, - quote: quote - }; - }, - - /* - * Extract a regular expression out of the next sequence of - * characters and/or lines or return 'null' if its not possible. - * - * This method is platform dependent: it accepts almost any - * regular expression values but then tries to compile and run - * them using system's RegExp object. This means that there are - * rare edge cases where one JavaScript engine complains about - * your regular expression while others don't. - */ - scanRegExp: function () { - var index = 0; - var length = this.input.length; - var char = this.peek(); - var value = char; - var body = ""; - var flags = []; - var malformed = false; - var isCharSet = false; - var terminated; - - var scanUnexpectedChars = function () { - // Unexpected control character - if (char < " ") { - malformed = true; - this.trigger("warning", { - code: "W048", - line: this.line, - character: this.char - }); - } - - // Unexpected escaped character - if (char === "<") { - malformed = true; - this.trigger("warning", { - code: "W049", - line: this.line, - character: this.char, - data: [ char ] - }); - } - }.bind(this); - - // Regular expressions must start with '/' - if (!this.prereg || char !== "/") { - return null; - } - - index += 1; - terminated = false; - - // Try to get everything in between slashes. A couple of - // cases aside (see scanUnexpectedChars) we don't really - // care whether the resulting expression is valid or not. - // We will check that later using the RegExp object. - - while (index < length) { - char = this.peek(index); - value += char; - body += char; - - if (isCharSet) { - if (char === "]") { - if (this.peek(index - 1) !== "\\" || this.peek(index - 2) === "\\") { - isCharSet = false; - } - } - - if (char === "\\") { - index += 1; - char = this.peek(index); - body += char; - value += char; - - scanUnexpectedChars(); - } - - index += 1; - continue; - } - - if (char === "\\") { - index += 1; - char = this.peek(index); - body += char; - value += char; - - scanUnexpectedChars(); - - if (char === "/") { - index += 1; - continue; - } - - if (char === "[") { - index += 1; - continue; - } - } - - if (char === "[") { - isCharSet = true; - index += 1; - continue; - } - - if (char === "/") { - body = body.substr(0, body.length - 1); - terminated = true; - index += 1; - break; - } - - index += 1; - } - - // A regular expression that was never closed is an - // error from which we cannot recover. - - if (!terminated) { - this.trigger("error", { - code: "E015", - line: this.line, - character: this.from - }); - - return void this.trigger("fatal", { - line: this.line, - from: this.from - }); - } - - // Parse flags (if any). - - while (index < length) { - char = this.peek(index); - if (!/[gim]/.test(char)) { - break; - } - flags.push(char); - value += char; - index += 1; - } - - // Check regular expression for correctness. - - try { - new RegExp(body, flags.join("")); - } catch (err) { - malformed = true; - this.trigger("error", { - code: "E016", - line: this.line, - character: this.char, - data: [ err.message ] // Platform dependent! - }); - } - - return { - type: Token.RegExp, - value: value, - flags: flags, - isMalformed: malformed - }; - }, - - /* - * Scan for any occurence of mixed tabs and spaces. If smarttabs option - * is on, ignore tabs followed by spaces. - * - * Tabs followed by one space followed by a block comment are allowed. - */ - scanMixedSpacesAndTabs: function () { - var at, match; - - if (state.option.smarttabs) { - // Negative look-behind for "//" - match = this.input.match(/(\/\/|^\s?\*)? \t/); - at = match && !match[1] ? 0 : -1; - } else { - at = this.input.search(/ \t|\t [^\*]/); - } - - return at; - }, - - /* - * Scan for characters that get silently deleted by one or more browsers. - */ - scanUnsafeChars: function () { - return this.input.search(reg.unsafeChars); - }, - - /* - * Produce the next raw token or return 'null' if no tokens can be matched. - * This method skips over all space characters. - */ - next: function (checks) { - this.from = this.char; - - // Move to the next non-space character. - var start; - if (/\s/.test(this.peek())) { - start = this.char; - - while (/\s/.test(this.peek())) { - this.from += 1; - this.skip(); - } - - if (this.peek() === "") { // EOL - if (!/^\s*$/.test(this.getLines()[this.line - 1]) && state.option.trailing) { - this.trigger("warning", { code: "W102", line: this.line, character: start }); - } - } - } - - // Methods that work with multi-line structures and move the - // character pointer. - - var match = this.scanComments() || - this.scanStringLiteral(checks); - - if (match) { - return match; - } - - // Methods that don't move the character pointer. - - match = - this.scanRegExp() || - this.scanPunctuator() || - this.scanKeyword() || - this.scanIdentifier() || - this.scanNumericLiteral(); - - if (match) { - this.skip(match.value.length); - return match; - } - - // No token could be matched, give up. - - return null; - }, - - /* - * Switch to the next line and reset all char pointers. Once - * switched, this method also checks for mixed spaces and tabs - * and other minor warnings. - */ - nextLine: function () { - var char; - - if (this.line >= this.getLines().length) { - return false; - } - - this.input = this.getLines()[this.line]; - this.line += 1; - this.char = 1; - this.from = 1; - - char = this.scanMixedSpacesAndTabs(); - if (char >= 0) { - this.trigger("warning", { code: "W099", line: this.line, character: char + 1 }); - } - - this.input = this.input.replace(/\t/g, state.tab); - char = this.scanUnsafeChars(); - - if (char >= 0) { - this.trigger("warning", { code: "W100", line: this.line, character: char }); - } - - // If there is a limit on line length, warn when lines get too - // long. - - if (state.option.maxlen && state.option.maxlen < this.input.length) { - this.trigger("warning", { code: "W101", line: this.line, character: this.input.length }); - } - - return true; - }, - - /* - * This is simply a synonym for nextLine() method with a friendlier - * public name. - */ - start: function () { - this.nextLine(); - }, - - /* - * Produce the next token. This function is called by advance() to get - * the next token. It retuns a token in a JSLint-compatible format. - */ - token: function () { - /*jshint loopfunc:true */ - var checks = asyncTrigger(); - var token; - - - function isReserved(token, isProperty) { - if (!token.reserved) { - return false; - } - var meta = token.meta; - - if (meta && meta.isFutureReservedWord && state.option.inES5()) { - // ES3 FutureReservedWord in an ES5 environment. - if (!meta.es5) { - return false; - } - - // Some ES5 FutureReservedWord identifiers are active only - // within a strict mode environment. - if (meta.strictOnly) { - if (!state.option.strict && !state.directive["use strict"]) { - return false; - } - } - - if (isProperty) { - return false; - } - } - - return true; - } - - // Produce a token object. - var create = function (type, value, isProperty) { - /*jshint validthis:true */ - var obj; - - if (type !== "(endline)" && type !== "(end)") { - this.prereg = false; - } - - if (type === "(punctuator)") { - switch (value) { - case ".": - case ")": - case "~": - case "#": - case "]": - this.prereg = false; - break; - default: - this.prereg = true; - } - - obj = Object.create(state.syntax[value] || state.syntax["(error)"]); - } - - if (type === "(identifier)") { - if (value === "return" || value === "case" || value === "typeof") { - this.prereg = true; - } - - if (_.has(state.syntax, value)) { - obj = Object.create(state.syntax[value] || state.syntax["(error)"]); - - // If this can't be a reserved keyword, reset the object. - if (!isReserved(obj, isProperty && type === "(identifier)")) { - obj = null; - } - } - } - - if (!obj) { - obj = Object.create(state.syntax[type]); - } - - obj.identifier = (type === "(identifier)"); - obj.type = obj.type || type; - obj.value = value; - obj.line = this.line; - obj.character = this.char; - obj.from = this.from; - - if (isProperty && obj.identifier) { - obj.isProperty = isProperty; - } - - obj.check = checks.check; - - return obj; - }.bind(this); - - for (;;) { - if (!this.input.length) { - return create(this.nextLine() ? "(endline)" : "(end)", ""); - } - - token = this.next(checks); - - if (!token) { - if (this.input.length) { - // Unexpected character. - this.trigger("error", { - code: "E024", - line: this.line, - character: this.char, - data: [ this.peek() ] - }); - - this.input = ""; - } - - continue; - } - - switch (token.type) { - case Token.StringLiteral: - this.triggerAsync("String", { - line: this.line, - char: this.char, - from: this.from, - value: token.value, - quote: token.quote - }, checks, function () { return true; }); - - return create("(string)", token.value); - case Token.Identifier: - this.trigger("Identifier", { - line: this.line, - char: this.char, - from: this.form, - name: token.value, - isProperty: state.tokens.curr.id === "." - }); - - /* falls through */ - case Token.Keyword: - case Token.NullLiteral: - case Token.BooleanLiteral: - return create("(identifier)", token.value, state.tokens.curr.id === "."); - - case Token.NumericLiteral: - if (token.isMalformed) { - this.trigger("warning", { - code: "W045", - line: this.line, - character: this.char, - data: [ token.value ] - }); - } - - this.triggerAsync("warning", { - code: "W114", - line: this.line, - character: this.char, - data: [ "0x-" ] - }, checks, function () { return token.base === 16 && state.jsonMode; }); - - this.triggerAsync("warning", { - code: "W115", - line: this.line, - character: this.char - }, checks, function () { - return state.directive["use strict"] && token.base === 8; - }); - - this.trigger("Number", { - line: this.line, - char: this.char, - from: this.from, - value: token.value, - base: token.base, - isMalformed: token.malformed - }); - - return create("(number)", token.value); - - case Token.RegExp: - return create("(regexp)", token.value); - - case Token.Comment: - state.tokens.curr.comment = true; - - if (token.isSpecial) { - return { - id: '(comment)', - value: token.value, - body: token.body, - type: token.commentType, - isSpecial: token.isSpecial, - line: this.line, - character: this.char, - from: this.from - }; - } - - break; - - case "": - break; - - default: - return create("(punctuator)", token.value); - } - } - } -}; - -exports.Lexer = Lexer; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/messages.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/messages.js deleted file mode 100644 index 241ce16..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/messages.js +++ /dev/null @@ -1,218 +0,0 @@ -"use strict"; - -var _ = require("underscore"); - -var errors = { - // JSHint options - E001: "Bad option: '{a}'.", - E002: "Bad option value.", - - // JSHint input - E003: "Expected a JSON value.", - E004: "Input is neither a string nor an array of strings.", - E005: "Input is empty.", - E006: "Unexpected early end of program.", - - // Strict mode - E007: "Missing \"use strict\" statement.", - E008: "Strict violation.", - E009: "Option 'validthis' can't be used in a global scope.", - E010: "'with' is not allowed in strict mode.", - - // Constants - E011: "const '{a}' has already been declared.", - E012: "const '{a}' is initialized to 'undefined'.", - E013: "Attempting to override '{a}' which is a constant.", - - // Regular expressions - E014: "A regular expression literal can be confused with '/='.", - E015: "Unclosed regular expression.", - E016: "Invalid regular expression.", - - // Tokens - E017: "Unclosed comment.", - E018: "Unbegun comment.", - E019: "Unmatched '{a}'.", - E020: "Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.", - E021: "Expected '{a}' and instead saw '{b}'.", - E022: "Line breaking error '{a}'.", - E023: "Missing '{a}'.", - E024: "Unexpected '{a}'.", - E025: "Missing ':' on a case clause.", - E026: "Missing '}' to match '{' from line {a}.", - E027: "Missing ']' to match '[' form line {a}.", - E028: "Illegal comma.", - E029: "Unclosed string.", - - // Everything else - E030: "Expected an identifier and instead saw '{a}'.", - E031: "Bad assignment.", // FIXME: Rephrase - E032: "Expected a small integer or 'false' and instead saw '{a}'.", - E033: "Expected an operator and instead saw '{a}'.", - E034: "get/set are ES5 features.", - E035: "Missing property name.", - E036: "Expected to see a statement and instead saw a block.", - E037: null, // Vacant - E038: null, // Vacant - E039: "Function declarations are not invocable. Wrap the whole function invocation in parens.", - E040: "Each value should have its own case label.", - E041: "Unrecoverable syntax error.", - E042: "Stopping.", - E043: "Too many errors.", - E044: "'{a}' is already defined and can't be redefined.", - E045: "Invalid for each loop.", - E046: "A yield statement shall be within a generator function (with syntax: `function*`)", - E047: "A generator function shall contain a yield statement.", - E048: "Let declaration not directly within block.", - E049: "A {a} cannot be named '{b}'.", - E050: "Mozilla requires the yield expression to be parenthesized here.", - E051: "Regular parameters cannot come after default parameters." -}; - -var warnings = { - W001: "'hasOwnProperty' is a really bad name.", - W002: "Value of '{a}' may be overwritten in IE 8 and earlier.", - W003: "'{a}' was used before it was defined.", - W004: "'{a}' is already defined.", - W005: "A dot following a number can be confused with a decimal point.", - W006: "Confusing minuses.", - W007: "Confusing pluses.", - W008: "A leading decimal point can be confused with a dot: '{a}'.", - W009: "The array literal notation [] is preferrable.", - W010: "The object literal notation {} is preferrable.", - W011: "Unexpected space after '{a}'.", - W012: "Unexpected space before '{a}'.", - W013: "Missing space after '{a}'.", - W014: "Bad line breaking before '{a}'.", - W015: "Expected '{a}' to have an indentation at {b} instead at {c}.", - W016: "Unexpected use of '{a}'.", - W017: "Bad operand.", - W018: "Confusing use of '{a}'.", - W019: "Use the isNaN function to compare with NaN.", - W020: "Read only.", - W021: "'{a}' is a function.", - W022: "Do not assign to the exception parameter.", - W023: "Expected an identifier in an assignment and instead saw a function invocation.", - W024: "Expected an identifier and instead saw '{a}' (a reserved word).", - W025: "Missing name in function declaration.", - W026: "Inner functions should be listed at the top of the outer function.", - W027: "Unreachable '{a}' after '{b}'.", - W028: "Label '{a}' on {b} statement.", - W030: "Expected an assignment or function call and instead saw an expression.", - W031: "Do not use 'new' for side effects.", - W032: "Unnecessary semicolon.", - W033: "Missing semicolon.", - W034: "Unnecessary directive \"{a}\".", - W035: "Empty block.", - W036: "Unexpected /*member '{a}'.", - W037: "'{a}' is a statement label.", - W038: "'{a}' used out of scope.", - W039: "'{a}' is not allowed.", - W040: "Possible strict violation.", - W041: "Use '{a}' to compare with '{b}'.", - W042: "Avoid EOL escaping.", - W043: "Bad escaping of EOL. Use option multistr if needed.", - W044: "Bad or unnecessary escaping.", - W045: "Bad number '{a}'.", - W046: "Don't use extra leading zeros '{a}'.", - W047: "A trailing decimal point can be confused with a dot: '{a}'.", - W048: "Unexpected control character in regular expression.", - W049: "Unexpected escaped character '{a}' in regular expression.", - W050: "JavaScript URL.", - W051: "Variables should not be deleted.", - W052: "Unexpected '{a}'.", - W053: "Do not use {a} as a constructor.", - W054: "The Function constructor is a form of eval.", - W055: "A constructor name should start with an uppercase letter.", - W056: "Bad constructor.", - W057: "Weird construction. Is 'new' unnecessary?", - W058: "Missing '()' invoking a constructor.", - W059: "Avoid arguments.{a}.", - W060: "document.write can be a form of eval.", - W061: "eval can be harmful.", - W062: "Wrap an immediate function invocation in parens " + - "to assist the reader in understanding that the expression " + - "is the result of a function, and not the function itself.", - W063: "Math is not a function.", - W064: "Missing 'new' prefix when invoking a constructor.", - W065: "Missing radix parameter.", - W066: "Implied eval. Consider passing a function instead of a string.", - W067: "Bad invocation.", - W068: "Wrapping non-IIFE function literals in parens is unnecessary.", - W069: "['{a}'] is better written in dot notation.", - W070: "Extra comma. (it breaks older versions of IE)", - W071: "This function has too many statements. ({a})", - W072: "This function has too many parameters. ({a})", - W073: "Blocks are nested too deeply. ({a})", - W074: "This function's cyclomatic complexity is too high. ({a})", - W075: "Duplicate key '{a}'.", - W076: "Unexpected parameter '{a}' in get {b} function.", - W077: "Expected a single parameter in set {a} function.", - W078: "Setter is defined without getter.", - W079: "Redefinition of '{a}'.", - W080: "It's not necessary to initialize '{a}' to 'undefined'.", - W081: "Too many var statements.", - W082: "Function declarations should not be placed in blocks. " + - "Use a function expression or move the statement to the top of " + - "the outer function.", - W083: "Don't make functions within a loop.", - W084: "Expected a conditional expression and instead saw an assignment.", - W085: "Don't use 'with'.", - W086: "Expected a 'break' statement before '{a}'.", - W087: "Forgotten 'debugger' statement?", - W088: "Creating global 'for' variable. Should be 'for (var {a} ...'.", - W089: "The body of a for in should be wrapped in an if statement to filter " + - "unwanted properties from the prototype.", - W090: "'{a}' is not a statement label.", - W091: "'{a}' is out of scope.", - W092: "Wrap the /regexp/ literal in parens to disambiguate the slash operator.", - W093: "Did you mean to return a conditional instead of an assignment?", - W094: "Unexpected comma.", - W095: "Expected a string and instead saw {a}.", - W096: "The '{a}' key may produce unexpected results.", - W097: "Use the function form of \"use strict\".", - W098: "'{a}' is defined but never used.", - W099: "Mixed spaces and tabs.", - W100: "This character may get silently deleted by one or more browsers.", - W101: "Line is too long.", - W102: "Trailing whitespace.", - W103: "The '{a}' property is deprecated.", - W104: "'{a}' is only available in JavaScript 1.7.", - W105: "Unexpected {a} in '{b}'.", - W106: "Identifier '{a}' is not in camel case.", - W107: "Script URL.", - W108: "Strings must use doublequote.", - W109: "Strings must use singlequote.", - W110: "Mixed double and single quotes.", - W112: "Unclosed string.", - W113: "Control character in string: {a}.", - W114: "Avoid {a}.", - W115: "Octal literals are not allowed in strict mode.", - W116: "Expected '{a}' and instead saw '{b}'.", - W117: "'{a}' is not defined.", - W118: "'{a}' is only available in Mozilla JavaScript extensions (use moz option).", - W119: "'{a}' is only available in ES6 (use esnext option).", - W120: "You might be leaking a variable ({a}) here." -}; - -var info = { - I001: "Comma warnings can be turned off with 'laxcomma'.", - I002: "Reserved words as properties can be used under the 'es5' option.", - I003: "ES5 option is now set per default" -}; - -exports.errors = {}; -exports.warnings = {}; -exports.info = {}; - -_.each(errors, function (desc, code) { - exports.errors[code] = { code: code, desc: desc }; -}); - -_.each(warnings, function (desc, code) { - exports.warnings[code] = { code: code, desc: desc }; -}); - -_.each(info, function (desc, code) { - exports.info[code] = { code: code, desc: desc }; -}); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/platforms/rhino.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/platforms/rhino.js deleted file mode 100644 index cc4116a..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/platforms/rhino.js +++ /dev/null @@ -1,113 +0,0 @@ -/*jshint boss: true, rhino: true, unused: true, undef: true, white: true, quotmark: double */ -/*global JSHINT */ - -(function (args) { - "use strict"; - - var filenames = []; - var flags = {}; - var optstr; // arg1=val1,arg2=val2,... - var predef; // global1=true,global2,global3,... - var opts = {}; - var globals = {}; - var retval = 0; - - args.forEach(function (arg) { - if (arg.indexOf("--") === 0) { - // Configuration Flags might be boolean or will be split into name and value - if (arg.indexOf("=") > -1) { - var o = arg.split("="); - flags[o[0].slice(2)] = o[1]; - } else { - flags[arg.slice(2)] = true; - } - - return; - } else if (arg.indexOf("=") > -1) { - // usual rhino configuration, like "boss=true,browser=true" - if (!optstr) { - // First time it's the options. - optstr = arg; - } else { - predef = arg; - } - - return; - } - - if (optstr) { - predef = arg; - return; - } - - filenames.push(arg); - }); - - if (filenames.length === 0) { - print("Usage: jshint.js file.js"); - quit(1); - } - - // If a config flag has been provided, try and load that - if ("config" in flags) { - var cfgFileContent; - try { - cfgFileContent = readFile(flags.config); - } catch (e) { - print("Could not read config file " + flags.config); - quit(1); - } - - opts = JSON.parse(cfgFileContent); - } - - if (optstr) { - optstr.split(",").forEach(function (arg) { - var o = arg.split("="); - if (o[0] === "indent") { - opts[o[0]] = parseInt(o[1], 10); - } else { - opts[o[0]] = (function (ov) { - switch (ov) { - case "true": - return true; - case "false": - return false; - default: - return ov; - } - }(o[1])); - } - }); - } - - globals = opts.globals || {}; - delete(opts.globals); - - if (predef) { - predef.split(",").forEach(function (arg) { - var global = arg.split("="); - globals[global[0]] = global[1] === "true" ? true : false; - }); - } - - filenames.forEach(function (name) { - var input = readFile(name); - - if (!input) { - print("jshint: Couldn't open file " + name); - quit(1); - } - - if (!JSHINT(input, opts, globals)) { - for (var i = 0, err; err = JSHINT.errors[i]; i += 1) { - print(err.reason + " (" + name + ":" + err.line + ":" + err.character + ")"); - print("> " + (err.evidence || "").replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1")); - print(""); - } - retval = 2; - } - }); - - quit(retval); -}(arguments)); diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reg.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reg.js deleted file mode 100644 index 5a54a31..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reg.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Regular expressions. Some of these are stupidly long. - */ - -/*jshint maxlen:1000 */ - -"use string"; - -// Unsafe comment or string (ax) -exports.unsafeString = - /@cc|<\/?|script|\]\s*\]|<\s*!|</i; - -// Unsafe characters that are silently deleted by one or more browsers (cx) -exports.unsafeChars = - /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; - -// Characters in strings that need escaping (nx and nxg) -exports.needEsc = - /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/; - -exports.needEscGlobal = - /[\u0000-\u001f&<"\/\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; - -// Star slash (lx) -exports.starSlash = /\*\//; - -// Identifier (ix) -exports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/; - -// JavaScript URL (jx) -exports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; - -// Catches /* falls through */ comments (ft) -exports.fallsThrough = /^\s*\/\*\s*falls?\sthrough\s*\*\/\s*$/; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/checkstyle.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/checkstyle.js deleted file mode 100644 index 5306d1c..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/checkstyle.js +++ /dev/null @@ -1,115 +0,0 @@ -// Author: Boy Baukema -// http://github.com/relaxnow -module.exports = -{ - reporter: function (results, data, opts) - { - "use strict"; - - var files = {}, - out = [], - pairs = { - "&": "&", - '"': """, - "'": "'", - "<": "<", - ">": ">" - }, - file, fileName, i, issue, globals, unuseds, errorMessage; - - opts = opts || {}; - - function encode(s) { - for (var r in pairs) { - if (typeof(s) !== "undefined") { - s = s.replace(new RegExp(r, "g"), pairs[r]); - } - } - return s || ""; - } - - results.forEach(function (result) { - // Register the file - result.file = result.file.replace(/^\.\//, ''); - if (!files[result.file]) { - files[result.file] = []; - } - - // Create the error message - errorMessage = result.error.reason; - if (opts.verbose) { - errorMessage += ' (' + result.error.code + ')'; - } - - // Add the error - files[result.file].push({ - severity: 'error', - line: result.error.line, - column: result.error.character, - message: errorMessage, - source: 'jshint.' + result.error.code - }); - }); - - data.forEach(function (result) { - file = data.file; - globals = result.implieds; - unuseds = result.unused; - - // Register the file - result.file = result.file.replace(/^\.\//, ''); - if (!files[result.file]) { - files[result.file] = []; - } - - if (globals) { - globals.forEach(function (global) { - files[result.file].push({ - severity: 'warning', - line: global.line, - column: 0, - message: "Implied global '" + global.name + "'", - source: 'jshint.implied-globals' - }); - }); - } - if (unuseds) { - unuseds.forEach(function (unused) { - files[result.file].push({ - severity: 'warning', - line: unused.line, - column: 0, - message: "Unused variable: '" + unused.name + "'", - source: 'jshint.implied-unuseds' - }); - }); - } - }); - - out.push(""); - out.push(""); - - for (fileName in files) { - if (files.hasOwnProperty(fileName)) { - out.push("\t"); - for (i = 0; i < files[fileName].length; i++) { - issue = files[fileName][i]; - out.push( - "\t\t" - ); - } - out.push("\t"); - } - } - - out.push(""); - - process.stdout.write(out.join("\n") + "\n"); - } -}; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/default.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/default.js deleted file mode 100644 index 2a432f1..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/default.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; - -module.exports = { - reporter: function (results, data, opts) { - var len = results.length; - var str = ''; - var prevfile; - - opts = opts || {}; - - results.forEach(function (result) { - var file = result.file; - var error = result.error; - - if (prevfile && prevfile !== file) { - str += "\n"; - } - prevfile = file; - - str += file + ': line ' + error.line + ', col ' + - error.character + ', ' + error.reason; - - if (opts.verbose) { - str += ' (' + error.code + ')'; - } - - str += '\n'; - }); - - if (str) { - process.stdout.write(str + "\n" + len + ' error' + ((len === 1) ? '' : 's') + "\n"); - } - } -}; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/jslint_xml.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/jslint_xml.js deleted file mode 100644 index 6900471..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/jslint_xml.js +++ /dev/null @@ -1,57 +0,0 @@ -module.exports = -{ - reporter: function (results) - { - "use strict"; - - var files = {}, - out = [], - pairs = { - "&": "&", - '"': """, - "'": "'", - "<": "<", - ">": ">" - }, - file, i, issue; - - function encode(s) { - for (var r in pairs) { - if (typeof(s) !== "undefined") { - s = s.replace(new RegExp(r, "g"), pairs[r]); - } - } - return s || ""; - } - - - results.forEach(function (result) { - result.file = result.file.replace(/^\.\//, ''); - if (!files[result.file]) { - files[result.file] = []; - } - files[result.file].push(result.error); - }); - - out.push(""); - out.push(""); - - for (file in files) { - out.push("\t"); - for (i = 0; i < files[file].length; i++) { - issue = files[file][i]; - out.push("\t\t"); - } - out.push("\t"); - } - - out.push(""); - - process.stdout.write(out.join("\n") + "\n"); - } -}; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/non_error.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/non_error.js deleted file mode 100644 index 384ce56..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/reporters/non_error.js +++ /dev/null @@ -1,52 +0,0 @@ -"use strict"; - -module.exports = { - reporter: function (results, data, opts) { - var len = results.length, - str = '', - file, error, globals, unuseds; - - results.forEach(function (result) { - file = result.file; - error = result.error; - str += file + ': line ' + error.line + ', col ' + - error.character + ', ' + error.reason; - - // Add the error code if the --verbose option is set - if (opts.verbose) { - str += ' (' + error.code + ')'; - } - - str += '\n'; - }); - - str += len > 0 ? ("\n" + len + ' error' + ((len === 1) ? '' : 's')) : ""; - - data.forEach(function (data) { - file = data.file; - globals = data.implieds; - unuseds = data.unused; - - if (globals || unuseds) { - str += '\n\n' + file + ' :\n'; - } - - if (globals) { - str += '\tImplied globals:\n'; - globals.forEach(function (global) { - str += '\t\t' + global.name + ': ' + global.line + '\n'; - }); - } - if (unuseds) { - str += '\tUnused Variables:\n\t\t'; - unuseds.forEach(function (unused) { - str += unused.name + '(' + unused.line + '), '; - }); - } - }); - - if (str) { - process.stdout.write(str + "\n"); - } - } -}; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/state.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/state.js deleted file mode 100644 index 52ce387..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/state.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; - -var state = { - syntax: {}, - - reset: function () { - this.tokens = { - prev: null, - next: null, - curr: null - }; - - this.option = {}; - this.ignored = {}; - this.directive = {}; - this.jsonMode = false; - this.jsonWarnings = []; - this.lines = []; - this.tab = ""; - this.cache = {}; // Node.JS doesn't have Map. Sniff. - } -}; - -exports.state = state; diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/style.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/style.js deleted file mode 100644 index bb1b365..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/style.js +++ /dev/null @@ -1,171 +0,0 @@ -"use strict"; - -exports.register = function (linter) { - // Check for properties named __proto__. This special property was - // deprecated and then re-introduced for ES6. - - linter.on("Identifier", function style_scanProto(data) { - if (linter.getOption("proto")) { - return; - } - - if (data.name === "__proto__") { - linter.warn("W103", { - line: data.line, - char: data.char, - data: [ data.name ] - }); - } - }); - - // Check for properties named __iterator__. This is a special property - // available only in browsers with JavaScript 1.7 implementation. - - linter.on("Identifier", function style_scanIterator(data) { - if (linter.getOption("iterator")) { - return; - } - - if (data.name === "__iterator__") { - linter.warn("W104", { - line: data.line, - char: data.char, - data: [ data.name ] - }); - } - }); - - // Check for dangling underscores. - - linter.on("Identifier", function style_scanDangling(data) { - if (!linter.getOption("nomen")) { - return; - } - - // Underscore.js - if (data.name === "_") { - return; - } - - // In Node, __dirname and __filename should be ignored. - if (linter.getOption("node")) { - if (/^(__dirname|__filename)$/.test(data.name) && !data.isProperty) { - return; - } - } - - if (/^(_+.*|.*_+)$/.test(data.name)) { - linter.warn("W105", { - line: data.line, - char: data.from, - data: [ "dangling '_'", data.name ] - }); - } - }); - - // Check that all identifiers are using camelCase notation. - // Exceptions: names like MY_VAR and _myVar. - - linter.on("Identifier", function style_scanCamelCase(data) { - if (!linter.getOption("camelcase")) { - return; - } - - if (data.name.replace(/^_+/, "").indexOf("_") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) { - linter.warn("W106", { - line: data.line, - char: data.from, - data: [ data.name ] - }); - } - }); - - // Enforce consistency in style of quoting. - - linter.on("String", function style_scanQuotes(data) { - var quotmark = linter.getOption("quotmark"); - var code; - - if (!quotmark) { - return; - } - - // If quotmark is set to 'single' warn about all double-quotes. - - if (quotmark === "single" && data.quote !== "'") { - code = "W109"; - } - - // If quotmark is set to 'double' warn about all single-quotes. - - if (quotmark === "double" && data.quote !== "\"") { - code = "W108"; - } - - // If quotmark is set to true, remember the first quotation style - // and then warn about all others. - - if (quotmark === true) { - if (!linter.getCache("quotmark")) { - linter.setCache("quotmark", data.quote); - } - - if (linter.getCache("quotmark") !== data.quote) { - code = "W110"; - } - } - - if (code) { - linter.warn(code, { - line: data.line, - char: data.char, - }); - } - }); - - linter.on("Number", function style_scanNumbers(data) { - if (data.value.charAt(0) === ".") { - // Warn about a leading decimal point. - linter.warn("W008", { - line: data.line, - char: data.char, - data: [ data.value ] - }); - } - - if (data.value.substr(data.value.length - 1) === ".") { - // Warn about a trailing decimal point. - linter.warn("W047", { - line: data.line, - char: data.char, - data: [ data.value ] - }); - } - - if (/^00+/.test(data.value)) { - // Multiple leading zeroes. - linter.warn("W046", { - line: data.line, - char: data.char, - data: [ data.value ] - }); - } - }); - - // Warn about script URLs. - - linter.on("String", function style_scanJavaScriptURLs(data) { - var re = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i; - - if (linter.getOption("scripturl")) { - return; - } - - if (re.test(data.value)) { - linter.warn("W107", { - line: data.line, - char: data.char - }); - } - }); -}; \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/vars.js b/node_modules/grunt-contrib-jshint/node_modules/jshint/src/vars.js deleted file mode 100644 index 327678d..0000000 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/src/vars.js +++ /dev/null @@ -1,588 +0,0 @@ -// jshint -W001 - -"use strict"; - -// Identifiers provided by the ECMAScript standard. - -exports.reservedVars = { - arguments : false, - NaN : false -}; - -exports.ecmaIdentifiers = { - Array : false, - Boolean : false, - Date : false, - decodeURI : false, - decodeURIComponent : false, - encodeURI : false, - encodeURIComponent : false, - Error : false, - "eval" : false, - EvalError : false, - Function : false, - hasOwnProperty : false, - isFinite : false, - isNaN : false, - JSON : false, - Math : false, - Map : false, - Number : false, - Object : false, - parseInt : false, - parseFloat : false, - RangeError : false, - ReferenceError : false, - RegExp : false, - Set : false, - String : false, - SyntaxError : false, - TypeError : false, - URIError : false, - WeakMap : false -}; - -// Global variables commonly provided by a web browser environment. - -exports.browser = { - Audio : false, - Blob : false, - addEventListener : false, - applicationCache : false, - atob : false, - blur : false, - btoa : false, - clearInterval : false, - clearTimeout : false, - close : false, - closed : false, - CustomEvent : false, - DOMParser : false, - defaultStatus : false, - document : false, - Element : false, - ElementTimeControl : false, - event : false, - FileReader : false, - FormData : false, - focus : false, - frames : false, - getComputedStyle : false, - HTMLElement : false, - HTMLAnchorElement : false, - HTMLBaseElement : false, - HTMLBlockquoteElement: false, - HTMLBodyElement : false, - HTMLBRElement : false, - HTMLButtonElement : false, - HTMLCanvasElement : false, - HTMLDirectoryElement : false, - HTMLDivElement : false, - HTMLDListElement : false, - HTMLFieldSetElement : false, - HTMLFontElement : false, - HTMLFormElement : false, - HTMLFrameElement : false, - HTMLFrameSetElement : false, - HTMLHeadElement : false, - HTMLHeadingElement : false, - HTMLHRElement : false, - HTMLHtmlElement : false, - HTMLIFrameElement : false, - HTMLImageElement : false, - HTMLInputElement : false, - HTMLIsIndexElement : false, - HTMLLabelElement : false, - HTMLLayerElement : false, - HTMLLegendElement : false, - HTMLLIElement : false, - HTMLLinkElement : false, - HTMLMapElement : false, - HTMLMenuElement : false, - HTMLMetaElement : false, - HTMLModElement : false, - HTMLObjectElement : false, - HTMLOListElement : false, - HTMLOptGroupElement : false, - HTMLOptionElement : false, - HTMLParagraphElement : false, - HTMLParamElement : false, - HTMLPreElement : false, - HTMLQuoteElement : false, - HTMLScriptElement : false, - HTMLSelectElement : false, - HTMLStyleElement : false, - HTMLTableCaptionElement: false, - HTMLTableCellElement : false, - HTMLTableColElement : false, - HTMLTableElement : false, - HTMLTableRowElement : false, - HTMLTableSectionElement: false, - HTMLTextAreaElement : false, - HTMLTitleElement : false, - HTMLUListElement : false, - HTMLVideoElement : false, - history : false, - Image : false, - length : false, - localStorage : false, - location : false, - MessageChannel : false, - MessageEvent : false, - MessagePort : false, - MouseEvent : false, - moveBy : false, - moveTo : false, - MutationObserver : false, - name : false, - Node : false, - NodeFilter : false, - navigator : false, - onbeforeunload : true, - onblur : true, - onerror : true, - onfocus : true, - onload : true, - onresize : true, - onunload : true, - open : false, - openDatabase : false, - opener : false, - Option : false, - parent : false, - print : false, - removeEventListener : false, - resizeBy : false, - resizeTo : false, - screen : false, - scroll : false, - scrollBy : false, - scrollTo : false, - sessionStorage : false, - setInterval : false, - setTimeout : false, - SharedWorker : false, - status : false, - SVGAElement : false, - SVGAltGlyphDefElement: false, - SVGAltGlyphElement : false, - SVGAltGlyphItemElement: false, - SVGAngle : false, - SVGAnimateColorElement: false, - SVGAnimateElement : false, - SVGAnimateMotionElement: false, - SVGAnimateTransformElement: false, - SVGAnimatedAngle : false, - SVGAnimatedBoolean : false, - SVGAnimatedEnumeration: false, - SVGAnimatedInteger : false, - SVGAnimatedLength : false, - SVGAnimatedLengthList: false, - SVGAnimatedNumber : false, - SVGAnimatedNumberList: false, - SVGAnimatedPathData : false, - SVGAnimatedPoints : false, - SVGAnimatedPreserveAspectRatio: false, - SVGAnimatedRect : false, - SVGAnimatedString : false, - SVGAnimatedTransformList: false, - SVGAnimationElement : false, - SVGCSSRule : false, - SVGCircleElement : false, - SVGClipPathElement : false, - SVGColor : false, - SVGColorProfileElement: false, - SVGColorProfileRule : false, - SVGComponentTransferFunctionElement: false, - SVGCursorElement : false, - SVGDefsElement : false, - SVGDescElement : false, - SVGDocument : false, - SVGElement : false, - SVGElementInstance : false, - SVGElementInstanceList: false, - SVGEllipseElement : false, - SVGExternalResourcesRequired: false, - SVGFEBlendElement : false, - SVGFEColorMatrixElement: false, - SVGFEComponentTransferElement: false, - SVGFECompositeElement: false, - SVGFEConvolveMatrixElement: false, - SVGFEDiffuseLightingElement: false, - SVGFEDisplacementMapElement: false, - SVGFEDistantLightElement: false, - SVGFEFloodElement : false, - SVGFEFuncAElement : false, - SVGFEFuncBElement : false, - SVGFEFuncGElement : false, - SVGFEFuncRElement : false, - SVGFEGaussianBlurElement: false, - SVGFEImageElement : false, - SVGFEMergeElement : false, - SVGFEMergeNodeElement: false, - SVGFEMorphologyElement: false, - SVGFEOffsetElement : false, - SVGFEPointLightElement: false, - SVGFESpecularLightingElement: false, - SVGFESpotLightElement: false, - SVGFETileElement : false, - SVGFETurbulenceElement: false, - SVGFilterElement : false, - SVGFilterPrimitiveStandardAttributes: false, - SVGFitToViewBox : false, - SVGFontElement : false, - SVGFontFaceElement : false, - SVGFontFaceFormatElement: false, - SVGFontFaceNameElement: false, - SVGFontFaceSrcElement: false, - SVGFontFaceUriElement: false, - SVGForeignObjectElement: false, - SVGGElement : false, - SVGGlyphElement : false, - SVGGlyphRefElement : false, - SVGGradientElement : false, - SVGHKernElement : false, - SVGICCColor : false, - SVGImageElement : false, - SVGLangSpace : false, - SVGLength : false, - SVGLengthList : false, - SVGLineElement : false, - SVGLinearGradientElement: false, - SVGLocatable : false, - SVGMPathElement : false, - SVGMarkerElement : false, - SVGMaskElement : false, - SVGMatrix : false, - SVGMetadataElement : false, - SVGMissingGlyphElement: false, - SVGNumber : false, - SVGNumberList : false, - SVGPaint : false, - SVGPathElement : false, - SVGPathSeg : false, - SVGPathSegArcAbs : false, - SVGPathSegArcRel : false, - SVGPathSegClosePath : false, - SVGPathSegCurvetoCubicAbs: false, - SVGPathSegCurvetoCubicRel: false, - SVGPathSegCurvetoCubicSmoothAbs: false, - SVGPathSegCurvetoCubicSmoothRel: false, - SVGPathSegCurvetoQuadraticAbs: false, - SVGPathSegCurvetoQuadraticRel: false, - SVGPathSegCurvetoQuadraticSmoothAbs: false, - SVGPathSegCurvetoQuadraticSmoothRel: false, - SVGPathSegLinetoAbs : false, - SVGPathSegLinetoHorizontalAbs: false, - SVGPathSegLinetoHorizontalRel: false, - SVGPathSegLinetoRel : false, - SVGPathSegLinetoVerticalAbs: false, - SVGPathSegLinetoVerticalRel: false, - SVGPathSegList : false, - SVGPathSegMovetoAbs : false, - SVGPathSegMovetoRel : false, - SVGPatternElement : false, - SVGPoint : false, - SVGPointList : false, - SVGPolygonElement : false, - SVGPolylineElement : false, - SVGPreserveAspectRatio: false, - SVGRadialGradientElement: false, - SVGRect : false, - SVGRectElement : false, - SVGRenderingIntent : false, - SVGSVGElement : false, - SVGScriptElement : false, - SVGSetElement : false, - SVGStopElement : false, - SVGStringList : false, - SVGStylable : false, - SVGStyleElement : false, - SVGSwitchElement : false, - SVGSymbolElement : false, - SVGTRefElement : false, - SVGTSpanElement : false, - SVGTests : false, - SVGTextContentElement: false, - SVGTextElement : false, - SVGTextPathElement : false, - SVGTextPositioningElement: false, - SVGTitleElement : false, - SVGTransform : false, - SVGTransformList : false, - SVGTransformable : false, - SVGURIReference : false, - SVGUnitTypes : false, - SVGUseElement : false, - SVGVKernElement : false, - SVGViewElement : false, - SVGViewSpec : false, - SVGZoomAndPan : false, - TimeEvent : false, - top : false, - WebSocket : false, - window : false, - Worker : false, - XMLHttpRequest : false, - XMLSerializer : false, - XPathEvaluator : false, - XPathException : false, - XPathExpression : false, - XPathNamespace : false, - XPathNSResolver : false, - XPathResult : false -}; - -exports.devel = { - alert : false, - confirm: false, - console: false, - Debug : false, - opera : false, - prompt : false -}; - -exports.worker = { - importScripts: true, - postMessage : true, - self : true -}; - -// Widely adopted global names that are not part of ECMAScript standard -exports.nonstandard = { - escape : false, - unescape: false -}; - -// Globals provided by popular JavaScript environments. - -exports.couch = { - "require" : false, - respond : false, - getRow : false, - emit : false, - send : false, - start : false, - sum : false, - log : false, - exports : false, - module : false, - provides : false -}; - -exports.node = { - __filename : false, - __dirname : false, - Buffer : false, - console : false, - exports : true, // In Node it is ok to exports = module.exports = foo(); - GLOBAL : false, - global : false, - module : false, - process : false, - require : false, - setTimeout : false, - clearTimeout : false, - setInterval : false, - clearInterval : false, - setImmediate : false, // v0.9.1+ - clearImmediate: false // v0.9.1+ -}; - -exports.phantom = { - phantom : true, - require : true, - WebPage : true, - console : true, // in examples, but undocumented - exports : true // v1.7+ -}; - -exports.rhino = { - defineClass : false, - deserialize : false, - gc : false, - help : false, - importPackage: false, - "java" : false, - load : false, - loadClass : false, - print : false, - quit : false, - readFile : false, - readUrl : false, - runCommand : false, - seal : false, - serialize : false, - spawn : false, - sync : false, - toint32 : false, - version : false -}; - -exports.shelljs = { - target : false, - echo : false, - exit : false, - cd : false, - pwd : false, - ls : false, - find : false, - cp : false, - rm : false, - mv : false, - mkdir : false, - test : false, - cat : false, - sed : false, - grep : false, - which : false, - dirs : false, - pushd : false, - popd : false, - env : false, - exec : false, - chmod : false, - config : false, - error : false, - tempdir : false -}; - -exports.typed = { - ArrayBuffer : false, - ArrayBufferView : false, - DataView : false, - Float32Array : false, - Float64Array : false, - Int16Array : false, - Int32Array : false, - Int8Array : false, - Uint16Array : false, - Uint32Array : false, - Uint8Array : false, - Uint8ClampedArray : false -}; - -exports.wsh = { - ActiveXObject : true, - Enumerator : true, - GetObject : true, - ScriptEngine : true, - ScriptEngineBuildVersion : true, - ScriptEngineMajorVersion : true, - ScriptEngineMinorVersion : true, - VBArray : true, - WSH : true, - WScript : true, - XDomainRequest : true -}; - -// Globals provided by popular JavaScript libraries. - -exports.dojo = { - dojo : false, - dijit : false, - dojox : false, - define : false, - "require": false -}; - -exports.jquery = { - "$" : false, - jQuery : false -}; - -exports.mootools = { - "$" : false, - "$$" : false, - Asset : false, - Browser : false, - Chain : false, - Class : false, - Color : false, - Cookie : false, - Core : false, - Document : false, - DomReady : false, - DOMEvent : false, - DOMReady : false, - Drag : false, - Element : false, - Elements : false, - Event : false, - Events : false, - Fx : false, - Group : false, - Hash : false, - HtmlTable : false, - Iframe : false, - IframeShim : false, - InputValidator: false, - instanceOf : false, - Keyboard : false, - Locale : false, - Mask : false, - MooTools : false, - Native : false, - Options : false, - OverText : false, - Request : false, - Scroller : false, - Slick : false, - Slider : false, - Sortables : false, - Spinner : false, - Swiff : false, - Tips : false, - Type : false, - typeOf : false, - URI : false, - Window : false -}; - -exports.prototypejs = { - "$" : false, - "$$" : false, - "$A" : false, - "$F" : false, - "$H" : false, - "$R" : false, - "$break" : false, - "$continue" : false, - "$w" : false, - Abstract : false, - Ajax : false, - Class : false, - Enumerable : false, - Element : false, - Event : false, - Field : false, - Form : false, - Hash : false, - Insertion : false, - ObjectRange : false, - PeriodicalExecuter: false, - Position : false, - Prototype : false, - Selector : false, - Template : false, - Toggle : false, - Try : false, - Autocompleter : false, - Builder : false, - Control : false, - Draggable : false, - Draggables : false, - Droppables : false, - Effect : false, - Sortable : false, - SortableObserver : false, - Sound : false, - Scriptaculous : false -}; - -exports.yui = { - YUI : false, - Y : false, - YUI_config: false -}; - diff --git a/node_modules/grunt-contrib-jshint/package.json b/node_modules/grunt-contrib-jshint/package.json deleted file mode 100644 index bfaf414..0000000 --- a/node_modules/grunt-contrib-jshint/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "grunt-contrib-jshint", - "description": "Validate files with JSHint.", - "version": "0.6.5", - "homepage": "https://github.com/gruntjs/grunt-contrib-jshint", - "author": { - "name": "Grunt Team", - "url": "http://gruntjs.com/" - }, - "repository": { - "type": "git", - "url": "git://github.com/gruntjs/grunt-contrib-jshint.git" - }, - "bugs": { - "url": "https://github.com/gruntjs/grunt-contrib-jshint/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/gruntjs/grunt-contrib-jshint/blob/master/LICENSE-MIT" - } - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "grunt test" - }, - "dependencies": { - "jshint": "~2.1.10" - }, - "devDependencies": { - "grunt-contrib-nodeunit": "~0.1.2", - "grunt-contrib-internal": "~0.4.6", - "grunt": "~0.4.0" - }, - "peerDependencies": { - "grunt": "~0.4.0" - }, - "keywords": [ - "gruntplugin" - ], - "readme": "# grunt-contrib-jshint v0.6.5 [![Build Status](https://travis-ci.org/gruntjs/grunt-contrib-jshint.png?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-jshint)\n\n> Validate files with JSHint.\n\n\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:\n\n```shell\nnpm install grunt-contrib-jshint --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-contrib-jshint');\n```\n\n\n\n\n## Jshint task\n_Run this task with the `grunt jshint` command._\n\nTask targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n\nFor more explanations of the lint errors JSHint will throw at you please visit [jslinterrors.com](http://jslinterrors.com/).\n\n### Options\n\nAny specified option will be passed through directly to [JSHint][], thus you can specify any option that JSHint supports. See the [JSHint documentation][] for a list of supported options.\n\n[JSHint]: http://www.jshint.com/\n[JSHint documentation]: http://www.jshint.com/docs/\n\nA few additional options are supported:\n\n#### globals\nType: `Object`\nDefault value: `null`\n\nA map of global variables, with keys as names and a boolean value to determine if they are assignable. This is not a standard JSHint option, but is passed into the `JSHINT` function as its third argument. See the [JSHint documentation][] for more information.\n\n#### jshintrc\nType: `String`\nDefault value: `null`\n\nIf this filename is specified, options and globals defined therein will be used. The `jshintrc` file must be valid JSON and looks something like this:\n\n```json\n{\n \"curly\": true,\n \"eqnull\": true,\n \"eqeqeq\": true,\n \"undef\": true,\n \"globals\": {\n \"jQuery\": true\n }\n}\n```\n\n*Be aware that `jshintrc` settings are not merged with your Grunt options.*\n\n#### extensions\nType: `String`\nDefault value: `''`\n\nA list of non-dot-js extensions to check.\n\n#### ignores\nType: `Array`\nDefault value: `null`\n\nA list of files and dirs to ignore. This will override your `.jshintignore` file if set and does not merge.\n\n#### force\nType: `Boolean`\nDefault value: `false`\n\nSet `force` to `true` to report JSHint errors but not fail the task.\n\n#### reporter\nType: `String`\nDefault value: `null`\n\nAllows you to modify this plugins output. By default it will use a built-in Grunt reporter. Set the path to your own custom reporter or to one of the built-in JSHint reporters: `jslint` or `checkstyle`.\n\nSee also: [Writing your own JSHint reporter.](http://jshint.com/docs/reporters/)\n\n#### reporterOutput\nType: `String`\nDefault value: `null`\n\nSpecify a filepath to output the results of a reporter. If `reporterOutput` is specified then all output will be written to the given filepath instead of printed to stdout.\n\n### Usage examples\n\n#### Wildcards\nIn this example, running `grunt jshint:all` (or `grunt jshint` because `jshint` is a [multi task](http://gruntjs.com/configuring-tasks#task-configuration-and-targets)) will lint the project's Gruntfile as well as all JavaScript files in the `lib` and `test` directories and their subdirectores, using the default JSHint options.\n\n```js\n// Project configuration.\ngrunt.initConfig({\n jshint: {\n all: ['Gruntfile.js', 'lib/**/*.js', 'test/**/*.js']\n }\n});\n```\n\n#### Linting before and after concatenating\nIn this example, running `grunt jshint` will lint both the \"beforeconcat\" set and \"afterconcat\" sets of files. This is not ideal, because `dist/output.js` may get linted before it gets created via the [grunt-contrib-concat plugin](https://github.com/gruntjs/grunt-contrib-concat) `concat` task.\n\nIn this case, you should lint the \"beforeconcat\" files first, then concat, then lint the \"afterconcat\" files, by running `grunt jshint:beforeconcat concat jshint:afterconcat`.\n\n```js\n// Project configuration.\ngrunt.initConfig({\n concat: {\n dist: {\n src: ['src/foo.js', 'src/bar.js'],\n dest: 'dist/output.js'\n }\n },\n jshint: {\n beforeconcat: ['src/foo.js', 'src/bar.js'],\n afterconcat: ['dist/output.js']\n }\n});\n```\n\n#### Specifying JSHint options and globals\n\nIn this example, custom JSHint options are specified. Note that when `grunt jshint:uses_defaults` is run, those files are linted using the default options, but when `grunt jshint:with_overrides` is run, those files are linted using _merged_ task/target options.\n\n```js\n// Project configuration.\ngrunt.initConfig({\n jshint: {\n options: {\n curly: true,\n eqeqeq: true,\n eqnull: true,\n browser: true,\n globals: {\n jQuery: true\n },\n },\n uses_defaults: ['dir1/**/*.js', 'dir2/**/*.js'],\n with_overrides: {\n options: {\n curly: false,\n undef: true,\n },\n files: {\n src: ['dir3/**/*.js', 'dir4/**/*.js']\n },\n }\n },\n});\n```\n\n#### Ignoring specific warnings\n\nIf you would like to ignore a specific warning:\n\n```shell\n[L24:C9] W015: Expected '}' to have an indentation at 11 instead at 9.\n```\n\nYou can toggle it by prepending `-` to the warning id as an option:\n\n```js\ngrunt.initConfig({\n jshint: {\n ignore_warning: {\n options: {\n '-W015': true,\n },\n src: ['**/*.js'],\n },\n },\n});\n```\n\n#### Ignoring specific files\n\nOccasionally application files and third party libraries share the same directory. To exclude third party code, but include all current and future application files, use a glob for `files` and specifically exclude libraries using `ignores`. In this example, the jQuery file is matched by the glob but subsequently ignored when JSHint does its analysis.\n\n```js\ngrunt.initConfig({\n jshint: {\n files: ['js/*.js'],\n options: {\n ignores: ['js/jquery.js']\n }\n }\n});\n```\n\n\n## Release History\n\n * 2013-10-23   v0.6.5   Fix output when maxerr is low.\n * 2013-08-29   v0.6.4   jshintrc now loaded by jshint allowing comments.\n * 2013-08-15   v0.6.3   Fix module location for jshint 2.1.10.\n * 2013-07-29   v0.6.2   Update to jshint 2.1.7.\n * 2013-07-27   v0.6.1   Peg jshint to 2.1.4 until breaking changes in 2.1.5 are fixed.\n * 2013-06-02   v0.6.0   Dont always succeed the task when using a custom reporter. Bump jshint to 2.1.3.\n * 2013-05-22   v0.5.4   Fix default reporter to show offending file.\n * 2013-05-19   v0.5.3   Performance: Execute the reporter once rather than per file.\n * 2013-05-18   v0.5.2   Fix printing too many erroneous ignored file errors.\n * 2013-05-17   v0.5.1   Fix for when only 1 file is lint free.\n * 2013-05-17   v0.5.0   Bump to jshint 2.0. Add support for .jshintignore files and ignores option Add support for extensions option. Add support for custom reporters and output report to a file.\n * 2013-04-08   v0.4.3   Fix evaluation of predef option when it's an object.\n * 2013-04-08   v0.4.2   Avoid wiping force option when jshintrc is used.\n * 2013-04-06   v0.4.1   Fix to allow object type for deprecated predef.\n * 2013-04-04   v0.4.0   Revert task level options to override jshintrc files.\n * 2013-03-13   v0.3.0   Bump to JSHint 1.1.0. Add force option to report JSHint errors but not fail the task. Add error/warning code to message. Allow task level options to override jshintrc file.\n * 2013-02-26   v0.2.0   Bump to JSHint 1.0\n * 2013-02-15   v0.1.1   First official release for Grunt 0.4.0.\n * 2013-01-18   v0.1.1rc6   Updating grunt/gruntplugin dependencies to rc6. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.\n * 2013-01-09   v0.1.1rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api.\n * 2012-10-18   v0.1.0   Work in progress, not yet officially released.\n\n---\n\nTask submitted by [\"Cowboy\" Ben Alman](http://benalman.com/)\n\n*This file was generated on Wed Oct 23 2013 20:33:11.*\n", - "readmeFilename": "README.md", - "contributors": [ - { - "name": "\"Cowboy\" Ben Alman", - "url": "http://benalman.com/" - }, - { - "name": "Tyler Kellen", - "url": "http://goingslowly.com/" - } - ], - "_id": "grunt-contrib-jshint@0.6.5", - "_from": "grunt-contrib-jshint@~0.6.3" -} diff --git a/node_modules/grunt-contrib-jshint/tasks/jshint.js b/node_modules/grunt-contrib-jshint/tasks/jshint.js deleted file mode 100644 index c9ae207..0000000 --- a/node_modules/grunt-contrib-jshint/tasks/jshint.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - * grunt-contrib-jshint - * http://gruntjs.com/ - * - * Copyright (c) 2013 "Cowboy" Ben Alman, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -module.exports = function(grunt) { - - var path = require('path'); - var jshint = require('./lib/jshint').init(grunt); - - grunt.registerMultiTask('jshint', 'Validate files with JSHint.', function() { - var done = this.async(); - - // Merge task-specific and/or target-specific options with these defaults. - var options = this.options({ - force: false, - reporterOutput: null, - }); - - // log (verbose) options before hooking in the reporter - grunt.verbose.writeflags(options, 'JSHint options'); - - // Report JSHint errors but dont fail the task - var force = options.force; - delete options.force; - - // Whether to output the report to a file - var reporterOutput = options.reporterOutput; - delete options.reporterOutput; - - // Hook into stdout to capture report - var output = ''; - if (reporterOutput) { - grunt.util.hooker.hook(process.stdout, 'write', { - pre: function(out) { - output += out; - return grunt.util.hooker.preempt(); - } - }); - } - - jshint.lint(this.filesSrc, options, function(results, data) { - var failed = 0; - if (results.length > 0) { - // Fail task if errors were logged except if force was set. - failed = force; - } else { - if (jshint.usingGruntReporter === true && data.length > 0) { - grunt.log.ok(data.length + ' file' + (data.length === 1 ? '' : 's') + ' lint free.'); - } - } - - // Write the output of the reporter if wanted - if (reporterOutput) { - grunt.util.hooker.unhook(process.stdout, 'write'); - reporterOutput = grunt.template.process(reporterOutput); - var destDir = path.dirname(reporterOutput); - if (!grunt.file.exists(destDir)) { - grunt.file.mkdir(destDir); - } - grunt.file.write(reporterOutput, output); - grunt.log.ok('Report "' + reporterOutput + '" created.'); - } - - done(failed); - }); - }); - -}; diff --git a/node_modules/grunt-contrib-jshint/tasks/lib/jshint.js b/node_modules/grunt-contrib-jshint/tasks/lib/jshint.js deleted file mode 100644 index 77ba445..0000000 --- a/node_modules/grunt-contrib-jshint/tasks/lib/jshint.js +++ /dev/null @@ -1,221 +0,0 @@ -/* - * grunt-contrib-jshint - * http://gruntjs.com/ - * - * Copyright (c) 2013 "Cowboy" Ben Alman, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -var path = require('path'); -var jshint = require('jshint').JSHINT; -var jshintcli = require('jshint/src/cli'); - -exports.init = function(grunt) { - var exports = { - usingGruntReporter: false - }; - - // No idea why JSHint treats tabs as options.indent # characters wide, but it - // does. See issue: https://github.com/jshint/jshint/issues/430 - var getTabStr = function(options) { - options = options ? grunt.util._.clone(options) : {}; - options.maxerr = 50; - // Do something that's going to error. - jshint('\tx', options); - // If an error occurred, figure out what character JSHint reported and - // subtract one. - var character = jshint.errors && jshint.errors[0] && jshint.errors[0].character - 1; - // If character is actually a number, use it. Otherwise use 1. - var tabsize = isNaN(character) ? 1 : character; - // If tabsize > 1, return something that should be safe to use as a - // placeholder. \uFFFF repeated 2+ times. - return tabsize > 1 && grunt.util.repeat(tabsize, '\uFFFF'); - }; - - var tabregex = /\t/g; - - // Select a reporter (if not using the default Grunt reporter) - // Copied from jshint/src/cli/cli.js until that part is exposed - exports.selectReporter = function(options) { - switch (true) { - // JSLint reporter - case options.reporter === 'jslint': - case options['jslint-reporter']: - options.reporter = 'jshint/src/reporters/jslint_xml.js'; - break; - - // CheckStyle (XML) reporter - case options.reporter === 'checkstyle': - case options['checkstyle-reporter']: - options.reporter = 'jshint/src/reporters/checkstyle.js'; - break; - - // Reporter that displays additional JSHint data - case options['show-non-errors']: - options.reporter = 'jshint/src/reporters/non_error.js'; - break; - - // Custom reporter - case options.reporter !== undefined: - options.reporter = path.resolve(process.cwd(), options.reporter); - } - - var reporter; - if (options.reporter) { - try { - reporter = require(options.reporter).reporter; - exports.usingGruntReporter = false; - } catch (err) { - grunt.fatal(err); - } - } - - // Use the default Grunt reporter if none are found - if (!reporter) { - reporter = exports.reporter; - exports.usingGruntReporter = true; - } - - return reporter; - }; - - // Default Grunt JSHint reporter - exports.reporter = function(results, data) { - // Dont report empty data as its an ignored file - if (data.length < 1) { - grunt.log.error('0 files linted. Please check your ignored files.'); - return; - } - - if (results.length === 0) { - // Success! - grunt.verbose.ok(); - return; - } - - var options = data[0].options; - - // Tab size as reported by JSHint. - var tabstr = getTabStr(options); - var placeholderregex = new RegExp(tabstr, 'g'); - - // Iterate over all errors. - results.forEach(function(result) { - // Display the defending file - var msg = 'Linting' + (result.file ? ' ' + result.file : '') + ' ...'; - grunt.verbose.write(msg); - - // Something went wrong. - grunt.verbose.or.write(msg); - grunt.log.error(); - - var e = result.error; - // Sometimes there's no error object. - if (!e) { return; } - var pos; - var code = ''; - var evidence = e.evidence; - var character = e.character; - if (evidence) { - // Manually increment errorcount since we're not using grunt.log.error(). - grunt.fail.errorcount++; - // Descriptive code error. - pos = '['.red + ('L' + e.line).yellow + ':'.red + ('C' + character).yellow + ']'.red; - if (e.code) { - code = e.code.yellow + ':'.red + ' '; - } - grunt.log.writeln(pos + ' ' + code + e.reason.yellow); - // If necessary, eplace each tab char with something that can be - // swapped out later. - if (tabstr) { - evidence = evidence.replace(tabregex, tabstr); - } - if (character === 0) { - // Beginning of line. - evidence = '?'.inverse.red + evidence; - } else if (character > evidence.length) { - // End of line. - evidence = evidence + ' '.inverse.red; - } else { - // Middle of line. - evidence = evidence.slice(0, character - 1) + evidence[character - 1].inverse.red + - evidence.slice(character); - } - // Replace tab placeholder (or tabs) but with a 2-space soft tab. - evidence = evidence.replace(tabstr ? placeholderregex : tabregex, ' '); - grunt.log.writeln(evidence); - } else { - // Generic "Whoops, too many errors" error. - grunt.log.error(e.reason); - } - }); - grunt.log.writeln(); - }; - - // Run JSHint on the given files with the given options - exports.lint = function(files, options, done) { - var cliOptions = { - verbose: grunt.option('verbose'), - extensions: '', - }; - - // A list of non-dot-js extensions to check - if (options.extensions) { - cliOptions.extensions = options.extensions; - delete options.extensions; - } - - // A list ignored files - if (options.ignores) { - if (typeof options.ignores === 'string') { - options.ignores = [options.ignores]; - } - cliOptions.ignores = options.ignores; - delete options.ignores; - } - - // Select a reporter to use - var reporter = exports.selectReporter(options); - - // Remove bad options that may have came in from the cli - ['reporter', 'jslint-reporter', 'checkstyle-reporter', 'show-non-errors'].forEach(function(opt) { - if (options.hasOwnProperty(opt)) { - delete options[opt]; - } - }); - - // Read JSHint options from a specified jshintrc file. - if (options.jshintrc) { - options = jshintcli.loadConfig(options.jshintrc); - delete options.jshintrc; - } - - // Enable/disable debugging if option explicitly set. - if (grunt.option('debug') !== undefined) { - options.devel = options.debug = grunt.option('debug'); - // Tweak a few things. - if (grunt.option('debug')) { - options.maxerr = Infinity; - } - } - - cliOptions.config = options; - - // Run JSHint on all file and collect results/data - var allResults = []; - var allData = []; - var cliopts = grunt.util._.clone(cliOptions); - cliopts.args = files; - cliopts.reporter = function(results, data) { - reporter(results, data); - allResults = allResults.concat(results); - allData = allData.concat(data); - }; - jshintcli.run(cliopts); - done(allResults, allData); - }; - - return exports; -}; diff --git a/node_modules/grunt-contrib-jshint/test/fixtures/dontlint.txt b/node_modules/grunt-contrib-jshint/test/fixtures/dontlint.txt deleted file mode 100644 index 8aaf1b4..0000000 --- a/node_modules/grunt-contrib-jshint/test/fixtures/dontlint.txt +++ /dev/null @@ -1 +0,0 @@ -Dont lint me! \ No newline at end of file diff --git a/node_modules/grunt-contrib-jshint/test/fixtures/lint.txt b/node_modules/grunt-contrib-jshint/test/fixtures/lint.txt deleted file mode 100644 index 62b11566754d5be57c9515a45274711fa4c66879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmXwyTMEK35Jk^YW&xGh9~U6Bh`;IrLYtycT8WWvzc(X(<-X>GK)|^3?fQOn}J Padg`Mw<|X;A}^F3XCWR= diff --git a/node_modules/grunt-contrib-jshint/test/fixtures/missingsemicolon.js b/node_modules/grunt-contrib-jshint/test/fixtures/missingsemicolon.js deleted file mode 100644 index 2b2ab22..0000000 --- a/node_modules/grunt-contrib-jshint/test/fixtures/missingsemicolon.js +++ /dev/null @@ -1 +0,0 @@ -var missingsemicolon = true diff --git a/node_modules/grunt-contrib-jshint/test/fixtures/nodemodule.js b/node_modules/grunt-contrib-jshint/test/fixtures/nodemodule.js deleted file mode 100644 index d0e1f2a..0000000 --- a/node_modules/grunt-contrib-jshint/test/fixtures/nodemodule.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict'; - -module.exports = function() { -}; diff --git a/node_modules/grunt-contrib-jshint/test/jshint_test.js b/node_modules/grunt-contrib-jshint/test/jshint_test.js deleted file mode 100644 index 7ac3176..0000000 --- a/node_modules/grunt-contrib-jshint/test/jshint_test.js +++ /dev/null @@ -1,141 +0,0 @@ -'use strict'; - -var path = require('path'); -var grunt = require('grunt'); -var jshint = require('../tasks/lib/jshint').init(grunt); - -var fixtures = path.join(__dirname, 'fixtures'); - -// Helper for testing stdout -var hooker = grunt.util.hooker; -var stdoutEqual = function(callback, done) { - var actual = ''; - // Hook process.stdout.write - hooker.hook(process.stdout, 'write', { - // This gets executed before the original process.stdout.write. - pre: function(result) { - // Concatenate uncolored result onto actual. - actual += grunt.log.uncolor(result); - // Prevent the original process.stdout.write from executing. - return hooker.preempt(); - } - }); - // Execute the logging code to be tested. - callback(); - // Restore process.stdout.write to its original value. - hooker.unhook(process.stdout, 'write'); - // Actually test the actually-logged stdout string to the expected value. - done(actual); -}; - -exports.jshint = { - basic: function(test) { - test.expect(1); - var files = [path.join(fixtures, 'missingsemicolon.js')]; - var options = {}; - jshint.lint(files, options, function(results, data) { - test.equal(results[0].error.reason, 'Missing semicolon.', 'Should reporter a missing semicolon.'); - test.done(); - }); - }, - jshintrc: function(test) { - test.expect(1); - var files = [path.join(fixtures, 'nodemodule.js')]; - var options = { - jshintrc: path.join(__dirname, '..', '.jshintrc') - }; - jshint.lint(files, options, function(results, data) { - test.ok(results.length === 0, 'Should not have reported any errors with supplied .jshintrc'); - test.done(); - }); - }, - defaultReporter: function(test) { - test.expect(2); - grunt.log.muted = false; - var files = [path.join(fixtures, 'nodemodule.js')]; - var options = {}; - stdoutEqual(function() { - jshint.lint(files, options, function(results, data) {}); - }, function(result) { - test.ok(jshint.usingGruntReporter, 'Should be using the default grunt reporter.'); - test.ok(result.indexOf('[L3:C1] W117: \'module\' is not defined.') !== -1, 'Should have reported errors with the default grunt reporter.'); - test.done(); - }); - }, - defaultReporterErrors: function(test) { - test.expect(3); - grunt.log.muted = false; - var files = [path.join(fixtures, 'nodemodule.js'), path.join(fixtures, 'missingsemicolon.js')]; - var options = {}; - stdoutEqual(function() { - jshint.lint(files, options, function(results, data) {}); - }, function(result) { - test.ok(jshint.usingGruntReporter, 'Should be using the default grunt reporter.'); - test.ok(result.match(/nodemodule\.js\s\.\.\.ERROR/g).length === 2, 'Should have reported nodemodule.js once per error.'); - test.ok(result.match(/missingsemicolon\.js\s\.\.\.ERROR/g).length === 1, 'Should have reported missingsemicolon.js once per error.'); - test.done(); - }); - }, - alternateReporter: function(test) { - test.expect(2); - var files = [path.join(fixtures, 'nodemodule.js')]; - var options = { - reporter: 'jslint' - }; - stdoutEqual(function() { - jshint.lint(files, options, function(results, data) {}); - }, function(result) { - test.ok((jshint.usingGruntReporter === false), 'Should NOT be using the default grunt reporter.'); - test.ok(result.indexOf('') !== -1, 'Should have reported errors with the jslint reporter.'); - test.done(); - }); - }, - reporterOutput: function(test) { - test.expect(1); - var result = grunt.file.read(path.join('tmp', 'report.xml')); - test.ok(result.indexOf('') !== -1, 'Should have reported errors with the checkstyle reporter.'); - test.done(); - }, - dontBlowUp: function(test) { - test.expect(1); - var files = [path.join(fixtures, 'lint.txt')]; - jshint.lint(files, {}, function(results, data) { - test.equal(results[0].error.code, 'W100', 'It should not blow up if an error occurs on character 0.'); - test.done(); - }); - }, - jshintignore: function(test) { - test.expect(1); - var files = [path.join(fixtures, 'dontlint.txt')]; - jshint.lint(files, {}, function(results, data) { - test.equal(data.length, 0, 'Should not have linted a file listed in the .jshintignore.'); - test.done(); - }); - }, - ignoresOption: function(test) { - test.expect(1); - var files = [path.join(fixtures, 'lint.txt')]; - var options = { - ignores: files - }; - jshint.lint(files, options, function(results, data) { - test.equal(data.length, 0, 'Should not have linted a file listed in the ignores option.'); - test.done(); - }); - }, - singleReportCall: function(test) { - test.expect(2); - - // stub jshint.reporter - var reporterCallCount = 0; - var _report = jshint.reporter; - jshint.reporter = function() { reporterCallCount++; }; - - var files = [path.join(fixtures, 'dontlint.txt'), path.join(fixtures, 'lint.txt')]; - jshint.lint(files, {}, function(results, data) { - test.equal(data.length, 1, 'Should not have linted a file listed in the .jshintignore.'); - test.equal(reporterCallCount, 1, 'Should have called the reporter once.'); - test.done(); - }); - } -}; diff --git a/node_modules/grunt-contrib-nodeunit/.jshintrc b/node_modules/grunt-contrib-nodeunit/.jshintrc deleted file mode 100644 index f57a8ff..0000000 --- a/node_modules/grunt-contrib-nodeunit/.jshintrc +++ /dev/null @@ -1,13 +0,0 @@ -{ - "curly": true, - "eqeqeq": true, - "immed": true, - "latedef": true, - "newcap": true, - "noarg": true, - "sub": true, - "undef": true, - "boss": true, - "eqnull": true, - "node": true -} diff --git a/node_modules/grunt-contrib-nodeunit/.npmignore b/node_modules/grunt-contrib-nodeunit/.npmignore deleted file mode 100644 index b785247..0000000 --- a/node_modules/grunt-contrib-nodeunit/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -npm-debug.log -tmp diff --git a/node_modules/grunt-contrib-nodeunit/.travis.yml b/node_modules/grunt-contrib-nodeunit/.travis.yml deleted file mode 100644 index 5766191..0000000 --- a/node_modules/grunt-contrib-nodeunit/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - "0.8" - - "0.10" -before_script: - - npm install -g grunt-cli \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/AUTHORS b/node_modules/grunt-contrib-nodeunit/AUTHORS deleted file mode 100644 index 6cf7a03..0000000 --- a/node_modules/grunt-contrib-nodeunit/AUTHORS +++ /dev/null @@ -1,2 +0,0 @@ -"Cowboy" Ben Alman (http://benalman.com) -Tyler Kellen (http://goingslowly.com) diff --git a/node_modules/grunt-contrib-nodeunit/CHANGELOG b/node_modules/grunt-contrib-nodeunit/CHANGELOG deleted file mode 100644 index 0e24ebd..0000000 --- a/node_modules/grunt-contrib-nodeunit/CHANGELOG +++ /dev/null @@ -1,34 +0,0 @@ -v0.2.2: - date: 2013-10-19 - changes: - - Allow missing operators on error object. -v0.2.1: - date: 2013-09-24 - changes: - - Fix error display. -v0.2.0: - date: 2013-05-23 - changes: - - Bump nodeunit to v0.8.0 -v0.1.2: - date: 2013-02-15 - changes: - - First official release for Grunt 0.4.0. -v0.1.2rc6: - date: 2013-01-18 - changes: - - Updating grunt/gruntplugin dependencies to rc6. - - Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. -v0.1.2rc5: - date: 2013-01-09 - changes: - - Updating to work with grunt v0.4.0rc5. - - Switching to this.filesSrc api. -v0.1.1: - date: 2012-11-13 - changes: - - Switch to this.file api internally. -v0.1.0: - date: 2012-11-04 - changes: - - Work in progress, not yet officially released. diff --git a/node_modules/grunt-contrib-nodeunit/CONTRIBUTING.md b/node_modules/grunt-contrib-nodeunit/CONTRIBUTING.md deleted file mode 100644 index 5d08cc3..0000000 --- a/node_modules/grunt-contrib-nodeunit/CONTRIBUTING.md +++ /dev/null @@ -1 +0,0 @@ -Please see the [Contributing to grunt](http://gruntjs.com/contributing) guide for information on contributing to this project. diff --git a/node_modules/grunt-contrib-nodeunit/Gruntfile.js b/node_modules/grunt-contrib-nodeunit/Gruntfile.js deleted file mode 100644 index f292a4d..0000000 --- a/node_modules/grunt-contrib-nodeunit/Gruntfile.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * grunt-contrib-nodeunit - * http://gruntjs.com/ - * - * Copyright (c) 2013 "Cowboy" Ben Alman, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -module.exports = function(grunt) { - var path = require('path'); - - // Project configuration. - grunt.initConfig({ - jshint: { - all: [ - 'Gruntfile.js', - 'tasks/*.js', - ], - options: { - jshintrc: '.jshintrc', - }, - }, - - // Unit tests. - nodeunit: { - tests: ['test/*_test.js'], - }, - }); - - // Actually load this plugin's task(s). - grunt.loadTasks('tasks'); - - // These plugins provide necessary tasks. - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-internal'); - - // Whenever the "test" task is run, run some basic tests. - grunt.registerTask('test', function(which) { - var test = path.join(__dirname, 'test', 'fixtures', which + '.js'); - if (grunt.file.exists(test)) { - grunt.config('nodeunit.tests', test); - } - grunt.task.run('nodeunit'); - }); - - // By default, lint and run all tests. - grunt.registerTask('default', ['jshint', 'nodeunit', 'build-contrib']); - -}; diff --git a/node_modules/grunt-contrib-nodeunit/LICENSE-MIT b/node_modules/grunt-contrib-nodeunit/LICENSE-MIT deleted file mode 100644 index 8368849..0000000 --- a/node_modules/grunt-contrib-nodeunit/LICENSE-MIT +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 "Cowboy" Ben Alman, 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/grunt-contrib-nodeunit/README.md b/node_modules/grunt-contrib-nodeunit/README.md deleted file mode 100644 index 456e8fe..0000000 --- a/node_modules/grunt-contrib-nodeunit/README.md +++ /dev/null @@ -1,74 +0,0 @@ -# grunt-contrib-nodeunit v0.2.2 [![Build Status](https://travis-ci.org/gruntjs/grunt-contrib-nodeunit.png?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-nodeunit) - -> Run Nodeunit unit tests. - - - -## Getting Started -This plugin requires Grunt `~0.4.0` - -If you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command: - -```shell -npm install grunt-contrib-nodeunit --save-dev -``` - -Once the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript: - -```js -grunt.loadNpmTasks('grunt-contrib-nodeunit'); -``` - - - - -## Nodeunit task -_Run this task with the `grunt nodeunit` command._ - -Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide. - -This plugin provides server-side JavaScript unit testing via [nodeunit](https://github.com/caolan/nodeunit/). If you're looking to test JavaScript that uses `window` or the DOM, please use the [grunt-contrib-qunit plugin](https://github.com/gruntjs/grunt-contrib-qunit)`qunit` task. - - -### Usage examples - -#### Wildcards - -In this example, `grunt nodeunit:all` or `grunt nodeunit` will test all files ending with `_test.js` in the `test` directory. - -```js -// Project configuration. -grunt.initConfig({ - nodeunit: { - all: ['test/*_test.js'] - } -}); -``` - -With a slight modification, `grunt nodeunit:all` will test files matching the same pattern in the `test` directory _and all subdirectories_. - -```js -// Project configuration. -grunt.initConfig({ - nodeunit: { - all: ['test/**/*_test.js'] - } -}); -``` - -## Release History - - * 2013-10-19   v0.2.2   Allow missing operators on error object. - * 2013-09-24   v0.2.1   Fix error display. - * 2013-05-23   v0.2.0   Bump nodeunit to v0.8.0 - * 2013-02-15   v0.1.2   First official release for Grunt 0.4.0. - * 2013-01-18   v0.1.2rc6   Updating grunt/gruntplugin dependencies to rc6. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions. - * 2013-01-09   v0.1.2rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api. - * 2012-11-13   v0.1.1   Switch to this.file api internally. - * 2012-11-04   v0.1.0   Work in progress, not yet officially released. - ---- - -Task submitted by ["Cowboy" Ben Alman](http://benalman.com) - -*This file was generated on Sat Oct 19 2013 14:59:01.* diff --git a/node_modules/grunt-contrib-nodeunit/docs/nodeunit-examples.md b/node_modules/grunt-contrib-nodeunit/docs/nodeunit-examples.md deleted file mode 100644 index b5db4fe..0000000 --- a/node_modules/grunt-contrib-nodeunit/docs/nodeunit-examples.md +++ /dev/null @@ -1,25 +0,0 @@ -# Usage examples - -## Wildcards - -In this example, `grunt nodeunit:all` or `grunt nodeunit` will test all files ending with `_test.js` in the `test` directory. - -```js -// Project configuration. -grunt.initConfig({ - nodeunit: { - all: ['test/*_test.js'] - } -}); -``` - -With a slight modification, `grunt nodeunit:all` will test files matching the same pattern in the `test` directory _and all subdirectories_. - -```js -// Project configuration. -grunt.initConfig({ - nodeunit: { - all: ['test/**/*_test.js'] - } -}); -``` \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/docs/nodeunit-options.md b/node_modules/grunt-contrib-nodeunit/docs/nodeunit-options.md deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/grunt-contrib-nodeunit/docs/nodeunit-overview.md b/node_modules/grunt-contrib-nodeunit/docs/nodeunit-overview.md deleted file mode 100644 index 8311026..0000000 --- a/node_modules/grunt-contrib-nodeunit/docs/nodeunit-overview.md +++ /dev/null @@ -1,3 +0,0 @@ -Task targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide. - -This plugin provides server-side JavaScript unit testing via [nodeunit](https://github.com/caolan/nodeunit/). If you're looking to test JavaScript that uses `window` or the DOM, please use the [grunt-contrib-qunit plugin](https://github.com/gruntjs/grunt-contrib-qunit)`qunit` task. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/.bin/nodeunit b/node_modules/grunt-contrib-nodeunit/node_modules/.bin/nodeunit deleted file mode 120000 index f31cdbe..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/.bin/nodeunit +++ /dev/null @@ -1 +0,0 @@ -../nodeunit/bin/nodeunit \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/.npmignore deleted file mode 100644 index 1a82501..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -stamp-build -test/fixtures/dir2 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/CONTRIBUTORS.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/CONTRIBUTORS.md deleted file mode 100644 index fba3609..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/CONTRIBUTORS.md +++ /dev/null @@ -1,68 +0,0 @@ -Nodeunit contributors (sorted alphabeticaly) -============================================ - -* **[Alex Gorbatchev](https://github.com/alexgorbatchev)** - - * Deeper default object inspection - * Timeout to ensure flushing of console output (default reporter) - -* **[Alex Wolfe](https://github.com/alexkwolfe)** - - * HTML test reporter - -* **[Caolan McMahon](https://github.com/caolan)** - - * Author and maintainer - * Most features develpopment - -* **[Carl Fürstenberg](https://github.com/azatoth)** - - * Debian-friendly Makefile, supports both 'node' and 'nodejs' executables - * Sandbox utility - * Minimal test reporter - -* **[Gerad Suyderhoud](https://github.com/gerad)** - - * First comand-line tool - -* **[Kadir Pekel](https://github.com/kadirpekel)** - - * Improvements to default test reporter - * HTTP test utility - -* **[Λlisue](https://github.com/lambdalisue)** - - * Add machineout reporter - -* **[Matthias Lübken](https://github.com/luebken)** - - * Utility functions for tracking incomplete tests on exit - -* **[Oleg Efimov](https://github.com/Sannis)** - - * Adding 'make lint' and fixing nodelint errors - * Option parsing, --help text and config file support - * Reporters option for command-line tool - -* **[Orlando Vazquez](https://github.com/orlandov)** - - * Added jUnit XML reporter - -* **[Ryan Dahl](https://github.com/ry)** - - * Add package.json - -* **[Sam Stephenson](https://github.com/sstephenson)** - - * Coffee-script support - -* **[Thomas Mayfield](https://github.com/thegreatape)** - - * Async setUp and tearDown support for testCase - -* **[Maciej Małecki](https://github.com/mmalecki)** - - * Removal of `testCase` - -**[Full contributors list](https://github.com/caolan/nodeunit/contributors).** - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/LICENSE deleted file mode 100644 index b7f9d50..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Caolan McMahon - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/Makefile b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/Makefile deleted file mode 100644 index 8f8d8cb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/Makefile +++ /dev/null @@ -1,177 +0,0 @@ -PACKAGE = nodeunit -NODEJS = $(if $(shell test -f /usr/bin/nodejs && echo "true"),nodejs,node) - -PREFIX ?= /usr/local -BINDIR ?= $(PREFIX)/bin -DATADIR ?= $(PREFIX)/share -MANDIR ?= $(PREFIX)/share/man -LIBDIR ?= $(PREFIX)/lib -NODEJSLIBDIR ?= $(LIBDIR)/$(NODEJS) - -BUILDDIR = dist - -DOCS = $(shell find doc -name '*.md' \ - |sed 's|.md|.1|g' \ - |sed 's|doc/|man1/|g' \ - ) - - -$(shell if [ ! -d $(BUILDDIR) ]; then mkdir $(BUILDDIR); fi) - -all: build doc - -browser: - # super hacky build script for browser version! - mkdir -p $(BUILDDIR)/browser - rm -rf $(BUILDDIR)/browser/* - # build browser version of nodeunit.js - cat share/license.js >> $(BUILDDIR)/browser/nodeunit.js - echo "nodeunit = (function(){" >> $(BUILDDIR)/browser/nodeunit.js - cat deps/json2.js >> $(BUILDDIR)/browser/nodeunit.js - # make assert global - echo "var assert = this.assert = {};" >> $(BUILDDIR)/browser/nodeunit.js - echo "var types = {};" >> $(BUILDDIR)/browser/nodeunit.js - echo "var core = {};" >> $(BUILDDIR)/browser/nodeunit.js - echo "var nodeunit = {};" >> $(BUILDDIR)/browser/nodeunit.js - echo "var reporter = {};" >> $(BUILDDIR)/browser/nodeunit.js - cat deps/async.js >> $(BUILDDIR)/browser/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js - cat lib/assert.js >> $(BUILDDIR)/browser/nodeunit.js - echo "})(assert);" >> $(BUILDDIR)/browser/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js - cat lib/types.js >> $(BUILDDIR)/browser/nodeunit.js - echo "})(types);" >> $(BUILDDIR)/browser/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js - cat lib/core.js >> $(BUILDDIR)/browser/nodeunit.js - echo "})(core);" >> $(BUILDDIR)/browser/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/browser/nodeunit.js - cat lib/reporters/browser.js >> $(BUILDDIR)/browser/nodeunit.js - echo "})(reporter);" >> $(BUILDDIR)/browser/nodeunit.js - echo "nodeunit = core;" >> $(BUILDDIR)/browser/nodeunit.js - echo "nodeunit.assert = assert;" >> $(BUILDDIR)/browser/nodeunit.js - echo "nodeunit.reporter = reporter;" >> $(BUILDDIR)/browser/nodeunit.js - echo "nodeunit.run = reporter.run;" >> $(BUILDDIR)/browser/nodeunit.js - echo "return nodeunit; })();" >> $(BUILDDIR)/browser/nodeunit.js - cp $(BUILDDIR)/browser/nodeunit.js $(BUILDDIR)/browser/.nodeunit.js - sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.nodeunit.js > $(BUILDDIR)/browser/nodeunit.js - rm $(BUILDDIR)/browser/.nodeunit.js - # copy nodeunit.css - cp share/nodeunit.css $(BUILDDIR)/browser/nodeunit.css - # create nodeunit.min.js - node_modules/uglify-js/bin/uglifyjs $(BUILDDIR)/browser/nodeunit.js > $(BUILDDIR)/browser/nodeunit.min.js - # create test scripts - mkdir -p $(BUILDDIR)/browser/test - cp test/test.html $(BUILDDIR)/browser/test/test.html - # test-base.js - echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-base.js - cat test/test-base.js >> $(BUILDDIR)/browser/test/test-base.js - echo "})(this.test_base = {});" >> $(BUILDDIR)/browser/test/test-base.js - cp $(BUILDDIR)/browser/test/test-base.js $(BUILDDIR)/browser/.test-base.js - sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-base.js > $(BUILDDIR)/browser/test/test-base.js - rm $(BUILDDIR)/browser/.test-base.js - # test-runmodule.js - echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-runmodule.js - cat test/test-runmodule.js >> $(BUILDDIR)/browser/test/test-runmodule.js - echo "})(this.test_runmodule = {});" >> $(BUILDDIR)/browser/test/test-runmodule.js - cp $(BUILDDIR)/browser/test/test-runmodule.js $(BUILDDIR)/browser/.test-runmodule.js - sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-runmodule.js > $(BUILDDIR)/browser/test/test-runmodule.js - rm $(BUILDDIR)/browser/.test-runmodule.js - # test-runtest.js - echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-runtest.js - cat test/test-runtest.js >> $(BUILDDIR)/browser/test/test-runtest.js - echo "})(this.test_runtest = {});" >> $(BUILDDIR)/browser/test/test-runtest.js - cp $(BUILDDIR)/browser/test/test-runtest.js $(BUILDDIR)/browser/.test-runtest.js - sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-runtest.js > $(BUILDDIR)/browser/test/test-runtest.js - rm $(BUILDDIR)/browser/.test-runtest.js - # test-testcase.js - echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-testcase.js - cat test/test-testcase.js >> $(BUILDDIR)/browser/test/test-testcase.js - echo "})(this.test_testcase = {});" >> $(BUILDDIR)/browser/test/test-testcase.js - cp $(BUILDDIR)/browser/test/test-testcase.js $(BUILDDIR)/browser/.test-testcase.js - sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-testcase.js > $(BUILDDIR)/browser/test/test-testcase.js - rm $(BUILDDIR)/browser/.test-testcase.js - # test-testcase-legacy.js - echo "(function (exports) {" > $(BUILDDIR)/browser/test/test-testcase-legacy.js - cat test/test-testcase-legacy.js >> $(BUILDDIR)/browser/test/test-testcase-legacy.js - echo "})(this.test_testcase_legacy = {});" >> $(BUILDDIR)/browser/test/test-testcase-legacy.js - cp $(BUILDDIR)/browser/test/test-testcase-legacy.js $(BUILDDIR)/browser/.test-testcase-legacy.js - sed "/\@REMOVE_LINE_FOR_BROWSER/d" <$(BUILDDIR)/browser/.test-testcase-legacy.js > $(BUILDDIR)/browser/test/test-testcase-legacy.js - rm $(BUILDDIR)/browser/.test-testcase-legacy.js - # copy nodeunit.js to dist/browser/test to make it easier for me to host and - # run on windows VMs with IE - cp $(BUILDDIR)/browser/nodeunit.js $(BUILDDIR)/browser/test/nodeunit.js - cp $(BUILDDIR)/browser/nodeunit.css $(BUILDDIR)/browser/test/nodeunit.css - -commonjs: - # super hacky build script for browser commonjs version! - ##### make commonjs browser module ###### - mkdir -p $(BUILDDIR)/commonjs - rm -rf $(BUILDDIR)/commonjs/* - mkdir -p $(BUILDDIR)/commonjs/deps - cp deps/json2.js $(BUILDDIR)/commonjs/deps - cp deps/async.js $(BUILDDIR)/commonjs/deps - echo "var async = require('async');" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "var assert = {};" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "var types = {};" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "var core = {};" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "var nodeunit = {};" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "var reporter = {};" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/commonjs/nodeunit.js - cat lib/assert.js >> $(BUILDDIR)/commonjs/nodeunit.js - echo "})(assert);" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/commonjs/nodeunit.js - cat lib/types.js >> $(BUILDDIR)/commonjs/nodeunit.js - echo "})(types);" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "(function(exports){" >> $(BUILDDIR)/commonjs/nodeunit.js - cat lib/core.js >> $(BUILDDIR)/commonjs/nodeunit.js - echo "})(core);" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "module.exports = core;" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "(function(exports, nodeunit){" >> $(BUILDDIR)/commonjs/nodeunit.js - cat lib/reporters/browser.js >> $(BUILDDIR)/commonjs/nodeunit.js - echo "})(reporter, module.exports);" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "module.exports.assert = assert;" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "module.exports.reporter = reporter;" >> $(BUILDDIR)/commonjs/nodeunit.js - echo "module.exports.run = reporter.run;" >> $(BUILDDIR)/commonjs/nodeunit.js - sed -i "/\@REMOVE_LINE_FOR_BROWSER/d" $(BUILDDIR)/commonjs/nodeunit.js - sed -i "/\@REMOVE_LINE_FOR_COMMONJS/d" $(BUILDDIR)/commonjs/nodeunit.js - ##### end of commonjs browser module ##### - -build: stamp-build - -stamp-build: $(wildcard deps/* lib/*.js) - touch $@; - mkdir -p $(BUILDDIR)/nodeunit - cp -R bin node_modules deps index.js lib package.json share $(BUILDDIR)/nodeunit - printf '#!/bin/sh\n$(NODEJS) $(NODEJSLIBDIR)/$(PACKAGE)/bin/nodeunit $$@' > $(BUILDDIR)/nodeunit.sh - -test: - $(NODEJS) ./bin/nodeunit test - -install: build - install -d $(NODEJSLIBDIR) - cp -a $(BUILDDIR)/nodeunit $(NODEJSLIBDIR) - install -m 0755 $(BUILDDIR)/nodeunit.sh $(BINDIR)/nodeunit - install -d $(MANDIR)/man1/ - cp -a man1/nodeunit.1 $(MANDIR)/man1/ - -uninstall: - rm -rf $(NODEJSLIBDIR)/nodeunit $(NODEJSLIBDIR)/nodeunit.js $(BINDIR)/nodeunit - rm -rf $(MANDIR)/man1/nodeunit.1 - -clean: - rm -rf $(BUILDDIR) stamp-build - -lint: - nodelint --config nodelint.cfg ./index.js ./bin/nodeunit ./bin/nodeunit.json ./lib/*.js ./lib/reporters/*.js ./test/*.js - -doc: man1 $(DOCS) - @true - -man1: - @if ! test -d man1 ; then mkdir -p man1 ; fi - -# use `npm install ronn` for this to work. -man1/%.1: doc/%.md - ronn --roff $< > $@ - -.PHONY: browser test install uninstall build all diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/README.md deleted file mode 100644 index 587123c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/README.md +++ /dev/null @@ -1,464 +0,0 @@ -Nodeunit -======== - -Simple syntax, powerful tools. Nodeunit provides easy async unit testing for -node.js and the browser. - -* Simple to use -* Just export the tests from a module -* Works with node.js and in the browser -* Helps you avoid common pitfalls when testing asynchronous code -* Easy to add test cases with setUp and tearDown functions if you wish -* Flexible reporters for custom output, built-in support for HTML and jUnit XML -* Allows the use of mocks and stubs - -__Contributors__ - -* [alexgorbatchev](https://github.com/alexgorbatchev) -* [alexkwolfe](https://github.com/alexkwolfe) -* [azatoth](https://github.com/azatoth) -* [kadirpekel](https://github.com/kadirpekel) -* [lambdalisue](https://github.com/lambdalisue) -* [luebken](https://github.com/luebken) -* [orlandov](https://github.com/orlandov) -* [Sannis](https://github.com/Sannis) -* [sstephenson](https://github.com/sstephenson) -* [thegreatape](https://github.com/thegreatape) -* [mmalecki](https://github.com/mmalecki) -* and thanks to [cjohansen](https://github.com/cjohansen) for input and advice - on implementing setUp and tearDown functions. See - [cjohansen's fork](https://github.com/cjohansen/nodeunit). - -Also, check out gerad's [nodeunit-dsl](https://github.com/gerad/nodeunit-dsl) -project, which implements a 'pretty dsl on top of nodeunit'. - -More contributor information can be found in the -[CONTRIBUTORS.md](https://github.com/caolan/nodeunit/blob/master/CONTRIBUTORS.md) -file. - -Usage ------ - -Here is an example unit test module: - - exports.testSomething = function(test){ - test.expect(1); - test.ok(true, "this assertion should pass"); - test.done(); - }; - - exports.testSomethingElse = function(test){ - test.ok(false, "this assertion should fail"); - test.done(); - }; - -When run using the included test runner, this will output the following: - - - -Installation ------------- - -There are two options for installing nodeunit: - -1. Clone / download nodeunit from [github](https://github.com/caolan/nodeunit), - then: - - make && sudo make install - -2. Install via npm: - - npm install nodeunit -g - -API Documentation ------------------ - -Nodeunit uses the functions available in the node.js -[assert module](http://nodejs.org/docs/v0.4.2/api/assert.html): - -* __ok(value, [message])__ - Tests if value is a true value. -* __equal(actual, expected, [message])__ - Tests shallow, coercive equality - with the equal comparison operator ( == ). -* __notEqual(actual, expected, [message])__ - Tests shallow, coercive - non-equality with the not equal comparison operator ( != ). -* __deepEqual(actual, expected, [message])__ - Tests for deep equality. -* __notDeepEqual(actual, expected, [message])__ - Tests for any deep - inequality. -* __strictEqual(actual, expected, [message])__ - Tests strict equality, as - determined by the strict equality operator ( === ) -* __notStrictEqual(actual, expected, [message])__ - Tests strict non-equality, - as determined by the strict not equal operator ( !== ) -* __throws(block, [error], [message])__ - Expects block to throw an error. -* __doesNotThrow(block, [error], [message])__ - Expects block not to throw an - error. -* __ifError(value)__ - Tests if value is not a false value, throws if it is a - true value. Useful when testing the first argument, error in callbacks. - -Nodeunit also provides the following functions within tests: - -* __expect(amount)__ - Specify how many assertions are expected to run within a - test. Very useful for ensuring that all your callbacks and assertions are - run. -* __done()__ - Finish the current test function, and move on to the next. ALL - tests should call this! - -Nodeunit aims to be simple and easy to learn. This is achieved through using -existing structures (such as node.js modules) to maximum effect, and reducing -the API where possible, to make it easier to digest. - -Tests are simply exported from a module, but they are still run in the order -they are defined. - -__Note:__ Users of old nodeunit versions may remember using `ok`, `equals` and -`same` in the style of qunit, instead of the assert functions above. These -functions still exist for backwards compatibility, and are simply aliases to -their assert module counterparts. - - -Asynchronous Testing --------------------- - -When testing asynchronous code, there are a number of sharp edges to watch out -for. Thankfully, nodeunit is designed to help you avoid as many of these -pitfalls as possible. For the most part, testing asynchronous code in nodeunit -_just works_. - - -### Tests run in series - -While running tests in parallel seems like a good idea for speeding up your -test suite, in practice I've found it means writing much more complicated -tests. Because of node's module cache, running tests in parallel means mocking -and stubbing is pretty much impossible. One of the nicest things about testing -in javascript is the ease of doing stubs: - - var _readFile = fs.readFile; - fs.readFile = function(path, callback){ - // it's a stub! - }; - // test function that uses fs.readFile - - // we're done - fs.readFile = _readFile; - -You cannot do this when running tests in parallel. In order to keep testing as -simple as possible, nodeunit avoids it. Thankfully, most unit-test suites run -fast anyway. - - -### Explicit ending of tests - -When testing async code it's important that tests end at the correct point, not -just after a given number of assertions. Otherwise your tests can run short, -ending before all assertions have completed. It's important to detect too -many assertions as well as too few. Combining explicit ending of tests with -an expected number of assertions helps to avoid false test passes, so be sure -to use the `test.expect()` method at the start of your test functions, and -`test.done()` when finished. - - -Groups, setUp and tearDown --------------------------- - -Nodeunit allows the nesting of test functions: - - exports.test1 = function (test) { - ... - } - - exports.group = { - test2: function (test) { - ... - }, - test3: function (test) { - ... - } - } - -This would be run as: - - test1 - group - test2 - group - test3 - -Using these groups, Nodeunit allows you to define a `setUp` function, which is -run before each test, and a `tearDown` function, which is run after each test -calls `test.done()`: - - module.exports = { - setUp: function (callback) { - this.foo = 'bar'; - callback(); - }, - tearDown: function (callback) { - // clean up - callback(); - }, - test1: function (test) { - test.equals(this.foo, 'bar'); - test.done(); - } - }; - -In this way, it's possible to have multiple groups of tests in a module, each -group with its own setUp and tearDown functions. - - -Running Tests -------------- - -Nodeunit comes with a basic command-line test runner, which can be installed -using `sudo make install`. Example usage: - - nodeunit testmodule1.js testfolder [...] - -The default test reporter uses color output, because I think that's more fun :) I -intend to add a no-color option in future. To give you a feeling of the fun you'll -be having writing tests, lets fix the example at the start of the README: - - - -Ahhh, Doesn't that feel better? - -When using the included test runner, it will exit using the failed number of -assertions as the exit code. This means it exits with 0 when all tests pass. - - -### Command-line Options - -* __--reporter FILE__ - you can set the test reporter to a custom module or -on of the modules in nodeunit/lib/reporters, when omitted, the default test runner -is used. -* __--list-reporters__ - list available built-in reporters. -* __--config FILE__ - load config options from a JSON file, allows -the customisation of color schemes for the default test reporter etc. See -bin/nodeunit.json for current available options. -* __--version__ or __-v__ - report nodeunit version -* __--help__ - show nodeunit help - - -Running tests in the browser ----------------------------- - -Nodeunit tests can also be run inside the browser. For example usage, see -the examples/browser folder. The basic syntax is as follows: - -__test.html__ - - - - Example Test Suite - - - - - - -

Example Test Suite

- - - - -Here, `suite1` and `suite2` are just object literals containing test functions -or groups, as would be returned if you did `require('test-suite')` in node.js: - -__suite1.js__ - - this.suite1 = { - 'example test': function (test) { - test.ok(true, 'everything is ok'); - test.done(); - } - }; - -If you wish to use a commonjs format for your test suites (using exports), it is -up to you to define the commonjs tools for the browser. There are a number of -alternatives and it's important it fits with your existing code, which is -why nodeunit does not currently provide this out of the box. - -In the example above, the tests will run when the page is loaded. - -The browser-version of nodeunit.js is created in dist/browser when you do, `make -browser`. You'll need [UglifyJS](https://github.com/mishoo/UglifyJS) installed in -order for it to automatically create nodeunit.min.js. - - -Adding nodeunit to Your Projects --------------------------------- - -If you don't want people to have to install the nodeunit command-line tool, -you'll want to create a script that runs the tests for your project with the -correct require paths set up. Here's an example test script, that assumes you -have nodeunit in a suitably located node_modules directory. - - #!/usr/bin/env node - var reporter = require('nodeunit').reporters.default; - reporter.run(['test']); - -If you're using git, you might find it useful to include nodeunit as a -submodule. Using submodules makes it easy for developers to download nodeunit -and run your test suite, without cluttering up your repository with -the source code. To add nodeunit as a git submodule do the following: - - git submodule add git://github.com/caolan/nodeunit.git node_modules/nodeunit - -This will add nodeunit to the node_modules folder of your project. Now, when -cloning the repository, nodeunit can be downloaded by doing the following: - - git submodule init - git submodule update - -Let's update the test script above with a helpful hint on how to get nodeunit, -if it's missing: - - #!/usr/bin/env node - try { - var reporter = require('nodeunit').reporters.default; - } - catch(e) { - console.log("Cannot find nodeunit module."); - console.log("You can download submodules for this project by doing:"); - console.log(""); - console.log(" git submodule init"); - console.log(" git submodule update"); - console.log(""); - process.exit(); - } - - process.chdir(__dirname); - reporter.run(['test']); - -Now if someone attempts to run your test suite without nodeunit installed they -will be prompted to download the submodules for your project. - - -Built-in Test Reporters ------------------------ - -* __default__ - The standard reporter seen in the nodeunit screenshots -* __minimal__ - Pretty, minimal output, shows errors and progress only -* __html__ - Outputs a HTML report to stdout -* __junit__ - Creates jUnit compatible XML reports, which can be used with - continuous integration tools such as [Hudson](http://hudson-ci.org/). -* __machineout__ - Simple reporter for machine analysis. There is - [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) which is useful for TDD on VIM. - - -Writing a Test Reporter ---------------------- - -Nodeunit exports runTest(fn, options), runModule(mod, options) and -runFiles(paths, options). You'll most likely want to run test suites from -files, which can be done using the latter function. The _options_ argument can -contain callbacks which run during testing. Nodeunit provides the following -callbacks: - -* __moduleStart(name)__ - called before a module is tested -* __moduleDone(name, assertions)__ - called once all test functions within the - module have completed (see assertions object reference below) - ALL tests within the module -* __testStart(name)__ - called before a test function is run -* __testReady(test)__ - called before a test function is run with the test object that will be passed to the test function -* __testDone(name, assertions)__ - called once a test function has completed - (by calling test.done()) -* __log(assertion)__ - called whenever an assertion is made (see assertion - object reference below) -* __done(assertions)__ - called after all tests/modules are complete - -The __assertion__ object: - -* __passed()__ - did the assertion pass? -* __failed()__ - did the assertion fail? -* __error__ - the AssertionError if the assertion failed -* __method__ - the nodeunit assertion method used (ok, same, equals...) -* __message__ - the message the assertion method was called with (optional) - -The __assertionList__ object: - -* An array-like object with the following new attributes: - * __failures()__ - the number of assertions which failed - * __duration__ - the time taken for the test to complete in msecs - -For a reference implementation of a test reporter, see lib/reporters/default.js in -the nodeunit project directory. - - -Sandbox utility ---------------- - -This is a function which evaluates JavaScript files in a sandbox and returns the -context. The sandbox function can be used for testing client-side code or private -un-exported functions within a module. - - var sandbox = require('nodeunit').utils.sandbox; - var example = sandbox('example.js'); - -__sandbox(files, sandbox)__ - Evaluates JavaScript files in a sandbox, returning -the context. The first argument can either be a single filename or an array of -filenames. If multiple filenames are given their contents are concatenated before -evaluation. The second argument is an optional context to use for the sandbox. - -Note: When working with the sandbox if your script depends on outside sources -(i.e. using `require`) then you will want to pass that into the optional -context when setting up the sandbox. - - var sandbox = require('nodeunit').utils.sandbox; - // pass in some node globals - var box_globals = { - // Passing module.exports into the sandbox will give your code access to it. - module: {exports: exports}, - // Passing require into the sandbox will give your code access to use it AND - // will share the cache with modules already required from outside the sandbox. - require: require, - // Passing console into the sandbox will give your code access to it - console: console - }; - var example = sandbox('example.js', box_globals); - - -Running the nodeunit Tests --------------------------- - -The tests for nodeunit are written using nodeunit itself as the test framework. -However, the module test-base.js first does some basic tests using the assert -module to ensure that test functions are actually run, and a basic level of -nodeunit functionality is available. - -To run the nodeunit tests do: - - make test - -__Note:__ There was a bug in node v0.2.0 causing the tests to hang, upgrading -to v0.2.1 fixes this. - - -__machineout__ reporter ----------------------------------------------- - -The default reporter is readable for human but not for machine analysis. -When you want to analyze the output of nodeunit, use __machineout__ reporter and you will get - - - - -nodeunit with vim ----------------------------------- -There is [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) so you can use -nodeunit with VIM. - -That compiler uses __machineout__ reporter and it is useful to use -with [vim-makegreen](https://github.com/reinh/vim-makegreen). - - - -Contributing ------------- - -Contributions to the project are most welcome, so feel free to fork and improve. -When submitting a pull request, please run `make lint` first to ensure -we're following a consistent coding style. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit deleted file mode 100755 index 4b3f4d5..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env node - -var - fs = require('fs'), - path = require('path'); - -// TODO: remove this when https://github.com/joyent/node/pull/1312 -// lands in core. -// -// Until then, use console.log from npm (https://gist.github.com/1077544) -require('../deps/console.log'); - -//require.paths.push(process.cwd()); -var args = (process.ARGV || process.argv).slice(2); - -var files = []; - -var testrunner, - config_file, - config_param_found = false, - output_param_found = false, - reporter_file = 'default', - reporter_param_found = false, - testspec_param_found = false; - testFullSpec_param_found = false; - -var usage = "Usage: nodeunit [options] testmodule1.js testfolder [...] \n" + - "Options:\n\n" + - " --config FILE the path to a JSON file with options\n" + - " --reporter FILE optional path to a reporter file to customize the output\n" + - " --list-reporters list available build-in reporters\n" + - " -t name, specify a test to run\n" + - " -f fullname, specify a specific test to run. fullname is built so: \"outerGroup - .. - innerGroup - testName\"\n" + - " -h, --help display this help and exit\n" + - " -v, --version output version information and exit"; - - - -// load default options -var content = fs.readFileSync(__dirname + '/nodeunit.json', 'utf8'); -var options = JSON.parse(content); - -// a very basic pseudo --options parser -args.forEach(function (arg) { - if (arg.slice(0, 9) === "--config=") { - config_file = arg.slice(9); - } else if (arg === '--config') { - config_param_found = true; - } else if (config_param_found) { - config_file = arg; - config_param_found = false; - } else if (arg.slice(0, 9) === "--output=") { - options.output = arg.slice(9); - } else if (arg === '--output') { - output_param_found = true; - } else if (output_param_found) { - options.output = arg; - output_param_found = false; - } else if (arg.slice(0, 11) === "--reporter=") { - reporter_file = arg.slice(11); - } else if (arg === '--reporter') { - reporter_param_found = true; - } else if (reporter_param_found) { - reporter_file = arg; - reporter_param_found = false; - } else if (arg === '-t') { - testspec_param_found = true; - } else if (testspec_param_found) { - options.testspec = arg; - testspec_param_found = false; - } else if (arg === '-f') { - testFullSpec_param_found = true; - } else if (testFullSpec_param_found) { - options.testFullSpec= arg; - testFullSpec_param_found = false; - } else if (arg === '--list-reporters') { - var reporters = fs.readdirSync(__dirname + '/../lib/reporters'); - reporters = reporters.filter(function (reporter_file) { - return (/\.js$/).test(reporter_file); - }).map(function (reporter_file) { - return reporter_file.replace(/\.js$/, ''); - }).filter(function (reporter_file) { - return reporter_file !== 'index'; - }); - console.log('Build-in reporters: '); - reporters.forEach(function (reporter_file) { - var reporter = require('../lib/reporters/' + reporter_file); - console.log(' * ' + reporter_file + (reporter.info ? ': ' + reporter.info : '')); - }); - process.exit(0); - } else if ((arg === '-v') || (arg === '--version')) { - var content = fs.readFileSync(__dirname + '/../package.json', 'utf8'); - var pkg = JSON.parse(content); - console.log(pkg.version); - process.exit(0); - } else if ((arg === '-h') || (arg === '--help')) { - console.log(usage); - process.exit(0); - } else { - files.push(arg); - } -}); - -if (files.length === 0) { - console.log('Files required.'); - console.log(usage); - process.exit(1); -} - -if (config_file) { - content = fs.readFileSync(config_file, 'utf8'); - var custom_options = JSON.parse(content); - - for (var option in custom_options) { - if (typeof option === 'string') { - options[option] = custom_options[option]; - } - } -} - -var builtin_reporters = require(__dirname + '/../lib/reporters'); -if (reporter_file in builtin_reporters) { - testrunner = builtin_reporters[reporter_file]; -} -else { - testrunner = require(reporter_file); -} - -testrunner.run(files, options, function(err) { - if (err) { - process.exit(1); - } -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit.json deleted file mode 100644 index 5c7778f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/bin/nodeunit.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "error_prefix": "\u001B[31m", - "error_suffix": "\u001B[39m", - "ok_prefix": "\u001B[32m", - "ok_suffix": "\u001B[39m", - "bold_prefix": "\u001B[1m", - "bold_suffix": "\u001B[22m", - "assertion_prefix": "\u001B[35m", - "assertion_suffix": "\u001B[39m" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js deleted file mode 100644 index f65be61..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/async.js +++ /dev/null @@ -1,628 +0,0 @@ -/*global setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root = this, - previous_async = root.async; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - else { - root.async = async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - //// cross-browser compatiblity functions //// - - var _forEach = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _forEach(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _forEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - var _indexOf = function (arr, item) { - if (arr.indexOf) { - return arr.indexOf(item); - } - for (var i = 0; i < arr.length; i += 1) { - if (arr[i] === item) { - return i; - } - } - return -1; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof setImmediate === 'function') { - async.nextTick = function (fn) { - setImmediate(fn); - }; - } - else if (typeof process !== 'undefined' && process.nextTick) { - async.nextTick = process.nextTick; - } - else { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - } - - async.forEach = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - _forEach(arr, function (x) { - iterator(x, function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - } - }); - }); - }; - - async.forEachSeries = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEach].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.forEachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - q.process(); - }); - } - }, - length: function () { - return tasks.length; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - hasher = hasher || function (x) { - return x; - }; - return function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else { - fn.apply(null, args.concat([function () { - memo[key] = arguments; - callback.apply(null, arguments); - }])); - } - }; - }; - -}()); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/console.log.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/console.log.js deleted file mode 100644 index fe146c1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/console.log.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - A console.log that won't leave you hanging when node exits - 90% of this file was ripped from node.js - - License: see: https://github.com/joyent/node/blob/master/lib/console.js - */ - - // console object -var formatRegExp = /%[sdj]/g; -function format(f) { - var util = require('util'); - - if (typeof f !== 'string') { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(util.inspect(arguments[i])); - } - return objects.join(' '); - } - - - var i = 1; - var args = arguments; - var str = String(f).replace(formatRegExp, function(x) { - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': return JSON.stringify(args[i++]); - default: - return x; - } - }); - for (var len = args.length, x = args[i]; i < len; x = args[++i]) { - if (x === null || typeof x !== 'object') { - str += ' ' + x; - } else { - str += ' ' + util.inspect(x); - } - } - return str; -} - -console.log = function() { - var res = process.stdout.write(format.apply(this, arguments) + '\n'); - - // this is the first time stdout got backed up - if (!res && !process.stdout.pendingWrite) { - process.stdout.pendingWrite = true; - - // magic sauce: keep node alive until stdout has flushed - process.stdout.once('drain', function () { - process.stdout.draining = false; - }); - } -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/History.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/History.md deleted file mode 100644 index 00d2b5b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/History.md +++ /dev/null @@ -1,70 +0,0 @@ - -0.4.3 / 2011-06-20 -================== - - * Fixed stacktraces line number when used multiline js expressions [Octave] - -0.4.2 / 2011-05-11 -================== - - * Added client side support - -0.4.1 / 2011-04-21 -================== - - * Fixed error context - -0.4.0 / 2011-04-21 -================== - - * Added; ported jade's error reporting to ejs. [slaskis] - -0.3.1 / 2011-02-23 -================== - - * Fixed optional `compile()` options - -0.3.0 / 2011-02-14 -================== - - * Added 'json' filter [Yuriy Bogdanov] - * Use exported version of parse function to allow monkey-patching [Anatoliy Chakkaev] - -0.2.1 / 2010-10-07 -================== - - * Added filter support - * Fixed _cache_ option. ~4x performance increase - -0.2.0 / 2010-08-05 -================== - - * Added support for global tag config - * Added custom tag support. Closes #5 - * Fixed whitespace bug. Closes #4 - -0.1.0 / 2010-08-04 -================== - - * Faster implementation [ashleydev] - -0.0.4 / 2010-08-02 -================== - - * Fixed single quotes for content outside of template tags. [aniero] - * Changed; `exports.compile()` now expects only "locals" - -0.0.3 / 2010-07-15 -================== - - * Fixed single quotes - -0.0.2 / 2010-07-09 -================== - - * Fixed newline preservation - -0.0.1 / 2010-07-09 -================== - - * Initial release diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Makefile b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Makefile deleted file mode 100644 index a8b00d9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ - -SRC = $(shell find lib -name "*.js" -type f) -UGLIFY_FLAGS = --no-mangle - -test: - @./node_modules/.bin/expresso test/*.test.js - -ejs.js: $(SRC) - @node support/compile.js $^ - -ejs.min.js: ejs.js - @uglifyjs $(UGLIFY_FLAGS) $< > $@ \ - && du ejs.min.js \ - && du ejs.js - -clean: - rm -f ejs.js - rm -f ejs.min.js - -.PHONY: test \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Readme.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Readme.md deleted file mode 100644 index 58cb10a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/Readme.md +++ /dev/null @@ -1,152 +0,0 @@ - -# EJS - -Embedded JavaScript templates. - -## Installation - - $ npm install ejs - -## Features - - * Complies with the [Express](http://expressjs.com) view system - * Static caching of intermediate JavaScript - * Unbuffered code for conditionals etc `<% code %>` - * Escapes html by default with `<%= code %>` - * Unescaped buffering with `<%- code %>` - * Supports tag customization - * Filter support for designer-friendly templates - * Client-side support - -## Example - - <% if (user) { %> -

<%= user.name %>

- <% } %> - -## Usage - - ejs.compile(str, options); - // => Function - - ejs.render(str, options); - // => str - -## Options - - - `locals` Local variables object - - `cache` Compiled functions are cached, requires `filename` - - `filename` Used by `cache` to key caches - - `scope` Function execution context - - `debug` Output generated function body - - `open` Open tag, defaulting to "<%" - - `close` Closing tag, defaulting to "%>" - -## Custom tags - -Custom tags can also be applied globally: - - var ejs = require('ejs'); - ejs.open = '{{'; - ejs.close = '}}'; - -Which would make the following a valid template: - -

{{= title }}

- -## Filters - -EJS conditionally supports the concept of "filters". A "filter chain" -is a designer friendly api for manipulating data, without writing JavaScript. - -Filters can be applied by supplying the _:_ modifier, so for example if we wish to take the array `[{ name: 'tj' }, { name: 'mape' }, { name: 'guillermo' }]` and output a list of names we can do this simply with filters: - -Template: - -

<%=: users | map:'name' | join %>

- -Output: - -

Tj, Mape, Guillermo

- -Render call: - - ejs.render(str, { - locals: { - users: [ - { name: 'tj' }, - { name: 'mape' }, - { name: 'guillermo' } - ] - } - }); - -Or perhaps capitalize the first user's name for display: - -

<%=: users | first | capitalize %>

- -## Filter list - -Currently these filters are available: - - - first - - last - - capitalize - - downcase - - upcase - - sort - - sort_by:'prop' - - size - - length - - plus:n - - minus:n - - times:n - - divided_by:n - - join:'val' - - truncate:n - - truncate_words:n - - replace:pattern,substitution - - prepend:val - - append:val - - map:'prop' - - reverse - - get:'prop' - -## Adding filters - - To add a filter simply add a method to the `.filters` object: - -```js -ejs.filters.last = function(obj) { - return obj[obj.length - 1]; -}; -``` - -## client-side support - - include `./ejs.js` or `./ejs.min.js` and `require("ejs").compile(str)`. - -## License - -(The MIT License) - -Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca> - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -'Software'), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/benchmark.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/benchmark.js deleted file mode 100644 index 7b267e1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/benchmark.js +++ /dev/null @@ -1,14 +0,0 @@ - - -var ejs = require('./lib/ejs'), - str = '<% if (foo) { %>

<%= foo %>

<% } %>', - times = 50000; - -console.log('rendering ' + times + ' times'); - -var start = new Date; -while (times--) { - ejs.render(str, { cache: true, filename: 'test', locals: { foo: 'bar' }}); -} - -console.log('took ' + (new Date - start) + 'ms'); \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.js deleted file mode 100644 index b8c6aa1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.js +++ /dev/null @@ -1,531 +0,0 @@ - -// CommonJS require() - -function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - } - -require.modules = {}; - -require.resolve = function (path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }; - -require.register = function (path, fn){ - require.modules[path] = fn; - }; - -require.relative = function (parent) { - return function(p){ - if ('.' != p[0]) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }; - - -require.register("ejs.js", function(module, exports, require){ - -/*! - * EJS - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('./utils'); - -/** - * Library version. - */ - -exports.version = '0.4.2'; - -/** - * Filters. - * - * @type Object - */ - -var filters = exports.filters = require('./filters'); - -/** - * Intermediate js cache. - * - * @type Object - */ - -var cache = {}; - -/** - * Clear intermediate js cache. - * - * @api public - */ - -exports.clearCache = function(){ - cache = {}; -}; - -/** - * Translate filtered code into function calls. - * - * @param {String} js - * @return {String} - * @api private - */ - -function filtered(js) { - return js.substr(1).split('|').reduce(function(js, filter){ - var parts = filter.split(':') - , name = parts.shift() - , args = parts.shift() || ''; - if (args) args = ', ' + args; - return 'filters.' + name + '(' + js + args + ')'; - }); -}; - -/** - * Re-throw the given `err` in context to the - * `str` of ejs, `filename`, and `lineno`. - * - * @param {Error} err - * @param {String} str - * @param {String} filename - * @param {String} lineno - * @api private - */ - -function rethrow(err, str, filename, lineno){ - var lines = str.split('\n') - , start = Math.max(lineno - 3, 0) - , end = Math.min(lines.length, lineno + 3); - - // Error context - var context = lines.slice(start, end).map(function(line, i){ - var curr = i + start + 1; - return (curr == lineno ? ' >> ' : ' ') - + curr - + '| ' - + line; - }).join('\n'); - - // Alter exception message - err.path = filename; - err.message = (filename || 'ejs') + ':' - + lineno + '\n' - + context + '\n\n' - + err.message; - - throw err; -} - -/** - * Parse the given `str` of ejs, returning the function body. - * - * @param {String} str - * @return {String} - * @api public - */ - -var parse = exports.parse = function(str, options){ - var options = options || {} - , open = options.open || exports.open || '<%' - , close = options.close || exports.close || '%>'; - - var buf = [ - "var buf = [];" - , "\nwith (locals) {" - , "\n buf.push('" - ]; - - var lineno = 1; - - for (var i = 0, len = str.length; i < len; ++i) { - if (str.slice(i, open.length + i) == open) { - i += open.length - - var prefix, postfix, line = '__stack.lineno=' + lineno; - switch (str[i]) { - case '=': - prefix = "', escape((" + line + ', '; - postfix = ")), '"; - ++i; - break; - case '-': - prefix = "', (" + line + ', '; - postfix = "), '"; - ++i; - break; - default: - prefix = "');" + line + ';'; - postfix = "; buf.push('"; - } - - var start = i; - var end = str.indexOf(close, i); - var js = str.substring(i, end); - var n = 0; - while ((n = js.indexOf("\n", n)) > -1) { - n++; - lineno++; - } - if (js[0] == ':') js = filtered(js); - buf.push(prefix, js, postfix); - i += end - start + close.length - 1; - - } else if (str[i] == "\\") { - buf.push("\\\\"); - } else if (str[i] == "'") { - buf.push("\\'"); - } else if (str[i] == "\r") { - buf.push(" "); - } else if (str[i] == "\n") { - buf.push("\\n"); - lineno++; - } else { - buf.push(str[i]); - } - } - - buf.push("');\n}\nreturn buf.join('');"); - return buf.join(''); -}; - -/** - * Compile the given `str` of ejs into a `Function`. - * - * @param {String} str - * @param {Object} options - * @return {Function} - * @api public - */ - -var compile = exports.compile = function(str, options){ - options = options || {}; - - var input = JSON.stringify(str) - , filename = options.filename - ? JSON.stringify(options.filename) - : 'undefined'; - - // Adds the fancy stack trace meta info - str = [ - 'var __stack = { lineno: 1, input: ' + input + ', filename: ' + filename + ' };', - rethrow.toString(), - 'try {', - exports.parse(str, options), - '} catch (err) {', - ' rethrow(err, __stack.input, __stack.filename, __stack.lineno);', - '}' - ].join("\n"); - - if (options.debug) console.log(str); - var fn = new Function('locals, filters, escape', str); - return function(locals){ - return fn.call(this, locals, filters, utils.escape); - } -}; - -/** - * Render the given `str` of ejs. - * - * Options: - * - * - `locals` Local variables object - * - `cache` Compiled functions are cached, requires `filename` - * - `filename` Used by `cache` to key caches - * - `scope` Function execution context - * - `debug` Output generated function body - * - `open` Open tag, defaulting to "<%" - * - `close` Closing tag, defaulting to "%>" - * - * @param {String} str - * @param {Object} options - * @return {String} - * @api public - */ - -exports.render = function(str, options){ - var fn - , options = options || {}; - if (options.cache) { - if (options.filename) { - fn = cache[options.filename] || (cache[options.filename] = compile(str, options)); - } else { - throw new Error('"cache" option requires "filename".'); - } - } else { - fn = compile(str, options); - } - return fn.call(options.scope, options.locals || {}); -}; - -/** - * Expose to require(). - */ - -if (require.extensions) { - require.extensions['.ejs'] = function(module, filename) { - source = require('fs').readFileSync(filename, 'utf-8'); - module._compile(compile(source, {}), filename); - }; -} else if (require.registerExtension) { - require.registerExtension('.ejs', function(src) { - return compile(src, {}); - }); -} - -}); // module: ejs.js - -require.register("filters.js", function(module, exports, require){ - -/*! - * EJS - Filters - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * First element of the target `obj`. - */ - -exports.first = function(obj) { - return obj[0]; -}; - -/** - * Last element of the target `obj`. - */ - -exports.last = function(obj) { - return obj[obj.length - 1]; -}; - -/** - * Capitalize the first letter of the target `str`. - */ - -exports.capitalize = function(str){ - str = String(str); - return str[0].toUpperCase() + str.substr(1, str.length); -}; - -/** - * Downcase the target `str`. - */ - -exports.downcase = function(str){ - return String(str).toLowerCase(); -}; - -/** - * Uppercase the target `str`. - */ - -exports.upcase = function(str){ - return String(str).toUpperCase(); -}; - -/** - * Sort the target `obj`. - */ - -exports.sort = function(obj){ - return Object.create(obj).sort(); -}; - -/** - * Sort the target `obj` by the given `prop` ascending. - */ - -exports.sort_by = function(obj, prop){ - return Object.create(obj).sort(function(a, b){ - a = a[prop], b = b[prop]; - if (a > b) return 1; - if (a < b) return -1; - return 0; - }); -}; - -/** - * Size or length of the target `obj`. - */ - -exports.size = exports.length = function(obj) { - return obj.length; -}; - -/** - * Add `a` and `b`. - */ - -exports.plus = function(a, b){ - return Number(a) + Number(b); -}; - -/** - * Subtract `b` from `a`. - */ - -exports.minus = function(a, b){ - return Number(a) - Number(b); -}; - -/** - * Multiply `a` by `b`. - */ - -exports.times = function(a, b){ - return Number(a) * Number(b); -}; - -/** - * Divide `a` by `b`. - */ - -exports.divided_by = function(a, b){ - return Number(a) / Number(b); -}; - -/** - * Join `obj` with the given `str`. - */ - -exports.join = function(obj, str){ - return obj.join(str || ', '); -}; - -/** - * Truncate `str` to `len`. - */ - -exports.truncate = function(str, len){ - str = String(str); - return str.substr(0, len); -}; - -/** - * Truncate `str` to `n` words. - */ - -exports.truncate_words = function(str, n){ - var str = String(str) - , words = str.split(/ +/); - return words.slice(0, n).join(' '); -}; - -/** - * Replace `pattern` with `substitution` in `str`. - */ - -exports.replace = function(str, pattern, substitution){ - return String(str).replace(pattern, substitution || ''); -}; - -/** - * Prepend `val` to `obj`. - */ - -exports.prepend = function(obj, val){ - return Array.isArray(obj) - ? [val].concat(obj) - : val + obj; -}; - -/** - * Append `val` to `obj`. - */ - -exports.append = function(obj, val){ - return Array.isArray(obj) - ? obj.concat(val) - : obj + val; -}; - -/** - * Map the given `prop`. - */ - -exports.map = function(arr, prop){ - return arr.map(function(obj){ - return obj[prop]; - }); -}; - -/** - * Reverse the given `obj`. - */ - -exports.reverse = function(obj){ - return Array.isArray(obj) - ? obj.reverse() - : String(obj).split('').reverse().join(''); -}; - -/** - * Get `prop` of the given `obj`. - */ - -exports.get = function(obj, prop){ - return obj[prop]; -}; - -/** - * Packs the given `obj` into json string - */ -exports.json = function(obj){ - return JSON.stringify(obj); -}; -}); // module: filters.js - -require.register("utils.js", function(module, exports, require){ - -/*! - * EJS - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - -}); // module: utils.js diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.min.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.min.js deleted file mode 100644 index 6b72d94..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/ejs.min.js +++ /dev/null @@ -1,2 +0,0 @@ -// CommonJS require() -function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');mod.exports||(mod.exports={},mod.call(mod.exports,mod,mod.exports,require.relative(path)));return mod.exports}require.modules={},require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&®||require.modules[index]&&index||orig},require.register=function(path,fn){require.modules[path]=fn},require.relative=function(parent){return function(p){if("."!=p[0])return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i> ":" ")+curr+"| "+line}).join("\n");err.path=filename,err.message=(filename||"ejs")+":"+lineno+"\n"+context+"\n\n"+err.message;throw err}var parse=exports.parse=function(str,options){var options=options||{},open=options.open||exports.open||"<%",close=options.close||exports.close||"%>",buf=["var buf = [];","\nwith (locals) {","\n buf.push('"],lineno=1;for(var i=0,len=str.length;ib)return 1;if(a/g,">").replace(/"/g,""")}}) \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/client.html b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/client.html deleted file mode 100644 index 7081a04..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/client.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.ejs b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.ejs deleted file mode 100644 index d571330..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.ejs +++ /dev/null @@ -1,7 +0,0 @@ -<% if (names.length) { %> -
    - <% names.forEach(function(name){ %> -
  • <%= name %>
  • - <% }) %> -
-<% } %> \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.js deleted file mode 100644 index 9cd7168..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/examples/list.js +++ /dev/null @@ -1,16 +0,0 @@ - -/** - * Module dependencies. - */ - -var ejs = require('../') - , fs = require('fs') - , str = fs.readFileSync(__dirname + '/list.ejs', 'utf8'); - -var ret = ejs.render(str, { - locals: { - names: ['foo', 'bar', 'baz'] - } -}); - -console.log(ret); \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/index.js deleted file mode 100644 index 20bf71a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/ejs'); \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/ejs.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/ejs.js deleted file mode 100644 index 46afa74..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/ejs.js +++ /dev/null @@ -1,251 +0,0 @@ - -/*! - * EJS - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('./utils'); - -/** - * Library version. - */ - -exports.version = '0.4.3'; - -/** - * Filters. - * - * @type Object - */ - -var filters = exports.filters = require('./filters'); - -/** - * Intermediate js cache. - * - * @type Object - */ - -var cache = {}; - -/** - * Clear intermediate js cache. - * - * @api public - */ - -exports.clearCache = function(){ - cache = {}; -}; - -/** - * Translate filtered code into function calls. - * - * @param {String} js - * @return {String} - * @api private - */ - -function filtered(js) { - return js.substr(1).split('|').reduce(function(js, filter){ - var parts = filter.split(':') - , name = parts.shift() - , args = parts.shift() || ''; - if (args) args = ', ' + args; - return 'filters.' + name + '(' + js + args + ')'; - }); -}; - -/** - * Re-throw the given `err` in context to the - * `str` of ejs, `filename`, and `lineno`. - * - * @param {Error} err - * @param {String} str - * @param {String} filename - * @param {String} lineno - * @api private - */ - -function rethrow(err, str, filename, lineno){ - var lines = str.split('\n') - , start = Math.max(lineno - 3, 0) - , end = Math.min(lines.length, lineno + 3); - - // Error context - var context = lines.slice(start, end).map(function(line, i){ - var curr = i + start + 1; - return (curr == lineno ? ' >> ' : ' ') - + curr - + '| ' - + line; - }).join('\n'); - - // Alter exception message - err.path = filename; - err.message = (filename || 'ejs') + ':' - + lineno + '\n' - + context + '\n\n' - + err.message; - - throw err; -} - -/** - * Parse the given `str` of ejs, returning the function body. - * - * @param {String} str - * @return {String} - * @api public - */ - -var parse = exports.parse = function(str, options){ - var options = options || {} - , open = options.open || exports.open || '<%' - , close = options.close || exports.close || '%>'; - - var buf = [ - "var buf = [];" - , "\nwith (locals) {" - , "\n buf.push('" - ]; - - var lineno = 1; - - for (var i = 0, len = str.length; i < len; ++i) { - if (str.slice(i, open.length + i) == open) { - i += open.length - - var prefix, postfix, line = '__stack.lineno=' + lineno; - switch (str.substr(i, 1)) { - case '=': - prefix = "', escape((" + line + ', '; - postfix = ")), '"; - ++i; - break; - case '-': - prefix = "', (" + line + ', '; - postfix = "), '"; - ++i; - break; - default: - prefix = "');" + line + ';'; - postfix = "; buf.push('"; - } - - var end = str.indexOf(close, i) - , js = str.substring(i, end) - , start = i - , n = 0; - - while (~(n = js.indexOf("\n", n))) n++, lineno++; - if (js.substr(0, 1) == ':') js = filtered(js); - buf.push(prefix, js, postfix); - i += end - start + close.length - 1; - - } else if (str.substr(i, 1) == "\\") { - buf.push("\\\\"); - } else if (str.substr(i, 1) == "'") { - buf.push("\\'"); - } else if (str.substr(i, 1) == "\r") { - buf.push(" "); - } else if (str.substr(i, 1) == "\n") { - buf.push("\\n"); - lineno++; - } else { - buf.push(str.substr(i, 1)); - } - } - - buf.push("');\n}\nreturn buf.join('');"); - return buf.join(''); -}; - -/** - * Compile the given `str` of ejs into a `Function`. - * - * @param {String} str - * @param {Object} options - * @return {Function} - * @api public - */ - -var compile = exports.compile = function(str, options){ - options = options || {}; - - var input = JSON.stringify(str) - , filename = options.filename - ? JSON.stringify(options.filename) - : 'undefined'; - - // Adds the fancy stack trace meta info - str = [ - 'var __stack = { lineno: 1, input: ' + input + ', filename: ' + filename + ' };', - rethrow.toString(), - 'try {', - exports.parse(str, options), - '} catch (err) {', - ' rethrow(err, __stack.input, __stack.filename, __stack.lineno);', - '}' - ].join("\n"); - - if (options.debug) console.log(str); - var fn = new Function('locals, filters, escape', str); - return function(locals){ - return fn.call(this, locals, filters, utils.escape); - } -}; - -/** - * Render the given `str` of ejs. - * - * Options: - * - * - `locals` Local variables object - * - `cache` Compiled functions are cached, requires `filename` - * - `filename` Used by `cache` to key caches - * - `scope` Function execution context - * - `debug` Output generated function body - * - `open` Open tag, defaulting to "<%" - * - `close` Closing tag, defaulting to "%>" - * - * @param {String} str - * @param {Object} options - * @return {String} - * @api public - */ - -exports.render = function(str, options){ - var fn - , options = options || {}; - if (options.cache) { - if (options.filename) { - fn = cache[options.filename] || (cache[options.filename] = compile(str, options)); - } else { - throw new Error('"cache" option requires "filename".'); - } - } else { - fn = compile(str, options); - } - return fn.call(options.scope, options.locals || {}); -}; - -/** - * Expose to require(). - */ - -if (require.extensions) { - require.extensions['.ejs'] = function(module, filename) { - source = require('fs').readFileSync(filename, 'utf-8'); - module._compile(compile(source, {}), filename); - }; -} else if (require.registerExtension) { - require.registerExtension('.ejs', function(src) { - return compile(src, {}); - }); -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/filters.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/filters.js deleted file mode 100644 index d425c8d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/filters.js +++ /dev/null @@ -1,198 +0,0 @@ - -/*! - * EJS - Filters - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * First element of the target `obj`. - */ - -exports.first = function(obj) { - return obj[0]; -}; - -/** - * Last element of the target `obj`. - */ - -exports.last = function(obj) { - return obj[obj.length - 1]; -}; - -/** - * Capitalize the first letter of the target `str`. - */ - -exports.capitalize = function(str){ - str = String(str); - return str[0].toUpperCase() + str.substr(1, str.length); -}; - -/** - * Downcase the target `str`. - */ - -exports.downcase = function(str){ - return String(str).toLowerCase(); -}; - -/** - * Uppercase the target `str`. - */ - -exports.upcase = function(str){ - return String(str).toUpperCase(); -}; - -/** - * Sort the target `obj`. - */ - -exports.sort = function(obj){ - return Object.create(obj).sort(); -}; - -/** - * Sort the target `obj` by the given `prop` ascending. - */ - -exports.sort_by = function(obj, prop){ - return Object.create(obj).sort(function(a, b){ - a = a[prop], b = b[prop]; - if (a > b) return 1; - if (a < b) return -1; - return 0; - }); -}; - -/** - * Size or length of the target `obj`. - */ - -exports.size = exports.length = function(obj) { - return obj.length; -}; - -/** - * Add `a` and `b`. - */ - -exports.plus = function(a, b){ - return Number(a) + Number(b); -}; - -/** - * Subtract `b` from `a`. - */ - -exports.minus = function(a, b){ - return Number(a) - Number(b); -}; - -/** - * Multiply `a` by `b`. - */ - -exports.times = function(a, b){ - return Number(a) * Number(b); -}; - -/** - * Divide `a` by `b`. - */ - -exports.divided_by = function(a, b){ - return Number(a) / Number(b); -}; - -/** - * Join `obj` with the given `str`. - */ - -exports.join = function(obj, str){ - return obj.join(str || ', '); -}; - -/** - * Truncate `str` to `len`. - */ - -exports.truncate = function(str, len){ - str = String(str); - return str.substr(0, len); -}; - -/** - * Truncate `str` to `n` words. - */ - -exports.truncate_words = function(str, n){ - var str = String(str) - , words = str.split(/ +/); - return words.slice(0, n).join(' '); -}; - -/** - * Replace `pattern` with `substitution` in `str`. - */ - -exports.replace = function(str, pattern, substitution){ - return String(str).replace(pattern, substitution || ''); -}; - -/** - * Prepend `val` to `obj`. - */ - -exports.prepend = function(obj, val){ - return Array.isArray(obj) - ? [val].concat(obj) - : val + obj; -}; - -/** - * Append `val` to `obj`. - */ - -exports.append = function(obj, val){ - return Array.isArray(obj) - ? obj.concat(val) - : obj + val; -}; - -/** - * Map the given `prop`. - */ - -exports.map = function(arr, prop){ - return arr.map(function(obj){ - return obj[prop]; - }); -}; - -/** - * Reverse the given `obj`. - */ - -exports.reverse = function(obj){ - return Array.isArray(obj) - ? obj.reverse() - : String(obj).split('').reverse().join(''); -}; - -/** - * Get `prop` of the given `obj`. - */ - -exports.get = function(obj, prop){ - return obj[prop]; -}; - -/** - * Packs the given `obj` into json string - */ -exports.json = function(obj){ - return JSON.stringify(obj); -}; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/utils.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/utils.js deleted file mode 100644 index 8d569d6..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/lib/utils.js +++ /dev/null @@ -1,23 +0,0 @@ - -/*! - * EJS - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/package.json deleted file mode 100644 index 224b4ff..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "ejs", - "description": "Embedded JavaScript templates", - "version": "0.4.3", - "author": "TJ Holowaychuk ", - "keywords": ["template", "engine", "ejs"], - "devDependencies": { - "expresso": "0.9.2" - }, - "main": "./lib/ejs.js" -} \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/support/compile.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/support/compile.js deleted file mode 100644 index edd3815..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/support/compile.js +++ /dev/null @@ -1,173 +0,0 @@ - -/** - * Module dependencies. - */ - -var fs = require('fs'); - -/** - * Arguments. - */ - -var args = process.argv.slice(2) - , pending = args.length - , files = {}; - -console.log(''); - -// parse arguments - -args.forEach(function(file){ - var mod = file.replace('lib/', ''); - fs.readFile(file, 'utf8', function(err, js){ - if (err) throw err; - console.log(' \033[90mcompile : \033[0m\033[36m%s\033[0m', file); - files[file] = parse(js); - --pending || compile(); - }); -}); - -/** - * Parse the given `js`. - */ - -function parse(js) { - return parseInheritance(parseConditionals(js)); -} - -/** - * Parse __proto__. - */ - -function parseInheritance(js) { - return js - .replace(/^ *(\w+)\.prototype\.__proto__ * = *(\w+)\.prototype *;?/gm, function(_, child, parent){ - return child + '.prototype = new ' + parent + ';\n' - + child + '.prototype.constructor = '+ child + ';\n'; - }); -} - -/** - * Parse the given `js`, currently supporting: - * - * 'if' ['node' | 'browser'] - * 'end' - * - */ - -function parseConditionals(js) { - var lines = js.split('\n') - , len = lines.length - , buffer = true - , browser = false - , buf = [] - , line - , cond; - - for (var i = 0; i < len; ++i) { - line = lines[i]; - if (/^ *\/\/ *if *(node|browser)/gm.exec(line)) { - cond = RegExp.$1; - buffer = browser = 'browser' == cond; - } else if (/^ *\/\/ *end/.test(line)) { - buffer = true; - browser = false; - } else if (browser) { - buf.push(line.replace(/^( *)\/\//, '$1')); - } else if (buffer) { - buf.push(line); - } - } - - return buf.join('\n'); -} - -/** - * Compile the files. - */ - -function compile() { - var buf = ''; - buf += '\n// CommonJS require()\n\n'; - buf += browser.require + '\n\n'; - buf += 'require.modules = {};\n\n'; - buf += 'require.resolve = ' + browser.resolve + ';\n\n'; - buf += 'require.register = ' + browser.register + ';\n\n'; - buf += 'require.relative = ' + browser.relative + ';\n\n'; - args.forEach(function(file){ - var js = files[file]; - file = file.replace('lib/', ''); - buf += '\nrequire.register("' + file + '", function(module, exports, require){\n'; - buf += js; - buf += '\n}); // module: ' + file + '\n'; - }); - fs.writeFile('ejs.js', buf, function(err){ - if (err) throw err; - console.log(' \033[90m create : \033[0m\033[36m%s\033[0m', 'ejs.js'); - console.log(); - }); -} - -// refactored version of weepy's -// https://github.com/weepy/brequire/blob/master/browser/brequire.js - -var browser = { - - /** - * Require a module. - */ - - require: function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - }, - - /** - * Resolve module path. - */ - - resolve: function(path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }, - - /** - * Return relative require(). - */ - - relative: function(parent) { - return function(p){ - if ('.' != p.substr(0, 1)) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }, - - /** - * Register a module. - */ - - register: function(path, fn){ - require.modules[path] = fn; - } -}; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/test/ejs.test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/test/ejs.test.js deleted file mode 100644 index 624157d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/deps/ejs/test/ejs.test.js +++ /dev/null @@ -1,269 +0,0 @@ - -/** - * Module dependencies. - */ - -var ejs = require('../') - , assert = require('assert'); - -module.exports = { - 'test .version': function(){ - assert.ok(/^\d+\.\d+\.\d+$/.test(ejs.version), 'Test .version format'); - }, - - 'test html': function(){ - assert.equal('

yay

', ejs.render('

yay

')); - }, - - 'test buffered code': function(){ - var html = '

tj

', - str = '

<%= name %>

', - locals = { name: 'tj' }; - assert.equal(html, ejs.render(str, { locals: locals })); - }, - - 'test unbuffered code': function(){ - var html = '

tj

', - str = '<% if (name) { %>

<%= name %>

<% } %>', - locals = { name: 'tj' }; - assert.equal(html, ejs.render(str, { locals: locals })); - }, - - 'test `scope` option': function(){ - var html = '

tj

', - str = '

<%= this %>

'; - assert.equal(html, ejs.render(str, { scope: 'tj' })); - }, - - 'test escaping': function(){ - assert.equal('<script>', ejs.render('<%= " - - - - - - - - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/nested/nested_reporter_test.unit.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/nested/nested_reporter_test.unit.js deleted file mode 100644 index 612adcd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/examples/nested/nested_reporter_test.unit.js +++ /dev/null @@ -1,94 +0,0 @@ -var testCase = require('nodeunit').testCase; -/* - This is an example test suite to demonstrate the nested test reporter. - Run with --reporter nested, e.g., - nodeunit --reporter nested nested_reporter_test.unit.js - - The test output should be something like: - - nested_reporter_test.unit.js - Test 0.1 (pass) - TC 1 - TC 1.1 - Test 1.1.1 (pass) - TC 2 - TC 2.1 - TC 2.1.1 - Test 2.1.1.1 (pass) - Test 2.1.1.2 (pass) - TC 2.2.1 - Test 2.2.1.1 (pass) - TC 2.2.1.1 - Test 2.2.1.1.1 (pass) - Test 2.2.1.2 (pass) - TC 3 - TC 3.1 - TC 3.1.1 - Test 3.1.1.1 (should fail) (fail) ✖ - AssertionError: false == true - // stack trace here. - - FAILURES: 1/8 assertions failed (6ms) -*/ - -module.exports = testCase({ - "Test 0.1": function(test) { - test.ok(true); - test.done(); - }, - - "TC 1": testCase({ - "TC 1.1": testCase({ - "Test 1.1.1": function(test) { - test.ok(true); - test.done(); - } - }) - }), - - "TC 2": testCase({ - "TC 2.1": testCase({ - "TC 2.1.1": testCase({ - "Test 2.1.1.1": function(test) { - test.ok(true); - test.done(); - }, - - "Test 2.1.1.2": function(test) { - test.ok(true); - test.done(); - } - }), - - "TC 2.2.1": testCase({ - "Test 2.2.1.1": function(test) { - test.ok(true); - test.done(); - }, - - "TC 2.2.1.1": testCase({ - "Test 2.2.1.1.1": function(test) { - test.ok(true); - test.done(); - }, - }), - - "Test 2.2.1.2": function(test) { - test.ok(true); - test.done(); - } - }) - }) - }), - - "TC 3": testCase({ - "TC 3.1": testCase({ - "TC 3.1.1": testCase({ - "Test 3.1.1.1 (should fail)": function(test) { - test.ok(false); - test.done(); - } - }) - }) - }) -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_fail.png b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_fail.png deleted file mode 100644 index 78ff4258cd574420da27fcf38b4711d02db58a92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38642 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 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_machineout.png b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/img/example_machineout.png deleted file mode 100644 index c6bfa27b56900e91282095c43b34b4e67854a0cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422136 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 z 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
KTihal9Ajl|fXZjNHfLk6}?0P-qs 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%0AFUWX!S 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 -// -// 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 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 pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({message: message, actual: actual, expected: expected}) - -assert.AssertionError = function AssertionError (options) { - this.name = "AssertionError"; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// code from util.inherits in node -assert.AssertionError.super_ = Error; - - -// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call -// TODO: test what effect this may have -var ctor = function () { this.constructor = assert.AssertionError; }; -ctor.prototype = Error.prototype; -assert.AssertionError.prototype = new ctor(); - - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [this.name+":", this.message].join(' '); - } else { - return [ this.name+":" - , typeof this.expected !== 'undefined' ? JSON.stringify(this.expected) : 'undefined' - , this.operator - , typeof this.actual !== 'undefined' ? JSON.stringify(this.actual) : 'undefined' - ].join(" "); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, "==", assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, "==", assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, "!=", assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, "deepEqual", assert.deepEqual); - } -}; - -var Buffer = null; -if (typeof require !== 'undefined' && typeof process !== 'undefined') { - try { - Buffer = require('buffer').Buffer; - } - catch (e) { - // May be a CommonJS environment other than Node.js - Buffer = null; - } -} - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.2.1 If the expcted value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object that refers to the same source and options - } else if (actual instanceof RegExp && expected instanceof RegExp) { - return actual.source === expected.source && - actual.global === expected.global && - actual.ignoreCase === expected.ignoreCase && - actual.multiline === expected.multiline; - - } else if (Buffer && actual instanceof Buffer && expected instanceof Buffer) { - return (function() { - var i, len; - - for (i = 0, len = expected.length; i < len; i++) { - if (actual[i] !== expected[i]) { - return false; - } - } - return actual.length === expected.length; - })(); - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull (value) { - return value === null || value === undefined; -} - -function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try{ - var ka = _keys(a), - kb = _keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key] )) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, "===", assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. -// assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, "!==", assert.notStrictEqual); - } -}; - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (expected instanceof RegExp) { - return expected.test(actual.message || actual); - } else if (actual instanceof expected) { - return true; - } else if (expected.call({}, actual) === true) { - return true; - } - - return false; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - try { - block(); - } catch (e) { - actual = e; - } - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail('Missing expected exception' + message); - } - - if (!shouldThrow && expectedException(actual, expected)) { - fail('Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function (err) { if (err) {throw err;}}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js deleted file mode 100644 index 8ff031b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/core.js +++ /dev/null @@ -1,319 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, it's mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - -var async = require('../deps/async'), //@REMOVE_LINE_FOR_BROWSER - nodeunit = require('./nodeunit'), //@REMOVE_LINE_FOR_BROWSER - types = require('./types'); //@REMOVE_LINE_FOR_BROWSER - - -/** - * Added for browser compatibility - */ - -var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; -}; - - -var _copy = function (obj) { - var nobj = {}; - var keys = _keys(obj); - for (var i = 0; i < keys.length; i += 1) { - nobj[keys[i]] = obj[keys[i]]; - } - return nobj; -}; - - -/** - * Runs a test function (fn) from a loaded module. After the test function - * calls test.done(), the callback is executed with an assertionList as its - * second argument. - * - * @param {String} name - * @param {Function} fn - * @param {Object} opt - * @param {Function} callback - * @api public - */ - -exports.runTest = function (name, fn, opt, callback) { - var options = types.options(opt); - - options.testStart(name); - var start = new Date().getTime(); - var test = types.test(name, start, options, callback); - - options.testReady(test); - try { - fn(test); - } - catch (e) { - test.done(e); - } -}; - -/** - * Takes an object containing test functions or other test suites as properties - * and runs each in series. After all tests have completed, the callback is - * called with a list of all assertions as the second argument. - * - * If a name is passed to this function it is prepended to all test and suite - * names that run within it. - * - * @param {String} name - * @param {Object} suite - * @param {Object} opt - * @param {Function} callback - * @api public - */ - -exports.runSuite = function (name, suite, opt, callback) { - suite = wrapGroup(suite); - var keys = _keys(suite); - - async.concatSeries(keys, function (k, cb) { - var prop = suite[k], _name; - - _name = name ? [].concat(name, k) : [k]; - _name.toString = function () { - // fallback for old one - return this.join(' - '); - }; - - if (typeof prop === 'function') { - var in_name = false, - in_specific_test = (_name.toString() === opt.testFullSpec) ? true : false; - for (var i = 0; i < _name.length; i += 1) { - if (_name[i] === opt.testspec) { - in_name = true; - } - } - - if ((!opt.testFullSpec || in_specific_test) && (!opt.testspec || in_name)) { - if (opt.moduleStart) { - opt.moduleStart(); - } - exports.runTest(_name, suite[k], opt, cb); - } - else { - return cb(); - } - } - else { - exports.runSuite(_name, suite[k], opt, cb); - } - }, callback); -}; - -/** - * Run each exported test function or test suite from a loaded module. - * - * @param {String} name - * @param {Object} mod - * @param {Object} opt - * @param {Function} callback - * @api public - */ - -exports.runModule = function (name, mod, opt, callback) { - var options = _copy(types.options(opt)); - - var _run = false; - var _moduleStart = options.moduleStart; - - mod = wrapGroup(mod); - - function run_once() { - if (!_run) { - _run = true; - _moduleStart(name); - } - } - options.moduleStart = run_once; - - var start = new Date().getTime(); - - exports.runSuite(null, mod, options, function (err, a_list) { - var end = new Date().getTime(); - var assertion_list = types.assertionList(a_list, end - start); - options.moduleDone(name, assertion_list); - if (nodeunit.complete) { - nodeunit.complete(name, assertion_list); - } - callback(null, a_list); - }); -}; - -/** - * Treats an object literal as a list of modules keyed by name. Runs each - * module and finished with calling 'done'. You can think of this as a browser - * safe alternative to runFiles in the nodeunit module. - * - * @param {Object} modules - * @param {Object} opt - * @api public - */ - -// TODO: add proper unit tests for this function -exports.runModules = function (modules, opt) { - var all_assertions = []; - var options = types.options(opt); - var start = new Date().getTime(); - - async.concatSeries(_keys(modules), function (k, cb) { - exports.runModule(k, modules[k], options, cb); - }, - function (err, all_assertions) { - var end = new Date().getTime(); - options.done(types.assertionList(all_assertions, end - start)); - }); -}; - - -/** - * Wraps a test function with setUp and tearDown functions. - * Used by testCase. - * - * @param {Function} setUp - * @param {Function} tearDown - * @param {Function} fn - * @api private - */ - -var wrapTest = function (setUp, tearDown, fn) { - return function (test) { - var context = {}; - if (tearDown) { - var done = test.done; - test.done = function (err) { - try { - tearDown.call(context, function (err2) { - if (err && err2) { - test._assertion_list.push( - types.assertion({error: err}) - ); - return done(err2); - } - done(err || err2); - }); - } - catch (e) { - done(e); - } - }; - } - if (setUp) { - setUp.call(context, function (err) { - if (err) { - return test.done(err); - } - fn.call(context, test); - }); - } - else { - fn.call(context, test); - } - }; -}; - - -/** - * Returns a serial callback from two functions. - * - * @param {Function} funcFirst - * @param {Function} funcSecond - * @api private - */ - -var getSerialCallback = function (fns) { - if (!fns.length) { - return null; - } - return function (callback) { - var that = this; - var bound_fns = []; - for (var i = 0, len = fns.length; i < len; i++) { - (function (j) { - bound_fns.push(function () { - return fns[j].apply(that, arguments); - }); - })(i); - } - return async.series(bound_fns, callback); - }; -}; - - -/** - * Wraps a group of tests with setUp and tearDown functions. - * Used by testCase. - * - * @param {Object} group - * @param {Array} setUps - parent setUp functions - * @param {Array} tearDowns - parent tearDown functions - * @api private - */ - -var wrapGroup = function (group, setUps, tearDowns) { - var tests = {}; - - var setUps = setUps ? setUps.slice(): []; - var tearDowns = tearDowns ? tearDowns.slice(): []; - - if (group.setUp) { - setUps.push(group.setUp); - delete group.setUp; - } - if (group.tearDown) { - tearDowns.unshift(group.tearDown); - delete group.tearDown; - } - - var keys = _keys(group); - - for (var i = 0; i < keys.length; i += 1) { - var k = keys[i]; - if (typeof group[k] === 'function') { - tests[k] = wrapTest( - getSerialCallback(setUps), - getSerialCallback(tearDowns), - group[k] - ); - } - else if (typeof group[k] === 'object') { - tests[k] = wrapGroup(group[k], setUps, tearDowns); - } - } - return tests; -}; - - -/** - * Backwards compatibility for test suites using old testCase API - */ - -exports.testCase = function (suite) { - return suite; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/nodeunit.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/nodeunit.js deleted file mode 100644 index 7d33c7b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/nodeunit.js +++ /dev/null @@ -1,104 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var async = require('../deps/async'), - types = require('./types'), - utils = require('./utils'), - core = require('./core'), - reporters = require('./reporters'), - assert = require('./assert'), - path = require('path'), - events = require('events'); - - -/** - * Export sub-modules. - */ - -exports.types = types; -exports.utils = utils; -exports.reporters = reporters; -exports.assert = assert; - -// backwards compatibility -exports.testrunner = { - run: function () { - console.log( - 'WARNING: nodeunit.testrunner is going to be deprecated, please ' + - 'use nodeunit.reporters.default instead!' - ); - return reporters['default'].run.apply(this, arguments); - } -}; - - -/** - * Export all core functions - */ - -for (var k in core) { - exports[k] = core[k]; -}; - - -/** - * Load modules from paths array and run all exported tests in series. If a path - * is a directory, load all supported file types inside it as modules. This only - * reads 1 level deep in the directory and does not recurse through - * sub-directories. - * - * @param {Array} paths - * @param {Object} opt - * @api public - */ - -exports.runFiles = function (paths, opt) { - var all_assertions = []; - var options = types.options(opt); - var start = new Date().getTime(); - - if (!paths.length) { - return options.done(types.assertionList(all_assertions)); - } - - utils.modulePaths(paths, function (err, files) { - if (err) throw err; - async.concatSeries(files, function (file, cb) { - var name = path.basename(file); - exports.runModule(name, require(file), options, cb); - }, - function (err, all_assertions) { - var end = new Date().getTime(); - exports.done() - options.done(types.assertionList(all_assertions, end - start)); - }); - }); - -}; - -/* Export all prototypes from events.EventEmitter */ -var label; -for (label in events.EventEmitter.prototype) { - exports[label] = events.EventEmitter.prototype[label]; -} - -/* Emit event 'complete' on completion of a test suite. */ -exports.complete = function(name, assertions) -{ - exports.emit('complete', name, assertions); -}; - -/* Emit event 'complete' on completion of all tests. */ -exports.done = function() -{ - exports.emit('done'); -}; - -module.exports = exports; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/browser.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/browser.js deleted file mode 100644 index c769c41..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/browser.js +++ /dev/null @@ -1,123 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - - -/** - * NOTE: this test runner is not listed in index.js because it cannot be - * used with the command-line tool, only inside the browser. - */ - - -/** - * Reporter info string - */ - -exports.info = "Browser-based test reporter"; - - -/** - * Run all tests within each module, reporting the results - * - * @param {Array} files - * @api public - */ - -exports.run = function (modules, options, callback) { - var start = new Date().getTime(), div; - options = options || {}; - div = options.div || document.body; - - function setText(el, txt) { - if ('innerText' in el) { - el.innerText = txt; - } - else if ('textContent' in el){ - el.textContent = txt; - } - } - - function getOrCreate(tag, id) { - var el = document.getElementById(id); - if (!el) { - el = document.createElement(tag); - el.id = id; - div.appendChild(el); - } - return el; - }; - - var header = getOrCreate('h1', 'nodeunit-header'); - var banner = getOrCreate('h2', 'nodeunit-banner'); - var userAgent = getOrCreate('h2', 'nodeunit-userAgent'); - var tests = getOrCreate('ol', 'nodeunit-tests'); - var result = getOrCreate('p', 'nodeunit-testresult'); - - setText(userAgent, navigator.userAgent); - - nodeunit.runModules(modules, { - moduleStart: function (name) { - /*var mheading = document.createElement('h2'); - mheading.innerText = name; - results.appendChild(mheading); - module = document.createElement('ol'); - results.appendChild(module);*/ - }, - testDone: function (name, assertions) { - var test = document.createElement('li'); - var strong = document.createElement('strong'); - strong.innerHTML = name + ' (' + - '' + assertions.failures() + ', ' + - '' + assertions.passes() + ', ' + - assertions.length + - ')'; - test.className = assertions.failures() ? 'fail': 'pass'; - test.appendChild(strong); - - var aList = document.createElement('ol'); - aList.style.display = 'none'; - test.onclick = function () { - var d = aList.style.display; - aList.style.display = (d == 'none') ? 'block': 'none'; - }; - for (var i=0; i' + (a.error.stack || a.error) + ''; - li.className = 'fail'; - } - else { - li.innerHTML = a.message || a.method || 'no message'; - li.className = 'pass'; - } - aList.appendChild(li); - } - test.appendChild(aList); - tests.appendChild(test); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - - var failures = assertions.failures(); - banner.className = failures ? 'fail': 'pass'; - - result.innerHTML = 'Tests completed in ' + duration + - ' milliseconds.
' + - assertions.passes() + ' assertions of ' + - '' + assertions.length + ' passed, ' + - assertions.failures() + ' failed.'; - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/default.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/default.js deleted file mode 100644 index 0de3f23..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/default.js +++ /dev/null @@ -1,131 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - utils = require('../utils'), - fs = require('fs'), - track = require('../track'), - path = require('path'), - AssertionError = require('../assert').AssertionError; - -/** - * Reporter info string - */ - -exports.info = "Default tests reporter"; - - -/** - * Run all tests within each module, reporting the results to the command-line. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, options, callback) { - - if (!options) { - // load default options - var content = fs.readFileSync( - __dirname + '/../../bin/nodeunit.json', 'utf8' - ); - options = JSON.parse(content); - } - - var error = function (str) { - return options.error_prefix + str + options.error_suffix; - }; - var ok = function (str) { - return options.ok_prefix + str + options.ok_suffix; - }; - var bold = function (str) { - return options.bold_prefix + str + options.bold_suffix; - }; - var assertion_message = function (str) { - return options.assertion_prefix + str + options.assertion_suffix; - }; - - var start = new Date().getTime(); - var tracker = track.createTracker(function (tracker) { - if (tracker.unfinished()) { - console.log(''); - console.log(error(bold( - 'FAILURES: Undone tests (or their setups/teardowns): ' - ))); - var names = tracker.names(); - for (var i = 0; i < names.length; i += 1) { - console.log('- ' + names[i]); - } - console.log(''); - console.log('To fix this, make sure all tests call test.done()'); - process.reallyExit(tracker.unfinished()); - } - }); - - var opts = { - testspec: options.testspec, - testFullSpec: options.testFullSpec, - moduleStart: function (name) { - console.log('\n' + bold(name)); - }, - testDone: function (name, assertions) { - tracker.remove(name); - - if (!assertions.failures()) { - console.log('✔ ' + name); - } - else { - console.log(error('✖ ' + name) + '\n'); - assertions.forEach(function (a) { - if (a.failed()) { - a = utils.betterErrors(a); - if (a.error instanceof AssertionError && a.message) { - console.log( - 'Assertion Message: ' + - assertion_message(a.message) - ); - } - console.log(a.error.stack + '\n'); - } - }); - } - }, - done: function (assertions, end) { - var end = end || new Date().getTime(); - var duration = end - start; - if (assertions.failures()) { - console.log( - '\n' + bold(error('FAILURES: ')) + assertions.failures() + - '/' + assertions.length + ' assertions failed (' + - assertions.duration + 'ms)' - ); - } - else { - console.log( - '\n' + bold(ok('OK: ')) + assertions.length + - ' assertions (' + assertions.duration + 'ms)' - ); - } - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - }, - testStart: function(name) { - tracker.put(name); - } - }; - if (files && files.length) { - var paths = files.map(function (p) { - return path.resolve(p); - }); - nodeunit.runFiles(paths, opts); - } else { - nodeunit.runModules(files,opts); - } -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/eclipse.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/eclipse.js deleted file mode 100644 index c56a4b8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/eclipse.js +++ /dev/null @@ -1,104 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - utils = require('../utils'), - fs = require('fs'), - track = require('../track'), - path = require('path'), - AssertionError = require('../assert').AssertionError; - -/** - * Reporter info string - */ - -exports.info = "Reporter for eclipse plugin"; - - -/** - * Run all tests within each module, reporting the results to the command-line. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, options, callback) { - - var start = new Date().getTime(); - var paths = files.map(function (p) { - if (p.indexOf('/') === 0) { - return p; - } - return path.resolve(p); - }); - var tracker = track.createTracker(function (tracker) { - if (tracker.unfinished()) { - console.log(''); - console.log('FAILURES: Undone tests (or their setups/teardowns): '); - var names = tracker.names(); - for (var i = 0; i < names.length; i += 1) { - console.log('- ' + names[i]); - } - console.log(''); - console.log('To fix this, make sure all tests call test.done()'); - process.reallyExit(tracker.unfinished()); - } - }); - - nodeunit.runFiles(paths, { - testspec: undefined, - moduleStart: function (name) { - console.log('\n' + name); - }, - testDone: function (name, assertions) { - tracker.remove(name); - - if (!assertions.failures()) { - console.log('✔ ' + name); - } - else { - console.log('✖ ' + name + '\n'); - assertions.forEach(function (a) { - if (a.failed()) { - a = utils.betterErrors(a); - if (a.error instanceof AssertionError && a.message) { - console.log( - 'Assertion Message: ' + a.message - ); - } - console.log(a.error.stack + '\n'); - } - }); - } - }, - done: function (assertions, end) { - var end = end || new Date().getTime(); - var duration = end - start; - if (assertions.failures()) { - console.log( - '\n' + 'FAILURES: ' + assertions.failures() + - '/' + assertions.length + ' assertions failed (' + - assertions.duration + 'ms)' - ); - } - else { - console.log( - '\n' + 'OK: ' + assertions.length + - ' assertions (' + assertions.duration + 'ms)' - ); - } - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - }, - testStart: function (name) { - tracker.put(name); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/html.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/html.js deleted file mode 100644 index ac64650..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/html.js +++ /dev/null @@ -1,110 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - utils = require('../utils'), - fs = require('fs'), - path = require('path'), - AssertionError = require('assert').AssertionError; - -/** - * Reporter info string - */ - -exports.info = "Report tests result as HTML"; - -/** - * Run all tests within each module, reporting the results to the command-line. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, options, callback) { - - var start = new Date().getTime(); - var paths = files.map(function (p) { - return path.resolve(p); - }); - - console.log(''); - console.log(''); - console.log(''); - console.log(''); - console.log(''); - console.log(''); - nodeunit.runFiles(paths, { - testspec: options.testspec, - testFullSpec: options.testFullSpec, - moduleStart: function (name) { - console.log('

' + name + '

'); - console.log('
    '); - }, - testDone: function (name, assertions) { - if (!assertions.failures()) { - console.log('
  1. ' + name + '
  2. '); - } - else { - console.log('
  3. ' + name); - assertions.forEach(function (a) { - if (a.failed()) { - a = utils.betterErrors(a); - if (a.error instanceof AssertionError && a.message) { - console.log('
    ' + - 'Assertion Message: ' + a.message + - '
    '); - } - console.log('
    ');
    -                        console.log(a.error.stack);
    -                        console.log('
    '); - } - }); - console.log('
  4. '); - } - }, - moduleDone: function () { - console.log('
'); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - if (assertions.failures()) { - console.log( - '

FAILURES: ' + assertions.failures() + - '/' + assertions.length + ' assertions failed (' + - assertions.duration + 'ms)

' - ); - } - else { - console.log( - '

OK: ' + assertions.length + - ' assertions (' + assertions.duration + 'ms)

' - ); - } - console.log(''); - console.log(''); - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/index.js deleted file mode 100644 index 10eff3c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/index.js +++ /dev/null @@ -1,27 +0,0 @@ -// This is a hack to make browserify skip tap -var tap; -try { - tap = require('./' + 'tap'); -} catch (ex) { - tap = { - run: function() { - throw new Error('Sorry, tap reporter not available'); - } - }; -} - -module.exports = { - 'junit': require('./junit'), - 'default': require('./default'), - 'skip_passed': require('./skip_passed'), - 'minimal': require('./minimal'), - 'html': require('./html'), - 'eclipse': require('./eclipse'), - 'machineout': require('./machineout'), - 'tap': tap, - 'nested': require('./nested'), - 'verbose' : require('./verbose'), - 'lcov' : require('./lcov') - // browser test reporter is not listed because it cannot be used - // with the command line tool, only inside a browser. -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/junit.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/junit.js deleted file mode 100644 index 5400526..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/junit.js +++ /dev/null @@ -1,180 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - utils = require('../utils'), - fs = require('fs'), - path = require('path'), - async = require('../../deps/async'), - AssertionError = require('assert').AssertionError, - child_process = require('child_process'), - ejs = require('../../deps/ejs'); - - -/** - * Reporter info string - */ - -exports.info = "jUnit XML test reports"; - - -/** - * Ensures a directory exists using mkdir -p. - * - * @param {String} path - * @param {Function} callback - * @api private - */ - -var ensureDir = function (path, callback) { - var mkdir = child_process.spawn('mkdir', ['-p', path]); - mkdir.on('error', function (err) { - callback(err); - callback = function(){}; - }); - mkdir.on('exit', function (code) { - if (code === 0) callback(); - else callback(new Error('mkdir exited with code: ' + code)); - }); -}; - - -/** - * Returns absolute version of a path. Relative paths are interpreted - * relative to process.cwd() or the cwd parameter. Paths that are already - * absolute are returned unaltered. - * - * @param {String} p - * @param {String} cwd - * @return {String} - * @api public - */ - -var abspath = function (p, /*optional*/cwd) { - if (p[0] === '/') return p; - cwd = cwd || process.cwd(); - return path.normalize(path.resolve(p)); -}; - - -/** - * Run all tests within each module, reporting the results to the command-line, - * then writes out junit-compatible xml documents. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, opts, callback) { - if (!opts.output) { - console.error( - 'Error: No output directory defined.\n' + - '\tEither add an "output" property to your nodeunit.json config ' + - 'file, or\n\tuse the --output command line option.' - ); - return; - } - opts.output = abspath(opts.output); - var error = function (str) { - return opts.error_prefix + str + opts.error_suffix; - }; - var ok = function (str) { - return opts.ok_prefix + str + opts.ok_suffix; - }; - var bold = function (str) { - return opts.bold_prefix + str + opts.bold_suffix; - }; - - var start = new Date().getTime(); - var paths = files.map(function (p) { - return path.resolve(p); - }); - - var modules = {} - var curModule; - - nodeunit.runFiles(paths, { - testspec: opts.testspec, - testFullSpec: opts.testFullSpec, - moduleStart: function (name) { - curModule = { - errorCount: 0, - failureCount: 0, - tests: 0, - testcases: [], - name: name - }; - modules[name] = curModule; - }, - testDone: function (name, assertions) { - var testcase = {name: name}; - for (var i=0; i name_slice(['TC1', 'TC1.1', 'mytest'], 1); - * "TC1,TC1.1" - */ - var name_slice = function (name_arr, end_index) { - return name_arr.slice(0, end_index + 1).join(","); - }; - - var indent = (function () { - var txt = ''; - var i; - for (i = 0; i < spaces_per_indent; i++) { - txt += ' '; - } - return txt; - }()); - - // Indent once for each indent_level - var add_indent = function (txt, indent_level) { - var k; - for (k = 0; k < indent_level; k++) { - txt += indent; - } - return txt; - }; - - // If it's not the last element of the name_arr, it's a testCase. - var is_testCase = function (name_arr, index) { - return index === name_arr.length - 1 ? false : true; - }; - - var testCase_line = function (txt) { - return txt + "\n"; - }; - - /** - * Prints (console.log) the nested test status line(s). - * - * @param {Array} name_arr - Array of name elements. - * @param {String} status - either 'pass' or 'fail'. - * @example - * > print_status(['TC1', 'TC1.1', 'mytest'], 'pass'); - * TC1 - * TC1.1 - * mytest (pass) - */ - var print_status = function (name_arr, status) { - var txt = ''; - var _name_slice, part, i; - for (i = 0; i < name_arr.length; i++) { - _name_slice = name_slice(name_arr, i); - part = name_arr[i]; - if (!tracker.already_printed[_name_slice]) { - txt = add_indent(txt, i); - if (is_testCase(name_arr, i)) { - txt += testCase_line(part); - } else { - txt += status_text(part, status); - } - tracker.already_printed[_name_slice] = true; - } - } - console.log(txt); - }; - - nodeunit.runFiles(paths, { - testspec: options.testspec, - testFullSpec: options.testFullSpec, - moduleStart: function (name) { - console.log('\n' + bold(name)); - }, - testDone: function (name, assertions) { - tracker.remove(name); - - if (!assertions.failures()) { - print_status(name, 'pass'); - } else { - print_status(name, 'fail'); - assertions.forEach(function (a) { - if (a.failed()) { - a = utils.betterErrors(a); - if (a.error instanceof AssertionError && a.message) { - console.log( - 'Assertion Message: ' + - assertion_message(a.message) - ); - } - console.log(a.error.stack + '\n'); - } - }); - } - }, - done: function (assertions, end) { - end = end || new Date().getTime(); - var duration = end - start; - if (assertions.failures()) { - console.log( - '\n' + bold(error('FAILURES: ')) + assertions.failures() + - '/' + assertions.length + ' assertions failed (' + - assertions.duration + 'ms)' - ); - } else { - console.log( - '\n' + bold(ok('OK: ')) + assertions.length + - ' assertions (' + assertions.duration + 'ms)' - ); - } - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - }, - testStart: function (name) { - tracker.put(name); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/skip_passed.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/skip_passed.js deleted file mode 100644 index e63489b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/skip_passed.js +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - utils = require('../utils'), - fs = require('fs'), - path = require('path'), - AssertionError = require('assert').AssertionError; - -/** - * Reporter info string - */ - -exports.info = "Skip passed tests output"; - -/** - * Run all tests within each module, reporting the results to the command-line. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, options, callback) { - - if (!options) { - // load default options - var content = fs.readFileSync( - __dirname + '/../../bin/nodeunit.json', 'utf8' - ); - options = JSON.parse(content); - } - - var error = function (str) { - return options.error_prefix + str + options.error_suffix; - }; - var ok = function (str) { - return options.ok_prefix + str + options.ok_suffix; - }; - var bold = function (str) { - return options.bold_prefix + str + options.bold_suffix; - }; - var assertion_message = function (str) { - return options.assertion_prefix + str + options.assertion_suffix; - }; - - var start = new Date().getTime(); - var paths = files.map(function (p) { - return path.resolve(p); - }); - - nodeunit.runFiles(paths, { - testspec: options.testspec, - testFullSpec: options.testFullSpec, - moduleStart: function (name) { - console.log('\n' + bold(name)); - }, - testDone: function (name, assertions) { - if (assertions.failures()) { - console.log(error('✖ ' + name) + '\n'); - assertions.forEach(function (a) { - if (a.failed()) { - a = utils.betterErrors(a); - if (a.error instanceof AssertionError && a.message) { - console.log( - 'Assertion Message: ' + assertion_message(a.message) - ); - } - console.log(a.error.stack + '\n'); - } - }); - } - }, - moduleDone: function (name, assertions) { - if (!assertions.failures()) { - console.log('✔ all tests passed'); - } - else { - console.log(error('✖ some tests failed')); - } - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - if (assertions.failures()) { - console.log( - '\n' + bold(error('FAILURES: ')) + assertions.failures() + - '/' + assertions.length + ' assertions failed (' + - assertions.duration + 'ms)' - ); - } - else { - console.log( - '\n' + bold(ok('OK: ')) + assertions.length + - ' assertions (' + assertions.duration + 'ms)' - ); - } - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/tap.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/tap.js deleted file mode 100644 index 8f7034c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/tap.js +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - path = require('path'), - assert = require('tap').assert, - TapProducer = require('tap').Producer, - fs = require('fs'); - -/** - * Reporter info string - */ - -exports.info = "TAP output"; - -/** - * Run all tests within each module, reporting the results to the command-line. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, options, callback) { - - if (!options) { - // load default options - var content = fs.readFileSync( - __dirname + '/../../bin/nodeunit.json', 'utf8' - ); - options = JSON.parse(content); - } - - var paths = files.map(function (p) { - return path.resolve(p); - }); - var output = new TapProducer(); - output.pipe(process.stdout); - - nodeunit.runFiles(paths, { - testStart: function (name) { - output.write(name.toString()); - }, - testDone: function (name, assertions) { - assertions.forEach(function (e) { - var extra = {}; - if (e.error) { - extra.error = { - name: e.error.name, - message: e.error.message, - stack: e.error.stack.split(/\n/).filter(function (line) { - // exclude line of "types.js" - return ! RegExp(/types.js:83:39/).test(line); - }).join('\n') - }; - extra.wanted = e.error.expected; - extra.found = e.error.actual; - } - output.write(assert(e.passed(), e.message, extra)); - }); - }, - done: function (assertions) { - output.end(); - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/verbose.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/verbose.js deleted file mode 100644 index 6c6083a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/reporters/verbose.js +++ /dev/null @@ -1,125 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var nodeunit = require('../nodeunit'), - utils = require('../utils'), - fs = require('fs'), - track = require('../track'), - path = require('path'); - AssertionError = require('../assert').AssertionError; - -/** - * Reporter info string - */ - -exports.info = "Verbose tests reporter" - - -/** - * Run all tests within each module, reporting the results to the command-line. - * - * @param {Array} files - * @api public - */ - -exports.run = function (files, options, callback) { - - if (!options) { - // load default options - var content = fs.readFileSync( - __dirname + '/../../bin/nodeunit.json', 'utf8' - ); - options = JSON.parse(content); - } - - var error = function (str) { - return options.error_prefix + str + options.error_suffix; - }; - var ok = function (str) { - return options.ok_prefix + str + options.ok_suffix; - }; - var bold = function (str) { - return options.bold_prefix + str + options.bold_suffix; - }; - var assertion_message = function (str) { - return options.assertion_prefix + str + options.assertion_suffix; - }; - - var start = new Date().getTime(); - var paths = files.map(function (p) { - return path.resolve(p); - }); - var tracker = track.createTracker(function (tracker) { - if (tracker.unfinished()) { - console.log(''); - console.log(error(bold( - 'FAILURES: Undone tests (or their setups/teardowns): ' - ))); - var names = tracker.names(); - for (var i = 0; i < names.length; i += 1) { - console.log('- ' + names[i]); - } - console.log(''); - console.log('To fix this, make sure all tests call test.done()'); - process.reallyExit(tracker.unfinished()); - } - }); - - nodeunit.runFiles(paths, { - testspec: options.testspec, - testFullSpec: options.testFullSpec, - moduleStart: function (name) { - console.log('\n' + bold(name)); - }, - testDone: function (name, assertions) { - tracker.remove(name); - - if (!assertions.failures()) { - console.log('✔ ' + name); - } - else { - console.log(error('✖ ' + name)); - } - // verbose so print everything - assertions.forEach(function (a) { - if (a.failed()) { - console.log(error(' ✖ ' + a.message)); - a = utils.betterErrors(a); - console.log(' ' + a.error.stack); - } - else { - console.log(' ✔ ' + a.message); - } - }); - }, - done: function (assertions, end) { - var end = end || new Date().getTime(); - var duration = end - start; - if (assertions.failures()) { - console.log( - '\n' + bold(error('FAILURES: ')) + assertions.failures() + - '/' + assertions.length + ' assertions failed (' + - assertions.duration + 'ms)' - ); - } - else { - console.log( - '\n' + bold(ok('OK: ')) + assertions.length + - ' assertions (' + assertions.duration + 'ms)' - ); - } - - if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined); - }, - testStart: function(name) { - tracker.put(name); - } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/track.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/track.js deleted file mode 100644 index 5af98ad..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/track.js +++ /dev/null @@ -1,48 +0,0 @@ -/*! - * Simple util module to track tests. Adds a process.exit hook to print - * the undone tests. - */ - - -exports.createTracker = function (on_exit) { - var names = {}; - var tracker = { - names: function () { - var arr = []; - for (var k in names) { - if (names.hasOwnProperty(k)) { - arr.push(k); - } - } - return arr; - }, - unfinished: function () { - return tracker.names().length; - }, - put: function (testname) { - names[testname] = testname; - }, - remove: function (testname) { - delete names[testname]; - } - }; - - process.on('exit', function() { - on_exit = on_exit || exports.default_on_exit; - on_exit(tracker); - }); - - return tracker; -}; - -exports.default_on_exit = function (tracker) { - if (tracker.unfinished()) { - console.log(''); - console.log('Undone tests (or their setups/teardowns): '); - var names = tracker.names(); - for (var i = 0; i < names.length; i += 1) { - console.log(names[i]); - } - process.reallyExit(tracker.unfinished()); - } -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/types.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/types.js deleted file mode 100644 index 879edd8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/types.js +++ /dev/null @@ -1,190 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, it's mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - -var assert = require('./assert'), //@REMOVE_LINE_FOR_BROWSER - async = require('../deps/async'); //@REMOVE_LINE_FOR_BROWSER - - -/** - * Creates assertion objects representing the result of an assert call. - * Accepts an object or AssertionError as its argument. - * - * @param {object} obj - * @api public - */ - -exports.assertion = function (obj) { - return { - method: obj.method || '', - message: obj.message || (obj.error && obj.error.message) || '', - error: obj.error, - passed: function () { - return !this.error; - }, - failed: function () { - return Boolean(this.error); - } - }; -}; - -/** - * Creates an assertion list object representing a group of assertions. - * Accepts an array of assertion objects. - * - * @param {Array} arr - * @param {Number} duration - * @api public - */ - -exports.assertionList = function (arr, duration) { - var that = arr || []; - that.failures = function () { - var failures = 0; - for (var i = 0; i < this.length; i += 1) { - if (this[i].failed()) { - failures += 1; - } - } - return failures; - }; - that.passes = function () { - return that.length - that.failures(); - }; - that.duration = duration || 0; - return that; -}; - -/** - * Create a wrapper function for assert module methods. Executes a callback - * after it's complete with an assertion object representing the result. - * - * @param {Function} callback - * @api private - */ - -var assertWrapper = function (callback) { - return function (new_method, assert_method, arity) { - return function () { - var message = arguments[arity - 1]; - var a = exports.assertion({method: new_method, message: message}); - try { - assert[assert_method].apply(null, arguments); - } - catch (e) { - a.error = e; - } - callback(a); - }; - }; -}; - -/** - * Creates the 'test' object that gets passed to every test function. - * Accepts the name of the test function as its first argument, followed by - * the start time in ms, the options object and a callback function. - * - * @param {String} name - * @param {Number} start - * @param {Object} options - * @param {Function} callback - * @api public - */ - -exports.test = function (name, start, options, callback) { - var expecting; - var a_list = []; - - var wrapAssert = assertWrapper(function (a) { - a_list.push(a); - if (options.log) { - async.nextTick(function () { - options.log(a); - }); - } - }); - - var test = { - done: function (err) { - if (expecting !== undefined && expecting !== a_list.length) { - var e = new Error( - 'Expected ' + expecting + ' assertions, ' + - a_list.length + ' ran' - ); - var a1 = exports.assertion({method: 'expect', error: e}); - a_list.push(a1); - if (options.log) { - async.nextTick(function () { - options.log(a1); - }); - } - } - if (err) { - var a2 = exports.assertion({error: err}); - a_list.push(a2); - if (options.log) { - async.nextTick(function () { - options.log(a2); - }); - } - } - var end = new Date().getTime(); - async.nextTick(function () { - var assertion_list = exports.assertionList(a_list, end - start); - options.testDone(name, assertion_list); - callback(null, a_list); - }); - }, - ok: wrapAssert('ok', 'ok', 2), - same: wrapAssert('same', 'deepEqual', 3), - equals: wrapAssert('equals', 'equal', 3), - expect: function (num) { - expecting = num; - }, - _assertion_list: a_list - }; - // add all functions from the assert module - for (var k in assert) { - if (assert.hasOwnProperty(k)) { - test[k] = wrapAssert(k, k, assert[k].length); - } - } - return test; -}; - -/** - * Ensures an options object has all callbacks, adding empty callback functions - * if any are missing. - * - * @param {Object} opt - * @return {Object} - * @api public - */ - -exports.options = function (opt) { - var optionalCallback = function (name) { - opt[name] = opt[name] || function () {}; - }; - - optionalCallback('moduleStart'); - optionalCallback('moduleDone'); - optionalCallback('testStart'); - optionalCallback('testReady'); - optionalCallback('testDone'); - //optionalCallback('log'); - - // 'done' callback is not optional. - - return opt; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/utils.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/utils.js deleted file mode 100644 index 5c72990..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/lib/utils.js +++ /dev/null @@ -1,216 +0,0 @@ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - */ - -/** - * Module dependencies - */ - -var async = require('../deps/async'), - fs = require('fs'), - util = require('util'), - Script = require('vm').Script, - http = require('http'); - - -/** - * Detect if coffee-script, iced-coffeescript, or streamline are available and - * the respective file extensions to the search filter in modulePaths if it is. - */ - -var extensions = [ 'js' ]; // js is always supported: add it unconditionally -var extensionPattern; - -try { - require('coffee' + '-script/register'); - extensions.push('coffee'); -} catch (e) { } - -try { - require('iced-coffee' + '-script/register'); - extensions.push('iced'); -} catch (e) { } - -try { - require('stream' + 'line').register(); - extensions.push('_coffee'); - extensions.push('_js'); -} catch (e) { } - -extensionPattern = new RegExp('\\.(?:' + extensions.join('|') + ')$'); - - -/** - * Finds all modules at each path in an array, If a path is a directory, it - * returns all supported file types inside it. This only reads 1 level deep in - * the directory and does not recurse through sub-directories. - * - * The extension (.js, .coffee etc) is stripped from the filenames so they can - * simply be require()'ed. - * - * @param {Array} paths - * @param {Function} callback - * @api public - */ - -exports.modulePaths = function (paths, callback) { - async.concat(paths, function (p, cb) { - fs.stat(p, function (err, stats) { - if (err) { - return cb(err); - } - if (stats.isFile()) { - return cb(null, [p]); - } - if (stats.isDirectory()) { - fs.readdir(p, function (err, files) { - if (err) { - return cb(err); - } - - // filter out any filenames with unsupported extensions - var modules = files.filter(function (filename) { - return extensionPattern.exec(filename); - }); - - // remove extension from module name and prepend the - // directory path - var fullpaths = modules.map(function (filename) { - var mod_name = filename.replace(extensionPattern, ''); - return [p, mod_name].join('/'); - }); - - // sort filenames here, because Array.map changes order - fullpaths.sort(); - - cb(null, fullpaths); - }); - } - }); - }, callback); -}; - -/** - * Evaluates JavaScript files in a sandbox, returning the context. The first - * argument can either be a single filename or an array of filenames. If - * multiple filenames are given their contents are concatenated before - * evalution. The second argument is an optional context to use for the sandbox. - * - * @param files - * @param {Object} sandbox - * @return {Object} - * @api public - */ - -exports.sandbox = function (files, /*optional*/sandbox) { - var source, script, result; - if (!(files instanceof Array)) { - files = [files]; - } - source = files.map(function (file) { - return fs.readFileSync(file, 'utf8'); - }).join(''); - - if (!sandbox) { - sandbox = {}; - } - script = new Script(source); - result = script.runInNewContext(sandbox); - return sandbox; -}; - -/** - * Provides a http request, response testing environment. - * - * Example: - * - * var httputil = require('nodeunit').utils.httputil - * exports.testSomething = function(test) { - * httputil(function (req, resp) { - * resp.writeHead(200, {}); - * resp.end('test data'); - * }, - * function(server, client) { - * client.fetch('GET', '/', {}, function(resp) { - * test.equal('test data', resp.body); - * server.close(); - * test.done(); - * }) - * }); - * }; - * - * @param {Function} cgi - * @param {Function} envReady - * @api public - */ -exports.httputil = function (cgi, envReady) { - var hostname = process.env.HOSTNAME || 'localhost'; - var port = process.env.PORT || 3000; - - var server = http.createServer(cgi); - server.listen(port, hostname); - - var client = http.createClient(port, hostname); - client.fetch = function (method, path, headers, respReady) { - var request = this.request(method, path, headers); - request.end(); - request.on('response', function (response) { - response.setEncoding('utf8'); - response.on('data', function (chunk) { - if (response.body) { - response.body += chunk; - } else { - response.body = chunk; - } - }); - response.on('end', function () { - if (response.headers['content-type'] === 'application/json') { - response.bodyAsObject = JSON.parse(response.body); - } - respReady(response); - }); - }); - }; - - process.nextTick(function () { - if (envReady && typeof envReady === 'function') { - envReady(server, client); - } - }); -}; - - -/** - * Improves formatting of AssertionError messages to make deepEqual etc more - * readable. - * - * @param {Object} assertion - * @return {Object} - * @api public - */ - -exports.betterErrors = function (assertion) { - if (!assertion.error) { - return assertion; - } - var e = assertion.error; - if (e.actual && e.expected) { - var actual = util.inspect(e.actual, false, 10).replace(/\n$/, ''); - var expected = util.inspect(e.expected, false, 10).replace(/\n$/, ''); - var multiline = ( - actual.indexOf('\n') !== -1 || - expected.indexOf('\n') !== -1 - ); - var spacing = (multiline ? '\n' : ' '); - e._message = e.message; - e.stack = ( - e.name + ':' + spacing + - actual + spacing + e.operator + spacing + - expected + '\n' + - e.stack.split('\n').slice(1).join('\n') - ); - } - return assertion; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/man1/nodeunit.1 b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/man1/nodeunit.1 deleted file mode 100644 index 450772d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/man1/nodeunit.1 +++ /dev/null @@ -1,95 +0,0 @@ -.\" Generated with Ronnjs/v0.1 -.\" http://github.com/kapouer/ronnjs/ -. -.TH "NODEUNIT" "1" "October 2010" "" "" -. -.SH "NAME" -\fBnodeunit\fR \-\- simple node\.js unit testing tool -. -.SH "SYNOPSIS" -. -.nf -nodeunit [options] [ \.\.\.] -. -.fi -. -.SH "DESCRIPTION" -Nodeunit is a simple unit testing tool based on the node\.js assert module\. -. -.IP "\(bu" 4 -Simple to use -. -.IP "\(bu" 4 -Just export the tests from a module -. -.IP "\(bu" 4 -Helps you avoid common pitfalls when testing asynchronous code -. -.IP "\(bu" 4 -Easy to add test cases with setUp and tearDown functions if you wish -. -.IP "\(bu" 4 -Allows the use of mocks and stubs -. -.IP "" 0 -. -.SH "OPTIONS" - \fB\-\-config FILE\fR: -. -.br - Load config options from a JSON file, allows the customisation - of color schemes for the default test reporter etc\. - See bin/nodeunit\.json for current available options\. -. -.P - \fB\-\-reporter FILE\fR: -. -.br - You can set the test reporter to a custom module or on of the modules - in nodeunit/lib/reporters, when omitted, the default test runner is used\. -. -.P - \fB\-\-list\-reporters\fR: -. -.br - List available build\-in reporters\. -. -.P - \fB\-h\fR, \fB\-\-help\fR: -. -.br - Display the help and exit\. -. -.P - \fB\-v\fR, \fB\-\-version\fR: -. -.br - Output version information and exit\. -. -.P - \fB\fR: - You can run nodeunit on specific files or on all \fI*\.js\fR files inside -. -.br - a directory\. -. -.SH "AUTHORS" -Written by Caolan McMahon and other nodeunit contributors\. -. -.br -Contributors list: \fIhttp://github\.com/caolan/nodeunit/contributors\fR\|\. -. -.SH "REPORTING BUGS" -Report nodeunit bugs to \fIhttp://github\.com/caolan/nodeunit/issues\fR\|\. -. -.SH "COPYRIGHT" -Copyright © 2010 Caolan McMahon\. -. -.br -Nodeunit has been released under the MIT license: -. -.br -\fIhttp://github\.com/caolan/nodeunit/raw/master/LICENSE\fR\|\. -. -.SH "SEE ALSO" -node(1) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/.bin/tap b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/.bin/tap deleted file mode 120000 index 999914b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/.bin/tap +++ /dev/null @@ -1 +0,0 @@ -../tap/bin/tap.js \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/.npmignore deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/AUTHORS b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/AUTHORS deleted file mode 100644 index b7f6eb2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/AUTHORS +++ /dev/null @@ -1,11 +0,0 @@ -# contributors sorted by whether or not they're me -Isaac Z. Schlueter -baudehlo -James Halliday -Jason Smith (air) -Pedro P. Candel -Stein Martin Hustad -Trent Mick -Corey Richardson -Raynos -Siddharth Mahendraker diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/README.md deleted file mode 100644 index d6a0440..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/README.md +++ /dev/null @@ -1,86 +0,0 @@ -This is a mix-and-match set of utilities that you can use to write test -harnesses and frameworks that communicate with one another using the -Test Anything Protocol. - -If you don't yet know what TAP is, [you better ask -somebody](http://testanything.org/). - -Default Usage: - -1. Make a directory. Maybe call it 'test'. That'd be nice and obvious. -2. Put a bunch of test scripts in there. If they're node programs, then - they should be ".js". Anything else is assumed to be some kind of shell - script, which should have a shebang line. -3. `npm install tap` -4. Update package.json scripts.test to include `tap ./test` [example - gist](https://gist.github.com/4469613) -5. `npm test` - -The output will be TAP-compliant. - -For extra special bonus points, you can do something like this: - - var test = require("tap").test - test("make sure the thingie is a thing", function (t) { - t.equal(thingie, "thing", "thingie should be thing") - t.deepEqual(array, ["foo", "bar"], "array has foo and bar elements") - t.deepEqual(object, {foo: 42}, "object has foo property") - t.type(thingie, "string", "type of thingie is string") - t.ok(true, "this is always true") - t.notOk(false, "this is never true") - t.test("a child test", function (t) { - t.equal(this, superEasy, "right!?") - t.similar(7, 2, "ever notice 7 is kinda like 2?", {todo: true}) - t.test("so skippable", {skip: true}, function (t) { - t.plan(1) // only one test in this block - t.ok(true, "but when the flag changes, it'll pass") - // no need to end, since we had a plan. - }) - t.end() - }) - t.ok(99, "can also skip individual assertions", {skip: true}) - // end lets it know it's over. - t.end() - }) - test("another one", function (t) { - t.plan(1) - t.ok(true, "It's ok to plan, and also end. Watch.") - t.end() // but it must match the plan! - }) - -Node-tap is actually a collection of several modules, any of which may be -mixed and matched however you please. - -If you don't like this test framework, and think you can do much much -better, *I strongly encourage you to do so!* If you use this library, -however, at least to output TAP-compliant results when `process.env.TAP` -is set, then the data coming out of your framework will be much more -consumable by machines. - -You can also use this to build programs that *consume* the TAP data, so -this is very useful for CI systems and such. - -* tap-assert: A collection of assert functions that return TAP result - objects. -* tap-consumer: A stream interface for consuming TAP data. -* tap-producer: A class that produces a TAP stream by taking in result - objects. -* tap-results: A class for keeping track of TAP result objects as they - pass by, counting up skips, passes, fails, and so on. -* tap-runner: A program that runs through a directory running all the - tests in it. (Tests which may or may not be TAP-outputting tests. But - it's better if they are.) -* tap-test: A class for actually running tests. -* tap-harness: A class that runs tests. (Tests are also Harnesses, - which is how sub-tests run.) -* tap-global-harness: A default harness that provides the top-level - support for running TAP tests. - -## Experimental Code Coverage with runforcover & bunker: - -``` -TAP_COV=1 tap ./test [--cover=./lib,foo.js] [--coverage-dir=./coverage] -``` - -This feature is experimental, and will most likely change somewhat -before being finalized. Feedback welcome. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-http.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-http.js deleted file mode 100644 index 296910f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-http.js +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env node - -// just an example, really -// Run with `node tap-http.js path/to/tests/` - -var argv = process.argv.slice(2) - , path = require("path") - , Runner = require("../lib/tap-runner") - - , http = require("http") - , server = http.createServer(function (req, res) { - // it'd be nice to return a non-200 if the tests fail, but we don't - // know the status until it's done, so that would mean not being able - // to pipe the output - res.writeHead(200, {'content-type': 'text/plain'}) - new Runner(argv, null).pipe(res) - }) - -server.listen(1337) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-reader.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-reader.js deleted file mode 100755 index b196cc2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap-reader.js +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env node - -// read a tap stream from stdin. - -var TapConsumer = require("../lib/tap-consumer") - , TapProducer = require("../lib/tap-producer") - -var tc = new TapConsumer - , tp = new TapProducer - -//process.stdin.pipe(tc) -process.stdin.on("data", function (c) { - c = c + "" - // console.error(JSON.stringify(c).substr(0, 100)) - tc.write(c) -}) -process.stdin.on("end", function () { tc.end() }) -process.stdin.resume() -//tc.pipe(tp) -tc.on("data", function (c) { - tp.write(c) -}) -tc.on("end", function () { tp.end() }) - -tp.on("data", function (c) { - console.error(["output write", c]) - process.stdout.write(c) -}) - -tp.on("end", function (er, total, ok) { - if (er) throw er - process.exit(total - ok) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap.js deleted file mode 100755 index 0a9bbeb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/bin/tap.js +++ /dev/null @@ -1,144 +0,0 @@ -#!/usr/bin/env node - -var argv = process.argv.slice(2) - , path = require("path") - , Runner = require("../lib/tap-runner") - - , nopt = require("nopt") - - , knownOpts = - { cover: [path, false] - , "cover-dir": path - , stderr: Boolean - , stdout: Boolean - , diag: Boolean - , version: Boolean - , tap: Boolean - , timeout: Number - , gc: Boolean - , debug: Boolean - , "debug-brk": Boolean - , strict: Boolean - , harmony: Boolean - } - - , shorthands = - // debugging 1: show stderr - { d: ["--stderr"] - // debugging 2: show stderr and tap - , dd: ["--stderr", "--tap"] - // debugging 3: show stderr, tap, AND always show diagnostics. - , ddd: ["--stderr", "--tap", "--diag"] - , "expose-gc": ["--gc"] - , g: ["--gc"] - , e: ["--stderr"] - , t: ["--timeout"] - , o: ["--tap"] - , c: ["--cover"] - , v: ["--version"] - , "?": ["--help"] - , h: ["--help"] - } - - , defaults = - { cover: "./lib" - , "cover-dir": "./coverage" - , stderr: process.env.TAP_STDERR !== '0' - , tap: process.env.TAP - , diag: process.env.TAP_DIAG - , timeout: +process.env.TAP_TIMEOUT || 30 - , gc: false - , debug: false - , "debug-brk": false - , strict: false - , harmony: false - , version: false - , help: false } - - , options = nopt(knownOpts, shorthands) - -if (options.version) { - console.log(require("../package.json").version) - process.exit(0) -} - -if (options.help) { - console.log(function(){/* - -Usage: - tap - - Run the files as tap tests, parse the output, and report the results - -Options: - - --stderr Print standard error output of tests to standard error. - --tap Print raw tap output. - --diag Print diagnostic output for passed tests, as well as failed. - (Implies --tap) - --gc Expose the garbage collector to tests. - --timeout Maximum time to wait for a subtest, in seconds. Default: 30 - --debug Pass the '--debug' flag to node for debugging - --debug-brk Pass the '--debug-brk' flag to node for debugging - --strict Enforce strict mode when running tests. - --harmony Enable harmony features for tests. - --version Print the version of node tap. - --help Print this help. - -Please report bugs! https://github.com/isaacs/node-tap/issues - -*/}.toString().split(/\n/).slice(1, -1).join("\n")) - process.exit(0) -} - - -Object.keys(defaults).forEach(function (k) { - if (!options.hasOwnProperty(k)) options[k] = defaults[k] -}) - -// other tests that might rely on these -if (options.diag) process.env.TAP_DIAG = true -if (options.tap) process.env.TAP = true -if (options.timeout) process.env.TAP_TIMEOUT = options.timeout - -var r = new Runner(options) - , TapProducer = require("../lib/tap-producer") - -if (options.tap || options.diag) { - r.pipe(process.stdout) -} else { - r.on("file", function (file, results, details) { - var s = (details.ok ? "" : "not ") + "ok "+results.name - , n = details.pass + "/" + details.testsTotal - , dots = new Array(Math.max(1, 60 - s.length - n.length)).join(".") - console.log("%s %s %s", s, dots, n) - if (details.ok) { - if (details.skip) { - console.log(" skipped: %s", details.skipTotal) - } - } else { - // console.error(details) - console.log(" Command: %s", results.command) - console.log(" " + TapProducer.encode(details.list) - .split(/\n/).join("\n ")) - } - }) - r.on("end", function () { - //console.log(r) - var s = "total" - , n = r.results.pass + "/" + r.results.testsTotal - , dots = new Array(60 - s.length - n.length).join(".") - , ok = r.results.ok ? "ok" : "not ok" - console.log("%s %s %s\n\n%s", s, dots, n, ok) - if (r.doCoverage) { - console.error( "\nCoverage: %s\n" - , path.resolve(r.coverageOutDir, "index.html") ) - } - }) -} - - - -r.on("end", function () { - process.exit(r.results.tests - r.results.pass) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/bar.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/bar.js deleted file mode 100644 index e7cb7ad..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/bar.js +++ /dev/null @@ -1,15 +0,0 @@ -var Bar = module.exports = function(str) { - this.bar = str; - this.str = str; -}; - -Bar.prototype.foo = function() { - var self = this; - return self.bar; -}; - -Bar.prototype.baz = function() { - var self = this; - return self.str; -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/foo.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/foo.js deleted file mode 100644 index cb9ee8f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/lib/foo.js +++ /dev/null @@ -1,15 +0,0 @@ -var Foo = module.exports = function(str) { - this.foo = str; - this.str = str; -}; - -Foo.prototype.bar = function() { - var self = this; - return self.foo; -}; - -Foo.prototype.baz = function() { - var self = this; - return self.str; -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/bar.test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/bar.test.js deleted file mode 100644 index 91e4bc2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/bar.test.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require('tap').test, - Bar = require('../lib/bar'), - bar; - -test('setup', function(t) { - bar = new Bar('baz'); - t.ok(bar); - t.end(); -}); - -test('bar', function(t) { - t.equal('baz', bar.foo()); - t.end(); -}); - -test('teardown', function(t) { - t.ok(true); - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/baz.test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/baz.test.js deleted file mode 100644 index fae22d8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/baz.test.js +++ /dev/null @@ -1,29 +0,0 @@ -var test = require('tap').test, - Foo = require('../lib/foo'), - Bar = require('../lib/bar'), - foo, bar; - -test('setup', function(t) { - foo = new Foo('baz'); - t.ok(foo); - bar = new Bar('baz'); - t.ok(bar); - t.end(); -}); - -test('baz from Foo', function(t) { - t.equal('baz', foo.baz()); - t.end(); -}); - -test('baz from Bar', function(t) { - t.equal('baz', bar.baz()); - t.end(); -}); - - -test('teardown', function(t) { - t.ok(true); - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/foo.test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/foo.test.js deleted file mode 100644 index 2aed8fd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/coverage-example/test/foo.test.js +++ /dev/null @@ -1,20 +0,0 @@ -var test = require('tap').test, - Foo = require('../lib/foo'), - foo; - -test('setup', function(t) { - foo = new Foo('baz'); - t.ok(foo); - t.end(); -}); - -test('bar', function(t) { - t.equal('baz', foo.bar()); - t.end(); -}); - -test('teardown', function(t) { - t.ok(true); - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/lib/math.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/lib/math.js deleted file mode 100644 index f798626..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/lib/math.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = Math diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/test/test-example.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/test/test-example.js deleted file mode 100644 index cd2549b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/example/test/test-example.js +++ /dev/null @@ -1,237 +0,0 @@ -var tap = require("tap") - , test = tap.test - , plan = tap.plan - , math - -test("load sut", function (t) { - math = require("../lib/math") - t.ok(math, "object loaded") - t.end() -}) - -test("validate constants", function (t) { - t.equal(math.LN10, 2.302585092994046, "ln 10") - t.equal(math.PI, 3.141592653589793, "pi") - t.equal(math.E, 2.718281828459045, "e") - t.equal(math.LOG10E, 0.4342944819032518, "log 10 e") - t.equal(math.SQRT2, 1.4142135623730951, "sqrt 2") - t.equal(math.SQRT1_2, 0.7071067811865476, "sqrt 1/2") - t.equal(math.LN2, 0.6931471805599453, "ln2") - t.end() -}) - -test("using this", function (t) { - // this also works. - this.equal(t, this, "call in scope of test obj") - this.end() -}) - -// test setTimeout, just a trivial example. -test("setTimeout", function (t) { - var start = Date.now() - setTimeout(function () { - t.ok(Date.now() >= start + 50, "timeout fired after delay") - t.end() - }, 50) -}) - -// another way to do the same, using a plan. -// this is more robust, but annoying when you have a long list -// of tests for something. For async stuff, it's generally better, -// since there's a higher risk of the control flowing off to lala land. -test("setTimeout planned", function (t) { - t.plan(1) - var start = Date.now() - setTimeout(function () { - t.ok(Date.now() >= start + 50, "timeout fired after delay") - }, 50) -}) - -// plans also are good for cases where things may fire in a non-deterministic -// order, since it won't be as obvious when everything is done. -test("setTimeout parallel", function (t) { - t.plan(2) - var start = Date.now() - setTimeout(function A () { - t.ok(Date.now() >= start + 50, "timeout A fired after delay") - }, 50) - setTimeout(function B () { - t.ok(Date.now() >= start + 50, "timeout B fired after delay") - }, 50) -}) - -// something slightly less hello worldy -test("async test", function (t) { - t.plan(4) - var fs = require("fs") - t.ok(fs, "fs library should load") - var rs = fs.createReadStream(__filename) - t.ok(rs, "read stream should start fine.") - rs.on("open", function (fd) { - t.type(fd, "number", "file descriptor should be a number") - t.equal(fd, rs.fd, "fd should match stream fd") - }) -}) - -// you can bail out of the entire everything if something is just -// Not Right (db not installed, etc.) -test("tarp", function (parent) { - if (7 === 5) { - parent.bailout("math is broken") - } - // bailout bubbles up a bit like "error" events - // if unhandled, then the parent will bail, as well. - parent.test("child bailouts", function (child) { - child.on("bailout", function (s) { - parent.fail("children shouldn't bail.") - }) - child.bailout("try to bail out, but instead just fail a test") - }) - - parent.test("child bailout 2", function (child) { - child.bailout("this one will bail out") - }) -}) - -// tests marked "todo" can fail without counting against the overall score -// never ever ever write tests to "verify" incorrect behavior! -test("unfinished test", function (t) { - t.equal(math.cos(math.PI), -1, "cos(PI)") - t.equal(math.sin(math.PI), 0, "sin(PI)") - t.equal(math.face, "your face", "math.face should be your face # TODO") - t.end() -}) - -// tests can have children. -test("http server", function (t) { - // one test plus 4 children. - t.plan(5) - - var http = require("http") - , PORT = 12346 - - t.ok(http, "http module should load") - var server - - t.test("set up server", function (t) { - t.plan(2) - server = http.createServer(function (req, res) { - t.comment("Request: "+req.url) - res.writeHead(200, {}) - res.end(req.method + " " + req.url) - }) - t.ok(server, "createServer should create a server") - server.listen(PORT, t.cb("listen should fire callback")) - }) - - // set the "parallel" flag on this one. - // That signals the harness to proceed immediately to the next test, - // and run them in parallel. - // Default behavior is to wait for each test to complete before proceeding - // to the next one. - // The first not-parallel test encountered will cause it to wait for that - // test, as well as all the parallel tests before it. - // A, B', C', D', E (where ' means "parallel") - // Runs A, and then B, C, and D in parallel, and then E. - t.test("testing POST", {parallel: true}, function (t) { - t.plan(1) - http.request("POST", { method: "POST" - , host: "localhost" - , path: "/foo" - , port: PORT }).on("response", function (res) { - t.bufferStream(res, function (s) { t.equal(s, "POST /foo") }) - }).end() - }) - - t.test("testing GET", {parallel: true}, function (t) { - t.plan(1) - http.request("POST", { method: "GET" - , host: "localhost" - , path: "/foo" - , port: PORT }).on("response", function (res) { - t.bufferStream(res, function (s) { t.equal(s, "GET /foo") }) - }).end() - }) - - // wrap in a test so that if this throws, it'll log as a failed test. - t.test("teardown", function (t) { - server.close() - t.end() - }) -}) - -// yo dawg! -test("meta-tests", function (t) { - t.plan(5) - - // t.fails() wraps a child test and succeeds if it fails. - t.fails(t.test("this should fail", function (t) { - t.ok(false, "assert false") - t.end() - })) - - // t.timesOut() wraps a child test and succeeds if it times out. - // if t.end() is called, or if a plan is completed, then it fails. - // set the timeout really low so that it will not take forever. - t.timesOut(t.test("this should timeout", { timeout: 1 }, function (t) { - t.ok(true, "assert true") - // t.end() never called. - })) - - // t.incomplete() wraps a child test and succeeds if it ends before - // the plan is finished. - t.incomplete(t.test("this should be incomplete", function (t) { - t.plan(100) - t.ok(true, "assert true") - // calling end prematurely. - t.end() - })) - - // t.bailsOut() wraps a child test and succeeds if it calls bailout() - t.bailsOut(t.test("this should bailout", function (t) { - t.bailout("oh noes, bailing out!") - })) - - // low-level analysis of subtests - t.test("verifying test success/failure expectations", function (t) { - t.once("end", function () { - var res = t.results - , is = t.equal - // hijack! - t.clear() - is(res.ok, false, "ok") - - is(res.bailedOut, false, "bailed out") - - is(res.skip, 2, "skips") - is(res.skipPass, 1, "skip that passed") - is(res.skipFail, 1, "skip that failed") - - is(res.todo, 2, "todos") - is(res.todoPass, 1, "todo that passed") - is(res.todoFail, 1, "todo that failed") - - is(res.failTotal, 3, "failures total") - is(res.fail, 1, "relevant failure") - - is(res.passTotal, 3, "passes total") - is(res.pass, 1, "relevant pass") - - is(res.testsTotal, 6, "total tests") - is(res.tests, 2, "should be 2 relevant tests") - - t.end() - }) - - // run the metatest. - // *this* is the actual SUT in this case. - t.ok(false, "failing todo #todo") - // can also set #todo or #skip explicitly - t.ok(true, "succeeding todo", {todo: true}) - t.ok(false, "failing skip #skip", {skip: true}) - t.ok(true, "suceeding skip #skip") - t.ok(false, "failing test") - t.ok(true, "succeeding test") - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/main.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/main.js deleted file mode 100644 index a9a520a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/main.js +++ /dev/null @@ -1,16 +0,0 @@ - -var GlobalHarness = require("./tap-global-harness") - -// this lets you do stuff like: -// var test = require("tap").test -// test(...) -// to run stuff in the global harness. -exports = module.exports = new GlobalHarness() - -exports.createProducer = exports.Producer = require("./tap-producer") -exports.createConsumer = exports.Consumer = require("./tap-consumer") -exports.yamlish = require("yamlish") -exports.createTest = exports.Test = require("./tap-test") -exports.createHarness = exports.Harness = require("./tap-harness") -exports.createRunner = exports.Runner = require("./tap-runner") -exports.assert = require("./tap-assert") diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-assert.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-assert.js deleted file mode 100644 index 60203a0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-assert.js +++ /dev/null @@ -1,445 +0,0 @@ -// an assert module that returns tappable data for each assertion. -var difflet = require('difflet') - , deepEqual = require('deep-equal') - , bufferEqual = require('buffer-equal') - , Buffer = require('buffer').Buffer - -module.exports = assert - -var syns = {} - , id = 1 - -function assert (ok, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - - //console.error("assert %j", [ok, message, extra]) - //if (extra && extra.skip) return assert.skip(message, extra) - //console.error("assert", [ok, message, extra]) - ok = !!ok - var res = { id : id ++, ok: ok } - - var caller = getCaller(extra && extra.error) - if (extra && extra.error) { - res.type = extra.error.name - res.message = extra.error.message - res.code = extra.error.code - || extra.error.type - res.errno = extra.error.errno - delete extra.error - } - if (caller.file) { - res.file = caller.file - res.line = +caller.line - res.column = +caller.column - } - res.stack = caller.stack - - res.name = message || "(unnamed assert)" - - if (extra) Object.keys(extra).forEach(function (k) { - if (!res.hasOwnProperty(k)) res[k] = extra[k] - }) - - // strings and objects are hard to diff by eye - if (!ok && - res.hasOwnProperty("found") && - res.hasOwnProperty("wanted") && - res.found !== res.wanted) { - if (typeof res.wanted !== typeof res.found || - typeof res.wanted === "object" && (!res.found || !res.wanted)) { - res.type = { found: typeof found - , wanted: typeof wanted } - } else if (typeof res.wanted === "string") { - res.diff = diffString(res.found, res.wanted) - } else if (typeof res.wanted === "object") { - res.diff = diffObject(res.found, res.wanted) - } - } - - //console.error("assert return", res) - - return res -} -assert.ok = assert -syns.ok = [ "true", "assert" ] - - -function notOk (ok, message, extra) { - return assert(!ok, message, extra) -} -assert.notOk = notOk -syns.notOk = [ "false", "notok" ] - -function error (er, message, extra) { - if (!er) { - // just like notOk(er) - return assert(!er, message, extra) - } - message = message || er.message - extra = extra || {} - extra.error = er - return assert.fail(message, extra) -} -assert.error = error -syns.error = [ "ifError", "ifErr", "iferror" ] - - -function pass (message, extra) { - return assert(true, message, extra) -} -assert.pass = pass - -function fail (message, extra) { - //console.error("assert.fail", [message, extra]) - //if (extra && extra.skip) return assert.skip(message, extra) - return assert(false, message, extra) -} -assert.fail = fail - -function skip (message, extra) { - //console.error("assert.skip", message, extra) - if (!extra) extra = {} - return { id: id ++, skip: true, name: message || "" } -} -assert.skip = skip - -function throws (fn, wanted, message, extra) { - if (typeof wanted === "string") { - extra = message - message = wanted - wanted = null - } - - if (extra && extra.skip) return assert.skip(message, extra) - - var found = null - try { - fn() - } catch (e) { - found = { name: e.name, message: e.message } - } - - extra = extra || {} - - extra.found = found - if (wanted) { - wanted = { name: wanted.name, message: wanted.message } - extra.wanted = wanted - } - - if (!message) { - message = "Expected to throw" - if (wanted) message += ": "+wanted.name + " " + wanted.message - } - - return (wanted) ? assert.similar(found, wanted, message, extra) - : assert.ok(found, message, extra) -} -assert.throws = throws - - -function doesNotThrow (fn, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - var found = null - try { - fn() - } catch (e) { - found = {name: e.name, message: e.message} - } - message = message || "Should not throw" - - return assert.equal(found, null, message, extra) -} -assert.doesNotThrow = doesNotThrow - - -function equal (a, b, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - extra = extra || {} - message = message || "should be equal" - extra.found = a - extra.wanted = b - return assert(a === b, message, extra) -} -assert.equal = equal -syns.equal = ["equals" - ,"isEqual" - ,"is" - ,"strictEqual" - ,"strictEquals"] - - -function equivalent (a, b, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - var extra = extra || {} - message = message || "should be equivalent" - extra.found = a - extra.wanted = b - - if (Buffer.isBuffer(a) && Buffer.isBuffer(b)) { - return assert(bufferEqual(a, b), message, extra) - } else { - return assert(deepEqual(a, b), message, extra) - } -} -assert.equivalent = equivalent -syns.equivalent = ["isEquivalent" - ,"looseEqual" - ,"looseEquals" - ,"isDeeply" - ,"same" - ,"deepEqual" - ,"deepEquals"] - - -function inequal (a, b, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - extra = extra || {} - message = message || "should not be equal" - extra.found = a - extra.doNotWant = b - return assert(a !== b, message, extra) -} -assert.inequal = inequal -syns.inequal = ["notEqual" - ,"notEquals" - ,"notStrictEqual" - ,"notStrictEquals" - ,"isNotEqual" - ,"isNot" - ,"not" - ,"doesNotEqual" - ,"isInequal"] - - -function inequivalent (a, b, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - extra = extra || {} - message = message || "should not be equivalent" - extra.found = a - extra.doNotWant = b - - if (Buffer.isBuffer(a) && Buffer.isBuffer(b)) { - return assert(!bufferEqual(a, b), message, extra) - } else { - return assert(!deepEqual(a, b), message, extra) - } -} -assert.inequivalent = inequivalent -syns.inequivalent = ["notEquivalent" - ,"notDeepEqual" - ,"notDeeply" - ,"notSame" - ,"isNotDeepEqual" - ,"isNotDeeply" - ,"isNotEquivalent" - ,"isInequivalent"] - -function similar (a, b, message, extra, flip) { - if (extra && extra.skip) return assert.skip(message, extra) - // test that a has all the fields in b - message = message || "should be similar" - - if (typeof a === "string" && - (Object.prototype.toString.call(b) === "[object RegExp]")) { - extra = extra || {} - extra.pattern = b - extra.string = a - var ok = a.match(b) - extra.match = ok - if (flip) ok = !ok - return assert.ok(ok, message, extra) - } - - var isObj = assert(a && typeof a === "object", message, extra) - if (!isObj.ok) { - // not an object - if (a == b) isObj.ok = true - if (flip) isObj.ok = !isObj.ok - return isObj - } - - var eq = flip ? inequivalent : equivalent - return eq(selectFields(a, b), b, message, extra) -} -assert.similar = similar -syns.similar = ["isSimilar" - ,"has" - ,"hasFields" - ,"like" - ,"isLike"] - -function dissimilar (a, b, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - message = message || "should be dissimilar" - return similar(a, b, message, extra, true) -} -assert.dissimilar = dissimilar -syns.dissimilar = ["unsimilar" - ,"notSimilar" - ,"unlike" - ,"isUnlike" - ,"notLike" - ,"isNotLike" - ,"doesNotHave" - ,"isNotSimilar" - ,"isDissimilar"] - -function type (thing, t, message, extra) { - if (extra && extra.skip) return assert.skip(message, extra) - var name = t - if (typeof name === "function") name = name.name || "(anonymous ctor)" - //console.error("name=%s", name) - message = message || "type is "+name - var type = typeof thing - //console.error("type=%s", type) - if (!thing && type === "object") type = "null" - if (type === "object" && t !== "object") { - if (typeof t === "function") { - //console.error("it is a function!") - extra = extra || {} - extra.found = Object.getPrototypeOf(thing).constructor.name - extra.wanted = name - //console.error(thing instanceof t, name) - return assert.ok(thing instanceof t, message, extra) - } - - //console.error("check prototype chain") - // check against classnames or objects in prototype chain, as well. - // type(new Error("asdf"), "Error") - // type(Object.create(foo), foo) - var p = thing - while (p = Object.getPrototypeOf(p)) { - if (p === t || p.constructor && p.constructor.name === t) { - type = name - break - } - } - } - //console.error(type, name, type === name) - return assert.equal(type, name, message, extra) -} -assert.type = type -syns.type = ["isa"] - -// synonyms are helpful. -Object.keys(syns).forEach(function (c) { - syns[c].forEach(function (s) { - Object.defineProperty(assert, s, { value: assert[c], enumerable: false }) - }) -}) - -// helpers below - -function selectFields (a, b) { - // get the values in A of the fields in B - var ret = Array.isArray(b) ? [] : {} - Object.keys(b).forEach(function (k) { - if (!a.hasOwnProperty(k)) return - var v = b[k] - , av = a[k] - if (v && av && typeof v === "object" && typeof av === "object" - && !(v instanceof Date) - && !(v instanceof RegExp) - && !(v instanceof String) - && !(v instanceof Boolean) - && !(v instanceof Number) - && !(Array.isArray(v))) { - ret[k] = selectFields(av, v) - } else ret[k] = av - }) - return ret -} - -function sortObject (obj) { - if (typeof obj !== 'object' || Array.isArray(obj) || obj === null) { - return obj - } - - return Object.keys(obj).sort().reduce(function (acc, key) { - acc[key] = sortObject(obj[key]) - return acc - }, {}) -} - -function stringify (a) { - return JSON.stringify(sortObject(a), (function () { - var seen = [] - , keys = [] - return function (key, val) { - var s = seen.indexOf(val) - if (s !== -1) { - return "[Circular: "+keys[s]+"]" - } - if (val && typeof val === "object" || typeof val === "function") { - seen.push(val) - keys.push(val["!"] || val.name || key || "") - if (typeof val === "function") { - return val.toString().split(/\n/)[0] - } else if (typeof val.toUTCString === "function") { - return val.toUTCString() - } - } - return val - }})()) -} - -function diffString (f, w) { - if (w === f) return null - var p = 0 - , l = w.length - while (p < l && w.charAt(p) === f.charAt(p)) p ++ - w = stringify(w).substr(1).replace(/"$/, "") - f = stringify(f).substr(1).replace(/"$/, "") - return diff(f, w, p) -} - -function diffObject (f, w) { - return difflet({ indent : 2, comment : true }).compare(w, f) -} - -function diff (f, w, p) { - if (w === f) return null - var i = p || 0 // it's going to be at least p. JSON can only be bigger. - , l = w.length - while (i < l && w.charAt(i) === f.charAt(i)) i ++ - var pos = Math.max(0, i - 20) - w = w.substr(pos, 40) - f = f.substr(pos, 40) - var pointer = i - pos - return "FOUND: "+f+"\n" - + "WANTED: "+w+"\n" - + (new Array(pointer + 9).join(" ")) - + "^ (at position = "+p+")" -} - -function getCaller (er) { - // get the first file/line that isn't this file. - if (!er) er = new Error - var stack = er.stack || "" - stack = stack.split(/\n/) - for (var i = 1, l = stack.length; i < l; i ++) { - var s = stack[i].match(/\(([^):]+):([0-9]+):([0-9]+)\)$/) - if (!s) continue - var file = s[1] - , line = +s[2] - , col = +s[3] - if (file.indexOf(__dirname) === 0) continue - if (file.match(/tap-test\/test.js$/)) continue - else break - } - var res = {} - if (file && file !== __filename && !file.match(/tap-test\/test.js$/)) { - res.file = file - res.line = line - res.column = col - } - - res.stack = stack.slice(1).map(function (s) { - return s.replace(/^\s*at\s*/, "") - }) - - return res -} - - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-browser-harness.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-browser-harness.js deleted file mode 100644 index 9eaa0e4..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-browser-harness.js +++ /dev/null @@ -1,63 +0,0 @@ -// this is just a harness that pipes to stdout. -// It's the default one. -module.exports = BrowserHarness - -var BrowserHarness = global.TAP_Browser_Harness - , inherits = require("inherits") - , Results = require("./tap-results") - , Harness = require("./tap-harness") - , Test = require("./tap-test") - -inherits(BrowserHarness, Harness) -function BrowserHarness (outPipe) { - //console.error("calling BrowserHarness") - if (browserHarness) return browserHarness - if (!(this instanceof BrowserHarness)) { - return browserHarness = new BrowserHarness - } - browserHarness = global.TAP_Browser_Harness = this - Harness.call(this, Test) - - if (outPipe) this.output.pipe(outPipe) - - this.test = this.test.bind(this) - - this.plan = this.plan.bind(this) - - var output = this.output - this.on("childEnd", function (child) { - //console.error("childEnd in global harness") - //console.error(child.results) - // write out the stuff for this child. - //console.error("child.conf", child.conf) - - // maybe write some other stuff about the number of tests in this - // thing, etc. I dunno. - //console.error("child results", child.results) - this.results.list.forEach(function (res) { - //delete res.error - //console.error("child resuilt", res) - output.write(res) - }) - //console.error("wrote child results") - this.results.list.length = 0 - }) - - var streamEnded = false - this.on("end", function () { - //console.error("global ending the stream") - if (!streamEnded) { - this.results.list.forEach(function (res) { - output.write(res) - }) - this.results.list.length = 0 - output.end() - streamEnded = true - } - }) - - // TODO: handle global errors - // process.on("unhandledException", function (e) { - // this.bailout("unhandled exception: " + e.message) - // }) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-consumer.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-consumer.js deleted file mode 100644 index 0b991a5..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-consumer.js +++ /dev/null @@ -1,246 +0,0 @@ -module.exports = TapConsumer - -// pipe a stream into this that's emitting tap-formatted data, -// and it'll emit "data" events with test objects or comment strings -// and an "end" event with the final results. - -var yamlish = require("yamlish") - , Results = require("./tap-results") - , inherits = require("inherits") - -TapConsumer.decode = TapConsumer.parse = function (str) { - var tc = new TapConsumer - , list = [] - tc.on("data", function (res) { - list.push(res) - }) - tc.end(str) - tc.results.list = list - return tc.results -} - -var Stream = require("stream").Stream -inherits(TapConsumer, Stream) -function TapConsumer () { - if (!(this instanceof TapConsumer)) { - return new TapConsumer - } - - Stream.call(this) - this.results = new Results - this.readable = this.writable = true - - this.on("data", function (res) { - if (typeof res === "object") this.results.add(res) - }) - - this._plan = null - this._buffer = "" - this._indent = [] - this._current = null - this._actualCount = 0 - this._passed = [] - this._failed = [] - //console.error("TapConsumer ctor done") -} - -TapConsumer.prototype.bailedOut = false - -TapConsumer.prototype.write = function (chunk) { - if (!this.writable) this.emit("error", new Error("not writable")) - if (this.bailedOut) return true - - this._buffer = this._buffer + chunk - // split it up into lines. - var lines = this._buffer.split(/\r?\n/) - // ignore the last line, since it might be incomplete. - this._buffer = lines.pop() - - for (var i = 0, l = lines.length; i < l; i ++) { - //console.error([i, lines[i]]) - // see if it's indented. - var line = lines[i] - , spaces = (this._indent.length && !line.trim()) - || line.match(/^\s/) - // at this level, only interested in fully undented stuff. - if (spaces) { - var c = i - while (c < l && (!lines[c].trim() || lines[c].match(/^\s/))) { - this._indent.push(lines[c++]) - } - //console.error(c-i, "indented", this._indent, this._current) - i = c - 1 - continue - } - // some kind of line. summary, ok, notok, comment, or garbage. - // this also finishes parsing any of the indented lines from before - this._parseLine(line) - } - return true -} - -TapConsumer.prototype.end = function () { - // finish up any hanging indented sections or final buffer - if (this._buffer.match(/^\s/)) this._indent.push(this.buffer) - else this._parseLine(this._buffer) - - if (!this.bailedOut && - this._plan !== null && - this.results.testsTotal !== this._plan) { - while (this._actualCount < this._plan) { - this.emit("data", {ok: false, name:"MISSING TEST", - id:this._actualCount ++ }) - } - } - - this._parseLine("") - this._buffer = "" - this.writable = false - this.emit("end", null, this._actualCount, this._passed) -} - -TapConsumer.prototype._parseLine = function (line) { - if (this.bailedOut) return - //console.error("_parseLine", [line]) - // if there are any indented lines, and there is a - // current object already, then they belong to it. - // if there is not a current object, then they're garbage. - if (this._current && this._indent.length) { - this._parseIndented() - } - this._indent.length = 0 - if (this._current) { - if (this._current.ok) this._passed.push(this._current.id) - else this._failed.push(this._current.id) - this.emit("data", this._current) - } - this._current = null - line = line.trim() - if (!line) return - // try to see what kind of line this is. - - var bo - if (bo = line.match(/^bail out!\s*(.*)$/i)) { - this.bailedOut = true - // this.emit("error", new Error(line)) - this.emit("bailout", bo[1]) - return - } - - if (line.match(/^#/)) { // just a comment - line = line.replace(/^#+/, "").trim() - // console.error("outputting comment", [line]) - if (line) this.emit("data", line) - return - } - - var plan = line.match(/^([0-9]+)\.\.([0-9]+)(?:\s+#(.*))?$/) - if (plan) { - var start = +(plan[1]) - , end = +(plan[2]) - , comment = plan[3] - - // TODO: maybe do something else with this? - // it might be something like: "1..0 #Skip because of reasons" - this._plan = end - this.emit("plan", end, comment) - // plan must come before or after all tests. - if (this._actualCount !== 0) { - this._sawPlan = true - } - return - } - - if (line.match(/^(not )?ok(?:\s+([0-9]+))?/)) { - this._parseResultLine(line) - return - } - - // garbage. emit as a comment. - //console.error("emitting", [line.trim()]) - if (line.trim()) this.emit("data", line.trim()) -} - -TapConsumer.prototype._parseDirective = function (line) { - line = line.trim() - if (line.match(/^TODO\b/i)) { - return { todo:true, explanation: line.replace(/^TODO\s*/i, "") } - } else if (line.match(/^SKIP\b/i)) { - return { skip:true, explanation: line.replace(/^SKIP\s*/i, "") } - } -} - -TapConsumer.prototype._parseResultLine = function (line) { - this._actualCount ++ - if (this._sawPlan) { - this.emit("data", {ok: false, name:"plan in the middle of tests" - ,id:this._actualCount ++}) - } - var parsed = line.match(/^(not )?ok(?: ([0-9]+))?(?:(?: - )?(.*))?$/) - , ok = !parsed[1] - , id = +(parsed[2] || this._actualCount) - , rest = parsed[3] || "" - , name - , res = { id:id, ok:ok } - - // split on un-escaped # characters - - //console.log("# "+JSON.stringify([name, rest])) - rest = rest.replace(/([^\\])((?:\\\\)*)#/g, "$1\n$2").split("\n") - name = rest.shift() - rest = rest.filter(function (r) { return r.trim() }).join("#") - //console.log("# "+JSON.stringify([name, rest])) - - // now, let's see if there's a directive in there. - var dir = this._parseDirective(rest.trim()) - if (!dir) name += rest ? "#" + rest : "" - else { - res.ok = true - if (dir.skip) res.skip = true - else if (dir.todo) res.todo = true - if (dir.explanation) res.explanation = dir.explanation - } - res.name = name - - //console.error(line, [ok, id, name]) - this._current = res -} - -TapConsumer.prototype._parseIndented = function () { - // pull yamlish block out - var ind = this._indent - , ys - , ye - , yind - , diag - //console.error(ind, this._indent) - for (var i = 0, l = ind.length; i < l; i ++) { - var line = ind[i] - if (line === undefined) continue - var lt = line.trim() - - if (!ys) { - ys = line.match(/^(\s*)---(.*)$/) - if (ys) { - yind = ys[1] - diag = [ys[2]] - //console.error([line,ys, diag]) - continue - } else if (lt) this.emit("data", lt) - } else if (ys && !ye) { - if (line === yind + "...") ye = true - else { - diag.push(line.substr(yind.length)) - } - } else if (ys && ye && lt) this.emit("data", lt) - } - if (diag) { - //console.error('about to parse', diag) - diag = yamlish.decode(diag.join("\n")) - //console.error('parsed', diag) - Object.keys(diag).forEach(function (k) { - //console.error(this._current, k) - if (!this._current.hasOwnProperty(k)) this._current[k] = diag[k] - }, this) - } -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-cov-html.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-cov-html.js deleted file mode 100644 index 3c1c192..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-cov-html.js +++ /dev/null @@ -1,78 +0,0 @@ -var fs = require('fs'), - path = require('path'), - asyncMap = require("slide").asyncMap, - util = require('util'); - -var CovHtml = module.exports = function(cov_stats, cov_dir, cb) { - var index = []; - - asyncMap( - Object.keys(cov_stats), - function(f, cb) { - var st = cov_stats[f], - missing_lines = st.missing.map(function(l) { - return l.number; - }), - out = '\n\n\n ' + - '\n ' + - - f + ' (' + st.loc + ')\n' + - '\n' + - '\n\n' + - '

' + f + ' (' + st.loc + ')' + '

' + - '

Run: ' + (st.missing.length ? st.loc - st.missing.length : st.loc) + ', Missing: ' + - st.missing.length + ', Percentage: ' + st.percentage + '

' + - '

Source:

\n' + - '
    \n' + - st.lines.map(function(line) { - var number = line.number, - color = (missing_lines.indexOf(number) !== -1) ? '#fcc' : '#cfc'; - return '
  1. ' + line.source.replace(/'; - }).join('\n') + - '
\n' + - '

Data

\n'+ - '
' + util.inspect(st, true, Infinity, false).replace(/\n';
-
-      fs.writeFile(
-        cov_dir + '/' + 
-        f.replace(process.cwd() + '/', '').replace(/\//g, '+') + '.html',
-        out,
-        'utf8',
-        function(err) {
-          if (err) {
-            throw err;
-          }
-          index.push(f);
-          cb();
-        });
-    },
-    function(err) {
-      if (err) {
-        throw err;
-      }
-      var out = '\n\n\n  ' +
-          '\n  Coverage Index\n\n' +
-          '\n

Code Coverage Information

\n
\n\n'; - - fs.writeFile(cov_dir + '/index.html', out, 'utf8', function(err) { - if (err) { - throw err; - } - cb(); - }); - } - ); -}; - - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-global-harness.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-global-harness.js deleted file mode 100644 index 2fb1933..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-global-harness.js +++ /dev/null @@ -1,68 +0,0 @@ -// this is just a harness that pipes to stdout. -// It's the default one. -module.exports = GlobalHarness - -var globalHarness = global.TAP_Global_Harness - , inherits = require("inherits") - , Results = require("./tap-results") - , Harness = require("./tap-harness") - , Test = require("./tap-test") - -inherits(GlobalHarness, Harness) -function GlobalHarness () { - //console.error("calling GlobalHarness") - if (globalHarness) return globalHarness - if (!(this instanceof GlobalHarness)) { - return globalHarness = new GlobalHarness - } - - globalHarness = global.TAP_Global_Harness = this - Harness.call(this, Test) - - this.output.pipe(process.stdout) - //this.output.on("data", function () { - // process.nextTick(process.stdout.flush.bind(process.stdout)) - //}) - - this.test = this.test.bind(this) - - this.plan = this.plan.bind(this) - - var output = this.output - this.on("childEnd", function (child) { - //console.error("childEnd in global harness") - //console.error(child.results) - // write out the stuff for this child. - //console.error("child.conf", child.conf) - - // maybe write some other stuff about the number of tests in this - // thing, etc. I dunno. - //console.error("child results", child.results) - this.results.list.forEach(function (res) { - //delete res.error - //console.error("child resuilt", res) - output.write(res) - }) - //console.error("wrote child results") - this.results.list.length = 0 - }) - - var streamEnded = false - this.on("end", function () { - //console.error("global ending the stream") - if (!streamEnded) { - this.results.list.forEach(function (res) { - output.write(res) - }) - this.results.list.length = 0 - output.end() - streamEnded = true - } - }) - - //this.on("end", this.output.end.bind(this.output)) - - process.on("unhandledException", function (e) { - this.bailout("unhandled exception: " + e.message) - }) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-harness.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-harness.js deleted file mode 100644 index f06f63c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-harness.js +++ /dev/null @@ -1,224 +0,0 @@ -// a thing that runs tests. -// Every "test" is also a harness. If they do not have a harness, -// then they are attached to the defaut "global harness", -// which writes its results to stdout. - - -// TODO: -// - Bailout should stop running any tests. -// - "skip" in the test config obj should skip it. - -module.exports = Harness -var EE = require("events").EventEmitter -require("inherits")(Harness, EE) - -var Results = require("./tap-results") - , TapProducer = require("./tap-producer") - , assert = require("./tap-assert") - -function Harness (Test) { - if (!(this instanceof Harness)) return new Harness(Test) - - //console.error("Test in "+this.constructor.name, Test) - - this._Test = Test - this._plan = null - this._children = [] - this._started = false - - this._testCount = 0 - this._planSum = 0 - - this.results = new Results() - // emit result events on the harness. - //this.results.on("result", function (res) { - // console.error("proxying result ev from res to harness") - // this.emit("result", res) - //}.bind(this)) - var me = this - this.results.on("result", this.emit.bind(this, "result")) - - var p = this.process.bind(this) - this.process = function () { - this._started = true - process.nextTick(p) - } - - this.output = new TapProducer() - EE.call(this) -} - -// this function actually only gets called bound to -// the Harness object, and on process.nextTick. Even if -// passed as an event handler, everything *else* will -// happen before it gets called. -Harness.prototype.process = function () { - //console.error("harness process") - // "end" can emit multiple times, so only actually move on - // to the next test if the current one is actually over. - // TODO: multiple in-process tests, if all are marked "async" - if (this._current) { - if (!this._current._ended) return - // handle the current one before moving onto the next. - this.childEnd(this._current) - } - var skip = true - while (skip) { - //console.error("checking for skips") - var current = this._current = this._children.shift() - if (current) { - skip = current.conf.skip - if (skip) { - //console.error("add a failure for the skipping") - this.results.add(assert.fail(current.conf.name - ,{skip:true, diag:false})) - } - } else skip = false - } - - // keep processing through skipped tests, instead of running them. - if (current && this._bailedOut) { - return this.process() - } - - //console.error("got current?", !!current) - if (current) { - current.on("end", this.process) - current.emit("ready") - //console.error("emitted ready") - //console.error("_plan", this._plan, this.constructor.name) - } else { - //console.error("Harness process: no more left. ending") - if (this._endNice) { - this._endNice() - } else { - this.end() - } - } -} - -Harness.prototype.end = function () { - if (this._children.length) { - return this.process() - } - //console.error("harness end", this.constructor.name) - if (this._bailedOut) return - - // can't call .end() more than once. - if (this._ended) { - //console.error("adding failure for end calling") - this.results.add(assert.fail("end called more than once")) - } - - // see if the plan is completed properly, if there was one. - if (this._plan !== null) { - var total = this._testCount - if (total !== this._plan) { - this.results.add(assert.equal(total, this._plan, "test count != plan")) - } - this._plan = total - } - - //console.error("setting ended true", this.constructor.name) - this._ended = true - this.emit("end") -} - -Harness.prototype.plan = function (p) { - //console.error("setting plan", new Error().stack) - if (this._plan !== null) { - //console.error("about to add failure for calling plan") - return this.results.add(assert.fail("plan set multiple times")) - } - this._plan = p - if (p === 0 || this.results.testsTotal) { - this.end() - } -} - -Harness.prototype.childEnd = function (child) { - //console.error("childEnd") - this._testCount ++ - this._planSum += child._plan - //console.error("adding set of child.results") - - this.results.add(child.conf.name || "(unnamed test)") - this.results.addSet(child.results) - this.emit("childEnd", child) - // was this planned? - if (this._plan === this._testCount) { - //console.error("plan", [this._plan, this._testCount]) - return this.end() - } -} - -function copyObj(o) { - var copied = {} - Object.keys(o).forEach(function (k) { copied[k] = o[k] }) - return copied -} - -Harness.prototype.test = function test (name, conf, cb) { - if (this._bailedOut) return - - if (typeof conf === "function") cb = conf, conf = null - if (typeof name === "object") conf = name, name = null - if (typeof name === "function") cb = name, name = null - - conf = (conf ? copyObj(conf) : {}) - name = name || "" - - //console.error("making test", [name, conf, cb]) - - // timeout: value in milliseconds. Defaults to 30s - // Set to Infinity to have no timeout. - if (isNaN(conf.timeout)) conf.timeout = 30000 - var t = new this._Test(this, name, conf) - var self = this - if (cb) { - //console.error("attaching cb to ready event") - t.on("ready", function () { - if (!isNaN(conf.timeout) && isFinite(conf.timeout)) { - var timer = setTimeout(this.timeout.bind(this), conf.timeout) - var clear = function () { - clearTimeout(timer) - } - t.on("end", clear) - t.on("bailout", function (message) { - self.bailout(message) - clear() - }) - } - }) - t.on("ready", cb.bind(t, t)) - // proxy the child results to this object. - //t.on("result", function (res) { - // console.error("in harness, proxying result up") - // t.results.add(res) - //}) - } - return t -} - -Harness.prototype.bailout = function (message) { - // console.error("Harness bailout", this.constructor.name) - message = message || "" - //console.error("adding bailout message result") - this.results.add({bailout: message}) - // console.error(">>> results after bailout" , this.results) - this._bailedOut = true - this.emit("bailout", message) - this.output.end({bailout: message}) -} - -Harness.prototype.add = function (child) { - //console.error("adding child") - this._children.push(child) - if (!this._started) this.process() -} - -// the tearDown function is *always* guaranteed to happen. -// Even if there's a bailout. -Harness.prototype.tearDown = function (fn) { - this.on("end", fn) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-producer.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-producer.js deleted file mode 100644 index 99dbb87..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-producer.js +++ /dev/null @@ -1,131 +0,0 @@ -module.exports = TapProducer - -var Results = require("./tap-results") - , inherits = require("inherits") - , yamlish = require("yamlish") - -TapProducer.encode = function (result, diag) { - var tp = new TapProducer(diag) - , out = "" - tp.on("data", function (c) { out += c }) - if (Array.isArray(result)) { - result.forEach(tp.write, tp) - } else tp.write(result) - tp.end() - return out -} - -var Stream = require("stream").Stream -inherits(TapProducer, Stream) -function TapProducer (diag) { - Stream.call(this) - this.diag = diag - this.count = 0 - this.readable = this.writable = true - this.results = new Results -} - -TapProducer.prototype.trailer = true - -TapProducer.prototype.write = function (res) { - // console.error("TapProducer.write", res) - if (typeof res === "function") throw new Error("wtf?") - if (!this.writable) this.emit("error", new Error("not writable")) - - if (!this._didHead) { - this.emit("data", "TAP version 13\n") - this._didHead = true - } - - var diag = res.diag - if (diag === undefined) diag = this.diag - - this.emit("data", encodeResult(res, this.count + 1, diag)) - - if (typeof res === "string") return true - - if (res.bailout) { - var bo = "bail out!" - if (typeof res.bailout === "string") bo += " " + res.bailout - this.emit("data", bo) - return - } - this.results.add(res, false) - - this.count ++ -} - -TapProducer.prototype.end = function (res) { - if (res) this.write(res) - // console.error("TapProducer end", res, this.results) - this.emit("data", "\n1.."+this.results.testsTotal+"\n") - if (this.trailer && typeof this.trailer !== "string") { - // summary trailer. - var trailer = "tests "+this.results.testsTotal + "\n" - if (this.results.pass) { - trailer += "pass " + this.results.pass + "\n" - } - if (this.results.fail) { - trailer += "fail " + this.results.fail + "\n" - } - if (this.results.skip) { - trailer += "skip "+this.results.skip + "\n" - } - if (this.results.todo) { - trailer += "todo "+this.results.todo + "\n" - } - if (this.results.bailedOut) { - trailer += "bailed out" + "\n" - } - - if (this.results.testsTotal === this.results.pass) { - trailer += "\nok\n" - } - this.trailer = trailer - } - if (this.trailer) this.write(this.trailer) - this.writable = false - this.emit("end", null, this.count, this.ok) -} - -function encodeResult (res, count, diag) { - // console.error(res, count, diag) - if (typeof res === "string") { - res = res.split(/\r?\n/).map(function (l) { - if (!l.trim()) return l.trim() - return "# " + l - }).join("\n") - if (res.substr(-1) !== "\n") res += "\n" - return res - } - - if (res.bailout) return "" - - - if (!!process.env.TAP_NODIAG) diag = false - else if (!!process.env.TAP_DIAG) diag = true - else if (diag === undefined) diag = !res.ok - - var output = "" - res.name = res.name && ("" + res.name).trim() - output += ( !res.ok ? "not " : "") + "ok " + count - + ( !res.name ? "" - : " " + res.name.replace(/[\r\n]/g, " ") ) - + ( res.skip ? " # SKIP" - : res.todo ? " # TODO" - : "" ) - + "\n" - - if (!diag) return output - var d = {} - , dc = 0 - Object.keys(res).filter(function (k) { - return k !== "ok" && k !== "name" && k !== "id" - }).forEach(function (k) { - dc ++ - d[k] = res[k] - }) - //console.error(d, "about to encode") - if (dc > 0) output += " ---"+yamlish.encode(d)+"\n ...\n" - return output -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-results.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-results.js deleted file mode 100644 index 6fe90e8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-results.js +++ /dev/null @@ -1,71 +0,0 @@ -// A class for counting up results in a test harness. - -module.exports = Results - -var inherits = require("inherits") - , EventEmitter = require("events").EventEmitter - -inherits(Results, EventEmitter) - -function Results (r) { - //console.error("result constructor", r) - this.ok = true - this.addSet(r) -} - -Results.prototype.addSet = function (r) { - //console.error("add set of results", r) - r = r || {ok: true} - ; [ "todo" - , "todoPass" - , "todoFail" - , "skip" - , "skipPass" - , "skipFail" - , "pass" - , "passTotal" - , "fail" - , "failTotal" - , "tests" - , "testsTotal" ].forEach(function (k) { - this[k] = (this[k] || 0) + (r[k] || 0) - //console.error([k, this[k]]) - }, this) - - this.ok = this.ok && r.ok && true - this.bailedOut = this.bailedOut || r.bailedOut || false - this.list = (this.list || []).concat(r.list || []) - this.emit("set", this.list) - //console.error("after addSet", this) -} - -Results.prototype.add = function (r, addToList) { - //console.error("add result", r) - var pf = r.ok ? "pass" : "fail" - , PF = r.ok ? "Pass" : "Fail" - - this.testsTotal ++ - this[pf + "Total"] ++ - - if (r.skip) { - this["skip" + PF] ++ - this.skip ++ - } else if (r.todo) { - this["todo" + PF] ++ - this.todo ++ - } else { - this.tests ++ - this[pf] ++ - } - - if (r.bailout || typeof r.bailout === "string") { - // console.error("Bailing out in result") - this.bailedOut = true - } - this.ok = !!(this.ok && r.ok) - - if (addToList === false) return - this.list = this.list || [] - this.list.push(r) - this.emit("result", r) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-runner.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-runner.js deleted file mode 100644 index c60e8d1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-runner.js +++ /dev/null @@ -1,501 +0,0 @@ -var fs = require("fs") - , child_process = require("child_process") - , path = require("path") - , chain = require("slide").chain - , asyncMap = require("slide").asyncMap - , TapProducer = require("./tap-producer.js") - , TapConsumer = require("./tap-consumer.js") - , assert = require("./tap-assert.js") - , inherits = require("inherits") - , util = require("util") - , CovHtml = require("./tap-cov-html.js") - , glob = require("glob") - - // XXX Clean up the coverage options - , doCoverage = process.env.TAP_COV - || process.env.npm_package_config_coverage - || process.env.npm_config_coverage - -module.exports = Runner - -inherits(Runner, TapProducer) - -function Runner (options, cb) { - this.options = options - - var diag = this.options.diag - var dir = this.options.argv.remain - TapProducer.call(this, diag) - - this.doCoverage = doCoverage - // An array of full paths to files to obtain coverage - this.coverageFiles = [] - // The source of these files - this.coverageFilesSource = {} - // Where to write coverage information - this.coverageOutDir = this.options["coverage-dir"] - // Temporary test files bunkerified we'll remove later - this.f2delete = [] - // Raw coverage stats, as read from JSON files - this.rawCovStats = [] - // Processed coverage information, per file to cover: - this.covStats = {} - - if (dir) { - var filesToCover = this.options.cover - - if (doCoverage) { - var mkdirp = require("mkdirp") - this.coverageOutDir = path.resolve(this.coverageOutDir) - this.getFilesToCover(filesToCover) - var self = this - return mkdirp(this.coverageOutDir, 0755, function (er) { - if (er) return self.emit("error", er) - self.run(dir, cb) - }) - } - - this.run(dir, cb) - } -} - - -Runner.prototype.run = function() { - var self = this - , args = Array.prototype.slice.call(arguments) - , cb = args.pop() || finish - - function finish (er) { - if (er) { - self.emit("error", er) - } - - if (!doCoverage) return self.end() - - // Cleanup temporary test files with coverage: - self.f2delete.forEach(function(f) { - fs.unlinkSync(f) - }) - self.getFilesToCoverSource(function(err, data) { - if (err) { - self.emit("error", err) - } - self.getPerFileCovInfo(function(err, data) { - if (err) { - self.emit("error", err) - } - self.mergeCovStats(function(err, data) { - if (err) { - self.emit("error", err) - } - CovHtml(self.covStats, self.coverageOutDir, function() { - self.end() - }) - }) - }) - }) - } - - if (Array.isArray(args[0])) { - args = args[0] - } - self.runFiles(args, "", cb) -} - -Runner.prototype.runDir = function (dir, cb) { - var self = this - fs.readdir(dir, function (er, files) { - if (er) { - self.write(assert.fail("failed to readdir " + dir, { error: er })) - self.end() - return - } - files = files.sort(function(a, b) { - return a > b ? 1 : -1 - }) - files = files.filter(function(f) { - return !f.match(/^\./) - }) - files = files.map(function(file) { - return path.resolve(dir, file) - }) - - self.runFiles(files, path.resolve(dir), cb) - }) -} - - -// glob the filenames so that test/*.js works on windows -Runner.prototype.runFiles = function (files, dir, cb) { - var self = this - var globRes = [] - chain(files.map(function (f) { - return function (cb) { - glob(f, function (er, files) { - if (er) - return cb(er) - globRes.push.apply(globRes, files) - cb() - }) - } - }), function (er) { - if (er) - return cb(er) - runFiles(self, globRes, dir, cb) - }) -} - -// set some default options for node debugging tests -function setOptionsForDebug(self) { - // Note: we automatically increase the default timeout here. Yes - // the user can specify --timeout to increase, but by default, - // 30 seconds is not a long time to debug your test. - self.options.timeout = 1000000; - - // Note: we automatically turn on stderr so user can see the 'debugger listening on port' message. - // Without this it looks like tap has hung.. - self.options.stderr = true; -} - -function runFiles(self, files, dir, cb) { - chain(files.map(function(f) { - return function (cb) { - if (self._bailedOut) return - var relDir = dir || path.dirname(f) - , fileName = relDir === "." ? f : f.substr(relDir.length + 1) - - self.write(fileName) - fs.lstat(f, function(er, st) { - if (er) { - self.write(assert.fail("failed to stat " + f, {error: er})) - return cb() - } - - var cmd = f, args = [], env = {} - - if (path.extname(f) === ".js") { - cmd = process.execPath - if (self.options.gc) { - args.push("--expose-gc") - } - if (self.options.debug) { - args.push("--debug") - setOptionsForDebug(self) - } - if (self.options["debug-brk"]) { - args.push("--debug-brk") - setOptionsForDebug(self) - } - if (self.options.strict) { - args.push("--use-strict") - } - if (self.options.harmony) { - args.push("--harmony") - } - args.push(fileName) - } else if (path.extname(f) === ".coffee") { - cmd = "coffee" - args.push(fileName) - } else { - // Check if file is executable - if ((st.mode & 0100) && process.getuid) { - if (process.getuid() != st.uid) { - return cb() - } - } else if ((st.mode & 0010) && process.getgid) { - if (process.getgid() != st.gid) { - return cb() - } - } else if ((st.mode & 0001) == 0) { - return cb() - } - } - - if (st.isDirectory()) { - return self.runDir(f, cb) - } - - if (doCoverage && path.extname(f) === ".js") { - var foriginal = fs.readFileSync(f, "utf8") - , fcontents = self.coverHeader() + foriginal + self.coverFooter() - , tmpBaseName = path.basename(f, path.extname(f)) - + ".with-coverage." + process.pid + path.extname(f) - , tmpFname = path.resolve(path.dirname(f), tmpBaseName) - - fs.writeFileSync(tmpFname, fcontents, "utf8") - args.splice(-1, 1, tmpFname) - } - - for (var i in process.env) { - env[i] = process.env[i] - } - env.TAP = 1 - - var cp = child_process.spawn(cmd, args, { env: env, cwd: relDir }) - , out = "" - , err = "" - , tc = new TapConsumer() - , childTests = [f] - - var timeout = setTimeout(function () { - if (!cp._ended) { - cp._timedOut = true - cp.kill() - } - }, self.options.timeout * 1000) - - tc.on("data", function(c) { - self.emit("result", c) - self.write(c) - }) - - tc.on("bailout", function (message) { - clearTimeout(timeout) - console.log("# " + f.substr(process.cwd().length + 1)) - process.stderr.write(err) - process.stdout.write(out + "\n") - self._bailedOut = true - cp._ended = true - cp.kill() - }) - - cp.stdout.pipe(tc) - cp.stdout.on("data", function (c) { out += c }) - cp.stderr.on("data", function (c) { - if (self.options.stderr) process.stderr.write(c) - err += c - }) - - cp.on("close", function (code, signal) { - if (cp._ended) return - cp._ended = true - var ok = !cp._timedOut && code === 0 - clearTimeout(timeout) - //childTests.forEach(function (c) { self.write(c) }) - var res = { name: path.dirname(f).replace(process.cwd() + "/", "") - + "/" + fileName - , ok: ok - , exit: code } - - if (cp._timedOut) - res.timedOut = cp._timedOut - if (signal) - res.signal = signal - - if (err) { - res.stderr = err - if (tc.results.ok && - tc.results.tests === 0 && - !self.options.stderr) { - // perhaps a compilation error or something else failed. - // no need if stderr is set, since it will have been - // output already anyway. - console.error(err) - } - } - - // tc.results.ok = tc.results.ok && ok - tc.results.add(res) - res.command = '"'+[cmd].concat(args).join(" ")+'"' - self.emit("result", res) - self.emit("file", f, res, tc.results) - self.write(res) - self.write("\n") - if (doCoverage) { - self.f2delete.push(tmpFname) - } - cb() - }) - }) - } - }), cb) - - return self -} - - -// Get an array of full paths to files we are interested into obtain -// code coverage. -Runner.prototype.getFilesToCover = function(filesToCover) { - var self = this - filesToCover = filesToCover.split(",").map(function(f) { - return path.resolve(f) - }).filter(function(f) { - var existsSync = fs.existsSync || path.existsSync; - return existsSync(f) - }) - - function recursive(f) { - if (path.extname(f) === "") { - // Is a directory: - fs.readdirSync(f).forEach(function(p) { - recursive(f + "/" + p) - }) - } else { - self.coverageFiles.push(f) - } - } - filesToCover.forEach(function(f) { - recursive(f) - }) -} - -// Prepend to every test file to run. Note tap.test at the very top due it -// "plays" with include paths. -Runner.prototype.coverHeader = function() { - // semi here since we're injecting it before the first line, - // and don't want to mess up line numbers in the test files. - return "var ___TAP_COVERAGE = require(" - + JSON.stringify(require.resolve("runforcover")) - + ").cover(/.*/g);" -} - -// Append at the end of every test file to run. Actually, the stuff which gets -// the coverage information. -// Maybe it would be better to move into a separate file template so editing -// could be easier. -Runner.prototype.coverFooter = function() { - var self = this - // This needs to be a string with proper interpolations: - return [ "" - , "var ___TAP = require(" + JSON.stringify(require.resolve("./main.js")) + ")" - , "if (typeof ___TAP._plan === 'number') ___TAP._plan ++" - , "___TAP.test(" + JSON.stringify("___coverage") + ", function(t) {" - , " var covFiles = " + JSON.stringify(self.coverageFiles) - , " , covDir = " + JSON.stringify(self.coverageOutDir) - , " , path = require('path')" - , " , fs = require('fs')" - , " , testFnBase = path.basename(__filename, '.js') + '.json'" - , " , testFn = path.resolve(covDir, testFnBase)" - , "" - , " function asyncForEach(arr, fn, callback) {" - , " if (!arr.length) {" - , " return callback()" - , " }" - , " var completed = 0" - , " arr.forEach(function(i) {" - , " fn(i, function (err) {" - , " if (err) {" - , " callback(err)" - , " callback = function () {}" - , " } else {" - , " completed += 1" - , " if (completed === arr.length) {" - , " callback()" - , " }" - , " }" - , " })" - , " })" - , " }" - , "" - , " ___TAP_COVERAGE(function(coverageData) {" - , " var outObj = {}" - , " asyncForEach(covFiles, function(f, cb) {" - , " if (coverageData[f]) {" - , " var stats = coverageData[f].stats()" - , " , stObj = stats" - , " stObj.lines = stats.lines.map(function (l) {" - , " return { number: l.lineno, source: l.source() }" - , " })" - , " outObj[f] = stObj" - , " }" - , " cb()" - , " }, function(err) {" - , " ___TAP_COVERAGE.release()" - , " fs.writeFileSync(testFn, JSON.stringify(outObj))" - , " t.end()" - , " })" - , " })" - , "})" ].join("\n") -} - - -Runner.prototype.getFilesToCoverSource = function(cb) { - var self = this - asyncMap(self.coverageFiles, function(f, cb) { - fs.readFile(f, "utf8", function(err, data) { - var lc = 0 - if (err) { - cb(err) - } - self.coverageFilesSource[f] = data.split("\n").map(function(l) { - lc += 1 - return { number: lc, source: l } - }) - cb() - }) - }, cb) -} - -Runner.prototype.getPerFileCovInfo = function(cb) { - var self = this - , covPath = path.resolve(self.coverageOutDir) - - fs.readdir(covPath, function(err, files) { - if (err) { - self.emit("error", err) - } - var covFiles = files.filter(function(f) { - return path.extname(f) === ".json" - }) - asyncMap(covFiles, function(f, cb) { - fs.readFile(path.resolve(covPath, f), "utf8", function(err, data) { - if (err) { - cb(err) - } - self.rawCovStats.push(JSON.parse(data)) - cb() - }) - }, function(f, cb) { - fs.unlink(path.resolve(covPath, f), cb) - }, cb) - }) -} - -Runner.prototype.mergeCovStats = function(cb) { - var self = this - self.rawCovStats.forEach(function(st) { - Object.keys(st).forEach(function(i) { - // If this is the first time we reach this file, just add the info: - if (!self.covStats[i]) { - self.covStats[i] = { - missing: st[i].lines - } - } else { - // If we already added info for this file before, we need to remove - // from self.covStats any line not duplicated again (since it has - // run on such case) - self.covStats[i].missing = self.covStats[i].missing.filter( - function(l) { - return (st[i].lines.indexOf(l)) - }) - } - }) - }) - - // This is due to a bug into - // chrisdickinson/node-bunker/blob/feature/add-coverage-interface - // which is using array indexes for line numbers instead of the right number - Object.keys(self.covStats).forEach(function(f) { - self.covStats[f].missing = self.covStats[f].missing.map(function(line) { - return { number: line.number, source: line.source } - }) - }) - - Object.keys(self.coverageFilesSource).forEach(function(f) { - if (!self.covStats[f]) { - self.covStats[f] = { missing: self.coverageFilesSource[f] - , percentage: 0 - } - } - self.covStats[f].lines = self.coverageFilesSource[f] - self.covStats[f].loc = self.coverageFilesSource[f].length - - if (!self.covStats[f].percentage) { - self.covStats[f].percentage = - 1 - (self.covStats[f].missing.length / self.covStats[f].loc) - } - - }) - cb() -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-test.js deleted file mode 100644 index ec73321..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/lib/tap-test.js +++ /dev/null @@ -1,110 +0,0 @@ -// This is a very simple test framework that leverages the tap framework -// to run tests and output tap-parseable results. - -module.exports = Test - -var assert = require("./tap-assert") - , inherits = require("inherits") - , Results = require("./tap-results") - , Harness = require("./tap-harness") - -// tests are also test harnesses -inherits(Test, Harness) - -function Test (harness, name, conf) { - //console.error("test ctor") - if (!(this instanceof Test)) return new Test(harness, name, conf) - - Harness.call(this, Test) - - conf.name = name || conf.name || "(anonymous)" - this.conf = conf - - this.harness = harness - this.harness.add(this) -} - -// it's taking too long! -Test.prototype.timeout = function () { - // detect false alarms - if (this._ended) return - this.fail("Timeout!") - this.end() -} - -Test.prototype.clear = function () { - this._started = false - this._ended = false - this._plan = null - this._bailedOut = false - this._testCount = 0 - this.results = new Results() -} - -// this gets called if a test throws ever -Test.prototype.threw = function (ex) { - //console.error("threw!", ex.stack) - this.fail(ex.name + ": " + ex.message, { error: ex, thrown: true }) - // may emit further failing tests if the plan is not completed - //console.error("end, because it threw") - if (!this._ended) this.end() -} - -Test.prototype.comment = function (m) { - if (typeof m !== "string") { - return this.fail("Test.comment argument must be a string") - } - this.result("\n" + m.trim()) -} - -Test.prototype.result = function (res) { - this.results.add(res) - this._testCount ++ - this.emit("result", res) - if (this._plan === this._testCount) { - process.nextTick(this._endNice.bind(this)) - } -} - -Test.prototype._endNice = function () { - if (!this._ended) this.end() -} - -// parasitic -// Who says you can't do multiple inheritance in js? -Object.getOwnPropertyNames(assert).forEach(function (k) { - if (k === "prototype" || k === "name") return - var d = Object.getOwnPropertyDescriptor(assert, k) - , v = d.value - if (!v) return - d.value = assertParasite(v) - Object.defineProperty(Test.prototype, k, d) -}) - -function assertParasite (fn) { return function _testAssert () { - //console.error("_testAssert", fn.name, arguments) - if (this._bailedOut) return - var res = fn.apply(assert, arguments) - this.result(res) - return res -}} - -// a few tweaks on the EE emit function, because -// we want to catch all thrown errors and bubble up "bailout" -Test.prototype.emit = (function (em) { return function (t) { - // bailouts bubble until handled - if (t === "bailout" && - this.listeners(t).length === 0 && - this.harness) { - return this.harness.bailout(arguments[1]) - } - - if (t === "error") return em.apply(this, arguments) - try { - em.apply(this, arguments) - } catch (ex) { - // any exceptions in a test are a failure - //console.error("caught!", ex.stack) - this.threw(ex) - } -}})(Harness.prototype.emit) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/.bin/nopt b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/.bin/nopt deleted file mode 120000 index 6b6566e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/.bin/nopt +++ /dev/null @@ -1 +0,0 @@ -../nopt/bin/nopt.js \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/.travis.yml deleted file mode 100644 index dad2273..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.8 - - "0.10" diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/README.markdown deleted file mode 100644 index 8c062fd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/README.markdown +++ /dev/null @@ -1,62 +0,0 @@ -buffer-equal -============ - -Return whether two buffers are equal. - -[![build status](https://secure.travis-ci.org/substack/node-buffer-equal.png)](http://travis-ci.org/substack/node-buffer-equal) - -example -======= - -``` js -var bufferEqual = require('buffer-equal'); - -console.dir(bufferEqual( - new Buffer([253,254,255]), - new Buffer([253,254,255]) -)); -console.dir(bufferEqual( - new Buffer('abc'), - new Buffer('abcd') -)); -console.dir(bufferEqual( - new Buffer('abc'), - 'abc' -)); -``` - -output: - -``` -true -false -undefined -``` - -methods -======= - -``` js -var bufferEqual = require('buffer-equal') -``` - -bufferEqual(a, b) ------------------ - -Return whether the two buffers `a` and `b` are equal. - -If `a` or `b` is not a buffer, return `undefined`. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install buffer-equal -``` - -license -======= - -MIT diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/example/eq.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/example/eq.js deleted file mode 100644 index 1eb0509..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/example/eq.js +++ /dev/null @@ -1,14 +0,0 @@ -var bufferEqual = require('../'); - -console.dir(bufferEqual( - new Buffer([253,254,255]), - new Buffer([253,254,255]) -)); -console.dir(bufferEqual( - new Buffer('abc'), - new Buffer('abcd') -)); -console.dir(bufferEqual( - new Buffer('abc'), - 'abc' -)); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/index.js deleted file mode 100644 index e640d4e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/index.js +++ /dev/null @@ -1,14 +0,0 @@ -var Buffer = require('buffer').Buffer; // for use with browserify - -module.exports = function (a, b) { - if (!Buffer.isBuffer(a)) return undefined; - if (!Buffer.isBuffer(b)) return undefined; - if (typeof a.equals === 'function') return a.equals(b); - if (a.length !== b.length) return false; - - for (var i = 0; i < a.length; i++) { - if (a[i] !== b[i]) return false; - } - - return true; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/package.json deleted file mode 100644 index a3b796a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "buffer-equal", - "description": "return whether two buffers are equal", - "version": "0.0.1", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-buffer-equal.git" - }, - "main": "index.js", - "keywords": [ - "buffer", - "equal" - ], - "directories": { - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "0.2.4" - }, - "engines": { - "node": ">=0.4.0" - }, - "license": "MIT", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "readme": "buffer-equal\n============\n\nReturn whether two buffers are equal.\n\n[![build status](https://secure.travis-ci.org/substack/node-buffer-equal.png)](http://travis-ci.org/substack/node-buffer-equal)\n\nexample\n=======\n\n``` js\nvar bufferEqual = require('buffer-equal');\n\nconsole.dir(bufferEqual(\n new Buffer([253,254,255]),\n new Buffer([253,254,255])\n));\nconsole.dir(bufferEqual(\n new Buffer('abc'),\n new Buffer('abcd')\n));\nconsole.dir(bufferEqual(\n new Buffer('abc'),\n 'abc'\n));\n```\n\noutput:\n\n```\ntrue\nfalse\nundefined\n```\n\nmethods\n=======\n\n``` js\nvar bufferEqual = require('buffer-equal')\n```\n\nbufferEqual(a, b)\n-----------------\n\nReturn whether the two buffers `a` and `b` are equal.\n\nIf `a` or `b` is not a buffer, return `undefined`.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install buffer-equal\n```\n\nlicense\n=======\n\nMIT\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/node-buffer-equal/issues" - }, - "homepage": "https://github.com/substack/node-buffer-equal", - "_id": "buffer-equal@0.0.1", - "_shasum": "91bc74b11ea405bc916bc6aa908faafa5b4aac4b", - "_from": "buffer-equal@~0.0.0", - "_resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/test/eq.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/test/eq.js deleted file mode 100644 index 3d34006..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/buffer-equal/test/eq.js +++ /dev/null @@ -1,35 +0,0 @@ -var bufferEqual = require('../'); -var test = require('tap').test; - -test('equal', function (t) { - var eq = bufferEqual( - new Buffer([253,254,255]), - new Buffer([253,254,255]) - ); - t.strictEqual(eq, true); - t.end(); -}); - -test('not equal', function (t) { - var eq = bufferEqual( - new Buffer('abc'), - new Buffer('abcd') - ); - t.strictEqual(eq, false); - t.end(); -}); - -test('not equal not buffer', function (t) { - var eq = bufferEqual( - new Buffer('abc'), - 'abc' - ); - t.strictEqual(eq, undefined); - t.end(); -}); - -test('equal not buffer', function (t) { - var eq = bufferEqual('abc', 'abc'); - t.strictEqual(eq, undefined); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/README.markdown deleted file mode 100644 index c3293d3..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/README.markdown +++ /dev/null @@ -1,55 +0,0 @@ -deep-equal -========== - -Node's `assert.deepEqual() algorithm` as a standalone module. - -example -======= - -``` js -var equal = require('deep-equal'); -console.dir([ - equal( - { a : [ 2, 3 ], b : [ 4 ] }, - { a : [ 2, 3 ], b : [ 4 ] } - ), - equal( - { x : 5, y : [6] }, - { x : 5, y : 6 } - ) -]); -``` - -methods -======= - -var deepEqual = require('deep-equal') - -deepEqual(a, b) ---------------- - -Compare objects `a` and `b`, returning whether they are equal according to a -recursive equality algorithm. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install deep-equal -``` - -test -==== - -With [npm](http://npmjs.org) do: - -``` -npm test -``` - -license -======= - -MIT. Derived largely from node's assert module. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/example/cmp.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/example/cmp.js deleted file mode 100644 index 67014b8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/example/cmp.js +++ /dev/null @@ -1,11 +0,0 @@ -var equal = require('../'); -console.dir([ - equal( - { a : [ 2, 3 ], b : [ 4 ] }, - { a : [ 2, 3 ], b : [ 4 ] } - ), - equal( - { x : 5, y : [6] }, - { x : 5, y : 6 } - ) -]); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/index.js deleted file mode 100644 index e4e37be..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/index.js +++ /dev/null @@ -1,84 +0,0 @@ -var pSlice = Array.prototype.slice; -var Object_keys = typeof Object.keys === 'function' - ? Object.keys - : function (obj) { - var keys = []; - for (var key in obj) keys.push(key); - return keys; - } -; - -var deepEqual = module.exports = function (actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical 'prototype' property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return deepEqual(a, b); - } - try { - var ka = Object_keys(a), - kb = Object_keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!deepEqual(a[key], b[key])) return false; - } - return true; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/package.json deleted file mode 100644 index b32ba2b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "deep-equal", - "version": "0.0.0", - "description": "node's assert.deepEqual algorithm", - "main": "index.js", - "directories": { - "lib": ".", - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "0.0.x" - }, - "repository": { - "type": "git", - "url": "http://github.com/substack/node-deep-equal.git" - }, - "keywords": [ - "equality", - "equal", - "compare" - ], - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "license": "MIT/X11", - "engine": { - "node": ">=0.4" - }, - "readme": "deep-equal\n==========\n\nNode's `assert.deepEqual() algorithm` as a standalone module.\n\nexample\n=======\n\n``` js\nvar equal = require('deep-equal');\nconsole.dir([\n equal(\n { a : [ 2, 3 ], b : [ 4 ] },\n { a : [ 2, 3 ], b : [ 4 ] }\n ),\n equal(\n { x : 5, y : [6] },\n { x : 5, y : 6 }\n )\n]);\n```\n\nmethods\n=======\n\nvar deepEqual = require('deep-equal')\n\ndeepEqual(a, b)\n---------------\n\nCompare objects `a` and `b`, returning whether they are equal according to a\nrecursive equality algorithm.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install deep-equal\n```\n\ntest\n====\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm test\n```\n\nlicense\n=======\n\nMIT. Derived largely from node's assert module.\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/node-deep-equal/issues" - }, - "homepage": "https://github.com/substack/node-deep-equal", - "_id": "deep-equal@0.0.0", - "_from": "deep-equal@~0.0.0" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/test/cmp.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/test/cmp.js deleted file mode 100644 index 8418f0f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/deep-equal/test/cmp.js +++ /dev/null @@ -1,18 +0,0 @@ -var test = require('tap').test; -var equal = require('../'); - -test('equal', function (t) { - t.ok(equal( - { a : [ 2, 3 ], b : [ 4 ] }, - { a : [ 2, 3 ], b : [ 4 ] } - )); - t.end(); -}); - -test('not equal', function (t) { - t.notOk(equal( - { x : 5, y : [6] }, - { x : 5, y : 6 } - )); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/.travis.yml deleted file mode 100644 index 09d3ef3..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.8 - - 0.10 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/README.markdown deleted file mode 100644 index 9ad4303..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/README.markdown +++ /dev/null @@ -1,116 +0,0 @@ -difflet -======= - -Create colorful diffs for javascript objects. - -example -======= - -string.js ---------- - -``` js -var difflet = require('difflet'); - -var s = difflet.compare({ a : 2, c : 5 }, { a : 3, b : 4 }); -process.stdout.write(s); -``` - -output: - -![colorful output](http://substack.net/images/screenshots/difflet_string.png) - -colors.js ---------- - -``` js -var diff = require('difflet')({ indent : 2 }); - -var prev = { - yy : 6, - zz : 5, - a : [1,2,3], - fn : 'beep', - c : { x : 7, z : 3 } -}; - -var next = { - a : [ 1, 2, "z", /beep/, new Buffer(3) ], - fn : function qqq () {}, - b : [5,6,7], - c : { x : 8, y : 5 } -}; - -diff(prev, next).pipe(process.stdout); -``` - -output: - -![colorful output](http://substack.net/images/screenshots/difflet_colors.png) - -green for inserts, blue for updates, red for deletes - -methods -======= - -var difflet = require('difflet') - -var diff = difflet(opts={}) ---------------------------- - -Create a difflet from optional options `opts`. - -With `opts.start(type, stream)` and `opts.stop(type, stream)`, -you can write custom handlers for all the types of differences: -`'inserted'`, `'updated'`, and `'deleted'`. -By default green is used for insertions, blue for updates, and red for -deletions. - -If `opts.indent` is set, output will span multiple lines and `opts.indent` -spaces will be used for leading whitespace. - -If `opts.comma === 'first'` then commas will be placed at the start of lines. - -Setting `opts.comment` to `true` will turn on comments with the previous -contents like this: - -![object comments](http://substack.net/images/screenshots/difflet_object_comments.png) - -diff(prev, next) ----------------- - -Return a stream with the colorful changes between objects `prev` and `next`. - -diff.compare(prev, next) ------------------------- - -Return a string with the colorful changes between `prev` and `next`. - -difflet.compare(prev, next) ---------------------------- - -Return a string with the colorful changes between `prev` and `next` with the -default options. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install difflet -``` - -test -==== - -With [npm](http://npmjs.org) do: - -``` -npm test -``` - -license -======= - -MIT/X11 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_array.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_array.js deleted file mode 100644 index bc5733f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_array.js +++ /dev/null @@ -1,6 +0,0 @@ -var difflet = require('../'); -var s = difflet({ indent : 2, comment : true }).compare( - [ 1, [2,3,{a:4}], 3 ], - [ 1, [[5],6,7], 4 ] -); -process.stdout.write(s); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_object.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_object.js deleted file mode 100644 index 5e00e2c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/cmp_object.js +++ /dev/null @@ -1,6 +0,0 @@ -var difflet = require('../'); -var s = difflet({ indent : 2, comment : true }).compare( - { z : [6,7], a : 'abcdefgh', b : [ 31, 'xxt' ] }, - { x : 5, a : 'abdcefg', b : [ 51, 'xxs' ] } -); -console.log(s); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/colors.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/colors.js deleted file mode 100644 index 332bbae..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/colors.js +++ /dev/null @@ -1,18 +0,0 @@ -var diff = require('../')({ indent : 2 }); - -var prev = { - yy : 6, - zz : 5, - a : [1,2,3], - fn : 'beep', - c : { x : 7, z : 3 } -}; - -var next = { - a : [ 1, 2, "z", /beep/, new Buffer(3) ], - fn : function qqq () {}, - b : [5,6,7], - c : { x : 8, y : 5 } -}; - -diff(prev, next).pipe(process.stdout); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/comma_first.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/comma_first.js deleted file mode 100644 index 67ece23..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/comma_first.js +++ /dev/null @@ -1,12 +0,0 @@ -var diff = require('../')({ - indent : 2, - comma : 'first', -}); - -var prev = { yy : 6, zz : 5, a : [1,2,3] }; -var next = { - a : [ 1, 2, 3, [4], "z", /beep/, new Buffer(3) ], - fn : 8, - b : [5,6,7] -}; -diff(prev, next).pipe(process.stdout); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/diff.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/diff.js deleted file mode 100644 index 08f6e7a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/diff.js +++ /dev/null @@ -1,15 +0,0 @@ -var difflet = require('../'); -var a = { - x : 4, - z : 8, - xs : [ 5, 2, 1, { 0 : 'c' } ], -}; - -var b = { - x : 4, - y : 5, - xs : [ 5, 2, 2, { c : 5 } ], -}; - -var s = difflet({ comment : true, indent : 2 }).compare(a, b); -console.log(s); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/html.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/html.js deleted file mode 100644 index 9ff4a29..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/html.js +++ /dev/null @@ -1,34 +0,0 @@ -var difflet = require('../'); -var ent = require('ent'); - -var tags = { - inserted : '', - updated : '', - deleted : '', -}; -var diff = difflet({ - start : function (t, s) { - s.write(tags[t]); - }, - stop : function (t, s) { - s.write(''); - }, - write : function (buf) { - stream.write(ent.encode(buf)) - }, -}); - -var prev = { - yy : 6, - zz : 5, - a : [1,2,3], - fn : function qq () {} -}; -var next = { - a : [ 1, 2, 3, [4], "z", /beep/, new Buffer([0,1,2]) ], - fn : 'I <3 robots', - b : [5,6,7] -}; - -var stream = diff(prev, next); -stream.pipe(process.stdout, { end : false }); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/string.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/string.js deleted file mode 100644 index 6cff6cb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/example/string.js +++ /dev/null @@ -1,4 +0,0 @@ -var difflet = require('../'); - -var s = difflet.compare({ a : 2, c : 5 }, { a : 3, b : 4 }); -process.stdout.write(s); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/index.js deleted file mode 100644 index 278e6b9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/index.js +++ /dev/null @@ -1,377 +0,0 @@ -var traverse = require('traverse'); -var Stream = require('stream').Stream; -var charm = require('charm'); -var deepEqual = require('deep-is'); - -var exports = module.exports = function (opts_) { - var fn = difflet.bind(null, opts_); - fn.compare = function (prev, next) { - var opts = Object.keys(opts_ || {}).reduce(function (acc, key) { - acc[key] = opts_[key]; - return acc; - }, {}); - var s = opts.stream = new Stream; - var data = ''; - s.write = function (buf) { data += buf }; - s.end = function () {}; - s.readable = true; - s.writable = true; - - difflet(opts, prev, next); - return data; - }; - return fn; -}; - -exports.compare = function (prev, next) { - return exports({}).compare(prev, next); -}; - -function difflet (opts, prev, next) { - var stream = opts.stream || new Stream; - if (!opts.stream) { - stream.readable = true; - stream.writable = true; - stream.write = function (buf) { this.emit('data', buf) }; - stream.end = function () { this.emit('end') }; - } - - if (!opts) opts = {}; - if (opts.start === undefined && opts.stop === undefined) { - var c = charm(stream); - opts.start = function (type) { - c.foreground({ - inserted : 'green', - updated : 'blue', - deleted : 'red', - comment : 'cyan', - }[type]); - c.display('bright'); - }; - opts.stop = function (type) { - c.display('reset'); - }; - } - var write = function (buf) { - if (opts.write) opts.write(buf, stream) - else stream.write(buf) - }; - - var commaFirst = opts.comma === 'first'; - - var stringify = function (node, params) { - return stringifier.call(this, true, node, params || opts); - }; - var plainStringify = function (node, params) { - return stringifier.call(this, false, node, params || opts); - }; - - var levels = 0; - function set (type) { - if (levels === 0) opts.start(type, stream); - levels ++; - } - - function unset (type) { - if (--levels === 0) opts.stop(type, stream); - } - - function stringifier (insertable, node, opts) { - var indent = opts.indent; - - if (insertable) { - var prevNode = traverse.get(prev, this.path || []); - } - var inserted = insertable && prevNode === undefined; - - var indentx; - try { - indentx = indent ? Array( - ((this.path || []).length + 1) * indent + 1 - ).join(' ') : ''; - } catch (e) { - // at times we get an invalid Array size here and need to prevent crashing - indentx = ''; - } - if (commaFirst) indentx = indentx.slice(indent); - - if (Array.isArray(node)) { - var updated = (prevNode || traverse.has(prev, this.path)) - && !Array.isArray(prevNode); - if (updated) { - set('updated'); - } - - if (opts.comment && !Array.isArray(prevNode)) { - indent = 0; - } - - this.before(function () { - if (inserted) set('inserted'); - if (indent && commaFirst) { - if ((this.path || []).length === 0 - || Array.isArray(this.parent.node)) { - write('[ '); - } - else write('\n' + indentx + '[ '); - } - else if (indent) { - write('[\n' + indentx); - } - else { - write('['); - } - }); - - this.post(function (child) { - if (!child.isLast && !(indent && commaFirst)) { - write(','); - } - - var prev = prevNode && prevNode[child.key]; - if (indent && opts.comment && child.node !== prev - && (typeof child.node !== 'object' || typeof prev !== 'object') - ) { - set('comment'); - write(' // != '); - traverse(prev).forEach(function (x) { - plainStringify.call(this, x, { indent : 0 }); - }); - unset('comment'); - } - - if (!child.isLast) { - if (indent && commaFirst) { - write('\n' + indentx + ', '); - } - else if (indent) { - write('\n' + indentx); - } - } - }); - - this.after(function () { - if (indent && commaFirst) write('\n' + indentx); - else if (indent) write('\n' + indentx.slice(indent)); - - write(']'); - if (updated) unset('updated'); - if (inserted) unset('inserted'); - }); - } - else if (isRegExp(node)) { - this.block(); - - if (inserted) { - set('inserted'); - write(node.toString()); - unset('inserted'); - } - else if (insertable && prevNode !== node) { - set('updated'); - write(node.toString()); - unset('updated'); - } - else write(node.toString()); - } - else if (typeof node === 'object' - && node && typeof node.inspect === 'function') { - this.block(); - if (inserted) { - set('inserted'); - write(node.inspect()); - unset('inserted'); - } - else if (!(prevNode && typeof prevNode.inspect === 'function' - && prevNode.inspect() === node.inspect())) { - set('updated'); - write(node.inspect()); - unset('updated'); - } - else write(node.inspect()); - } - else if (typeof node == 'object' && node !== null) { - var insertedKey = false; - var deleted = insertable && typeof prevNode === 'object' && prevNode - ? Object.keys(prevNode).filter(function (key) { - return !Object.hasOwnProperty.call(node, key); - }) - : [] - ; - - this.before(function () { - if (inserted) set('inserted'); - write(indent && commaFirst && !this.isRoot - ? '\n' + indentx + '{ ' - : '{' - ); - }); - - this.pre(function (x, key) { - if (insertable) { - var obj = traverse.get(prev, this.path.concat(key)); - if (obj === undefined) { - insertedKey = true; - set('inserted'); - } - } - - if (indent && !commaFirst) write('\n' + indentx); - - plainStringify(key); - write(indent ? ' : ' : ':'); - }); - - this.post(function (child) { - if (!child.isLast && !(indent && commaFirst)) { - write(','); - } - - if (child.isLast && deleted.length) { - if (insertedKey) unset('inserted'); - insertedKey = false; - } - else if (insertedKey) { - unset('inserted'); - insertedKey = false; - } - - var prev = prevNode && prevNode[child.key]; - if (indent && opts.comment && child.node !== prev - && (typeof child.node !== 'object' || typeof prev !== 'object') - ) { - set('comment'); - write(' // != '); - traverse(prev).forEach(function (x) { - plainStringify.call(this, x, { indent : 0 }); - }); - unset('comment'); - } - - if (child.isLast && deleted.length) { - if (insertedKey) unset('inserted'); - insertedKey = false; - - if (indent && commaFirst) { - write('\n' + indentx + ', ') - } - else if (opts.comment && indent) { - write('\n' + indentx); - } - else if (indent) { - write(',\n' + indentx); - } - else write(','); - } - else { - if (!child.isLast) { - if (indent && commaFirst) { - write('\n' + indentx + ', '); - } - } - } - }); - - this.after(function () { - if (inserted) unset('inserted'); - - if (deleted.length) { - if (indent && !commaFirst - && Object.keys(node).length === 0) { - write('\n' + indentx); - } - - set('deleted'); - deleted.forEach(function (key, ix) { - if (indent && opts.comment) { - unset('deleted'); - set('comment'); - write('// '); - unset('comment'); - set('deleted'); - } - - plainStringify(key); - write(indent ? ' : ' : ':'); - traverse(prevNode[key]).forEach(function (x) { - plainStringify.call(this, x, { indent : 0 }); - }); - - var last = ix === deleted.length - 1; - if (insertable && !last) { - if (indent && commaFirst) { - write('\n' + indentx + ', '); - } - else if (indent) { - write(',\n' + indentx); - } - else write(','); - } - }); - unset('deleted'); - } - - if (commaFirst && indent) { - write(indentx.slice(indent) + ' }'); - } - else if (indent) { - write('\n' + indentx.slice(indent) + '}'); - } - else write('}'); - }); - } - else { - var changed = false; - - if (inserted) set('inserted'); - else if (insertable && !deepEqual(prevNode, node)) { - changed = true; - set('updated'); - } - - if (typeof node === 'string') { - write('"' + node.toString().replace(/"/g, '\\"') + '"'); - } - else if (isRegExp(node)) { - write(node.toString()); - } - else if (typeof node === 'function') { - write(node.name - ? '[Function: ' + node.name + ']' - : '[Function]' - ); - } - else if (node === undefined) { - write('undefined'); - } - else if (node === null) { - write('null'); - } - else { - write(node.toString()); - } - - if (inserted) unset('inserted'); - else if (changed) unset('updated'); - } - } - - if (opts.stream) { - traverse(next).forEach(stringify); - } - else process.nextTick(function () { - traverse(next).forEach(stringify); - stream.emit('end'); - }); - - return stream; -} - -function isRegExp (node) { - return node instanceof RegExp || (node - && typeof node.test === 'function' - && typeof node.exec === 'function' - && typeof node.compile === 'function' - && node.constructor && node.constructor.name === 'RegExp' - ); -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/README.markdown deleted file mode 100644 index a0648ff..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/README.markdown +++ /dev/null @@ -1,216 +0,0 @@ -charm -===== - -Use -[ansi terminal characters](http://www.termsys.demon.co.uk/vtansi.htm) -to write colors and cursor positions. - -![me lucky charms](http://substack.net/images/charms.png) - -example -======= - -lucky ------ - -````javascript -var charm = require('charm')(); -charm.pipe(process.stdout); -charm.reset(); - -var colors = [ 'red', 'cyan', 'yellow', 'green', 'blue' ]; -var text = 'Always after me lucky charms.'; - -var offset = 0; -var iv = setInterval(function () { - var y = 0, dy = 1; - for (var i = 0; i < 40; i++) { - var color = colors[(i + offset) % colors.length]; - var c = text[(i + offset) % text.length]; - charm - .move(1, dy) - .foreground(color) - .write(c) - ; - y += dy; - if (y <= 0 || y >= 5) dy *= -1; - } - charm.position(0, 1); - offset ++; -}, 150); -```` - -events -====== - -Charm objects pass along the data events from their input stream except for -events generated from querying the terminal device. - -Because charm puts stdin into raw mode, charm emits two special events: "^C" and -"^D" when the user types those combos. It's super convenient with these events -to do: - -````javascript -charm.on('^C', process.exit) -```` - -The above is set on all `charm` streams. If you want to add your own handling for these -special events simply: - -````javascript -charm.removeAllListeners('^C') -charm.on('^C', function () { - // Don't exit. Do some mad science instead. -}) -```` - -methods -======= - -var charm = require('charm')(param or stream, ...) --------------------------------------------------- - -Create a new readable/writable `charm` stream. - -You can pass in readable or writable streams as parameters and they will be -piped to or from accordingly. You can also pass `process` in which case -`process.stdin` and `process.stdout` will be used. - -You can `pipe()` to and from the `charm` object you get back. - -charm.reset() -------------- - -Reset the entire screen, like the /usr/bin/reset command. - -charm.destroy(), charm.end() ----------------------------- - -Emit an `"end"` event downstream. - -charm.write(msg) ----------------- - -Pass along `msg` to the output stream. - -charm.position(x, y) --------------------- - -Set the cursor position to the absolute coordinates `x, y`. - -charm.position(cb) ------------------- - -Query the absolute cursor position from the input stream through the output -stream (the shell does this automatically) and get the response back as -`cb(x, y)`. - -charm.move(x, y) ----------------- - -Move the cursor position by the relative coordinates `x, y`. - -charm.up(y) ------------ - -Move the cursor up by `y` rows. - -charm.down(y) -------------- - -Move the cursor down by `y` rows. - -charm.left(x) -------------- - -Move the cursor left by `x` columns. - -charm.right(x) --------------- - -Move the cursor right by `x` columns. - -charm.push(withAttributes=false) --------------------------------- - -Push the cursor state and optionally the attribute state. - -charm.pop(withAttributes=false) -------------------------------- - -Pop the cursor state and optionally the attribute state. - -charm.erase(s) --------------- - -Erase a region defined by the string `s`. - -`s` can be: - -* end - erase from the cursor to the end of the line -* start - erase from the cursor to the start of the line -* line - erase the current line -* down - erase everything below the current line -* up - erase everything above the current line -* screen - erase the entire screen - -charm.display(attr) -------------------- - -Set the display mode with the string `attr`. - -`attr` can be: - -* reset -* bright -* dim -* underscore -* blink -* reverse -* hidden - -charm.foreground(color) ------------------------ - -Set the foreground color with the string `color`, which can be: - -* red -* yellow -* green -* blue -* cyan -* magenta -* black -* white - -or `color` can be an integer from 0 to 255, inclusive. - -charm.background(color) ------------------------ - -Set the background color with the string `color`, which can be: - -* red -* yellow -* green -* blue -* cyan -* magenta -* black -* white - -or `color` can be an integer from 0 to 255, inclusive. - -charm.cursor(visible) ---------------------- - -Set the cursor visibility with a boolean `visible`. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install charm -``` diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/256.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/256.js deleted file mode 100644 index 6851386..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/256.js +++ /dev/null @@ -1,17 +0,0 @@ -var charm = require('../')(process); - -function exit () { - charm.display('reset'); - process.exit(); -} -charm.on('^C', exit); - -var ix = 0; -var iv = setInterval(function () { - charm.background(ix++).write(' '); - if (ix === 256) { - clearInterval(iv); - charm.write('\n'); - exit(); - } -}, 10); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/column.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/column.js deleted file mode 100644 index 2647e71..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/column.js +++ /dev/null @@ -1,11 +0,0 @@ -var charm = require('../')(); -charm.pipe(process.stdout); - -charm - .column(16) - .write('beep') - .down() - .column(32) - .write('boop\n') - .end() -; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/cursor.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/cursor.js deleted file mode 100644 index 0c565b0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/cursor.js +++ /dev/null @@ -1,22 +0,0 @@ -var charm = require('../')(process); - -charm.position(5, 10); - -charm.position(function (x, y) { - console.dir([ x, y ]); - - charm.move(7,2); - charm.push(); - process.stdout.write('lul'); - - charm.left(3).up(1).foreground('magenta'); - process.stdout.write('v'); - charm.left(1).up(1).display('reset'); - process.stdout.write('|'); - - charm.down(3); - charm.pop().background('blue'); - process.stdout.write('popped\npow'); - charm.display('reset').erase('line'); - charm.destroy(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/http_spin.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/http_spin.js deleted file mode 100644 index 727e3e8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/http_spin.js +++ /dev/null @@ -1,36 +0,0 @@ -var http = require('http'); -var charmer = require('../'); - -http.createServer(function (req, res) { - res.setHeader('content-type', 'text/ansi'); - - var charm = charmer(); - charm.pipe(res); - charm.reset(); - - var radius = 10; - var theta = 0; - var points = []; - - var iv = setInterval(function () { - var x = 2 + (radius + Math.cos(theta) * radius) * 2; - var y = 2 + radius + Math.sin(theta) * radius; - - points.unshift([ x, y ]); - var colors = [ 'red', 'yellow', 'green', 'cyan', 'blue', 'magenta' ]; - - points.forEach(function (p, i) { - charm.position(p[0], p[1]); - var c = colors[Math.floor(i / 12)]; - charm.background(c).write(' ') - }); - points = points.slice(0, 12 * colors.length - 1); - - theta += Math.PI / 40; - }, 50); - - req.connection.on('end', function () { - clearInterval(iv); - charm.end(); - }); -}).listen(8081); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/lucky.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/lucky.js deleted file mode 100644 index 01fe801..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/lucky.js +++ /dev/null @@ -1,24 +0,0 @@ -var charm = require('../')(); -charm.pipe(process.stdout); -charm.reset(); - -var colors = [ 'red', 'cyan', 'yellow', 'green', 'blue' ]; -var text = 'Always after me lucky charms.'; - -var offset = 0; -var iv = setInterval(function () { - var y = 0, dy = 1; - for (var i = 0; i < 40; i++) { - var color = colors[(i + offset) % colors.length]; - var c = text[(i + offset) % text.length]; - charm - .move(1, dy) - .foreground(color) - .write(c) - ; - y += dy; - if (y <= 0 || y >= 5) dy *= -1; - } - charm.position(0, 1); - offset ++; -}, 150); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/position.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/position.js deleted file mode 100644 index 2c5ae9b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/position.js +++ /dev/null @@ -1,7 +0,0 @@ -var charm = require('charm')(process); - -charm.on('^C', process.exit); - -charm.position(function (x, y) { - console.log('(%d, %d)', x, y); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/progress.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/progress.js deleted file mode 100644 index 9da3c13..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/progress.js +++ /dev/null @@ -1,18 +0,0 @@ -var charm = require('../')(); -charm.pipe(process.stdout); - -charm.write('Progress: 0 %'); -var i = 0; - -var iv = setInterval(function () { - charm.left(i.toString().length + 2); - i ++; - charm.write(i + ' %'); - if (i === 100) { - charm.end('\nDone!\n'); - clearInterval(iv); - } -}, 25); - -charm.on('^C',process.exit); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/resize.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/resize.js deleted file mode 100644 index bda80b6..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/resize.js +++ /dev/null @@ -1,62 +0,0 @@ -var c = require('../')(); -c.pipe(process.stdout); -c.on('^C', process.exit); - -var queue = (function () { - var tasks = []; - var pending = false; - - return { - abort : function () { - tasks = []; - next(); - }, - push : function (t) { - tasks.push(t); - if (!pending) next(); - } - }; - - function next () { - pending = true; - process.nextTick(function () { - if (tasks.length === 0) return; - var t = tasks.shift(); - t(); - pending = false; - next(); - }); - } -})(); - -process.stdout.on('resize', draw); -draw(); -setInterval(function () {}, 1e8); - -function draw () { - var cols = process.stdout.columns; - var rows = process.stdout.rows; - queue.abort(); - - queue.push(function () { - c.reset(); - c.background('blue'); - c.position(1, 1); - c.write(Array(cols + 1).join(' ')); - }); - - for (var y = 1; y < rows; y++) { - queue.push(function () { - c.position(1, y); - c.write(' '); - c.position(cols, y); - c.write(' '); - }); - } - - queue.push(function () { - c.position(1, rows); - c.write(Array(cols + 1).join(' ')); - c.display('reset'); - }); -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/spin.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/spin.js deleted file mode 100644 index fd3e23a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/example/spin.js +++ /dev/null @@ -1,23 +0,0 @@ -var charm = require('../')(process); -charm.reset(); - -var radius = 10; -var theta = 0; -var points = []; - -var iv = setInterval(function () { - var x = 2 + (radius + Math.cos(theta) * radius) * 2; - var y = 2 + radius + Math.sin(theta) * radius; - - points.unshift([ x, y ]); - var colors = [ 'red', 'yellow', 'green', 'cyan', 'blue', 'magenta' ]; - - points.forEach(function (p, i) { - charm.position(p[0], p[1]); - var c = colors[Math.floor(i / 12)]; - charm.background(c).write(' ') - }); - points = points.slice(0, 12 * colors.length - 1); - - theta += Math.PI / 40; -}, 50); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/index.js deleted file mode 100644 index e1e7bdc..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/index.js +++ /dev/null @@ -1,305 +0,0 @@ -var tty = require('tty'); -var encode = require('./lib/encode'); -var Stream = require('stream').Stream; - -var exports = module.exports = function () { - var input = null; - function setInput (s) { - if (input) throw new Error('multiple inputs specified') - else input = s - } - - var output = null; - function setOutput (s) { - if (output) throw new Error('multiple outputs specified') - else output = s - } - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (!arg) continue; - if (arg.readable) setInput(arg) - else if (arg.stdin || arg.input) setInput(arg.stdin || arg.input) - - if (arg.writable) setOutput(arg) - else if (arg.stdout || arg.output) setOutput(arg.stdout || arg.output) - - } - - if (input && typeof input.fd === 'number' && tty.isatty(input.fd)) { - if (process.stdin.setRawMode) { - process.stdin.setRawMode(true); - } - else tty.setRawMode(true); - } - - var charm = new Charm; - if (input) { - input.pipe(charm); - } - - if (output) { - charm.pipe(output); - } - - charm.once('^C', process.exit); - charm.once('end', function () { - if (input) { - if (typeof input.fd === 'number' && tty.isatty(input.fd)) { - if (process.stdin.setRawMode) { - process.stdin.setRawMode(false); - } - else tty.setRawMode(false); - } - input.destroy(); - } - }); - - return charm; -}; - -var Charm = exports.Charm = function Charm () { - this.writable = true; - this.readable = true; - this.pending = []; -} - -Charm.prototype = new Stream; - -Charm.prototype.write = function (buf) { - var self = this; - - if (self.pending.length) { - var codes = extractCodes(buf); - var matched = false; - - for (var i = 0; i < codes.length; i++) { - for (var j = 0; j < self.pending.length; j++) { - var cb = self.pending[j]; - if (cb(codes[i])) { - matched = true; - self.pending.splice(j, 1); - break; - } - } - } - - if (matched) return; - } - - if (buf.length === 1) { - if (buf[0] === 3) self.emit('^C'); - if (buf[0] === 4) self.emit('^D'); - } - - self.emit('data', buf); - - return self; -}; - - -Charm.prototype.destroy = function () { - this.end(); -}; - -Charm.prototype.end = function (buf) { - if (buf) this.write(buf); - this.emit('end'); -}; - -Charm.prototype.reset = function (cb) { - this.write(encode('c')); - return this; -}; - -Charm.prototype.position = function (x, y) { - // get/set absolute coordinates - if (typeof x === 'function') { - var cb = x; - this.pending.push(function (buf) { - if (buf[0] === 27 && buf[1] === encode.ord('[') - && buf[buf.length-1] === encode.ord('R')) { - var pos = buf.toString() - .slice(2,-1) - .split(';') - .map(Number) - ; - cb(pos[1], pos[0]); - return true; - } - }); - this.write(encode('[6n')); - } - else { - this.write(encode( - '[' + Math.floor(y) + ';' + Math.floor(x) + 'f' - )); - } - return this; -}; - -Charm.prototype.move = function (x, y) { - // set relative coordinates - var bufs = []; - - if (y < 0) this.up(-y) - else if (y > 0) this.down(y) - - if (x > 0) this.right(x) - else if (x < 0) this.left(-x) - - return this; -}; - -Charm.prototype.up = function (y) { - if (y === undefined) y = 1; - this.write(encode('[' + Math.floor(y) + 'A')); - return this; -}; - -Charm.prototype.down = function (y) { - if (y === undefined) y = 1; - this.write(encode('[' + Math.floor(y) + 'B')); - return this; -}; - -Charm.prototype.right = function (x) { - if (x === undefined) x = 1; - this.write(encode('[' + Math.floor(x) + 'C')); - return this; -}; - -Charm.prototype.left = function (x) { - if (x === undefined) x = 1; - this.write(encode('[' + Math.floor(x) + 'D')); - return this; -}; - -Charm.prototype.column = function (x) { - this.write(encode('[' + Math.floor(x) + 'G')); - return this; -}; - -Charm.prototype.push = function (withAttributes) { - this.write(encode(withAttributes ? '7' : '[s')); - return this; -}; - -Charm.prototype.pop = function (withAttributes) { - this.write(encode(withAttributes ? '8' : '[u')); - return this; -}; - -Charm.prototype.erase = function (s) { - if (s === 'end' || s === '$') { - this.write(encode('[K')); - } - else if (s === 'start' || s === '^') { - this.write(encode('[1K')); - } - else if (s === 'line') { - this.write(encode('[2K')); - } - else if (s === 'down') { - this.write(encode('[J')); - } - else if (s === 'up') { - this.write(encode('[1J')); - } - else if (s === 'screen') { - this.write(encode('[1J')); - } - else { - this.emit('error', new Error('Unknown erase type: ' + s)); - } - return this; -}; - -Charm.prototype.display = function (attr) { - var c = { - reset : 0, - bright : 1, - dim : 2, - underscore : 4, - blink : 5, - reverse : 7, - hidden : 8 - }[attr]; - if (c === undefined) { - this.emit('error', new Error('Unknown attribute: ' + attr)); - } - this.write(encode('[' + c + 'm')); - return this; -}; - -Charm.prototype.foreground = function (color) { - if (typeof color === 'number') { - if (color < 0 || color >= 256) { - this.emit('error', new Error('Color out of range: ' + color)); - } - this.write(encode('[38;5;' + color + 'm')); - } - else { - var c = { - black : 30, - red : 31, - green : 32, - yellow : 33, - blue : 34, - magenta : 35, - cyan : 36, - white : 37 - }[color.toLowerCase()]; - - if (!c) this.emit('error', new Error('Unknown color: ' + color)); - this.write(encode('[' + c + 'm')); - } - return this; -}; - -Charm.prototype.background = function (color) { - if (typeof color === 'number') { - if (color < 0 || color >= 256) { - this.emit('error', new Error('Color out of range: ' + color)); - } - this.write(encode('[48;5;' + color + 'm')); - } - else { - var c = { - black : 40, - red : 41, - green : 42, - yellow : 43, - blue : 44, - magenta : 45, - cyan : 46, - white : 47 - }[color.toLowerCase()]; - - if (!c) this.emit('error', new Error('Unknown color: ' + color)); - this.write(encode('[' + c + 'm')); - } - return this; -}; - -Charm.prototype.cursor = function (visible) { - this.write(encode(visible ? '[?25h' : '[?25l')); - return this; -}; - -var extractCodes = exports.extractCodes = function (buf) { - var codes = []; - var start = -1; - - for (var i = 0; i < buf.length; i++) { - if (buf[i] === 27) { - if (start >= 0) codes.push(buf.slice(start, i)); - start = i; - } - else if (start >= 0 && i === buf.length - 1) { - codes.push(buf.slice(start)); - } - } - - return codes; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/lib/encode.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/lib/encode.js deleted file mode 100644 index 3b6417a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/lib/encode.js +++ /dev/null @@ -1,18 +0,0 @@ -var encode = module.exports = function (xs) { - function bytes (s) { - if (typeof s === 'string') { - return s.split('').map(ord); - } - else if (Array.isArray(s)) { - return s.reduce(function (acc, c) { - return acc.concat(bytes(c)); - }, []); - } - } - - return new Buffer([ 0x1b ].concat(bytes(xs))); -}; - -var ord = encode.ord = function ord (c) { - return c.charCodeAt(0) -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/package.json deleted file mode 100644 index ba24cb2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/charm/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "charm", - "version": "0.1.2", - "description": "ansi control sequences for terminal cursor hopping and colors", - "main": "index.js", - "directories": { - "lib": ".", - "example": "example", - "test": "test" - }, - "repository": { - "type": "git", - "url": "http://github.com/substack/node-charm.git" - }, - "keywords": [ - "terminal", - "ansi", - "cursor", - "color", - "console", - "control", - "escape", - "sequence" - ], - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "license": "MIT/X11", - "engine": { - "node": ">=0.4" - }, - "readme": "charm\n=====\n\nUse\n[ansi terminal characters](http://www.termsys.demon.co.uk/vtansi.htm)\nto write colors and cursor positions.\n\n![me lucky charms](http://substack.net/images/charms.png)\n\nexample\n=======\n\nlucky\n-----\n\n````javascript\nvar charm = require('charm')();\ncharm.pipe(process.stdout);\ncharm.reset();\n\nvar colors = [ 'red', 'cyan', 'yellow', 'green', 'blue' ];\nvar text = 'Always after me lucky charms.';\n\nvar offset = 0;\nvar iv = setInterval(function () {\n var y = 0, dy = 1;\n for (var i = 0; i < 40; i++) {\n var color = colors[(i + offset) % colors.length];\n var c = text[(i + offset) % text.length];\n charm\n .move(1, dy)\n .foreground(color)\n .write(c)\n ;\n y += dy;\n if (y <= 0 || y >= 5) dy *= -1;\n }\n charm.position(0, 1);\n offset ++;\n}, 150);\n````\n\nevents\n======\n\nCharm objects pass along the data events from their input stream except for\nevents generated from querying the terminal device.\n\nBecause charm puts stdin into raw mode, charm emits two special events: \"^C\" and\n\"^D\" when the user types those combos. It's super convenient with these events\nto do:\n\n````javascript\ncharm.on('^C', process.exit)\n````\n\nThe above is set on all `charm` streams. If you want to add your own handling for these\nspecial events simply:\n\n````javascript\ncharm.removeAllListeners('^C')\ncharm.on('^C', function () {\n // Don't exit. Do some mad science instead.\n})\n````\n\nmethods\n=======\n\nvar charm = require('charm')(param or stream, ...)\n--------------------------------------------------\n\nCreate a new readable/writable `charm` stream.\n\nYou can pass in readable or writable streams as parameters and they will be\npiped to or from accordingly. You can also pass `process` in which case\n`process.stdin` and `process.stdout` will be used.\n\nYou can `pipe()` to and from the `charm` object you get back.\n\ncharm.reset()\n-------------\n\nReset the entire screen, like the /usr/bin/reset command.\n\ncharm.destroy(), charm.end()\n----------------------------\n\nEmit an `\"end\"` event downstream.\n\ncharm.write(msg)\n----------------\n\nPass along `msg` to the output stream.\n\ncharm.position(x, y)\n--------------------\n\nSet the cursor position to the absolute coordinates `x, y`.\n\ncharm.position(cb)\n------------------\n\nQuery the absolute cursor position from the input stream through the output\nstream (the shell does this automatically) and get the response back as\n`cb(x, y)`.\n\ncharm.move(x, y)\n----------------\n\nMove the cursor position by the relative coordinates `x, y`.\n\ncharm.up(y)\n-----------\n\nMove the cursor up by `y` rows.\n\ncharm.down(y)\n-------------\n\nMove the cursor down by `y` rows.\n\ncharm.left(x)\n-------------\n\nMove the cursor left by `x` columns.\n\ncharm.right(x)\n--------------\n\nMove the cursor right by `x` columns.\n\ncharm.push(withAttributes=false)\n--------------------------------\n\nPush the cursor state and optionally the attribute state.\n\ncharm.pop(withAttributes=false)\n-------------------------------\n\nPop the cursor state and optionally the attribute state.\n\ncharm.erase(s)\n--------------\n\nErase a region defined by the string `s`.\n\n`s` can be:\n\n* end - erase from the cursor to the end of the line\n* start - erase from the cursor to the start of the line\n* line - erase the current line\n* down - erase everything below the current line\n* up - erase everything above the current line\n* screen - erase the entire screen\n\ncharm.display(attr)\n-------------------\n\nSet the display mode with the string `attr`.\n\n`attr` can be:\n\n* reset\n* bright\n* dim\n* underscore\n* blink\n* reverse\n* hidden\n\ncharm.foreground(color)\n-----------------------\n\nSet the foreground color with the string `color`, which can be:\n\n* red\n* yellow\n* green\n* blue\n* cyan\n* magenta\n* black\n* white\n\nor `color` can be an integer from 0 to 255, inclusive.\n\ncharm.background(color)\n-----------------------\n\nSet the background color with the string `color`, which can be:\n\n* red\n* yellow\n* green\n* blue\n* cyan\n* magenta\n* black\n* white\n\nor `color` can be an integer from 0 to 255, inclusive.\n\ncharm.cursor(visible)\n---------------------\n\nSet the cursor visibility with a boolean `visible`.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install charm\n```\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/node-charm/issues" - }, - "homepage": "https://github.com/substack/node-charm", - "_id": "charm@0.1.2", - "_from": "charm@0.1.x" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.travis.yml deleted file mode 100644 index d523c5f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 - - 0.8 - - 0.10 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/README.markdown deleted file mode 100644 index 876043f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/README.markdown +++ /dev/null @@ -1,63 +0,0 @@ -deep-is -========== - -Node's `assert.deepEqual() algorithm` as a standalone module. Exactly like -[deep-equal](https://github.com/substack/node-deep-equal) except for the fact that `deepEqual(NaN, NaN) === true`. - -This module is around [5 times faster](https://gist.github.com/2790507) -than wrapping `assert.deepEqual()` in a `try/catch`. - -[![browser support](http://ci.testling.com/thlorenz/deep-is.png)](http://ci.testling.com/thlorenz/deep-is) - -[![build status](https://secure.travis-ci.org/thlorenz/deep-is.png)](http://travis-ci.org/thlorenz/deep-is) - -example -======= - -``` js -var equal = require('deep-is'); -console.dir([ - equal( - { a : [ 2, 3 ], b : [ 4 ] }, - { a : [ 2, 3 ], b : [ 4 ] } - ), - equal( - { x : 5, y : [6] }, - { x : 5, y : 6 } - ) -]); -``` - -methods -======= - -var deepIs = require('deep-is') - -deepIs(a, b) ---------------- - -Compare objects `a` and `b`, returning whether they are equal according to a -recursive equality algorithm. - -install -======= - -With [npm](http://npmjs.org) do: - -``` -npm install deep-is -``` - -test -==== - -With [npm](http://npmjs.org) do: - -``` -npm test -``` - -license -======= - -MIT. Derived largely from node's assert module. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/example/cmp.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/example/cmp.js deleted file mode 100644 index 67014b8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/example/cmp.js +++ /dev/null @@ -1,11 +0,0 @@ -var equal = require('../'); -console.dir([ - equal( - { a : [ 2, 3 ], b : [ 4 ] }, - { a : [ 2, 3 ], b : [ 4 ] } - ), - equal( - { x : 5, y : [6] }, - { x : 5, y : 6 } - ) -]); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/index.js deleted file mode 100644 index 506fe27..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/index.js +++ /dev/null @@ -1,102 +0,0 @@ -var pSlice = Array.prototype.slice; -var Object_keys = typeof Object.keys === 'function' - ? Object.keys - : function (obj) { - var keys = []; - for (var key in obj) keys.push(key); - return keys; - } -; - -var deepEqual = module.exports = function (actual, expected) { - // enforce Object.is +0 !== -0 - if (actual === 0 && expected === 0) { - return areZerosEqual(actual, expected); - - // 7.1. All identical values are equivalent, as determined by ===. - } else if (actual === expected) { - return true; - - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - } else if (isNumberNaN(actual)) { - return isNumberNaN(expected); - - // 7.3. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -}; - -function isUndefinedOrNull(value) { - return value === null || value === undefined; -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function isNumberNaN(value) { - // NaN === NaN -> false - return typeof value == 'number' && value !== value; -} - -function areZerosEqual(zeroA, zeroB) { - // (1 / +0|0) -> Infinity, but (1 / -0) -> -Infinity and (Infinity !== -Infinity) - return (1 / zeroA) === (1 / zeroB); -} - -function objEquiv(a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - - // an identical 'prototype' property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return deepEqual(a, b); - } - try { - var ka = Object_keys(a), - kb = Object_keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!deepEqual(a[key], b[key])) return false; - } - return true; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/package.json deleted file mode 100644 index a07b908..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/package.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "deep-is", - "version": "0.1.2", - "description": "node's assert.deepEqual algorithm except for NaN being equal to NaN", - "main": "index.js", - "directories": { - "lib": ".", - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tape test/*.js" - }, - "devDependencies": { - "tape": "~1.0.2" - }, - "repository": { - "type": "git", - "url": "http://github.com/thlorenz/deep-is.git" - }, - "keywords": [ - "equality", - "equal", - "compare" - ], - "author": { - "name": "Thorsten Lorenz", - "email": "thlorenz@gmx.de", - "url": "http://thlorenz.com" - }, - "license": "MIT", - "testling": { - "files": "test/*.js", - "browsers": { - "ie": [ - 6, - 7, - 8, - 9 - ], - "ff": [ - 3.5, - 10, - 15 - ], - "chrome": [ - 10, - 22 - ], - "safari": [ - 5.1 - ], - "opera": [ - 12 - ] - } - }, - "readme": "deep-is\n==========\n\nNode's `assert.deepEqual() algorithm` as a standalone module. Exactly like\n[deep-equal](https://github.com/substack/node-deep-equal) except for the fact that `deepEqual(NaN, NaN) === true`.\n\nThis module is around [5 times faster](https://gist.github.com/2790507)\nthan wrapping `assert.deepEqual()` in a `try/catch`.\n\n[![browser support](http://ci.testling.com/thlorenz/deep-is.png)](http://ci.testling.com/thlorenz/deep-is)\n\n[![build status](https://secure.travis-ci.org/thlorenz/deep-is.png)](http://travis-ci.org/thlorenz/deep-is)\n\nexample\n=======\n\n``` js\nvar equal = require('deep-is');\nconsole.dir([\n equal(\n { a : [ 2, 3 ], b : [ 4 ] },\n { a : [ 2, 3 ], b : [ 4 ] }\n ),\n equal(\n { x : 5, y : [6] },\n { x : 5, y : 6 }\n )\n]);\n```\n\nmethods\n=======\n\nvar deepIs = require('deep-is')\n\ndeepIs(a, b)\n---------------\n\nCompare objects `a` and `b`, returning whether they are equal according to a\nrecursive equality algorithm.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install deep-is\n```\n\ntest\n====\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm test\n```\n\nlicense\n=======\n\nMIT. Derived largely from node's assert module.\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/thlorenz/deep-is/issues" - }, - "homepage": "https://github.com/thlorenz/deep-is", - "_id": "deep-is@0.1.2", - "_from": "deep-is@0.1.x" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/NaN.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/NaN.js deleted file mode 100644 index ddaa5a7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/NaN.js +++ /dev/null @@ -1,16 +0,0 @@ -var test = require('tape'); -var equal = require('../'); - -test('NaN and 0 values', function (t) { - t.ok(equal(NaN, NaN)); - t.notOk(equal(0, NaN)); - t.ok(equal(0, 0)); - t.notOk(equal(0, 1)); - t.end(); -}); - - -test('nested NaN values', function (t) { - t.ok(equal([ NaN, 1, NaN ], [ NaN, 1, NaN ])); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/cmp.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/cmp.js deleted file mode 100644 index 3071013..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/cmp.js +++ /dev/null @@ -1,23 +0,0 @@ -var test = require('tape'); -var equal = require('../'); - -test('equal', function (t) { - t.ok(equal( - { a : [ 2, 3 ], b : [ 4 ] }, - { a : [ 2, 3 ], b : [ 4 ] } - )); - t.end(); -}); - -test('not equal', function (t) { - t.notOk(equal( - { x : 5, y : [6] }, - { x : 5, y : 6 } - )); - t.end(); -}); - -test('nested nulls', function (t) { - t.ok(equal([ null, null, null ], [ null, null, null ])); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/neg-vs-pos-0.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/neg-vs-pos-0.js deleted file mode 100644 index ac26130..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/deep-is/test/neg-vs-pos-0.js +++ /dev/null @@ -1,15 +0,0 @@ -var test = require('tape'); -var equal = require('../'); - -test('0 values', function (t) { - t.ok(equal( 0, 0), ' 0 === 0'); - t.ok(equal( 0, +0), ' 0 === +0'); - t.ok(equal(+0, +0), '+0 === +0'); - t.ok(equal(-0, -0), '-0 === -0'); - - t.notOk(equal(-0, 0), '-0 !== 0'); - t.notOk(equal(-0, +0), '-0 !== +0'); - - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.travis.yml deleted file mode 100644 index 2d26206..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - 0.6 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/LICENSE deleted file mode 100644 index 7b75500..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: -http://www.opensource.org/licenses/mit-license.php - -Copyright 2010 James Halliday (mail@substack.net) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/json.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/json.js deleted file mode 100755 index 50d612e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/json.js +++ /dev/null @@ -1,16 +0,0 @@ -var traverse = require('traverse'); - -var id = 54; -var callbacks = {}; -var obj = { moo : function () {}, foo : [2,3,4, function () {}] }; - -var scrubbed = traverse(obj).map(function (x) { - if (typeof x === 'function') { - callbacks[id] = { id : id, f : x, path : this.path }; - this.update('[Function]'); - id++; - } -}); - -console.dir(scrubbed); -console.dir(callbacks); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/leaves.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/leaves.js deleted file mode 100755 index c1b310b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/leaves.js +++ /dev/null @@ -1,15 +0,0 @@ -var traverse = require('traverse'); - -var obj = { - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 }, -}; - -var leaves = traverse(obj).reduce(function (acc, x) { - if (this.isLeaf) acc.push(x); - return acc; -}, []); - -console.dir(leaves); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/negative.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/negative.js deleted file mode 100755 index 78608a0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/negative.js +++ /dev/null @@ -1,8 +0,0 @@ -var traverse = require('traverse'); -var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - -traverse(obj).forEach(function (x) { - if (x < 0) this.update(x + 128); -}); - -console.dir(obj); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/scrub.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/scrub.js deleted file mode 100755 index 5d15b91..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/scrub.js +++ /dev/null @@ -1,10 +0,0 @@ -// scrub out circular references -var traverse = require('traverse'); - -var obj = { a : 1, b : 2, c : [ 3, 4 ] }; -obj.c.push(obj); - -var scrubbed = traverse(obj).map(function (x) { - if (this.circular) this.remove() -}); -console.dir(scrubbed); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/stringify.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/stringify.js deleted file mode 100755 index 167b68b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/examples/stringify.js +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node -var traverse = require('traverse'); - -var obj = [ 'five', 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - -var s = ''; -traverse(obj).forEach(function to_s (node) { - if (Array.isArray(node)) { - this.before(function () { s += '[' }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += ']' }); - } - else if (typeof node == 'object') { - this.before(function () { s += '{' }); - this.pre(function (x, key) { - to_s(key); - s += ':'; - }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += '}' }); - } - else if (typeof node == 'string') { - s += '"' + node.toString().replace(/"/g, '\\"') + '"'; - } - else if (typeof node == 'function') { - s += 'null'; - } - else { - s += node.toString(); - } -}); - -console.log('JSON.stringify: ' + JSON.stringify(obj)); -console.log('this stringify: ' + s); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/index.js deleted file mode 100644 index 2f2cf67..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/index.js +++ /dev/null @@ -1,314 +0,0 @@ -var traverse = module.exports = function (obj) { - return new Traverse(obj); -}; - -function Traverse (obj) { - this.value = obj; -} - -Traverse.prototype.get = function (ps) { - var node = this.value; - for (var i = 0; i < ps.length; i ++) { - var key = ps[i]; - if (!node || !hasOwnProperty.call(node, key)) { - node = undefined; - break; - } - node = node[key]; - } - return node; -}; - -Traverse.prototype.has = function (ps) { - var node = this.value; - for (var i = 0; i < ps.length; i ++) { - var key = ps[i]; - if (!node || !hasOwnProperty.call(node, key)) { - return false; - } - node = node[key]; - } - return true; -}; - -Traverse.prototype.set = function (ps, value) { - var node = this.value; - for (var i = 0; i < ps.length - 1; i ++) { - var key = ps[i]; - if (!hasOwnProperty.call(node, key)) node[key] = {}; - node = node[key]; - } - node[ps[i]] = value; - return value; -}; - -Traverse.prototype.map = function (cb) { - return walk(this.value, cb, true); -}; - -Traverse.prototype.forEach = function (cb) { - this.value = walk(this.value, cb, false); - return this.value; -}; - -Traverse.prototype.reduce = function (cb, init) { - var skip = arguments.length === 1; - var acc = skip ? this.value : init; - this.forEach(function (x) { - if (!this.isRoot || !skip) { - acc = cb.call(this, acc, x); - } - }); - return acc; -}; - -Traverse.prototype.paths = function () { - var acc = []; - this.forEach(function (x) { - acc.push(this.path); - }); - return acc; -}; - -Traverse.prototype.nodes = function () { - var acc = []; - this.forEach(function (x) { - acc.push(this.node); - }); - return acc; -}; - -Traverse.prototype.clone = function () { - var parents = [], nodes = []; - - return (function clone (src) { - for (var i = 0; i < parents.length; i++) { - if (parents[i] === src) { - return nodes[i]; - } - } - - if (typeof src === 'object' && src !== null) { - var dst = copy(src); - - parents.push(src); - nodes.push(dst); - - forEach(objectKeys(src), function (key) { - dst[key] = clone(src[key]); - }); - - parents.pop(); - nodes.pop(); - return dst; - } - else { - return src; - } - })(this.value); -}; - -function walk (root, cb, immutable) { - var path = []; - var parents = []; - var alive = true; - - return (function walker (node_) { - var node = immutable ? copy(node_) : node_; - var modifiers = {}; - - var keepGoing = true; - - var state = { - node : node, - node_ : node_, - path : [].concat(path), - parent : parents[parents.length - 1], - parents : parents, - key : path.slice(-1)[0], - isRoot : path.length === 0, - level : path.length, - circular : null, - update : function (x, stopHere) { - if (!state.isRoot) { - state.parent.node[state.key] = x; - } - state.node = x; - if (stopHere) keepGoing = false; - }, - 'delete' : function (stopHere) { - delete state.parent.node[state.key]; - if (stopHere) keepGoing = false; - }, - remove : function (stopHere) { - if (isArray(state.parent.node)) { - state.parent.node.splice(state.key, 1); - } - else { - delete state.parent.node[state.key]; - } - if (stopHere) keepGoing = false; - }, - keys : null, - before : function (f) { modifiers.before = f }, - after : function (f) { modifiers.after = f }, - pre : function (f) { modifiers.pre = f }, - post : function (f) { modifiers.post = f }, - stop : function () { alive = false }, - block : function () { keepGoing = false } - }; - - if (!alive) return state; - - function updateState() { - if (typeof state.node === 'object' && state.node !== null) { - if (!state.keys || state.node_ !== state.node) { - state.keys = objectKeys(state.node) - } - - state.isLeaf = state.keys.length == 0; - - for (var i = 0; i < parents.length; i++) { - if (parents[i].node_ === node_) { - state.circular = parents[i]; - break; - } - } - } - else { - state.isLeaf = true; - state.keys = null; - } - - state.notLeaf = !state.isLeaf; - state.notRoot = !state.isRoot; - } - - updateState(); - - // use return values to update if defined - var ret = cb.call(state, state.node); - if (ret !== undefined && state.update) state.update(ret); - - if (modifiers.before) modifiers.before.call(state, state.node); - - if (!keepGoing) return state; - - if (typeof state.node == 'object' - && state.node !== null && !state.circular) { - parents.push(state); - - updateState(); - - forEach(state.keys, function (key, i) { - path.push(key); - - if (modifiers.pre) modifiers.pre.call(state, state.node[key], key); - - var child = walker(state.node[key]); - if (immutable && hasOwnProperty.call(state.node, key)) { - state.node[key] = child.node; - } - - child.isLast = i == state.keys.length - 1; - child.isFirst = i == 0; - - if (modifiers.post) modifiers.post.call(state, child); - - path.pop(); - }); - parents.pop(); - } - - if (modifiers.after) modifiers.after.call(state, state.node); - - return state; - })(root).node; -} - -function copy (src) { - if (typeof src === 'object' && src !== null) { - var dst; - - if (isArray(src)) { - dst = []; - } - else if (isDate(src)) { - dst = new Date(src.getTime ? src.getTime() : src); - } - else if (isRegExp(src)) { - dst = new RegExp(src); - } - else if (isError(src)) { - dst = { message: src.message }; - } - else if (isBoolean(src)) { - dst = new Boolean(src); - } - else if (isNumber(src)) { - dst = new Number(src); - } - else if (isString(src)) { - dst = new String(src); - } - else if (Object.create && Object.getPrototypeOf) { - dst = Object.create(Object.getPrototypeOf(src)); - } - else if (src.constructor === Object) { - dst = {}; - } - else { - var proto = - (src.constructor && src.constructor.prototype) - || src.__proto__ - || {} - ; - var T = function () {}; - T.prototype = proto; - dst = new T; - } - - forEach(objectKeys(src), function (key) { - dst[key] = src[key]; - }); - return dst; - } - else return src; -} - -var objectKeys = Object.keys || function keys (obj) { - var res = []; - for (var key in obj) res.push(key) - return res; -}; - -function toS (obj) { return Object.prototype.toString.call(obj) } -function isDate (obj) { return toS(obj) === '[object Date]' } -function isRegExp (obj) { return toS(obj) === '[object RegExp]' } -function isError (obj) { return toS(obj) === '[object Error]' } -function isBoolean (obj) { return toS(obj) === '[object Boolean]' } -function isNumber (obj) { return toS(obj) === '[object Number]' } -function isString (obj) { return toS(obj) === '[object String]' } - -var isArray = Array.isArray || function isArray (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - -var forEach = function (xs, fn) { - if (xs.forEach) return xs.forEach(fn) - else for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } -}; - -forEach(objectKeys(Traverse.prototype), function (key) { - traverse[key] = function (obj) { - var args = [].slice.call(arguments, 1); - var t = new Traverse(obj); - return t[key].apply(t, args); - }; -}); - -var hasOwnProperty = Object.hasOwnProperty || function (obj, key) { - return key in obj; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/package.json deleted file mode 100644 index efbded2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "traverse", - "version": "0.6.6", - "description": "traverse and transform objects by visiting every node on a recursive walk", - "main": "index.js", - "directories": { - "example": "example", - "test": "test" - }, - "devDependencies": { - "tape": "~1.0.4" - }, - "scripts": { - "test": "tape test/*.js" - }, - "testling": { - "files": "test/*.js", - "browsers": { - "iexplore": [ - "6.0", - "7.0", - "8.0", - "9.0" - ], - "chrome": [ - "10.0", - "20.0" - ], - "firefox": [ - "10.0", - "15.0" - ], - "safari": [ - "5.1" - ], - "opera": [ - "12.0" - ] - } - }, - "repository": { - "type": "git", - "url": "git://github.com/substack/js-traverse.git" - }, - "homepage": "https://github.com/substack/js-traverse", - "keywords": [ - "traverse", - "walk", - "recursive", - "map", - "forEach", - "deep", - "clone" - ], - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "license": "MIT", - "readme": "# traverse\n\nTraverse and transform objects by visiting every node on a recursive walk.\n\n[![browser support](http://ci.testling.com/substack/js-traverse.png)](http://ci.testling.com/substack/js-traverse)\n\n[![build status](https://secure.travis-ci.org/substack/js-traverse.png)](http://travis-ci.org/substack/js-traverse)\n\n# examples\n\n## transform negative numbers in-place\n\nnegative.js\n\n````javascript\nvar traverse = require('traverse');\nvar obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ];\n\ntraverse(obj).forEach(function (x) {\n if (x < 0) this.update(x + 128);\n});\n\nconsole.dir(obj);\n````\n\nOutput:\n\n [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ]\n\n## collect leaf nodes\n\nleaves.js\n\n````javascript\nvar traverse = require('traverse');\n\nvar obj = {\n a : [1,2,3],\n b : 4,\n c : [5,6],\n d : { e : [7,8], f : 9 },\n};\n\nvar leaves = traverse(obj).reduce(function (acc, x) {\n if (this.isLeaf) acc.push(x);\n return acc;\n}, []);\n\nconsole.dir(leaves);\n````\n\nOutput:\n\n [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n\n## scrub circular references\n\nscrub.js:\n\n````javascript\nvar traverse = require('traverse');\n\nvar obj = { a : 1, b : 2, c : [ 3, 4 ] };\nobj.c.push(obj);\n\nvar scrubbed = traverse(obj).map(function (x) {\n if (this.circular) this.remove()\n});\nconsole.dir(scrubbed);\n````\n\noutput:\n\n { a: 1, b: 2, c: [ 3, 4 ] }\n\n# methods\n\nEach method that takes an `fn` uses the context documented below in the context\nsection.\n\n## .map(fn)\n\nExecute `fn` for each node in the object and return a new object with the\nresults of the walk. To update nodes in the result use `this.update(value)`.\n\n## .forEach(fn)\n\nExecute `fn` for each node in the object but unlike `.map()`, when\n`this.update()` is called it updates the object in-place.\n\n## .reduce(fn, acc)\n\nFor each node in the object, perform a\n[left-fold](http://en.wikipedia.org/wiki/Fold_(higher-order_function))\nwith the return value of `fn(acc, node)`.\n\nIf `acc` isn't specified, `acc` is set to the root object for the first step\nand the root element is skipped.\n\n## .paths()\n\nReturn an `Array` of every possible non-cyclic path in the object.\nPaths are `Array`s of string keys.\n\n## .nodes()\n\nReturn an `Array` of every node in the object.\n\n## .clone()\n\nCreate a deep clone of the object.\n\n## .get(path)\n\nGet the element at the array `path`.\n\n## .set(path, value)\n\nSet the element at the array `path` to `value`.\n\n## .has(path)\n\nReturn whether the element at the array `path` exists.\n\n# context\n\nEach method that takes a callback has a context (its `this` object) with these\nattributes:\n\n## this.node\n\nThe present node on the recursive walk\n\n## this.path\n\nAn array of string keys from the root to the present node\n\n## this.parent\n\nThe context of the node's parent.\nThis is `undefined` for the root node.\n\n## this.key\n\nThe name of the key of the present node in its parent.\nThis is `undefined` for the root node.\n\n## this.isRoot, this.notRoot\n\nWhether the present node is the root node\n\n## this.isLeaf, this.notLeaf\n\nWhether or not the present node is a leaf node (has no children)\n\n## this.level\n\nDepth of the node within the traversal\n\n## this.circular\n\nIf the node equals one of its parents, the `circular` attribute is set to the\ncontext of that parent and the traversal progresses no deeper.\n\n## this.update(value, stopHere=false)\n\nSet a new value for the present node.\n\nAll the elements in `value` will be recursively traversed unless `stopHere` is\ntrue.\n\n## this.remove(stopHere=false)\n\nRemove the current element from the output. If the node is in an Array it will\nbe spliced off. Otherwise it will be deleted from its parent.\n\n## this.delete(stopHere=false)\n\nDelete the current element from its parent in the output. Calls `delete` even on\nArrays.\n\n## this.before(fn)\n\nCall this function before any of the children are traversed.\n\nYou can assign into `this.keys` here to traverse in a custom order.\n\n## this.after(fn)\n\nCall this function after any of the children are traversed.\n\n## this.pre(fn)\n\nCall this function before each of the children are traversed.\n\n## this.post(fn)\n\nCall this function after each of the children are traversed.\n\n\n# install\n\nUsing [npm](http://npmjs.org) do:\n\n $ npm install traverse\n\n# license\n\nMIT\n", - "readmeFilename": "readme.markdown", - "bugs": { - "url": "https://github.com/substack/js-traverse/issues" - }, - "_id": "traverse@0.6.6", - "_from": "traverse@0.6.x" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/readme.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/readme.markdown deleted file mode 100644 index fbfd06e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/readme.markdown +++ /dev/null @@ -1,209 +0,0 @@ -# traverse - -Traverse and transform objects by visiting every node on a recursive walk. - -[![browser support](http://ci.testling.com/substack/js-traverse.png)](http://ci.testling.com/substack/js-traverse) - -[![build status](https://secure.travis-ci.org/substack/js-traverse.png)](http://travis-ci.org/substack/js-traverse) - -# examples - -## transform negative numbers in-place - -negative.js - -````javascript -var traverse = require('traverse'); -var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - -traverse(obj).forEach(function (x) { - if (x < 0) this.update(x + 128); -}); - -console.dir(obj); -```` - -Output: - - [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ] - -## collect leaf nodes - -leaves.js - -````javascript -var traverse = require('traverse'); - -var obj = { - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 }, -}; - -var leaves = traverse(obj).reduce(function (acc, x) { - if (this.isLeaf) acc.push(x); - return acc; -}, []); - -console.dir(leaves); -```` - -Output: - - [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] - -## scrub circular references - -scrub.js: - -````javascript -var traverse = require('traverse'); - -var obj = { a : 1, b : 2, c : [ 3, 4 ] }; -obj.c.push(obj); - -var scrubbed = traverse(obj).map(function (x) { - if (this.circular) this.remove() -}); -console.dir(scrubbed); -```` - -output: - - { a: 1, b: 2, c: [ 3, 4 ] } - -# methods - -Each method that takes an `fn` uses the context documented below in the context -section. - -## .map(fn) - -Execute `fn` for each node in the object and return a new object with the -results of the walk. To update nodes in the result use `this.update(value)`. - -## .forEach(fn) - -Execute `fn` for each node in the object but unlike `.map()`, when -`this.update()` is called it updates the object in-place. - -## .reduce(fn, acc) - -For each node in the object, perform a -[left-fold](http://en.wikipedia.org/wiki/Fold_(higher-order_function)) -with the return value of `fn(acc, node)`. - -If `acc` isn't specified, `acc` is set to the root object for the first step -and the root element is skipped. - -## .paths() - -Return an `Array` of every possible non-cyclic path in the object. -Paths are `Array`s of string keys. - -## .nodes() - -Return an `Array` of every node in the object. - -## .clone() - -Create a deep clone of the object. - -## .get(path) - -Get the element at the array `path`. - -## .set(path, value) - -Set the element at the array `path` to `value`. - -## .has(path) - -Return whether the element at the array `path` exists. - -# context - -Each method that takes a callback has a context (its `this` object) with these -attributes: - -## this.node - -The present node on the recursive walk - -## this.path - -An array of string keys from the root to the present node - -## this.parent - -The context of the node's parent. -This is `undefined` for the root node. - -## this.key - -The name of the key of the present node in its parent. -This is `undefined` for the root node. - -## this.isRoot, this.notRoot - -Whether the present node is the root node - -## this.isLeaf, this.notLeaf - -Whether or not the present node is a leaf node (has no children) - -## this.level - -Depth of the node within the traversal - -## this.circular - -If the node equals one of its parents, the `circular` attribute is set to the -context of that parent and the traversal progresses no deeper. - -## this.update(value, stopHere=false) - -Set a new value for the present node. - -All the elements in `value` will be recursively traversed unless `stopHere` is -true. - -## this.remove(stopHere=false) - -Remove the current element from the output. If the node is in an Array it will -be spliced off. Otherwise it will be deleted from its parent. - -## this.delete(stopHere=false) - -Delete the current element from its parent in the output. Calls `delete` even on -Arrays. - -## this.before(fn) - -Call this function before any of the children are traversed. - -You can assign into `this.keys` here to traverse in a custom order. - -## this.after(fn) - -Call this function after any of the children are traversed. - -## this.pre(fn) - -Call this function before each of the children are traversed. - -## this.post(fn) - -Call this function after each of the children are traversed. - - -# install - -Using [npm](http://npmjs.org) do: - - $ npm install traverse - -# license - -MIT diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/circular.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/circular.js deleted file mode 100644 index f56506a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/circular.js +++ /dev/null @@ -1,117 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); -var util = require('util'); - -test('circular', function (t) { - t.plan(1); - - var obj = { x : 3 }; - obj.y = obj; - traverse(obj).forEach(function (x) { - if (this.path.join('') == 'y') { - t.equal( - util.inspect(this.circular.node), - util.inspect(obj) - ); - } - }); -}); - -test('deepCirc', function (t) { - t.plan(2); - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - - var times = 0; - traverse(obj).forEach(function (x) { - if (this.circular) { - t.same(this.circular.path, []); - t.same(this.path, [ 'y', 2 ]); - } - }); -}); - -test('doubleCirc', function (t) { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - var circs = []; - traverse(obj).forEach(function (x) { - if (this.circular) { - circs.push({ circ : this.circular, self : this, node : x }); - } - }); - - t.same(circs[0].self.path, [ 'x', 3, 2 ]); - t.same(circs[0].circ.path, []); - - t.same(circs[1].self.path, [ 'y', 2 ]); - t.same(circs[1].circ.path, []); - - t.same(circs.length, 2); - t.end(); -}); - -test('circDubForEach', function (t) { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - traverse(obj).forEach(function (x) { - if (this.circular) this.update('...'); - }); - - t.same(obj, { x : [ 1, 2, 3, [ 4, 5, '...' ] ], y : [ 4, 5, '...' ] }); - t.end(); -}); - -test('circDubMap', function (t) { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - var c = traverse(obj).map(function (x) { - if (this.circular) { - this.update('...'); - } - }); - - t.same(c, { x : [ 1, 2, 3, [ 4, 5, '...' ] ], y : [ 4, 5, '...' ] }); - t.end(); -}); - -test('circClone', function (t) { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - var clone = traverse.clone(obj); - t.ok(obj !== clone); - - t.ok(clone.y[2] === clone); - t.ok(clone.y[2] !== obj); - t.ok(clone.x[3][2] === clone); - t.ok(clone.x[3][2] !== obj); - t.same(clone.x.slice(0,3), [1,2,3]); - t.same(clone.y.slice(0,2), [4,5]); - t.end(); -}); - -test('circMapScrub', function (t) { - var obj = { a : 1, b : 2 }; - obj.c = obj; - - var scrubbed = traverse(obj).map(function (node) { - if (this.circular) this.remove(); - }); - t.same( - Object.keys(scrubbed).sort(), - [ 'a', 'b' ] - ); - t.ok(deepEqual(scrubbed, { a : 1, b : 2 })); - - t.equal(obj.c, obj); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/date.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/date.js deleted file mode 100644 index 54db4b0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/date.js +++ /dev/null @@ -1,37 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('dateEach', function (t) { - var obj = { x : new Date, y : 10, z : 5 }; - - var counts = {}; - - traverse(obj).forEach(function (node) { - var t = (node instanceof Date && 'Date') || typeof node; - counts[t] = (counts[t] || 0) + 1; - }); - - t.same(counts, { - object : 1, - Date : 1, - number : 2, - }); - t.end(); -}); - -test('dateMap', function (t) { - var obj = { x : new Date, y : 10, z : 5 }; - - var res = traverse(obj).map(function (node) { - if (typeof node === 'number') this.update(node + 100); - }); - - t.ok(obj.x !== res.x); - t.same(res, { - x : obj.x, - y : 110, - z : 105, - }); - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/equal.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/equal.js deleted file mode 100644 index fd0463c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/equal.js +++ /dev/null @@ -1,240 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); - -test('deepDates', function (t) { - t.plan(2); - - t.ok( - deepEqual( - { d : new Date, x : [ 1, 2, 3 ] }, - { d : new Date, x : [ 1, 2, 3 ] } - ), - 'dates should be equal' - ); - - var d0 = new Date; - setTimeout(function () { - t.ok( - !deepEqual( - { d : d0, x : [ 1, 2, 3 ], }, - { d : new Date, x : [ 1, 2, 3 ] } - ), - 'microseconds should count in date equality' - ); - }, 5); -}); - -test('deepCircular', function (t) { - var a = [1]; - a.push(a); // a = [ 1, *a ] - - var b = [1]; - b.push(a); // b = [ 1, [ 1, *a ] ] - - t.ok( - !deepEqual(a, b), - 'circular ref mount points count towards equality' - ); - - var c = [1]; - c.push(c); // c = [ 1, *c ] - t.ok( - deepEqual(a, c), - 'circular refs are structurally the same here' - ); - - var d = [1]; - d.push(a); // c = [ 1, [ 1, *d ] ] - t.ok( - deepEqual(b, d), - 'non-root circular ref structural comparison' - ); - - t.end(); -}); - -test('deepInstances', function (t) { - t.ok( - !deepEqual([ new Boolean(false) ], [ false ]), - 'boolean instances are not real booleans' - ); - - t.ok( - !deepEqual([ new String('x') ], [ 'x' ]), - 'string instances are not real strings' - ); - - t.ok( - !deepEqual([ new Number(4) ], [ 4 ]), - 'number instances are not real numbers' - ); - - t.ok( - deepEqual([ new RegExp('x') ], [ /x/ ]), - 'regexp instances are real regexps' - ); - - t.ok( - !deepEqual([ new RegExp(/./) ], [ /../ ]), - 'these regexps aren\'t the same' - ); - - t.ok( - !deepEqual( - [ function (x) { return x * 2 } ], - [ function (x) { return x * 2 } ] - ), - 'functions with the same .toString() aren\'t necessarily the same' - ); - - var f = function (x) { return x * 2 }; - t.ok( - deepEqual([ f ], [ f ]), - 'these functions are actually equal' - ); - - t.end(); -}); - -test('deepEqual', function (t) { - t.ok( - !deepEqual([ 1, 2, 3 ], { 0 : 1, 1 : 2, 2 : 3 }), - 'arrays are not objects' - ); - t.end(); -}); - -test('falsy', function (t) { - t.ok( - !deepEqual([ undefined ], [ null ]), - 'null is not undefined!' - ); - - t.ok( - !deepEqual([ null ], [ undefined ]), - 'undefined is not null!' - ); - - t.ok( - !deepEqual( - { a : 1, b : 2, c : [ 3, undefined, 5 ] }, - { a : 1, b : 2, c : [ 3, null, 5 ] } - ), - 'undefined is not null, however deeply!' - ); - - t.ok( - !deepEqual( - { a : 1, b : 2, c : [ 3, undefined, 5 ] }, - { a : 1, b : 2, c : [ 3, null, 5 ] } - ), - 'null is not undefined, however deeply!' - ); - - t.ok( - !deepEqual( - { a : 1, b : 2, c : [ 3, undefined, 5 ] }, - { a : 1, b : 2, c : [ 3, null, 5 ] } - ), - 'null is not undefined, however deeply!' - ); - - t.end(); -}); - -test('deletedArrayEqual', function (t) { - var xs = [ 1, 2, 3, 4 ]; - delete xs[2]; - - var ys = Object.create(Array.prototype); - ys[0] = 1; - ys[1] = 2; - ys[3] = 4; - - t.ok( - deepEqual(xs, ys), - 'arrays with deleted elements are only equal to' - + ' arrays with similarly deleted elements' - ); - - t.ok( - !deepEqual(xs, [ 1, 2, undefined, 4 ]), - 'deleted array elements cannot be undefined' - ); - - t.ok( - !deepEqual(xs, [ 1, 2, null, 4 ]), - 'deleted array elements cannot be null' - ); - - t.end(); -}); - -test('deletedObjectEqual', function (t) { - var obj = { a : 1, b : 2, c : 3 }; - delete obj.c; - - t.ok( - deepEqual(obj, { a : 1, b : 2 }), - 'deleted object elements should not show up' - ); - - t.ok( - !deepEqual(obj, { a : 1, b : 2, c : undefined }), - 'deleted object elements are not undefined' - ); - - t.ok( - !deepEqual(obj, { a : 1, b : 2, c : null }), - 'deleted object elements are not null' - ); - - t.end(); -}); - -test('emptyKeyEqual', function (t) { - t.ok(!deepEqual( - { a : 1 }, { a : 1, '' : 55 } - )); - - t.end(); -}); - -test('deepArguments', function (t) { - t.ok( - !deepEqual( - [ 4, 5, 6 ], - (function () { return arguments })(4, 5, 6) - ), - 'arguments are not arrays' - ); - - t.ok( - deepEqual( - (function () { return arguments })(4, 5, 6), - (function () { return arguments })(4, 5, 6) - ), - 'arguments should equal' - ); - - t.end(); -}); - -test('deepUn', function (t) { - t.ok(!deepEqual({ a : 1, b : 2 }, undefined)); - t.ok(!deepEqual({ a : 1, b : 2 }, {})); - t.ok(!deepEqual(undefined, { a : 1, b : 2 })); - t.ok(!deepEqual({}, { a : 1, b : 2 })); - t.ok(deepEqual(undefined, undefined)); - t.ok(deepEqual(null, null)); - t.ok(!deepEqual(undefined, null)); - - t.end(); -}); - -test('deepLevels', function (t) { - var xs = [ 1, 2, [ 3, 4, [ 5, 6 ] ] ]; - t.ok(!deepEqual(xs, [])); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/error.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/error.js deleted file mode 100644 index 447c725..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/error.js +++ /dev/null @@ -1,11 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('traverse an Error', function (t) { - var obj = new Error("test"); - var results = traverse(obj).map(function (node) {}); - t.same(results, { message: 'test' }); - - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/has.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/has.js deleted file mode 100644 index 94a50c6..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/has.js +++ /dev/null @@ -1,15 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('has', function (t) { - var obj = { a : 2, b : [ 4, 5, { c : 6 } ] }; - - t.equal(traverse(obj).has([ 'b', 2, 'c' ]), true) - t.equal(traverse(obj).has([ 'b', 2, 'c', 0 ]), false) - t.equal(traverse(obj).has([ 'b', 2, 'd' ]), false) - t.equal(traverse(obj).has([]), true) - t.equal(traverse(obj).has([ 'a' ]), true) - t.equal(traverse(obj).has([ 'a', 2 ]), false) - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/instance.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/instance.js deleted file mode 100644 index 112f477..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/instance.js +++ /dev/null @@ -1,17 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); -var EventEmitter = require('events').EventEmitter; - -test('check instanceof on node elems', function (t) { - var counts = { emitter : 0 }; - - traverse([ new EventEmitter, 3, 4, { ev : new EventEmitter }]) - .forEach(function (node) { - if (node instanceof EventEmitter) counts.emitter ++; - }) - ; - - t.equal(counts.emitter, 2); - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/interface.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/interface.js deleted file mode 100644 index f454c27..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/interface.js +++ /dev/null @@ -1,43 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('interface map', function (t) { - var obj = { a : [ 5,6,7 ], b : { c : [8] } }; - - t.same( - traverse.paths(obj) - .sort() - .map(function (path) { return path.join('/') }) - .slice(1) - .join(' ') - , - 'a a/0 a/1 a/2 b b/c b/c/0' - ); - - t.same( - traverse.nodes(obj), - [ - { a: [ 5, 6, 7 ], b: { c: [ 8 ] } }, - [ 5, 6, 7 ], 5, 6, 7, - { c: [ 8 ] }, [ 8 ], 8 - ] - ); - - t.same( - traverse.map(obj, function (node) { - if (typeof node == 'number') { - return node + 1000; - } - else if (Array.isArray(node)) { - return node.join(' '); - } - }), - { a: '5 6 7', b: { c: '8' } } - ); - - var nodes = 0; - traverse.forEach(obj, function (node) { nodes ++ }); - t.same(nodes, 8); - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/json.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/json.js deleted file mode 100644 index 46d55e6..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/json.js +++ /dev/null @@ -1,49 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('json test', function (t) { - var id = 54; - var callbacks = {}; - var obj = { moo : function () {}, foo : [2,3,4, function () {}] }; - - var scrubbed = traverse(obj).map(function (x) { - if (typeof x === 'function') { - callbacks[id] = { id : id, f : x, path : this.path }; - this.update('[Function]'); - id++; - } - }); - - t.equal( - scrubbed.moo, '[Function]', - 'obj.moo replaced with "[Function]"' - ); - - t.equal( - scrubbed.foo[3], '[Function]', - 'obj.foo[3] replaced with "[Function]"' - ); - - t.same(scrubbed, { - moo : '[Function]', - foo : [ 2, 3, 4, "[Function]" ] - }, 'Full JSON string matches'); - - t.same( - typeof obj.moo, 'function', - 'Original obj.moo still a function' - ); - - t.same( - typeof obj.foo[3], 'function', - 'Original obj.foo[3] still a function' - ); - - t.same(callbacks, { - 54: { id: 54, f : obj.moo, path: [ 'moo' ] }, - 55: { id: 55, f : obj.foo[3], path: [ 'foo', '3' ] }, - }, 'Check the generated callbacks list'); - - t.end(); -}); - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/keys.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/keys.js deleted file mode 100644 index 9661140..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/keys.js +++ /dev/null @@ -1,31 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('sort test', function (t) { - var acc = []; - traverse({ - a: 30, - b: 22, - id: 9 - }).forEach(function (node) { - if ((! Array.isArray(node)) && typeof node === 'object') { - this.before(function(node) { - this.keys = Object.keys(node); - this.keys.sort(function(a, b) { - a = [a === "id" ? 0 : 1, a]; - b = [b === "id" ? 0 : 1, b]; - return a < b ? -1 : a > b ? 1 : 0; - }); - }); - } - if (this.isLeaf) acc.push(node); - }); - - t.equal( - acc.join(' '), - '9 30 22', - 'Traversal in a custom order' - ); - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/leaves.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/leaves.js deleted file mode 100644 index c04ad5f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/leaves.js +++ /dev/null @@ -1,22 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('leaves test', function (t) { - var acc = []; - traverse({ - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 } - }).forEach(function (x) { - if (this.isLeaf) acc.push(x); - }); - - t.equal( - acc.join(' '), - '1 2 3 4 5 6 7 8 9', - 'Traversal in the right(?) order' - ); - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/lib/deep_equal.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/lib/deep_equal.js deleted file mode 100644 index c75b04c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/lib/deep_equal.js +++ /dev/null @@ -1,96 +0,0 @@ -var traverse = require('../../'); - -module.exports = function (a, b) { - if (arguments.length !== 2) { - throw new Error( - 'deepEqual requires exactly two objects to compare against' - ); - } - - var equal = true; - var node = b; - - traverse(a).forEach(function (y) { - var notEqual = (function () { - equal = false; - //this.stop(); - return undefined; - }).bind(this); - - //if (node === undefined || node === null) return notEqual(); - - if (!this.isRoot) { - /* - if (!Object.hasOwnProperty.call(node, this.key)) { - return notEqual(); - } - */ - if (typeof node !== 'object') return notEqual(); - node = node[this.key]; - } - - var x = node; - - this.post(function () { - node = x; - }); - - var toS = function (o) { - return Object.prototype.toString.call(o); - }; - - if (this.circular) { - if (traverse(b).get(this.circular.path) !== x) notEqual(); - } - else if (typeof x !== typeof y) { - notEqual(); - } - else if (x === null || y === null || x === undefined || y === undefined) { - if (x !== y) notEqual(); - } - else if (x.__proto__ !== y.__proto__) { - notEqual(); - } - else if (x === y) { - // nop - } - else if (typeof x === 'function') { - if (x instanceof RegExp) { - // both regexps on account of the __proto__ check - if (x.toString() != y.toString()) notEqual(); - } - else if (x !== y) notEqual(); - } - else if (typeof x === 'object') { - if (toS(y) === '[object Arguments]' - || toS(x) === '[object Arguments]') { - if (toS(x) !== toS(y)) { - notEqual(); - } - } - else if (toS(y) === '[object RegExp]' - || toS(x) === '[object RegExp]') { - if (!x || !y || x.toString() !== y.toString()) notEqual(); - } - else if (x instanceof Date || y instanceof Date) { - if (!(x instanceof Date) || !(y instanceof Date) - || x.getTime() !== y.getTime()) { - notEqual(); - } - } - else { - var kx = Object.keys(x); - var ky = Object.keys(y); - if (kx.length !== ky.length) return notEqual(); - for (var i = 0; i < kx.length; i++) { - var k = kx[i]; - if (!Object.hasOwnProperty.call(y, k)) { - notEqual(); - } - } - } - } - }); - - return equal; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/mutability.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/mutability.js deleted file mode 100644 index 3ab90da..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/mutability.js +++ /dev/null @@ -1,300 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); - -test('mutate', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).forEach(function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - t.same(obj, res); - t.same(obj, { a : 1, b : 20, c : [ 3, 40 ] }); - t.end(); -}); - -test('mutateT', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse.forEach(obj, function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - t.same(obj, res); - t.same(obj, { a : 1, b : 20, c : [ 3, 40 ] }); - t.end(); -}); - -test('map', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).map(function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - t.same(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - t.same(res, { a : 1, b : 20, c : [ 3, 40 ] }); - t.end(); -}); - -test('mapT', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse.map(obj, function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - t.same(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - t.same(res, { a : 1, b : 20, c : [ 3, 40 ] }); - t.end(); -}); - -test('clone', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).clone(); - t.same(obj, res); - t.ok(obj !== res); - obj.a ++; - t.same(res.a, 1); - obj.c.push(5); - t.same(res.c, [ 3, 4 ]); - t.end(); -}); - -test('cloneT', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse.clone(obj); - t.same(obj, res); - t.ok(obj !== res); - obj.a ++; - t.same(res.a, 1); - obj.c.push(5); - t.same(res.c, [ 3, 4 ]); - t.end(); -}); - -test('reduce', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).reduce(function (acc, x) { - if (this.isLeaf) acc.push(x); - return acc; - }, []); - t.same(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - t.same(res, [ 1, 2, 3, 4 ]); - t.end(); -}); - -test('reduceInit', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).reduce(function (acc, x) { - if (this.isRoot) assert.fail('got root'); - return acc; - }); - t.same(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - t.same(res, obj); - t.end(); -}); - -test('remove', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - traverse(obj).forEach(function (x) { - if (this.isLeaf && x % 2 == 0) this.remove(); - }); - - t.same(obj, { a : 1, c : [ 3 ] }); - t.end(); -}); - -exports.removeNoStop = function() { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 }, f: 5 }; - - var keys = []; - traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.remove(); - }); - - t.same(keys, [undefined, 'a', 'b', 'c', 'd', 'e', 'f']) - t.end(); -} - -exports.removeStop = function() { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 }, f: 5 }; - - var keys = []; - traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.remove(true); - }); - - t.same(keys, [undefined, 'a', 'b', 'c', 'f']) - t.end(); -} - -test('removeMap', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).map(function (x) { - if (this.isLeaf && x % 2 == 0) this.remove(); - }); - - t.same(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - t.same(res, { a : 1, c : [ 3 ] }); - t.end(); -}); - -test('delete', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - traverse(obj).forEach(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - t.ok(!deepEqual( - obj, { a : 1, c : [ 3, undefined ] } - )); - - t.ok(deepEqual( - obj, { a : 1, c : [ 3 ] } - )); - - t.ok(!deepEqual( - obj, { a : 1, c : [ 3, null ] } - )); - t.end(); -}); - -test('deleteNoStop', function (t) { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 } }; - - var keys = []; - traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.delete(); - }); - - t.same(keys, [undefined, 'a', 'b', 'c', 'd', 'e']) - t.end(); -}); - -test('deleteStop', function (t) { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 } }; - - var keys = []; - traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.delete(true); - }); - - t.same(keys, [undefined, 'a', 'b', 'c']) - t.end(); -}); - -test('deleteRedux', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4, 5 ] }; - traverse(obj).forEach(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - t.ok(!deepEqual( - obj, { a : 1, c : [ 3, undefined, 5 ] } - )); - - t.ok(deepEqual( - obj, { a : 1, c : [ 3 ,, 5 ] } - )); - - t.ok(!deepEqual( - obj, { a : 1, c : [ 3, null, 5 ] } - )); - - t.ok(!deepEqual( - obj, { a : 1, c : [ 3, 5 ] } - )); - - t.end(); -}); - -test('deleteMap', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).map(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - t.ok(deepEqual( - obj, - { a : 1, b : 2, c : [ 3, 4 ] } - )); - - var xs = [ 3, 4 ]; - delete xs[1]; - - t.ok(deepEqual( - res, { a : 1, c : xs } - )); - - t.ok(deepEqual( - res, { a : 1, c : [ 3, ] } - )); - - t.ok(deepEqual( - res, { a : 1, c : [ 3 ] } - )); - - t.end(); -}); - -test('deleteMapRedux', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4, 5 ] }; - var res = traverse(obj).map(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - t.ok(deepEqual( - obj, - { a : 1, b : 2, c : [ 3, 4, 5 ] } - )); - - var xs = [ 3, 4, 5 ]; - delete xs[1]; - - t.ok(deepEqual( - res, { a : 1, c : xs } - )); - - t.ok(!deepEqual( - res, { a : 1, c : [ 3, 5 ] } - )); - - t.ok(deepEqual( - res, { a : 1, c : [ 3 ,, 5 ] } - )); - - t.end(); -}); - -test('objectToString', function (t) { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = traverse(obj).forEach(function (x) { - if (typeof x === 'object' && !this.isRoot) { - this.update(JSON.stringify(x)); - } - }); - t.same(obj, res); - t.same(obj, { a : 1, b : 2, c : "[3,4]" }); - t.end(); -}); - -test('stringToObject', function (t) { - var obj = { a : 1, b : 2, c : "[3,4]" }; - var res = traverse(obj).forEach(function (x) { - if (typeof x === 'string') { - this.update(JSON.parse(x)); - } - else if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - t.deepEqual(obj, res); - t.deepEqual(obj, { a : 1, b : 20, c : [ 3, 40 ] }); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/negative.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/negative.js deleted file mode 100644 index 91566c8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/negative.js +++ /dev/null @@ -1,21 +0,0 @@ -var traverse = require('../'); -var test = require('tape'); - -test('negative update test', function (t) { - var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - var fixed = traverse.map(obj, function (x) { - if (x < 0) this.update(x + 128); - }); - - t.same(fixed, - [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ], - 'Negative values += 128' - ); - - t.same(obj, - [ 5, 6, -3, [ 7, 8, -2, 1 ], { f: 10, g: -13 } ], - 'Original references not modified' - ); - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/obj.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/obj.js deleted file mode 100644 index 8bcf58a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/obj.js +++ /dev/null @@ -1,11 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('traverse an object with nested functions', function (t) { - t.plan(1); - - function Cons (x) { - t.equal(x, 10) - }; - traverse(new Cons(10)); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/siblings.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/siblings.js deleted file mode 100644 index c59e557..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/siblings.js +++ /dev/null @@ -1,37 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('siblings', function (t) { - var obj = { a : 1, b : 2, c : [ 4, 5, 6 ] }; - - var res = traverse(obj).reduce(function (acc, x) { - var p = '/' + this.path.join('/'); - if (this.parent) { - acc[p] = { - siblings : this.parent.keys, - key : this.key, - index : this.parent.keys.indexOf(this.key) - }; - } - else { - acc[p] = { - siblings : [], - key : this.key, - index : -1 - } - } - return acc; - }, {}); - - t.same(res, { - '/' : { siblings : [], key : undefined, index : -1 }, - '/a' : { siblings : [ 'a', 'b', 'c' ], key : 'a', index : 0 }, - '/b' : { siblings : [ 'a', 'b', 'c' ], key : 'b', index : 1 }, - '/c' : { siblings : [ 'a', 'b', 'c' ], key : 'c', index : 2 }, - '/c/0' : { siblings : [ '0', '1', '2' ], key : '0', index : 0 }, - '/c/1' : { siblings : [ '0', '1', '2' ], key : '1', index : 1 }, - '/c/2' : { siblings : [ '0', '1', '2' ], key : '2', index : 2 } - }); - - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stop.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stop.js deleted file mode 100644 index 9ce15b0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stop.js +++ /dev/null @@ -1,44 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('stop', function (t) { - var visits = 0; - traverse('abcdefghij'.split('')).forEach(function (node) { - if (typeof node === 'string') { - visits ++; - if (node === 'e') this.stop() - } - }); - - t.equal(visits, 5); - t.end(); -}); - -test('stopMap', function (t) { - var s = traverse('abcdefghij'.split('')).map(function (node) { - if (typeof node === 'string') { - if (node === 'e') this.stop() - return node.toUpperCase(); - } - }).join(''); - - t.equal(s, 'ABCDEfghij'); - t.end(); -}); - -test('stopReduce', function (t) { - var obj = { - a : [ 4, 5 ], - b : [ 6, [ 7, 8, 9 ] ] - }; - var xs = traverse(obj).reduce(function (acc, node) { - if (this.isLeaf) { - if (node === 7) this.stop(); - else acc.push(node) - } - return acc; - }, []); - - t.same(xs, [ 4, 5, 6 ]); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stringify.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stringify.js deleted file mode 100644 index f1680d8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/stringify.js +++ /dev/null @@ -1,36 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); - -test('stringify', function (t) { - var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - - var s = ''; - traverse(obj).forEach(function (node) { - if (Array.isArray(node)) { - this.before(function () { s += '[' }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += ']' }); - } - else if (typeof node == 'object') { - this.before(function () { s += '{' }); - this.pre(function (x, key) { - s += '"' + key + '"' + ':'; - }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += '}' }); - } - else if (typeof node == 'function') { - s += 'null'; - } - else { - s += node.toString(); - } - }); - - t.equal(s, JSON.stringify(obj)); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/subexpr.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/subexpr.js deleted file mode 100644 index 7682608..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/subexpr.js +++ /dev/null @@ -1,36 +0,0 @@ -var traverse = require('../'); -var test = require('tape'); - -test('subexpr', function (t) { - var obj = [ 'a', 4, 'b', 5, 'c', 6 ]; - var r = traverse(obj).map(function (x) { - if (typeof x === 'number') { - this.update([ x - 0.1, x, x + 0.1 ], true); - } - }); - - t.same(obj, [ 'a', 4, 'b', 5, 'c', 6 ]); - t.same(r, [ - 'a', [ 3.9, 4, 4.1 ], - 'b', [ 4.9, 5, 5.1 ], - 'c', [ 5.9, 6, 6.1 ], - ]); - t.end(); -}); - -test('block', function (t) { - var obj = [ [ 1 ], [ 2 ], [ 3 ] ]; - var r = traverse(obj).map(function (x) { - if (Array.isArray(x) && !this.isRoot) { - if (x[0] === 5) this.block() - else this.update([ [ x[0] + 1 ] ]) - } - }); - - t.same(r, [ - [ [ [ [ [ 5 ] ] ] ] ], - [ [ [ [ 5 ] ] ] ], - [ [ [ 5 ] ] ], - ]); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/super_deep.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/super_deep.js deleted file mode 100644 index 1eb9e26..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/test/super_deep.js +++ /dev/null @@ -1,56 +0,0 @@ -var test = require('tape'); -var traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); - -test('super_deep', function (t) { - var util = require('util'); - var a0 = make(); - var a1 = make(); - t.ok(deepEqual(a0, a1)); - - a0.c.d.moo = true; - t.ok(!deepEqual(a0, a1)); - - a1.c.d.moo = true; - t.ok(deepEqual(a0, a1)); - - // TODO: this one - //a0.c.a = a1; - //t.ok(!deepEqual(a0, a1)); - t.end(); -}); - -function make () { - var a = { self : 'a' }; - var b = { self : 'b' }; - var c = { self : 'c' }; - var d = { self : 'd' }; - var e = { self : 'e' }; - - a.a = a; - a.b = b; - a.c = c; - - b.a = a; - b.b = b; - b.c = c; - - c.a = a; - c.b = b; - c.c = c; - c.d = d; - - d.a = a; - d.b = b; - d.c = c; - d.d = d; - d.e = e; - - e.a = a; - e.b = b; - e.c = c; - e.d = d; - e.e = e; - - return a; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/testling/leaves.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/testling/leaves.js deleted file mode 100644 index 29968dd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/node_modules/traverse/testling/leaves.js +++ /dev/null @@ -1,22 +0,0 @@ -var traverse = require('./'); -var test = require('testling'); - -test('leaves', function (t) { - var obj = { - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 } - }; - - var acc = []; - traverse(obj).forEach(function (x) { - if (this.isLeaf) acc.push(x); - }); - - t.deepEqual( - acc, [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], - 'traversal in the proper order' - ); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/package.json deleted file mode 100644 index 0eba07a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "difflet", - "description": "colorful diffs for javascript objects", - "version": "0.2.6", - "repository": { - "type": "git", - "url": "git://github.com/substack/difflet.git" - }, - "main": "index.js", - "keywords": [ - "diff", - "object", - "compare" - ], - "directories": { - "lib": ".", - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tap test/*.js" - }, - "dependencies": { - "traverse": "0.6.x", - "charm": "0.1.x", - "deep-is": "0.1.x" - }, - "devDependencies": { - "tap": "0.1.x", - "ent": "0.0.x" - }, - "engines": { - "node": ">=0.4.0" - }, - "license": "MIT", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "readme": "difflet\n=======\n\nCreate colorful diffs for javascript objects.\n\nexample\n=======\n\nstring.js\n---------\n\n``` js\nvar difflet = require('difflet');\n\nvar s = difflet.compare({ a : 2, c : 5 }, { a : 3, b : 4 });\nprocess.stdout.write(s);\n```\n\noutput:\n\n![colorful output](http://substack.net/images/screenshots/difflet_string.png)\n\ncolors.js\n---------\n\n``` js\nvar diff = require('difflet')({ indent : 2 });\n\nvar prev = {\n yy : 6,\n zz : 5,\n a : [1,2,3],\n fn : 'beep',\n c : { x : 7, z : 3 }\n};\n\nvar next = {\n a : [ 1, 2, \"z\", /beep/, new Buffer(3) ],\n fn : function qqq () {},\n b : [5,6,7],\n c : { x : 8, y : 5 }\n};\n\ndiff(prev, next).pipe(process.stdout);\n```\n\noutput:\n\n![colorful output](http://substack.net/images/screenshots/difflet_colors.png)\n\ngreen for inserts, blue for updates, red for deletes\n\nmethods\n=======\n\nvar difflet = require('difflet')\n\nvar diff = difflet(opts={})\n---------------------------\n\nCreate a difflet from optional options `opts`.\n\nWith `opts.start(type, stream)` and `opts.stop(type, stream)`,\nyou can write custom handlers for all the types of differences:\n`'inserted'`, `'updated'`, and `'deleted'`.\nBy default green is used for insertions, blue for updates, and red for\ndeletions.\n\nIf `opts.indent` is set, output will span multiple lines and `opts.indent`\nspaces will be used for leading whitespace.\n\nIf `opts.comma === 'first'` then commas will be placed at the start of lines.\n\nSetting `opts.comment` to `true` will turn on comments with the previous\ncontents like this:\n\n![object comments](http://substack.net/images/screenshots/difflet_object_comments.png)\n\ndiff(prev, next)\n----------------\n\nReturn a stream with the colorful changes between objects `prev` and `next`.\n\ndiff.compare(prev, next)\n------------------------\n\nReturn a string with the colorful changes between `prev` and `next`.\n\ndifflet.compare(prev, next)\n---------------------------\n\nReturn a string with the colorful changes between `prev` and `next` with the\ndefault options.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install difflet\n```\n\ntest\n====\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm test\n```\n\nlicense\n=======\n\nMIT/X11\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/difflet/issues" - }, - "homepage": "https://github.com/substack/difflet", - "_id": "difflet@0.2.6", - "_from": "difflet@~0.2.0" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/diffing-NaN.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/diffing-NaN.js deleted file mode 100644 index d29e6e1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/diffing-NaN.js +++ /dev/null @@ -1,17 +0,0 @@ -var difflet = require('../'); -var diff = difflet(); -var test = require('tap').test; - -test('diffing NaN against NaN', function (t) { - t.plan(1); - var d = diff.compare(NaN, NaN); - - t.equal(d, 'NaN'); -}); - -test('diffing { o: NaN } against { o: NaN }', function (t) { - t.plan(1); - var d = diff.compare({ o: NaN }, { o: NaN }); - - t.equal(d, '{"o":NaN}'); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/html.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/html.js deleted file mode 100644 index 26d2ed4..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/difflet/test/html.js +++ /dev/null @@ -1,80 +0,0 @@ -var difflet = require('../'); -var test = require('tap').test; -var ent = require('ent'); - -var tags = { - inserted : 'g', - updated : 'b', - deleted : 'r', -}; - -test('html output', function (t) { - t.plan(1); - var diff = difflet({ - start : function (t, s) { - s.write('<' + tags[t] + '>'); - }, - stop : function (t, s) { - s.write(''); - }, - write : function (buf, s) { - s.write(ent.encode(buf)); - } - }); - - var stream = diff( - { yy : 6, zz : 5, a : [1,2,3], fn : function qqq () {} }, - { - a : [ 1, 2, 3, [4], "z", /beep/, new Buffer([0,1,2]) ], - fn : function rrr () {}, - b : [5,6,7] - } - ); - - var data = '' - stream.on('data', function (buf) { data += buf }); - stream.on('end', function () { - t.equal(data, - '{"a":[1,2,3,[4],"z",' - + '/beep/,<Buffer 00 01 02>],' - + '"fn":[Function: rrr],' - + '"b":[5,6,7],"yy":6,' - + '"zz":5}' - ); - t.end(); - }); -}); - -test('compare html output', function (t) { - t.plan(1); - - var diff = difflet({ - start : function (t, s) { - s.write('<' + tags[t] + '>'); - }, - stop : function (t, s) { - s.write(''); - }, - write : function (buf, s) { - s.write(ent.encode(buf)); - } - }); - - var data = diff.compare( - { yy : 6, zz : 5, a : [1,2,3], fn : function qqq () {} }, - { - a : [ 1, 2, 3, [4], "z", /beep/, new Buffer([0,1,2]) ], - fn : function rrr () {}, - b : [5,6,7] - } - ); - - t.equal(data, - '{"a":[1,2,3,[4],"z",' - + '/beep/,<Buffer 00 01 02>],' - + '"fn":[Function: rrr],' - + '"b":[5,6,7],"yy":6,' - + '"zz":5}' - ); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.npmignore deleted file mode 100644 index 2af4b71..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -.*.swp -test/a/ diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.travis.yml deleted file mode 100644 index baa0031..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - 0.8 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/LICENSE deleted file mode 100644 index 0c44ae7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Isaac Z. Schlueter ("Author") -All rights reserved. - -The BSD License - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/README.md deleted file mode 100644 index cc69164..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/README.md +++ /dev/null @@ -1,250 +0,0 @@ -# Glob - -Match files using the patterns the shell uses, like stars and stuff. - -This is a glob implementation in JavaScript. It uses the `minimatch` -library to do its matching. - -## Attention: node-glob users! - -The API has changed dramatically between 2.x and 3.x. This library is -now 100% JavaScript, and the integer flags have been replaced with an -options object. - -Also, there's an event emitter class, proper tests, and all the other -things you've come to expect from node modules. - -And best of all, no compilation! - -## Usage - -```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. -}) -``` - -## Features - -Please see the [minimatch -documentation](https://github.com/isaacs/minimatch) for more details. - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` -* [minimatch documentation](https://github.com/isaacs/minimatch) - -## 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 instanting 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. -* `error` The error encountered. When an error is encountered, the - glob object is in an undefined state, and should be discarded. -* `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. -* `statCache` Collection of all the stat results the glob search - performed. -* `cache` Convenience object. Each field has the following possible - values: - * `false` - Path does not exist - * `true` - Path exists - * `1` - Path exists, and is not a directory - * `2` - Path exists, and is a directory - * `[file, entries, ...]` - Path exists, is a directory, and the - array value is the results of `fs.readdir` - -### 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 matched. -* `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 - -* `abort` Stop the search. - -### 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. - -* `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. It will cause - ELOOP to be triggered one level sooner in the case of cyclical - symbolic links. -* `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.) -* `sync` Perform a synchronous glob search. -* `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). -* `nocase` Perform a case-insensitive match. Note that case-insensitive - filesystems will sometimes result in glob returning results that are - case-insensitively matched anyway, since readdir and stat will not - raise an error. -* `debug` Set to enable debug logging in minimatch and glob. -* `globDebug` Set to enable debug logging in glob, but not minimatch. - -## 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. - -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 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. - -## 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. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/g.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/g.js deleted file mode 100644 index be122df..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/g.js +++ /dev/null @@ -1,9 +0,0 @@ -var Glob = require("../").Glob - -var pattern = "test/a/**/[cg]/../[cg]" -console.log(pattern) - -var mg = new Glob(pattern, {mark: true, sync:true}, function (er, matches) { - console.log("matches", matches) -}) -console.log("after") diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/usr-local.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/usr-local.js deleted file mode 100644 index 327a425..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/examples/usr-local.js +++ /dev/null @@ -1,9 +0,0 @@ -var Glob = require("../").Glob - -var pattern = "{./*/*,/*,/usr/local/*}" -console.log(pattern) - -var mg = new Glob(pattern, {mark: true}, function (er, matches) { - console.log("matches", matches) -}) -console.log("after") diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/glob.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/glob.js deleted file mode 100644 index f646c44..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/glob.js +++ /dev/null @@ -1,728 +0,0 @@ -// Approach: -// -// 1. Get the minimatch set -// 2. For each pattern in the set, PROCESS(pattern) -// 3. Store matches per-set, then uniq them -// -// PROCESS(pattern) -// 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. -// readdir(PREFIX) as ENTRIES -// If fails, END -// 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 .. $]) -// // handle other cases. -// for ENTRY in ENTRIES (not dotfiles) -// // attach globstar + tail onto the entry -// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $]) -// -// 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") -, minimatch = require("minimatch") -, Minimatch = minimatch.Minimatch -, inherits = require("inherits") -, EE = require("events").EventEmitter -, path = require("path") -, isDir = {} -, assert = require("assert").ok - -function glob (pattern, options, cb) { - if (typeof options === "function") cb = options, options = {} - if (!options) options = {} - - if (typeof options === "number") { - deprecated() - return - } - - var g = new Glob(pattern, options, cb) - return g.sync ? g.found : g -} - -glob.fnmatch = deprecated - -function deprecated () { - throw new Error("glob's interface has changed. Please see the docs.") -} - -glob.sync = globSync -function globSync (pattern, options) { - if (typeof options === "number") { - deprecated() - return - } - - options = options || {} - options.sync = true - return glob(pattern, options) -} - -this._processingEmitQueue = false - -glob.Glob = Glob -inherits(Glob, EE) -function Glob (pattern, options, cb) { - if (!(this instanceof Glob)) { - return new Glob(pattern, options, cb) - } - - if (typeof options === "function") { - cb = options - options = null - } - - if (typeof cb === "function") { - this.on("error", cb) - this.on("end", function (matches) { - cb(null, matches) - }) - } - - options = options || {} - - this._endEmitted = false - this.EOF = {} - this._emitQueue = [] - - this.paused = false - this._processingEmitQueue = false - - this.maxDepth = options.maxDepth || 1000 - this.maxLength = options.maxLength || Infinity - this.cache = options.cache || {} - this.statCache = options.statCache || {} - - this.changedCwd = false - var cwd = process.cwd() - if (!options.hasOwnProperty("cwd")) this.cwd = cwd - else { - this.cwd = options.cwd - this.changedCwd = path.resolve(options.cwd) !== cwd - } - - this.root = options.root || path.resolve(this.cwd, "/") - this.root = path.resolve(this.root) - if (process.platform === "win32") - this.root = this.root.replace(/\\/g, "/") - - this.nomount = !!options.nomount - - if (!pattern) { - throw new Error("must provide pattern") - } - - // 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 - } - - this.strict = options.strict !== false - this.dot = !!options.dot - this.mark = !!options.mark - this.sync = !!options.sync - this.nounique = !!options.nounique - this.nonull = !!options.nonull - this.nosort = !!options.nosort - this.nocase = !!options.nocase - this.stat = !!options.stat - - this.debug = !!options.debug || !!options.globDebug - if (this.debug) - this.log = console.error - - this.silent = !!options.silent - - var mm = this.minimatch = new Minimatch(pattern, options) - this.options = mm.options - pattern = this.pattern = mm.pattern - - this.error = null - this.aborted = false - - // list of all the patterns that ** has resolved do, so - // we can avoid visiting multiple times. - this._globstars = {} - - EE.call(this) - - // 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) - - this.minimatch.set.forEach(iterator.bind(this)) - function iterator (pattern, i, set) { - this._process(pattern, 0, i, function (er) { - if (er) this.emit("error", er) - if (-- n <= 0) this._finish() - }) - } -} - -Glob.prototype.log = function () {} - -Glob.prototype._finish = function () { - assert(this instanceof Glob) - - var nou = this.nounique - , all = nou ? [] : {} - - for (var i = 0, l = this.matches.length; i < l; i ++) { - var matches = this.matches[i] - this.log("matches[%d] =", i, matches) - // do like the shell, and spit out the literal glob - if (!matches) { - if (this.nonull) { - var literal = this.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 (!this.nosort) { - all = all.sort(this.nocase ? alphasorti : alphasort) - } - - if (this.mark) { - // at *some* point we statted all of these - all = all.map(this._mark, this) - } - - this.log("emitting end", all) - - this.EOF = this.found = all - this.emitMatch(this.EOF) -} - -function alphasorti (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return alphasort(a, b) -} - -function alphasort (a, b) { - return a > b ? 1 : a < b ? -1 : 0 -} - -Glob.prototype._mark = function (p) { - var c = this.cache[p] - var m = p - if (c) { - var isDir = c === 2 || Array.isArray(c) - var slash = p.slice(-1) === '/' - - if (isDir && !slash) - m += '/' - else if (!isDir && slash) - m = m.slice(0, -1) - - if (m !== p) { - this.statCache[m] = this.statCache[p] - this.cache[m] = this.cache[p] - } - } - - return m -} - -Glob.prototype.abort = function () { - this.aborted = true - this.emit("abort") -} - -Glob.prototype.pause = function () { - if (this.paused) return - if (this.sync) - this.emit("error", new Error("Can't pause/resume sync glob")) - this.paused = true - this.emit("pause") -} - -Glob.prototype.resume = function () { - if (!this.paused) return - if (this.sync) - this.emit("error", new Error("Can't pause/resume sync glob")) - this.paused = false - this.emit("resume") - this._processEmitQueue() - //process.nextTick(this.emit.bind(this, "resume")) -} - -Glob.prototype.emitMatch = function (m) { - this.log('emitMatch', m) - this._emitQueue.push(m) - this._processEmitQueue() -} - -Glob.prototype._processEmitQueue = function (m) { - this.log("pEQ paused=%j processing=%j m=%j", this.paused, - this._processingEmitQueue, m) - var done = false - while (!this._processingEmitQueue && - !this.paused) { - this._processingEmitQueue = true - var m = this._emitQueue.shift() - this.log(">processEmitQueue", m === this.EOF ? ":EOF:" : m) - if (!m) { - this.log(">processEmitQueue, falsey m") - this._processingEmitQueue = false - break - } - - if (m === this.EOF || !(this.mark && !this.stat)) { - this.log("peq: unmarked, or eof") - next.call(this, 0, false) - } else if (this.statCache[m]) { - var sc = this.statCache[m] - var exists - if (sc) - exists = sc.isDirectory() ? 2 : 1 - this.log("peq: stat cached") - next.call(this, exists, exists === 2) - } else { - this.log("peq: _stat, then next") - this._stat(m, next) - } - - function next(exists, isDir) { - this.log("next", m, exists, isDir) - var ev = m === this.EOF ? "end" : "match" - - // "end" can only happen once. - assert(!this._endEmitted) - if (ev === "end") - this._endEmitted = true - - if (exists) { - // Doesn't mean it necessarily doesn't exist, it's possible - // we just didn't check because we don't care that much, or - // this is EOF anyway. - if (isDir && !m.match(/\/$/)) { - m = m + "/" - } else if (!isDir && m.match(/\/$/)) { - m = m.replace(/\/+$/, "") - } - } - this.log("emit", ev, m) - this.emit(ev, m) - this._processingEmitQueue = false - if (done && m !== this.EOF && !this.paused) - this._processEmitQueue() - } - } - done = true -} - -Glob.prototype._process = function (pattern, depth, index, cb_) { - assert(this instanceof Glob) - - var cb = function cb (er, res) { - assert(this instanceof Glob) - if (this.paused) { - if (!this._processQueue) { - this._processQueue = [] - this.once("resume", function () { - var q = this._processQueue - this._processQueue = null - q.forEach(function (cb) { cb() }) - }) - } - this._processQueue.push(cb_.bind(this, er, res)) - } else { - cb_.call(this, er, res) - } - }.bind(this) - - if (this.aborted) return cb() - - if (depth > this.maxDepth) return cb() - - // 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: - prefix = pattern.join("/") - this._stat(prefix, function (exists, isDir) { - // either it's there, or it isn't. - // nothing more to do, either way. - if (exists) { - if (prefix && isAbsolute(prefix) && !this.nomount) { - if (prefix.charAt(0) === "/") { - prefix = path.join(this.root, prefix) - } else { - prefix = path.resolve(this.root, prefix) - } - } - - if (process.platform === "win32") - prefix = prefix.replace(/\\/g, "/") - - this.matches[index] = this.matches[index] || {} - this.matches[index][prefix] = true - this.emitMatch(prefix) - } - return 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) - prefix = prefix.join("/") - break - } - - // get the list of entries. - var read - if (prefix === null) read = "." - else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) { - if (!prefix || !isAbsolute(prefix)) { - prefix = path.join("/", prefix) - } - read = prefix = path.resolve(prefix) - - // if (process.platform === "win32") - // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/") - - this.log('absolute: ', prefix, this.root, pattern, read) - } else { - read = prefix - } - - this.log('readdir(%j)', read, this.cwd, this.root) - - return this._readdir(read, function (er, entries) { - if (er) { - // not a directory! - // this means that, whatever else comes after this, it can never match - return cb() - } - - // globstar is special - if (pattern[n] === minimatch.GLOBSTAR) { - // test without the globstar, and with every child both below - // and replacing the globstar. - var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ] - entries.forEach(function (e) { - if (e.charAt(0) === "." && !this.dot) return - // instead of the globstar - s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))) - // below the globstar - s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n))) - }, this) - - s = s.filter(function (pattern) { - var key = gsKey(pattern) - var seen = !this._globstars[key] - this._globstars[key] = true - return seen - }, this) - - if (!s.length) - return cb() - - // now asyncForEach over this - var l = s.length - , errState = null - s.forEach(function (gsPattern) { - this._process(gsPattern, depth + 1, index, function (er) { - if (errState) return - if (er) return cb(errState = er) - if (--l <= 0) return cb() - }) - }, this) - - return - } - - // not a globstar - // 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 = pattern[n] - var rawGlob = pattern[n]._glob - , dotOk = this.dot || rawGlob.charAt(0) === "." - - entries = entries.filter(function (e) { - return (e.charAt(0) !== "." || dotOk) && - e.match(pattern[n]) - }) - - // If n === pattern.length - 1, then there's no need for the extra stat - // *unless* the user has specified "mark" or "stat" explicitly. - // We know that they exist, since the readdir returned them. - if (n === pattern.length - 1 && - !this.mark && - !this.stat) { - entries.forEach(function (e) { - if (prefix) { - if (prefix !== "/") e = prefix + "/" + e - else e = prefix + e - } - if (e.charAt(0) === "/" && !this.nomount) { - e = path.join(this.root, e) - } - - if (process.platform === "win32") - e = e.replace(/\\/g, "/") - - this.matches[index] = this.matches[index] || {} - this.matches[index][e] = true - this.emitMatch(e) - }, this) - return cb.call(this) - } - - - // now test all the remaining entries as stand-ins for that part - // of the pattern. - var l = entries.length - , errState = null - if (l === 0) return cb() // no matches possible - entries.forEach(function (e) { - var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)) - this._process(p, depth + 1, index, function (er) { - if (errState) return - if (er) return cb(errState = er) - if (--l === 0) return cb.call(this) - }) - }, this) - }) - -} - -function gsKey (pattern) { - return '**' + pattern.map(function (p) { - return (p === minimatch.GLOBSTAR) ? '**' : (''+p) - }).join('/') -} - -Glob.prototype._stat = function (f, cb) { - assert(this instanceof Glob) - var abs = f - if (f.charAt(0) === "/") { - abs = path.join(this.root, f) - } else if (this.changedCwd) { - abs = path.resolve(this.cwd, f) - } - - if (f.length > this.maxLength) { - var er = new Error("Path name too long") - er.code = "ENAMETOOLONG" - er.path = f - return this._afterStat(f, abs, cb, er) - } - - this.log('stat', [this.cwd, f, '=', abs]) - - if (!this.stat && this.cache.hasOwnProperty(f)) { - var exists = this.cache[f] - , isDir = exists && (Array.isArray(exists) || exists === 2) - if (this.sync) return cb.call(this, !!exists, isDir) - return process.nextTick(cb.bind(this, !!exists, isDir)) - } - - var stat = this.statCache[abs] - if (this.sync || stat) { - var er - try { - stat = fs.statSync(abs) - } catch (e) { - er = e - } - this._afterStat(f, abs, cb, er, stat) - } else { - fs.stat(abs, this._afterStat.bind(this, f, abs, cb)) - } -} - -Glob.prototype._afterStat = function (f, abs, cb, er, stat) { - var exists - assert(this instanceof Glob) - - if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) { - this.log("should be ENOTDIR, fake it") - - er = new Error("ENOTDIR, not a directory '" + abs + "'") - er.path = abs - er.code = "ENOTDIR" - stat = null - } - - var emit = !this.statCache[abs] - this.statCache[abs] = stat - - if (er || !stat) { - exists = false - } else { - exists = stat.isDirectory() ? 2 : 1 - if (emit) - this.emit('stat', f, stat) - } - this.cache[f] = this.cache[f] || exists - cb.call(this, !!exists, exists === 2) -} - -Glob.prototype._readdir = function (f, cb) { - assert(this instanceof Glob) - var abs = f - if (f.charAt(0) === "/") { - abs = path.join(this.root, f) - } else if (isAbsolute(f)) { - abs = f - } else if (this.changedCwd) { - abs = path.resolve(this.cwd, f) - } - - if (f.length > this.maxLength) { - var er = new Error("Path name too long") - er.code = "ENAMETOOLONG" - er.path = f - return this._afterReaddir(f, abs, cb, er) - } - - this.log('readdir', [this.cwd, f, abs]) - if (this.cache.hasOwnProperty(f)) { - var c = this.cache[f] - if (Array.isArray(c)) { - if (this.sync) return cb.call(this, null, c) - return process.nextTick(cb.bind(this, null, c)) - } - - if (!c || c === 1) { - // either ENOENT or ENOTDIR - var code = c ? "ENOTDIR" : "ENOENT" - , er = new Error((c ? "Not a directory" : "Not found") + ": " + f) - er.path = f - er.code = code - this.log(f, er) - if (this.sync) return cb.call(this, er) - return process.nextTick(cb.bind(this, er)) - } - - // at this point, c === 2, meaning it's a dir, but we haven't - // had to read it yet, or c === true, meaning it's *something* - // but we don't have any idea what. Need to read it, either way. - } - - if (this.sync) { - var er, entries - try { - entries = fs.readdirSync(abs) - } catch (e) { - er = e - } - return this._afterReaddir(f, abs, cb, er, entries) - } - - fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb)) -} - -Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) { - assert(this instanceof Glob) - if (entries && !er) { - this.cache[f] = entries - // if we haven't asked to stat everything for suresies, then just - // assume that everything in there exists, so we can avoid - // having to stat it a second time. This also gets us one step - // further into ELOOP territory. - if (!this.mark && !this.stat) { - entries.forEach(function (e) { - if (f === "/") e = f + e - else e = f + "/" + e - this.cache[e] = true - }, this) - } - - return cb.call(this, er, entries) - } - - // now handle errors, and cache the information - if (er) switch (er.code) { - case "ENOTDIR": // totally normal. means it *does* exist. - this.cache[f] = 1 - return cb.call(this, er) - case "ENOENT": // not terribly unusual - case "ELOOP": - case "ENAMETOOLONG": - case "UNKNOWN": - this.cache[f] = false - return cb.call(this, er) - default: // some unusual error. Treat as failure. - this.cache[f] = false - if (this.strict) this.emit("error", er) - if (!this.silent) console.error("glob error", er) - return cb.call(this, er) - } -} - -var isAbsolute = process.platform === "win32" ? absWin : absUnix - -function absWin (p) { - if (absUnix(p)) return true - // pull off the device/UNC bit from a windows path. - // from node's lib/path.js - var splitDeviceRe = - /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/ - , result = splitDeviceRe.exec(p) - , device = result[1] || '' - , isUnc = device && device.charAt(1) !== ':' - , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute - - return isAbsolute -} - -function absUnix (p) { - return p.charAt(0) === "/" || p === "" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits_browser.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/package.json deleted file mode 100644 index 5bf0db5..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "homepage": "https://github.com/isaacs/inherits", - "_id": "inherits@2.0.1", - "_from": "inherits@2" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/README.md deleted file mode 100644 index 5b3967e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/README.md +++ /dev/null @@ -1,218 +0,0 @@ -# minimatch - -A minimal matching utility. - -[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch) - - -This is the matching library used internally by npm. - -Eventually, it will replace the C binding in node-glob. - -It works by converting glob expressions into JavaScript `RegExp` -objects. - -## Usage - -```javascript -var minimatch = require("minimatch") - -minimatch("bar.foo", "*.foo") // true! -minimatch("bar.foo", "*.bar") // false! -minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy! -``` - -## Features - -Supports these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - -See: - -* `man sh` -* `man bash` -* `man 3 fnmatch` -* `man 5 gitignore` - -## Minimatch Class - -Create a minimatch object by instanting the `minimatch.Minimatch` class. - -```javascript -var Minimatch = require("minimatch").Minimatch -var mm = new Minimatch(pattern, options) -``` - -### Properties - -* `pattern` The original pattern the minimatch object represents. -* `options` The options supplied to the constructor. -* `set` A 2-dimensional array of regexp or string expressions. - Each row in the - array corresponds to a brace-expanded pattern. Each item in the row - corresponds to a single path-part. For example, the pattern - `{a,b/c}/d` would expand to a set of patterns like: - - [ [ a, d ] - , [ b, c, d ] ] - - If a portion of the pattern doesn't have any "magic" in it - (that is, it's something like `"foo"` rather than `fo*o?`), then it - will be left as a string rather than converted to a regular - expression. - -* `regexp` Created by the `makeRe` method. A single regular expression - expressing the entire pattern. This is useful in cases where you wish - to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled. -* `negate` True if the pattern is negated. -* `comment` True if the pattern is a comment. -* `empty` True if the pattern is `""`. - -### Methods - -* `makeRe` Generate the `regexp` member if necessary, and return it. - Will return `false` if the pattern is invalid. -* `match(fname)` Return true if the filename matches the pattern, or - false otherwise. -* `matchOne(fileArray, patternArray, partial)` Take a `/`-split - filename, and match it against a single row in the `regExpSet`. This - method is mainly for internal use, but is exposed so that it can be - used by a glob-walker that needs to avoid excessive filesystem calls. - -All other methods are internal, and will be called as necessary. - -## Functions - -The top-level exported function has a `cache` property, which is an LRU -cache set to store 100 items. So, calling these methods repeatedly -with the same pattern and options will use the same Minimatch object, -saving the cost of parsing it multiple times. - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```javascript -var isJS = minimatch(file, "*.js", { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```javascript -var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) -``` - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```javascript -var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself 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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/minimatch.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/minimatch.js deleted file mode 100644 index 4539678..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/minimatch.js +++ /dev/null @@ -1,1061 +0,0 @@ -;(function (require, exports, module, platform) { - -if (module) module.exports = minimatch -else exports.minimatch = minimatch - -if (!require) { - require = function (id) { - switch (id) { - case "sigmund": return function sigmund (obj) { - return JSON.stringify(obj) - } - case "path": return { basename: function (f) { - f = f.split(/[\/\\]/) - var e = f.pop() - if (!e) e = f.pop() - return e - }} - case "lru-cache": return function LRUCache () { - // not quite an LRU, but still space-limited. - var cache = {} - var cnt = 0 - this.set = function (k, v) { - cnt ++ - if (cnt >= 100) cache = {} - cache[k] = v - } - this.get = function (k) { return cache[k] } - } - } - } -} - -minimatch.Minimatch = Minimatch - -var LRU = require("lru-cache") - , cache = minimatch.cache = new LRU({max: 100}) - , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} - , sigmund = require("sigmund") - -var path = require("path") - // any single thing other than / - // don't need to escape / when using new RegExp() - , qmark = "[^/]" - - // * => any number of characters - , star = qmark + "*?" - - // ** when dots are allowed. Anything goes, except .. and . - // not (^ or / followed by one or two dots followed by $ or /), - // followed by anything, any number of times. - , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" - - // not a ^ or / followed by a dot, - // followed by anything, any number of times. - , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" - - // characters that need to be escaped in RegExp. - , reSpecials = charSet("().*{}+?[]^$\\!") - -// "abc" -> { a:true, b:true, c:true } -function charSet (s) { - return s.split("").reduce(function (set, c) { - set[c] = true - return set - }, {}) -} - -// normalizes slashes. -var slashSplit = /\/+/ - -minimatch.filter = filter -function filter (pattern, options) { - options = options || {} - return function (p, i, list) { - return minimatch(p, pattern, options) - } -} - -function ext (a, b) { - a = a || {} - b = b || {} - var t = {} - Object.keys(b).forEach(function (k) { - t[k] = b[k] - }) - Object.keys(a).forEach(function (k) { - t[k] = a[k] - }) - return t -} - -minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return minimatch - - var orig = minimatch - - var m = function minimatch (p, pattern, options) { - return orig.minimatch(p, pattern, ext(def, options)) - } - - m.Minimatch = function Minimatch (pattern, options) { - return new orig.Minimatch(pattern, ext(def, options)) - } - - return m -} - -Minimatch.defaults = function (def) { - if (!def || !Object.keys(def).length) return Minimatch - return minimatch.defaults(def).Minimatch -} - - -function minimatch (p, pattern, options) { - if (typeof pattern !== "string") { - throw new TypeError("glob pattern string required") - } - - if (!options) options = {} - - // shortcut: comments match nothing. - if (!options.nocomment && pattern.charAt(0) === "#") { - return false - } - - // "" only matches "" - if (pattern.trim() === "") return p === "" - - return new Minimatch(pattern, options).match(p) -} - -function Minimatch (pattern, options) { - if (!(this instanceof Minimatch)) { - return new Minimatch(pattern, options, cache) - } - - if (typeof pattern !== "string") { - throw new TypeError("glob pattern string required") - } - - if (!options) options = {} - pattern = pattern.trim() - - // windows: need to use /, not \ - // On other platforms, \ is a valid (albeit bad) filename char. - if (platform === "win32") { - pattern = pattern.split("\\").join("/") - } - - // lru storage. - // these things aren't particularly big, but walking down the string - // and turning it into a regexp can get pretty costly. - var cacheKey = pattern + "\n" + sigmund(options) - var cached = minimatch.cache.get(cacheKey) - if (cached) return cached - minimatch.cache.set(cacheKey, this) - - this.options = options - this.set = [] - this.pattern = pattern - this.regexp = null - this.negate = false - this.comment = false - this.empty = false - - // make the set of regexps etc. - this.make() -} - -Minimatch.prototype.debug = function() {} - -Minimatch.prototype.make = make -function make () { - // don't do it more than once. - if (this._made) return - - var pattern = this.pattern - var options = this.options - - // empty patterns and comments match nothing. - if (!options.nocomment && pattern.charAt(0) === "#") { - this.comment = true - return - } - if (!pattern) { - this.empty = true - return - } - - // step 1: figure out negation, etc. - this.parseNegate() - - // step 2: expand braces - var set = this.globSet = this.braceExpand() - - if (options.debug) this.debug = console.error - - this.debug(this.pattern, set) - - // step 3: now we have a set, so turn each one into a series of path-portion - // matching patterns. - // These will be regexps, except in the case of "**", which is - // set to the GLOBSTAR object for globstar behavior, - // and will not contain any / characters - set = this.globParts = set.map(function (s) { - return s.split(slashSplit) - }) - - this.debug(this.pattern, set) - - // glob --> regexps - set = set.map(function (s, si, set) { - return s.map(this.parse, this) - }, this) - - this.debug(this.pattern, set) - - // filter out everything that didn't compile properly. - set = set.filter(function (s) { - return -1 === s.indexOf(false) - }) - - this.debug(this.pattern, set) - - this.set = set -} - -Minimatch.prototype.parseNegate = parseNegate -function parseNegate () { - var pattern = this.pattern - , negate = false - , options = this.options - , negateOffset = 0 - - if (options.nonegate) return - - for ( var i = 0, l = pattern.length - ; i < l && pattern.charAt(i) === "!" - ; i ++) { - negate = !negate - negateOffset ++ - } - - if (negateOffset) this.pattern = pattern.substr(negateOffset) - this.negate = negate -} - -// Brace expansion: -// a{b,c}d -> abd acd -// a{b,}c -> abc ac -// a{0..3}d -> a0d a1d a2d a3d -// a{b,c{d,e}f}g -> abg acdfg acefg -// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg -// -// Invalid sets are not expanded. -// a{2..}b -> a{2..}b -// a{b}c -> a{b}c -minimatch.braceExpand = function (pattern, options) { - return new Minimatch(pattern, options).braceExpand() -} - -Minimatch.prototype.braceExpand = braceExpand -function braceExpand (pattern, options) { - options = options || this.options - pattern = typeof pattern === "undefined" - ? this.pattern : pattern - - if (typeof pattern === "undefined") { - throw new Error("undefined pattern") - } - - if (options.nobrace || - !pattern.match(/\{.*\}/)) { - // shortcut. no need to expand. - return [pattern] - } - - var escaping = false - - // examples and comments refer to this crazy pattern: - // a{b,c{d,e},{f,g}h}x{y,z} - // expected: - // abxy - // abxz - // acdxy - // acdxz - // acexy - // acexz - // afhxy - // afhxz - // aghxy - // aghxz - - // everything before the first \{ is just a prefix. - // So, we pluck that off, and work with the rest, - // and then prepend it to everything we find. - if (pattern.charAt(0) !== "{") { - this.debug(pattern) - var prefix = null - for (var i = 0, l = pattern.length; i < l; i ++) { - var c = pattern.charAt(i) - this.debug(i, c) - if (c === "\\") { - escaping = !escaping - } else if (c === "{" && !escaping) { - prefix = pattern.substr(0, i) - break - } - } - - // actually no sets, all { were escaped. - if (prefix === null) { - this.debug("no sets") - return [pattern] - } - - var tail = braceExpand.call(this, pattern.substr(i), options) - return tail.map(function (t) { - return prefix + t - }) - } - - // now we have something like: - // {b,c{d,e},{f,g}h}x{y,z} - // walk through the set, expanding each part, until - // the set ends. then, we'll expand the suffix. - // If the set only has a single member, then'll put the {} back - - // first, handle numeric sets, since they're easier - var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/) - if (numset) { - this.debug("numset", numset[1], numset[2]) - var suf = braceExpand.call(this, pattern.substr(numset[0].length), options) - , start = +numset[1] - , end = +numset[2] - , inc = start > end ? -1 : 1 - , set = [] - for (var i = start; i != (end + inc); i += inc) { - // append all the suffixes - for (var ii = 0, ll = suf.length; ii < ll; ii ++) { - set.push(i + suf[ii]) - } - } - return set - } - - // ok, walk through the set - // We hope, somewhat optimistically, that there - // will be a } at the end. - // If the closing brace isn't found, then the pattern is - // interpreted as braceExpand("\\" + pattern) so that - // the leading \{ will be interpreted literally. - var i = 1 // skip the \{ - , depth = 1 - , set = [] - , member = "" - , sawEnd = false - , escaping = false - - function addMember () { - set.push(member) - member = "" - } - - this.debug("Entering for") - FOR: for (i = 1, l = pattern.length; i < l; i ++) { - var c = pattern.charAt(i) - this.debug("", i, c) - - if (escaping) { - escaping = false - member += "\\" + c - } else { - switch (c) { - case "\\": - escaping = true - continue - - case "{": - depth ++ - member += "{" - continue - - case "}": - depth -- - // if this closes the actual set, then we're done - if (depth === 0) { - addMember() - // pluck off the close-brace - i ++ - break FOR - } else { - member += c - continue - } - - case ",": - if (depth === 1) { - addMember() - } else { - member += c - } - continue - - default: - member += c - continue - } // switch - } // else - } // for - - // now we've either finished the set, and the suffix is - // pattern.substr(i), or we have *not* closed the set, - // and need to escape the leading brace - if (depth !== 0) { - this.debug("didn't close", pattern) - return braceExpand.call(this, "\\" + pattern, options) - } - - // x{y,z} -> ["xy", "xz"] - this.debug("set", set) - this.debug("suffix", pattern.substr(i)) - var suf = braceExpand.call(this, pattern.substr(i), options) - // ["b", "c{d,e}","{f,g}h"] -> - // [["b"], ["cd", "ce"], ["fh", "gh"]] - var addBraces = set.length === 1 - this.debug("set pre-expanded", set) - set = set.map(function (p) { - return braceExpand.call(this, p, options) - }, this) - this.debug("set expanded", set) - - - // [["b"], ["cd", "ce"], ["fh", "gh"]] -> - // ["b", "cd", "ce", "fh", "gh"] - set = set.reduce(function (l, r) { - return l.concat(r) - }) - - if (addBraces) { - set = set.map(function (s) { - return "{" + s + "}" - }) - } - - // now attach the suffixes. - var ret = [] - for (var i = 0, l = set.length; i < l; i ++) { - for (var ii = 0, ll = suf.length; ii < ll; ii ++) { - ret.push(set[i] + suf[ii]) - } - } - return ret -} - -// parse a component of the expanded set. -// At this point, no pattern may contain "/" in it -// so we're going to return a 2d array, where each entry is the full -// pattern, split on '/', and then turned into a regular expression. -// A regexp is made at the end which joins each array with an -// escaped /, and another full one which joins each regexp with |. -// -// Following the lead of Bash 4.1, note that "**" only has special meaning -// when it is the *only* thing in a path portion. Otherwise, any series -// of * is equivalent to a single *. Globstar behavior is enabled by -// default, and can be disabled by setting options.noglobstar. -Minimatch.prototype.parse = parse -var SUBPARSE = {} -function parse (pattern, isSub) { - var options = this.options - - // shortcuts - if (!options.noglobstar && pattern === "**") return GLOBSTAR - if (pattern === "") return "" - - var re = "" - , hasMagic = !!options.nocase - , escaping = false - // ? => one single character - , patternListStack = [] - , plType - , stateChar - , inClass = false - , reClassStart = -1 - , classStart = -1 - // . and .. never match anything that doesn't start with ., - // even when options.dot is set. - , patternStart = pattern.charAt(0) === "." ? "" // anything - // not (start or / followed by . or .. followed by / or end) - : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" - : "(?!\\.)" - , self = this - - function clearStateChar () { - if (stateChar) { - // we had some state-tracking character - // that wasn't consumed by this pass. - switch (stateChar) { - case "*": - re += star - hasMagic = true - break - case "?": - re += qmark - hasMagic = true - break - default: - re += "\\"+stateChar - break - } - self.debug('clearStateChar %j %j', stateChar, re) - stateChar = false - } - } - - for ( var i = 0, len = pattern.length, c - ; (i < len) && (c = pattern.charAt(i)) - ; i ++ ) { - - this.debug("%s\t%s %s %j", pattern, i, re, c) - - // skip over any that are escaped. - if (escaping && reSpecials[c]) { - re += "\\" + c - escaping = false - continue - } - - SWITCH: switch (c) { - case "/": - // completely not allowed, even escaped. - // Should already be path-split by now. - return false - - case "\\": - clearStateChar() - escaping = true - continue - - // the various stateChar values - // for the "extglob" stuff. - case "?": - case "*": - case "+": - case "@": - case "!": - this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) - - // all of those are literals inside a class, except that - // the glob [!a] means [^a] in regexp - if (inClass) { - this.debug(' in class') - if (c === "!" && i === classStart + 1) c = "^" - re += c - continue - } - - // if we already have a stateChar, then it means - // that there was something like ** or +? in there. - // Handle the stateChar, then proceed with this one. - self.debug('call clearStateChar %j', stateChar) - clearStateChar() - stateChar = c - // if extglob is disabled, then +(asdf|foo) isn't a thing. - // just clear the statechar *now*, rather than even diving into - // the patternList stuff. - if (options.noext) clearStateChar() - continue - - case "(": - if (inClass) { - re += "(" - continue - } - - if (!stateChar) { - re += "\\(" - continue - } - - plType = stateChar - patternListStack.push({ type: plType - , start: i - 1 - , reStart: re.length }) - // negation is (?:(?!js)[^/]*) - re += stateChar === "!" ? "(?:(?!" : "(?:" - this.debug('plType %j %j', stateChar, re) - stateChar = false - continue - - case ")": - if (inClass || !patternListStack.length) { - re += "\\)" - continue - } - - clearStateChar() - hasMagic = true - re += ")" - plType = patternListStack.pop().type - // negation is (?:(?!js)[^/]*) - // The others are (?:) - switch (plType) { - case "!": - re += "[^/]*?)" - break - case "?": - case "+": - case "*": re += plType - case "@": break // the default anyway - } - continue - - case "|": - if (inClass || !patternListStack.length || escaping) { - re += "\\|" - escaping = false - continue - } - - clearStateChar() - re += "|" - continue - - // these are mostly the same in regexp and glob - case "[": - // swallow any state-tracking char before the [ - clearStateChar() - - if (inClass) { - re += "\\" + c - continue - } - - inClass = true - classStart = i - reClassStart = re.length - re += c - continue - - case "]": - // a right bracket shall lose its special - // meaning and represent itself in - // a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - if (i === classStart + 1 || !inClass) { - re += "\\" + c - escaping = false - continue - } - - // finish up the class. - hasMagic = true - inClass = false - re += c - continue - - default: - // swallow any state char that wasn't consumed - clearStateChar() - - if (escaping) { - // no need - escaping = false - } else if (reSpecials[c] - && !(c === "^" && inClass)) { - re += "\\" - } - - re += c - - } // switch - } // for - - - // handle the case where we left a class open. - // "[abc" is valid, equivalent to "\[abc" - if (inClass) { - // split where the last [ was, and escape it - // this is a huge pita. We now have to re-walk - // the contents of the would-be class to re-translate - // any characters that were passed through as-is - var cs = pattern.substr(classStart + 1) - , sp = this.parse(cs, SUBPARSE) - re = re.substr(0, reClassStart) + "\\[" + sp[0] - hasMagic = hasMagic || sp[1] - } - - // handle the case where we had a +( thing at the *end* - // of the pattern. - // each pattern list stack adds 3 chars, and we need to go through - // and escape any | chars that were passed through as-is for the regexp. - // Go through and escape them, taking care not to double-escape any - // | chars that were already escaped. - var pl - while (pl = patternListStack.pop()) { - var tail = re.slice(pl.reStart + 3) - // maybe some even number of \, then maybe 1 \, followed by a | - tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { - if (!$2) { - // the | isn't already escaped, so escape it. - $2 = "\\" - } - - // need to escape all those slashes *again*, without escaping the - // one that we need for escaping the | character. As it works out, - // escaping an even number of slashes can be done by simply repeating - // it exactly after itself. That's why this trick works. - // - // I am sorry that you have to see this. - return $1 + $1 + $2 + "|" - }) - - this.debug("tail=%j\n %s", tail, tail) - var t = pl.type === "*" ? star - : pl.type === "?" ? qmark - : "\\" + pl.type - - hasMagic = true - re = re.slice(0, pl.reStart) - + t + "\\(" - + tail - } - - // handle trailing things that only matter at the very end. - clearStateChar() - if (escaping) { - // trailing \\ - re += "\\\\" - } - - // only need to apply the nodot start if the re starts with - // something that could conceivably capture a dot - var addPatternStart = false - switch (re.charAt(0)) { - case ".": - case "[": - case "(": addPatternStart = true - } - - // if the re is not "" at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== "" && hasMagic) re = "(?=.)" + re - - if (addPatternStart) re = patternStart + re - - // parsing just a piece of a larger pattern. - if (isSub === SUBPARSE) { - return [ re, hasMagic ] - } - - // skip the regexp for non-magical patterns - // unescape anything in it, though, so that it'll be - // an exact match against a file etc. - if (!hasMagic) { - return globUnescape(pattern) - } - - var flags = options.nocase ? "i" : "" - , regExp = new RegExp("^" + re + "$", flags) - - regExp._glob = pattern - regExp._src = re - - return regExp -} - -minimatch.makeRe = function (pattern, options) { - return new Minimatch(pattern, options || {}).makeRe() -} - -Minimatch.prototype.makeRe = makeRe -function makeRe () { - if (this.regexp || this.regexp === false) return this.regexp - - // at this point, this.set is a 2d array of partial - // pattern strings, or "**". - // - // It's better to use .match(). This function shouldn't - // be used, really, but it's pretty convenient sometimes, - // when you just want to work with a regex. - var set = this.set - - if (!set.length) return this.regexp = false - var options = this.options - - var twoStar = options.noglobstar ? star - : options.dot ? twoStarDot - : twoStarNoDot - , flags = options.nocase ? "i" : "" - - var re = set.map(function (pattern) { - return pattern.map(function (p) { - return (p === GLOBSTAR) ? twoStar - : (typeof p === "string") ? regExpEscape(p) - : p._src - }).join("\\\/") - }).join("|") - - // must match entire pattern - // ending in a * or ** will make it less strict. - re = "^(?:" + re + ")$" - - // can match anything, as long as it's not this. - if (this.negate) re = "^(?!" + re + ").*$" - - try { - return this.regexp = new RegExp(re, flags) - } catch (ex) { - return this.regexp = false - } -} - -minimatch.match = function (list, pattern, options) { - 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 \ - // On other platforms, \ is a valid (albeit bad) filename char. - if (platform === "win32") { - f = f.split("\\").join("/") - } - - // treat the test path as a set of pathparts. - f = f.split(slashSplit) - this.debug(this.pattern, "split", f) - - // just ONE of the pattern sets in this.set needs to match - // in order for it to be valid. If negating, then just one - // match means that we have failed. - // Either way, return on the first hit. - - var set = this.set - this.debug(this.pattern, "set", set) - - // Find the basename of the path by looking for the last non-empty segment - var filename; - for (var i = f.length - 1; i >= 0; i--) { - filename = f[i] - if (filename) break - } - - for (var i = 0, l = set.length; i < l; i ++) { - var pattern = set[i], file = f - if (options.matchBase && pattern.length === 1) { - file = [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] - , f = file[fi] - - this.debug(pattern, p, f) - - // should be impossible. - // some invalid regexp stuff in the set. - if (p === false) return false - - if (p === GLOBSTAR) { - this.debug('GLOBSTAR', [pattern, p, f]) - - // "**" - // a/**/b/**/c would match the following: - // a/b/x/y/z/c - // a/x/y/z/b/c - // a/b/x/b/x/c - // a/b/c - // To do this, take the rest of the pattern after - // the **, and see if it would match the file remainder. - // If so, return success. - // If not, the ** "swallows" a segment, and try again. - // This is recursively awful. - // - // a/**/b/**/c matching a/b/x/y/z/c - // - a matches a - // - doublestar - // - matchOne(b/x/y/z/c, b/**/c) - // - b matches b - // - doublestar - // - matchOne(x/y/z/c, c) -> no - // - matchOne(y/z/c, c) -> no - // - matchOne(z/c, c) -> no - // - matchOne(c, c) yes, hit - var fr = fi - , pr = pi + 1 - if (pr === pl) { - this.debug('** at the end') - // a ** at the end will just swallow the rest. - // We have found a match. - // however, it will not swallow /.x, unless - // options.dot is set. - // . and .. are *never* matched by **, for explosively - // exponential reasons. - for ( ; fi < fl; fi ++) { - if (file[fi] === "." || file[fi] === ".." || - (!options.dot && file[fi].charAt(0) === ".")) return false - } - return true - } - - // ok, let's see if we can swallow whatever we can. - WHILE: while (fr < fl) { - var swallowee = file[fr] - - this.debug('\nglobstar while', - file, fr, pattern, pr, swallowee) - - // XXX remove this slice. Just pass the start index. - if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { - this.debug('globstar found match!', fr, fl, swallowee) - // found a match. - return true - } else { - // can't swallow "." or ".." ever. - // can only swallow ".foo" when explicitly asked. - if (swallowee === "." || swallowee === ".." || - (!options.dot && swallowee.charAt(0) === ".")) { - this.debug("dot detected!", file, fr, pattern, pr) - break WHILE - } - - // ** swallows a segment, and continue. - this.debug('globstar swallow a segment, and continue') - fr ++ - } - } - // no match was found. - // However, in partial mode, we can't say this is necessarily over. - // If there's more *pattern* left, then - if (partial) { - // ran out of file - this.debug("\n>>> no match, partial?", file, fr, pattern, pr) - if (fr === fl) return true - } - return false - } - - // something other than ** - // non-magic patterns just have to match exactly - // patterns with magic have been turned into regexps. - var hit - if (typeof p === "string") { - if (options.nocase) { - hit = f.toLowerCase() === p.toLowerCase() - } else { - hit = f === p - } - this.debug("string match", p, f, hit) - } else { - hit = f.match(p) - this.debug("pattern match", p, f, hit) - } - - if (!hit) return false - } - - // Note: ending in / means that we'll get a final "" - // at the end of the pattern. This can only match a - // corresponding "" at the end of the file. - // If the file ends in /, then it can only match a - // a pattern that ends in /, unless the pattern just - // doesn't have any more for it. But, a/b/ should *not* - // match "a/b/*", even though "" matches against the - // [^/]*? pattern, except in partial mode, where it might - // simply not be reached yet. - // However, a/b/ should still satisfy a/* - - // now either we fell off the end of the pattern, or we're done. - if (fi === fl && pi === pl) { - // ran out of pattern and filename at the same time. - // an exact hit! - return true - } else if (fi === fl) { - // ran out of file, but still had pattern left. - // this is ok if we're doing the match as part of - // a glob fs traversal. - return partial - } else if (pi === pl) { - // ran out of pattern, still have file left. - // this is only acceptable if we're on the very last - // empty segment of a file with a trailing slash. - // a/* should match a/b/ - var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") - return emptyFileEnd - } - - // should be unreachable. - throw new Error("wtf?") -} - - -// replace stuff like \* with * -function globUnescape (s) { - return s.replace(/\\(.)/g, "$1") -} - - -function regExpEscape (s) { - return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") -} - -})( typeof require === "function" ? require : null, - this, - typeof module === "object" ? module : null, - typeof process === "object" ? process.platform : "win32" - ) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore deleted file mode 100644 index 07e6e47..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/.npmignore +++ /dev/null @@ -1 +0,0 @@ -/node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS deleted file mode 100644 index 4a0bc50..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +++ /dev/null @@ -1,14 +0,0 @@ -# Authors, sorted by whether or not they are me -Isaac Z. Schlueter -Brian Cottingham -Carlos Brito Lage -Jesse Dailey -Kevin O'Hara -Marco Rogers -Mark Cavage -Marko Mikulicic -Nathan Rajlich -Satheesh Natesan -Trent Mick -ashleybrener -n4kz diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md deleted file mode 100644 index 03ee0f9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# lru cache - -A cache object that deletes the least-recently-used items. - -## Usage: - -```javascript -var LRU = require("lru-cache") - , options = { max: 500 - , length: function (n) { return n * 2 } - , dispose: function (key, n) { n.close() } - , maxAge: 1000 * 60 * 60 } - , cache = LRU(options) - , otherCache = LRU(50) // sets just the max size - -cache.set("key", "value") -cache.get("key") // "value" - -cache.reset() // empty the cache -``` - -If you put more stuff in it, then items will fall out. - -If you try to put an oversized thing in it, then it'll fall out right -away. - -## Options - -* `max` The maximum size of the cache, checked by applying the length - function to all values in the cache. Not setting this is kind of - silly, since that's the whole purpose of this lib, but it defaults - to `Infinity`. -* `maxAge` Maximum age in ms. Items are not pro-actively pruned out - as they age, but if you try to get an item that is too old, it'll - drop it and return undefined instead of giving it to you. -* `length` Function that is used to calculate the length of stored - items. If you're storing strings or buffers, then you probably want - to do something like `function(n){return n.length}`. The default is - `function(n){return 1}`, which is fine if you want to store `n` - like-sized things. -* `dispose` Function that is called on items when they are dropped - from the cache. This can be handy if you want to close file - descriptors or do other cleanup tasks when items are no longer - accessible. Called with `key, value`. It's called *before* - actually removing the item from the internal cache, so if you want - to immediately put it back in, you'll have to do that in a - `nextTick` or `setTimeout` callback or it won't do anything. -* `stale` By default, if you set a `maxAge`, it'll only actually pull - stale items out of the cache when you `get(key)`. (That is, it's - not pre-emptively doing a `setTimeout` or anything.) If you set - `stale:true`, it'll return the stale value before deleting it. If - you don't set this, then it'll return `undefined` when you try to - get a stale entry, as if it had already been deleted. - -## API - -* `set(key, value)` -* `get(key) => value` - - Both of these will update the "recently used"-ness of the key. - They do what you think. - -* `peek(key)` - - Returns the key value (or `undefined` if not found) without - updating the "recently used"-ness of the key. - - (If you find yourself using this a lot, you *might* be using the - wrong sort of data structure, but there are some use cases where - it's handy.) - -* `del(key)` - - Deletes a key out of the cache. - -* `reset()` - - Clear the cache entirely, throwing away all values. - -* `has(key)` - - Check if a key is in the cache, without updating the recent-ness - or deleting it for being stale. - -* `forEach(function(value,key,cache), [thisp])` - - Just like `Array.prototype.forEach`. Iterates over all the keys - in the cache, in order of recent-ness. (Ie, more recently used - items are iterated over first.) - -* `keys()` - - Return an array of the keys in the cache. - -* `values()` - - Return an array of the values in the cache. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js deleted file mode 100644 index d1d1381..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +++ /dev/null @@ -1,252 +0,0 @@ -;(function () { // closure for web browsers - -if (typeof module === 'object' && module.exports) { - module.exports = LRUCache -} else { - // just set the global for non-node platforms. - this.LRUCache = LRUCache -} - -function hOP (obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key) -} - -function naiveLength () { return 1 } - -function LRUCache (options) { - if (!(this instanceof LRUCache)) - return new LRUCache(options) - - if (typeof options === 'number') - options = { max: options } - - if (!options) - options = {} - - this._max = options.max - // Kind of weird to have a default max of Infinity, but oh well. - if (!this._max || !(typeof this._max === "number") || this._max <= 0 ) - this._max = Infinity - - this._lengthCalculator = options.length || naiveLength - if (typeof this._lengthCalculator !== "function") - this._lengthCalculator = naiveLength - - this._allowStale = options.stale || false - this._maxAge = options.maxAge || null - this._dispose = options.dispose - this.reset() -} - -// resize the cache when the max changes. -Object.defineProperty(LRUCache.prototype, "max", - { set : function (mL) { - if (!mL || !(typeof mL === "number") || mL <= 0 ) mL = Infinity - this._max = mL - if (this._length > this._max) trim(this) - } - , get : function () { return this._max } - , enumerable : true - }) - -// resize the cache when the lengthCalculator changes. -Object.defineProperty(LRUCache.prototype, "lengthCalculator", - { set : function (lC) { - if (typeof lC !== "function") { - this._lengthCalculator = naiveLength - this._length = this._itemCount - for (var key in this._cache) { - this._cache[key].length = 1 - } - } else { - this._lengthCalculator = lC - this._length = 0 - for (var key in this._cache) { - this._cache[key].length = this._lengthCalculator(this._cache[key].value) - this._length += this._cache[key].length - } - } - - if (this._length > this._max) trim(this) - } - , get : function () { return this._lengthCalculator } - , enumerable : true - }) - -Object.defineProperty(LRUCache.prototype, "length", - { get : function () { return this._length } - , enumerable : true - }) - - -Object.defineProperty(LRUCache.prototype, "itemCount", - { get : function () { return this._itemCount } - , enumerable : true - }) - -LRUCache.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - var i = 0; - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { - i++ - var hit = this._lruList[k] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { - del(this, hit) - if (!this._allowStale) hit = undefined - } - if (hit) { - fn.call(thisp, hit.value, hit.key, this) - } - } -} - -LRUCache.prototype.keys = function () { - var keys = new Array(this._itemCount) - var i = 0 - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { - var hit = this._lruList[k] - keys[i++] = hit.key - } - return keys -} - -LRUCache.prototype.values = function () { - var values = new Array(this._itemCount) - var i = 0 - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { - var hit = this._lruList[k] - values[i++] = hit.value - } - return values -} - -LRUCache.prototype.reset = function () { - if (this._dispose && this._cache) { - for (var k in this._cache) { - this._dispose(k, this._cache[k].value) - } - } - - this._cache = Object.create(null) // hash of items by key - this._lruList = Object.create(null) // list of items in order of use recency - this._mru = 0 // most recently used - this._lru = 0 // least recently used - this._length = 0 // number of items in the list - this._itemCount = 0 -} - -// Provided for debugging/dev purposes only. No promises whatsoever that -// this API stays stable. -LRUCache.prototype.dump = function () { - return this._cache -} - -LRUCache.prototype.dumpLru = function () { - return this._lruList -} - -LRUCache.prototype.set = function (key, value) { - if (hOP(this._cache, key)) { - // dispose of the old one before overwriting - if (this._dispose) this._dispose(key, this._cache[key].value) - if (this._maxAge) this._cache[key].now = Date.now() - this._cache[key].value = value - this.get(key) - return true - } - - var len = this._lengthCalculator(value) - var age = this._maxAge ? Date.now() : 0 - var hit = new Entry(key, value, this._mru++, len, age) - - // oversized objects fall out of cache automatically. - if (hit.length > this._max) { - if (this._dispose) this._dispose(key, value) - return false - } - - this._length += hit.length - this._lruList[hit.lu] = this._cache[key] = hit - this._itemCount ++ - - if (this._length > this._max) trim(this) - return true -} - -LRUCache.prototype.has = function (key) { - if (!hOP(this._cache, key)) return false - var hit = this._cache[key] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { - return false - } - return true -} - -LRUCache.prototype.get = function (key) { - return get(this, key, true) -} - -LRUCache.prototype.peek = function (key) { - return get(this, key, false) -} - -LRUCache.prototype.pop = function () { - var hit = this._lruList[this._lru] - del(this, hit) - return hit || null -} - -LRUCache.prototype.del = function (key) { - del(this, this._cache[key]) -} - -function get (self, key, doUse) { - var hit = self._cache[key] - if (hit) { - if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { - del(self, hit) - if (!self._allowStale) hit = undefined - } else { - if (doUse) use(self, hit) - } - if (hit) hit = hit.value - } - return hit -} - -function use (self, hit) { - shiftLU(self, hit) - hit.lu = self._mru ++ - self._lruList[hit.lu] = hit -} - -function trim (self) { - while (self._lru < self._mru && self._length > self._max) - del(self, self._lruList[self._lru]) -} - -function shiftLU (self, hit) { - delete self._lruList[ hit.lu ] - while (self._lru < self._mru && !self._lruList[self._lru]) self._lru ++ -} - -function del (self, hit) { - if (hit) { - if (self._dispose) self._dispose(hit.key, hit.value) - self._length -= hit.length - self._itemCount -- - delete self._cache[ hit.key ] - shiftLU(self, hit) - } -} - -// classy, since V8 prefers predictable objects. -function Entry (key, value, lu, length, now) { - this.key = key - this.value = value - this.lu = lu - this.length = length - this.now = now -} - -})() diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json deleted file mode 100644 index 4472725..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "lru-cache", - "description": "A cache object that deletes the least-recently-used items.", - "version": "2.5.0", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "scripts": { - "test": "tap test --gc" - }, - "main": "lib/lru-cache.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-lru-cache.git" - }, - "devDependencies": { - "tap": "", - "weak": "" - }, - "license": { - "type": "MIT", - "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" - }, - "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/node-lru-cache/issues" - }, - "homepage": "https://github.com/isaacs/node-lru-cache", - "_id": "lru-cache@2.5.0", - "_from": "lru-cache@2" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js deleted file mode 100644 index f72697c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js +++ /dev/null @@ -1,369 +0,0 @@ -var test = require("tap").test - , LRU = require("../") - -test("basic", function (t) { - var cache = new LRU({max: 10}) - cache.set("key", "value") - t.equal(cache.get("key"), "value") - t.equal(cache.get("nada"), undefined) - t.equal(cache.length, 1) - t.equal(cache.max, 10) - t.end() -}) - -test("least recently set", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.set("b", "B") - cache.set("c", "C") - t.equal(cache.get("c"), "C") - t.equal(cache.get("b"), "B") - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("lru recently gotten", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.set("b", "B") - cache.get("a") - cache.set("c", "C") - t.equal(cache.get("c"), "C") - t.equal(cache.get("b"), undefined) - t.equal(cache.get("a"), "A") - t.end() -}) - -test("del", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.del("a") - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("max", function (t) { - var cache = new LRU(3) - - // test changing the max, verify that the LRU items get dropped. - cache.max = 100 - for (var i = 0; i < 100; i ++) cache.set(i, i) - t.equal(cache.length, 100) - for (var i = 0; i < 100; i ++) { - t.equal(cache.get(i), i) - } - cache.max = 3 - t.equal(cache.length, 3) - for (var i = 0; i < 97; i ++) { - t.equal(cache.get(i), undefined) - } - for (var i = 98; i < 100; i ++) { - t.equal(cache.get(i), i) - } - - // now remove the max restriction, and try again. - cache.max = "hello" - for (var i = 0; i < 100; i ++) cache.set(i, i) - t.equal(cache.length, 100) - for (var i = 0; i < 100; i ++) { - t.equal(cache.get(i), i) - } - // should trigger an immediate resize - cache.max = 3 - t.equal(cache.length, 3) - for (var i = 0; i < 97; i ++) { - t.equal(cache.get(i), undefined) - } - for (var i = 98; i < 100; i ++) { - t.equal(cache.get(i), i) - } - t.end() -}) - -test("reset", function (t) { - var cache = new LRU(10) - cache.set("a", "A") - cache.set("b", "B") - cache.reset() - t.equal(cache.length, 0) - t.equal(cache.max, 10) - t.equal(cache.get("a"), undefined) - t.equal(cache.get("b"), undefined) - t.end() -}) - - -// Note: `.dump()` is a debugging tool only. No guarantees are made -// about the format/layout of the response. -test("dump", function (t) { - var cache = new LRU(10) - var d = cache.dump(); - t.equal(Object.keys(d).length, 0, "nothing in dump for empty cache") - cache.set("a", "A") - var d = cache.dump() // { a: { key: "a", value: "A", lu: 0 } } - t.ok(d.a) - t.equal(d.a.key, "a") - t.equal(d.a.value, "A") - t.equal(d.a.lu, 0) - - cache.set("b", "B") - cache.get("b") - d = cache.dump() - t.ok(d.b) - t.equal(d.b.key, "b") - t.equal(d.b.value, "B") - t.equal(d.b.lu, 2) - - t.end() -}) - - -test("basic with weighed length", function (t) { - var cache = new LRU({ - max: 100, - length: function (item) { return item.size } - }) - cache.set("key", {val: "value", size: 50}) - t.equal(cache.get("key").val, "value") - t.equal(cache.get("nada"), undefined) - t.equal(cache.lengthCalculator(cache.get("key")), 50) - t.equal(cache.length, 50) - t.equal(cache.max, 100) - t.end() -}) - - -test("weighed length item too large", function (t) { - var cache = new LRU({ - max: 10, - length: function (item) { return item.size } - }) - t.equal(cache.max, 10) - - // should fall out immediately - cache.set("key", {val: "value", size: 50}) - - t.equal(cache.length, 0) - t.equal(cache.get("key"), undefined) - t.end() -}) - -test("least recently set with weighed length", function (t) { - var cache = new LRU({ - max:8, - length: function (item) { return item.length } - }) - cache.set("a", "A") - cache.set("b", "BB") - cache.set("c", "CCC") - cache.set("d", "DDDD") - t.equal(cache.get("d"), "DDDD") - t.equal(cache.get("c"), "CCC") - t.equal(cache.get("b"), undefined) - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("lru recently gotten with weighed length", function (t) { - var cache = new LRU({ - max: 8, - length: function (item) { return item.length } - }) - cache.set("a", "A") - cache.set("b", "BB") - cache.set("c", "CCC") - cache.get("a") - cache.get("b") - cache.set("d", "DDDD") - t.equal(cache.get("c"), undefined) - t.equal(cache.get("d"), "DDDD") - t.equal(cache.get("b"), "BB") - t.equal(cache.get("a"), "A") - t.end() -}) - -test("set returns proper booleans", function(t) { - var cache = new LRU({ - max: 5, - length: function (item) { return item.length } - }) - - t.equal(cache.set("a", "A"), true) - - // should return false for max exceeded - t.equal(cache.set("b", "donuts"), false) - - t.equal(cache.set("b", "B"), true) - t.equal(cache.set("c", "CCCC"), true) - t.end() -}) - -test("drop the old items", function(t) { - var cache = new LRU({ - max: 5, - maxAge: 50 - }) - - cache.set("a", "A") - - setTimeout(function () { - cache.set("b", "b") - t.equal(cache.get("a"), "A") - }, 25) - - setTimeout(function () { - cache.set("c", "C") - // timed out - t.notOk(cache.get("a")) - }, 60) - - setTimeout(function () { - t.notOk(cache.get("b")) - t.equal(cache.get("c"), "C") - }, 90) - - setTimeout(function () { - t.notOk(cache.get("c")) - t.end() - }, 155) -}) - -test("disposal function", function(t) { - var disposed = false - var cache = new LRU({ - max: 1, - dispose: function (k, n) { - disposed = n - } - }) - - cache.set(1, 1) - cache.set(2, 2) - t.equal(disposed, 1) - cache.set(3, 3) - t.equal(disposed, 2) - cache.reset() - t.equal(disposed, 3) - t.end() -}) - -test("disposal function on too big of item", function(t) { - var disposed = false - var cache = new LRU({ - max: 1, - length: function (k) { - return k.length - }, - dispose: function (k, n) { - disposed = n - } - }) - var obj = [ 1, 2 ] - - t.equal(disposed, false) - cache.set("obj", obj) - t.equal(disposed, obj) - t.end() -}) - -test("has()", function(t) { - var cache = new LRU({ - max: 1, - maxAge: 10 - }) - - cache.set('foo', 'bar') - t.equal(cache.has('foo'), true) - cache.set('blu', 'baz') - t.equal(cache.has('foo'), false) - t.equal(cache.has('blu'), true) - setTimeout(function() { - t.equal(cache.has('blu'), false) - t.end() - }, 15) -}) - -test("stale", function(t) { - var cache = new LRU({ - maxAge: 10, - stale: true - }) - - cache.set('foo', 'bar') - t.equal(cache.get('foo'), 'bar') - t.equal(cache.has('foo'), true) - setTimeout(function() { - t.equal(cache.has('foo'), false) - t.equal(cache.get('foo'), 'bar') - t.equal(cache.get('foo'), undefined) - t.end() - }, 15) -}) - -test("lru update via set", function(t) { - var cache = LRU({ max: 2 }); - - cache.set('foo', 1); - cache.set('bar', 2); - cache.del('bar'); - cache.set('baz', 3); - cache.set('qux', 4); - - t.equal(cache.get('foo'), undefined) - t.equal(cache.get('bar'), undefined) - t.equal(cache.get('baz'), 3) - t.equal(cache.get('qux'), 4) - t.end() -}) - -test("least recently set w/ peek", function (t) { - var cache = new LRU(2) - cache.set("a", "A") - cache.set("b", "B") - t.equal(cache.peek("a"), "A") - cache.set("c", "C") - t.equal(cache.get("c"), "C") - t.equal(cache.get("b"), "B") - t.equal(cache.get("a"), undefined) - t.end() -}) - -test("pop the least used item", function (t) { - var cache = new LRU(3) - , last - - cache.set("a", "A") - cache.set("b", "B") - cache.set("c", "C") - - t.equal(cache.length, 3) - t.equal(cache.max, 3) - - // Ensure we pop a, c, b - cache.get("b", "B") - - last = cache.pop() - t.equal(last.key, "a") - t.equal(last.value, "A") - t.equal(cache.length, 2) - t.equal(cache.max, 3) - - last = cache.pop() - t.equal(last.key, "c") - t.equal(last.value, "C") - t.equal(cache.length, 1) - t.equal(cache.max, 3) - - last = cache.pop() - t.equal(last.key, "b") - t.equal(last.value, "B") - t.equal(cache.length, 0) - t.equal(cache.max, 3) - - last = cache.pop() - t.equal(last, null) - t.equal(cache.length, 0) - t.equal(cache.max, 3) - - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js deleted file mode 100644 index eefb80d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +++ /dev/null @@ -1,52 +0,0 @@ -var test = require('tap').test -var LRU = require('../') - -test('forEach', function (t) { - var l = new LRU(5) - for (var i = 0; i < 10; i ++) { - l.set(i.toString(), i.toString(2)) - } - - var i = 9 - l.forEach(function (val, key, cache) { - t.equal(cache, l) - t.equal(key, i.toString()) - t.equal(val, i.toString(2)) - i -= 1 - }) - - // get in order of most recently used - l.get(6) - l.get(8) - - var order = [ 8, 6, 9, 7, 5 ] - var i = 0 - - l.forEach(function (val, key, cache) { - var j = order[i ++] - t.equal(cache, l) - t.equal(key, j.toString()) - t.equal(val, j.toString(2)) - }) - - t.end() -}) - -test('keys() and values()', function (t) { - var l = new LRU(5) - for (var i = 0; i < 10; i ++) { - l.set(i.toString(), i.toString(2)) - } - - t.similar(l.keys(), ['9', '8', '7', '6', '5']) - t.similar(l.values(), ['1001', '1000', '111', '110', '101']) - - // get in order of most recently used - l.get(6) - l.get(8) - - t.similar(l.keys(), ['8', '6', '9', '7', '5']) - t.similar(l.values(), ['1000', '110', '1001', '111', '101']) - - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js deleted file mode 100644 index 7af45b0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env node --expose_gc - -var weak = require('weak'); -var test = require('tap').test -var LRU = require('../') -var l = new LRU({ max: 10 }) -var refs = 0 -function X() { - refs ++ - weak(this, deref) -} - -function deref() { - refs -- -} - -test('no leaks', function (t) { - // fill up the cache - for (var i = 0; i < 100; i++) { - l.set(i, new X); - // throw some gets in there, too. - if (i % 2 === 0) - l.get(i / 2) - } - - gc() - - var start = process.memoryUsage() - - // capture the memory - var startRefs = refs - - // do it again, but more - for (var i = 0; i < 10000; i++) { - l.set(i, new X); - // throw some gets in there, too. - if (i % 2 === 0) - l.get(i / 2) - } - - gc() - - var end = process.memoryUsage() - t.equal(refs, startRefs, 'no leaky refs') - - console.error('start: %j\n' + - 'end: %j', start, end); - t.pass(); - t.end(); -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE deleted file mode 100644 index 0c44ae7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) Isaac Z. Schlueter ("Author") -All rights reserved. - -The BSD License - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md deleted file mode 100644 index 7e36512..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/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 cocain-addled psychoanalyst, there is no way to revive the object -from the signature string that sigmund gives you. In fact, it's -barely even readable. - -As with `sys.inspect` and `JSON.stringify`, larger objects will -produce larger signature strings. - -Because sigmund is a bit less strict than the more thorough -alternatives, the strings will be shorter, and also there is a -slightly higher chance for collisions. For example, these objects -have the same signature: - - var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]} - var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']} - -Like a good Freudian, sigmund is most effective when you already have -some understanding of what you're looking for. It can help you help -yourself, but you must be willing to do some work as well. - -Cycles are handled, and cyclical objects are silently omitted (though -the key is included in the signature output.) - -The second argument is the maximum depth, which defaults to 10, -because that is the maximum object traversal depth covered by most -insurance carriers. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js deleted file mode 100644 index 5acfd6d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json deleted file mode 100644 index cb7e2bd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "sigmund", - "version": "1.0.0", - "description": "Quick and dirty signatures for Objects.", - "main": "sigmund.js", - "directories": { - "test": "test" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.3.0" - }, - "scripts": { - "test": "tap test/*.js", - "bench": "node bench.js" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/sigmund" - }, - "keywords": [ - "object", - "signature", - "key", - "data", - "psychoanalysis" - ], - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "license": "BSD", - "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/sigmund/issues" - }, - "homepage": "https://github.com/isaacs/sigmund", - "_id": "sigmund@1.0.0", - "_from": "sigmund@~1.0.0" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js deleted file mode 100644 index 82c7ab8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js deleted file mode 100644 index 50c53a1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/package.json deleted file mode 100644 index c6b2aa2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "name": "minimatch", - "description": "a glob matcher in javascript", - "version": "0.3.0", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/minimatch.git" - }, - "main": "minimatch.js", - "scripts": { - "test": "tap test/*.js" - }, - "engines": { - "node": "*" - }, - "dependencies": { - "lru-cache": "2", - "sigmund": "~1.0.0" - }, - "devDependencies": { - "tap": "" - }, - "license": { - "type": "MIT", - "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" - }, - "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself if this option is set. When not set, an empty list\nis returned if there are no matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/minimatch/issues" - }, - "homepage": "https://github.com/isaacs/minimatch", - "_id": "minimatch@0.3.0", - "_shasum": "275d8edaac4f1bb3326472089e7949c8394699dd", - "_from": "minimatch@0.3", - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/basic.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/basic.js deleted file mode 100644 index ae7ac73..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/basic.js +++ /dev/null @@ -1,399 +0,0 @@ -// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test -// -// TODO: Some of these tests do very bad things with backslashes, and will -// most likely fail badly on windows. They should probably be skipped. - -var tap = require("tap") - , globalBefore = Object.keys(global) - , mm = require("../") - , files = [ "a", "b", "c", "d", "abc" - , "abd", "abe", "bb", "bcd" - , "ca", "cb", "dd", "de" - , "bdir/", "bdir/cfile"] - , next = files.concat([ "a-b", "aXb" - , ".x", ".y" ]) - - -var patterns = - [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test" - , ["a*", ["a", "abc", "abd", "abe"]] - , ["X*", ["X*"], {nonull: true}] - - // allow null glob expansion - , ["X*", []] - - // isaacs: Slightly different than bash/sh/ksh - // \\* is not un-escaped to literal "*" in a failed match, - // but it does make it get treated as a literal star - , ["\\*", ["\\*"], {nonull: true}] - , ["\\**", ["\\**"], {nonull: true}] - , ["\\*\\*", ["\\*\\*"], {nonull: true}] - - , ["b*/", ["bdir/"]] - , ["c*", ["c", "ca", "cb"]] - , ["**", files] - - , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] - , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] - - , "legendary larry crashes bashes" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] - - , "character classes" - , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] - , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", - "bdir/", "ca", "cb", "dd", "de"]] - , ["a*[^c]", ["abd", "abe"]] - , function () { files.push("a-b", "aXb") } - , ["a[X-]b", ["a-b", "aXb"]] - , function () { files.push(".x", ".y") } - , ["[^a-c]*", ["d", "dd", "de"]] - , function () { files.push("a*b/", "a*b/ooo") } - , ["a\\*b/*", ["a*b/ooo"]] - , ["a\\*?/*", ["a*b/ooo"]] - , ["*\\\\!*", [], {null: true}, ["echo !7"]] - , ["*\\!*", ["echo !7"], null, ["echo !7"]] - , ["*.\\*", ["r.*"], null, ["r.*"]] - , ["a[b]c", ["abc"]] - , ["a[\\b]c", ["abc"]] - , ["a?c", ["abc"]] - , ["a\\*c", [], {null: true}, ["abc"]] - , ["", [""], { null: true }, [""]] - - , "http://www.opensource.apple.com/source/bash/bash-23/" + - "bash/tests/glob-test" - , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } - , ["*/man*/bash.*", ["man/man1/bash.1"]] - , ["man/man1/bash.1", ["man/man1/bash.1"]] - , ["a***c", ["abc"], null, ["abc"]] - , ["a*****?c", ["abc"], null, ["abc"]] - , ["?*****??", ["abc"], null, ["abc"]] - , ["*****??", ["abc"], null, ["abc"]] - , ["?*****?c", ["abc"], null, ["abc"]] - , ["?***?****c", ["abc"], null, ["abc"]] - , ["?***?****?", ["abc"], null, ["abc"]] - , ["?***?****", ["abc"], null, ["abc"]] - , ["*******c", ["abc"], null, ["abc"]] - , ["*******?", ["abc"], null, ["abc"]] - , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["[-abc]", ["-"], null, ["-"]] - , ["[abc-]", ["-"], null, ["-"]] - , ["\\", ["\\"], null, ["\\"]] - , ["[\\\\]", ["\\"], null, ["\\"]] - , ["[[]", ["["], null, ["["]] - , ["[", ["["], null, ["["]] - , ["[*", ["[abc"], null, ["[abc"]] - , "a right bracket shall lose its special meaning and\n" + - "represent itself in a bracket expression if it occurs\n" + - "first in the list. -- POSIX.2 2.8.3.2" - , ["[]]", ["]"], null, ["]"]] - , ["[]-]", ["]"], null, ["]"]] - , ["[a-\z]", ["p"], null, ["p"]] - , ["??**********?****?", [], { null: true }, ["abc"]] - , ["??**********?****c", [], { null: true }, ["abc"]] - , ["?************c****?****", [], { null: true }, ["abc"]] - , ["*c*?**", [], { null: true }, ["abc"]] - , ["a*****c*?**", [], { null: true }, ["abc"]] - , ["a********???*******", [], { null: true }, ["abc"]] - , ["[]", [], { null: true }, ["a"]] - , ["[abc", [], { null: true }, ["["]] - - , "nocase tests" - , ["XYZ", ["xYz"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["ab*", ["ABC"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - - // [ pattern, [matches], MM opts, files, TAP opts] - , "onestar/twostar" - , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] - , ["{/?,*}", ["/a", "bb"], {null: true} - , ["/a", "/b/b", "/a/b/c", "bb"]] - - , "dots should not match unless requested" - , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] - - // .. and . can only match patterns starting with ., - // even when options.dot is set. - , function () { - files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] - } - , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] - , ["a/*/b", ["a/c/b"], {dot:false}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] - - - // this also tests that changing the options needs - // to change the cache key, even if the pattern is - // the same! - , ["**", ["a/b","a/.d",".a/.d"], { dot: true } - , [ ".a/.d", "a/.d", "a/b"]] - - , "paren sets cannot contain slashes" - , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] - - // brace sets trump all else. - // - // invalid glob pattern. fails on bash4 and bsdglob. - // however, in this implementation, it's easier just - // to do the intuitive thing, and let brace-expansion - // actually come before parsing any extglob patterns, - // like the documentation seems to say. - // - // XXX: if anyone complains about this, either fix it - // or tell them to grow up and stop complaining. - // - // bash/bsdglob says this: - // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] - // but we do this instead: - , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] - - // test partial parsing in the presence of comment/negation chars - , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] - , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] - - // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. - , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] - , {} - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] - - - // crazy nested {,,} and *(||) tests. - , function () { - files = [ "a", "b", "c", "d" - , "ab", "ac", "ad" - , "bc", "cb" - , "bc,d", "c,db", "c,d" - , "d)", "(b|c", "*(b|c" - , "b|c", "b|cc", "cb|c" - , "x(a|b|c)", "x(a|c)" - , "(a|b|c)", "(a|c)"] - } - , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] - , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] - // a - // *(b|c) - // *(b|d) - , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] - , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] - - - // test various flag settings. - , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] - , { noext: true } ] - , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} - , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] - , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] - - - // begin channelling Boole and deMorgan... - , "negation tests" - , function () { - files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] - } - - // anything that is NOT a* matches. - , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] - - // anything that IS !a* matches. - , ["!a*", ["!ab", "!abc"], {nonegate: true}] - - // anything that IS a* matches - , ["!!a*", ["a!b"]] - - // anything that is NOT !a* matches - , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] - - // negation nestled within a pattern - , function () { - files = [ "foo.js" - , "foo.bar" - // can't match this one without negative lookbehind. - , "foo.js.js" - , "blar.js" - , "foo." - , "boo.js.boo" ] - } - , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] - - // https://github.com/isaacs/minimatch/issues/5 - , function () { - files = [ 'a/b/.x/c' - , 'a/b/.x/c/d' - , 'a/b/.x/c/d/e' - , 'a/b/.x' - , 'a/b/.x/' - , 'a/.x/b' - , '.x' - , '.x/' - , '.x/a' - , '.x/a/b' - , 'a/.x/b/.x/c' - , '.x/.x' ] - } - , ["**/.x/**", [ '.x/' - , '.x/a' - , '.x/a/b' - , 'a/.x/b' - , 'a/b/.x/' - , 'a/b/.x/c' - , 'a/b/.x/c/d' - , 'a/b/.x/c/d/e' ] ] - - ] - -var regexps = - [ '/^(?:(?=.)a[^/]*?)$/', - '/^(?:(?=.)X[^/]*?)$/', - '/^(?:(?=.)X[^/]*?)$/', - '/^(?:\\*)$/', - '/^(?:(?=.)\\*[^/]*?)$/', - '/^(?:\\*\\*)$/', - '/^(?:(?=.)b[^/]*?\\/)$/', - '/^(?:(?=.)c[^/]*?)$/', - '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', - '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/', - '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/', - '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/', - '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/', - '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/', - '/^(?:(?=.)a[^/]*?[^c])$/', - '/^(?:(?=.)a[X-]b)$/', - '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/', - '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/', - '/^(?:(?=.)a[b]c)$/', - '/^(?:(?=.)a[b]c)$/', - '/^(?:(?=.)a[^/]c)$/', - '/^(?:a\\*c)$/', - 'false', - '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/', - '/^(?:man\\/man1\\/bash\\.1)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', - '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', - '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[-abc])$/', - '/^(?:(?!\\.)(?=.)[abc-])$/', - '/^(?:\\\\)$/', - '/^(?:(?!\\.)(?=.)[\\\\])$/', - '/^(?:(?!\\.)(?=.)[\\[])$/', - '/^(?:\\[)$/', - '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[\\]])$/', - '/^(?:(?!\\.)(?=.)[\\]-])$/', - '/^(?:(?!\\.)(?=.)[a-z])$/', - '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/', - '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/', - '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/', - '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/', - '/^(?:\\[\\])$/', - '/^(?:\\[abc)$/', - '/^(?:(?=.)XYZ)$/i', - '/^(?:(?=.)ab[^/]*?)$/i', - '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i', - '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/', - '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/', - '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/', - '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/', - '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', - '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/', - '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/', - '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/', - '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', - '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/', - '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/', - '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/', - '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/', - '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/', - '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/', - '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/', - '/^(?:(?=.)a[^/]b)$/', - '/^(?:(?=.)#[^/]*?)$/', - '/^(?!^(?:(?=.)a[^/]*?)$).*$/', - '/^(?:(?=.)\\!a[^/]*?)$/', - '/^(?:(?=.)a[^/]*?)$/', - '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/', - '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/', - '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ] -var re = 0; - -tap.test("basic tests", function (t) { - var start = Date.now() - - // [ pattern, [matches], MM opts, files, TAP opts] - patterns.forEach(function (c) { - if (typeof c === "function") return c() - if (typeof c === "string") return t.comment(c) - - var pattern = c[0] - , expect = c[1].sort(alpha) - , options = c[2] || {} - , f = c[3] || files - , tapOpts = c[4] || {} - - // options.debug = true - var m = new mm.Minimatch(pattern, options) - var r = m.makeRe() - var expectRe = regexps[re++] - tapOpts.re = String(r) || JSON.stringify(r) - tapOpts.files = JSON.stringify(f) - tapOpts.pattern = pattern - tapOpts.set = m.set - tapOpts.negated = m.negate - - var actual = mm.match(f, pattern, options) - actual.sort(alpha) - - t.equivalent( actual, expect - , JSON.stringify(pattern) + " " + JSON.stringify(expect) - , tapOpts ) - - t.equal(tapOpts.re, expectRe, tapOpts) - }) - - t.comment("time=" + (Date.now() - start) + "ms") - t.end() -}) - -tap.test("global leak test", function (t) { - var globalAfter = Object.keys(global) - t.equivalent(globalAfter, globalBefore, "no new globals, please") - t.end() -}) - -function alpha (a, b) { - return a > b ? 1 : -1 -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/brace-expand.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/brace-expand.js deleted file mode 100644 index 7ee278a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/brace-expand.js +++ /dev/null @@ -1,33 +0,0 @@ -var tap = require("tap") - , minimatch = require("../") - -tap.test("brace expansion", function (t) { - // [ pattern, [expanded] ] - ; [ [ "a{b,c{d,e},{f,g}h}x{y,z}" - , [ "abxy" - , "abxz" - , "acdxy" - , "acdxz" - , "acexy" - , "acexz" - , "afhxy" - , "afhxz" - , "aghxy" - , "aghxz" ] ] - , [ "a{1..5}b" - , [ "a1b" - , "a2b" - , "a3b" - , "a4b" - , "a5b" ] ] - , [ "a{b}c", ["a{b}c"] ] - ].forEach(function (tc) { - var p = tc[0] - , expect = tc[1] - t.equivalent(minimatch.braceExpand(p), expect, p) - }) - console.error("ending") - t.end() -}) - - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/caching.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/caching.js deleted file mode 100644 index 0fec4b0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/caching.js +++ /dev/null @@ -1,14 +0,0 @@ -var Minimatch = require("../minimatch.js").Minimatch -var tap = require("tap") -tap.test("cache test", function (t) { - var mm1 = new Minimatch("a?b") - var mm2 = new Minimatch("a?b") - t.equal(mm1, mm2, "should get the same object") - // the lru should drop it after 100 entries - for (var i = 0; i < 100; i ++) { - new Minimatch("a"+i) - } - mm2 = new Minimatch("a?b") - t.notEqual(mm1, mm2, "cache should have dropped") - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/defaults.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/defaults.js deleted file mode 100644 index 75e0571..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/defaults.js +++ /dev/null @@ -1,274 +0,0 @@ -// http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test -// -// TODO: Some of these tests do very bad things with backslashes, and will -// most likely fail badly on windows. They should probably be skipped. - -var tap = require("tap") - , globalBefore = Object.keys(global) - , mm = require("../") - , files = [ "a", "b", "c", "d", "abc" - , "abd", "abe", "bb", "bcd" - , "ca", "cb", "dd", "de" - , "bdir/", "bdir/cfile"] - , next = files.concat([ "a-b", "aXb" - , ".x", ".y" ]) - -tap.test("basic tests", function (t) { - var start = Date.now() - - // [ pattern, [matches], MM opts, files, TAP opts] - ; [ "http://www.bashcookbook.com/bashinfo" + - "/source/bash-1.14.7/tests/glob-test" - , ["a*", ["a", "abc", "abd", "abe"]] - , ["X*", ["X*"], {nonull: true}] - - // allow null glob expansion - , ["X*", []] - - // isaacs: Slightly different than bash/sh/ksh - // \\* is not un-escaped to literal "*" in a failed match, - // but it does make it get treated as a literal star - , ["\\*", ["\\*"], {nonull: true}] - , ["\\**", ["\\**"], {nonull: true}] - , ["\\*\\*", ["\\*\\*"], {nonull: true}] - - , ["b*/", ["bdir/"]] - , ["c*", ["c", "ca", "cb"]] - , ["**", files] - - , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}] - , ["s/\\..*//", ["s/\\..*//"], {nonull: true}] - - , "legendary larry crashes bashes" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}] - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/" - , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}] - - , "character classes" - , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]] - , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd", - "bdir/", "ca", "cb", "dd", "de"]] - , ["a*[^c]", ["abd", "abe"]] - , function () { files.push("a-b", "aXb") } - , ["a[X-]b", ["a-b", "aXb"]] - , function () { files.push(".x", ".y") } - , ["[^a-c]*", ["d", "dd", "de"]] - , function () { files.push("a*b/", "a*b/ooo") } - , ["a\\*b/*", ["a*b/ooo"]] - , ["a\\*?/*", ["a*b/ooo"]] - , ["*\\\\!*", [], {null: true}, ["echo !7"]] - , ["*\\!*", ["echo !7"], null, ["echo !7"]] - , ["*.\\*", ["r.*"], null, ["r.*"]] - , ["a[b]c", ["abc"]] - , ["a[\\b]c", ["abc"]] - , ["a?c", ["abc"]] - , ["a\\*c", [], {null: true}, ["abc"]] - , ["", [""], { null: true }, [""]] - - , "http://www.opensource.apple.com/source/bash/bash-23/" + - "bash/tests/glob-test" - , function () { files.push("man/", "man/man1/", "man/man1/bash.1") } - , ["*/man*/bash.*", ["man/man1/bash.1"]] - , ["man/man1/bash.1", ["man/man1/bash.1"]] - , ["a***c", ["abc"], null, ["abc"]] - , ["a*****?c", ["abc"], null, ["abc"]] - , ["?*****??", ["abc"], null, ["abc"]] - , ["*****??", ["abc"], null, ["abc"]] - , ["?*****?c", ["abc"], null, ["abc"]] - , ["?***?****c", ["abc"], null, ["abc"]] - , ["?***?****?", ["abc"], null, ["abc"]] - , ["?***?****", ["abc"], null, ["abc"]] - , ["*******c", ["abc"], null, ["abc"]] - , ["*******?", ["abc"], null, ["abc"]] - , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]] - , ["[-abc]", ["-"], null, ["-"]] - , ["[abc-]", ["-"], null, ["-"]] - , ["\\", ["\\"], null, ["\\"]] - , ["[\\\\]", ["\\"], null, ["\\"]] - , ["[[]", ["["], null, ["["]] - , ["[", ["["], null, ["["]] - , ["[*", ["[abc"], null, ["[abc"]] - , "a right bracket shall lose its special meaning and\n" + - "represent itself in a bracket expression if it occurs\n" + - "first in the list. -- POSIX.2 2.8.3.2" - , ["[]]", ["]"], null, ["]"]] - , ["[]-]", ["]"], null, ["]"]] - , ["[a-\z]", ["p"], null, ["p"]] - , ["??**********?****?", [], { null: true }, ["abc"]] - , ["??**********?****c", [], { null: true }, ["abc"]] - , ["?************c****?****", [], { null: true }, ["abc"]] - , ["*c*?**", [], { null: true }, ["abc"]] - , ["a*****c*?**", [], { null: true }, ["abc"]] - , ["a********???*******", [], { null: true }, ["abc"]] - , ["[]", [], { null: true }, ["a"]] - , ["[abc", [], { null: true }, ["["]] - - , "nocase tests" - , ["XYZ", ["xYz"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["ab*", ["ABC"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true } - , ["xYz", "ABC", "IjK"]] - - // [ pattern, [matches], MM opts, files, TAP opts] - , "onestar/twostar" - , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]] - , ["{/?,*}", ["/a", "bb"], {null: true} - , ["/a", "/b/b", "/a/b/c", "bb"]] - - , "dots should not match unless requested" - , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]] - - // .. and . can only match patterns starting with ., - // even when options.dot is set. - , function () { - files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"] - } - , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}] - , ["a/*/b", ["a/c/b"], {dot:false}] - , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}] - - - // this also tests that changing the options needs - // to change the cache key, even if the pattern is - // the same! - , ["**", ["a/b","a/.d",".a/.d"], { dot: true } - , [ ".a/.d", "a/.d", "a/b"]] - - , "paren sets cannot contain slashes" - , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]] - - // brace sets trump all else. - // - // invalid glob pattern. fails on bash4 and bsdglob. - // however, in this implementation, it's easier just - // to do the intuitive thing, and let brace-expansion - // actually come before parsing any extglob patterns, - // like the documentation seems to say. - // - // XXX: if anyone complains about this, either fix it - // or tell them to grow up and stop complaining. - // - // bash/bsdglob says this: - // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]] - // but we do this instead: - , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]] - - // test partial parsing in the presence of comment/negation chars - , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]] - , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]] - - // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. - , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g" - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"] - , {} - , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]] - - - // crazy nested {,,} and *(||) tests. - , function () { - files = [ "a", "b", "c", "d" - , "ab", "ac", "ad" - , "bc", "cb" - , "bc,d", "c,db", "c,d" - , "d)", "(b|c", "*(b|c" - , "b|c", "b|cc", "cb|c" - , "x(a|b|c)", "x(a|c)" - , "(a|b|c)", "(a|c)"] - } - , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]] - , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]] - // a - // *(b|c) - // *(b|d) - , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]] - , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]] - - - // test various flag settings. - , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"] - , { noext: true } ] - , ["a?b", ["x/y/acb", "acb/"], {matchBase: true} - , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ] - , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]] - - - // begin channelling Boole and deMorgan... - , "negation tests" - , function () { - files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"] - } - - // anything that is NOT a* matches. - , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]] - - // anything that IS !a* matches. - , ["!a*", ["!ab", "!abc"], {nonegate: true}] - - // anything that IS a* matches - , ["!!a*", ["a!b"]] - - // anything that is NOT !a* matches - , ["!\\!a*", ["a!b", "d", "e", "\\!a"]] - - // negation nestled within a pattern - , function () { - files = [ "foo.js" - , "foo.bar" - // can't match this one without negative lookbehind. - , "foo.js.js" - , "blar.js" - , "foo." - , "boo.js.boo" ] - } - , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ] - - ].forEach(function (c) { - if (typeof c === "function") return c() - if (typeof c === "string") return t.comment(c) - - var pattern = c[0] - , expect = c[1].sort(alpha) - , options = c[2] - , f = c[3] || files - , tapOpts = c[4] || {} - - // options.debug = true - var Class = mm.defaults(options).Minimatch - var m = new Class(pattern, {}) - var r = m.makeRe() - tapOpts.re = String(r) || JSON.stringify(r) - tapOpts.files = JSON.stringify(f) - tapOpts.pattern = pattern - tapOpts.set = m.set - tapOpts.negated = m.negate - - var actual = mm.match(f, pattern, options) - actual.sort(alpha) - - t.equivalent( actual, expect - , JSON.stringify(pattern) + " " + JSON.stringify(expect) - , tapOpts ) - }) - - t.comment("time=" + (Date.now() - start) + "ms") - t.end() -}) - -tap.test("global leak test", function (t) { - var globalAfter = Object.keys(global) - t.equivalent(globalAfter, globalBefore, "no new globals, please") - t.end() -}) - -function alpha (a, b) { - return a > b ? 1 : -1 -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js deleted file mode 100644 index 6676e26..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/node_modules/minimatch/test/extglob-ending-with-state-char.js +++ /dev/null @@ -1,8 +0,0 @@ -var test = require('tap').test -var minimatch = require('../') - -test('extglob ending with statechar', function(t) { - t.notOk(minimatch('ax', 'a?(b*)')) - t.ok(minimatch('ax', '?(a*|b)')) - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/package.json deleted file mode 100644 index 45e5e67..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "name": "glob", - "description": "a little globber", - "version": "3.2.11", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-glob.git" - }, - "main": "glob.js", - "engines": { - "node": "*" - }, - "dependencies": { - "inherits": "2", - "minimatch": "0.3" - }, - "devDependencies": { - "tap": "~0.4.0", - "mkdirp": "0", - "rimraf": "1" - }, - "scripts": { - "test": "tap test/*.js", - "test-regen": "TEST_REGEN=1 node test/00-setup.js" - }, - "license": "BSD", - "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/node-glob/issues" - }, - "homepage": "https://github.com/isaacs/node-glob", - "_id": "glob@3.2.11", - "_shasum": "4a973f635b9190f715d10987d5c00fd2815ebe3d", - "_from": "glob@~3.2.1", - "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/00-setup.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/00-setup.js deleted file mode 100644 index 245afaf..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/00-setup.js +++ /dev/null @@ -1,176 +0,0 @@ -// just a little pre-run script to set up the fixtures. -// zz-finish cleans it up - -var mkdirp = require("mkdirp") -var path = require("path") -var i = 0 -var tap = require("tap") -var fs = require("fs") -var rimraf = require("rimraf") - -var files = -[ "a/.abcdef/x/y/z/a" -, "a/abcdef/g/h" -, "a/abcfed/g/h" -, "a/b/c/d" -, "a/bc/e/f" -, "a/c/d/c/b" -, "a/cb/e/f" -] - -var symlinkTo = path.resolve(__dirname, "a/symlink/a/b/c") -var symlinkFrom = "../.." - -files = files.map(function (f) { - return path.resolve(__dirname, f) -}) - -tap.test("remove fixtures", function (t) { - rimraf(path.resolve(__dirname, "a"), function (er) { - t.ifError(er, "remove fixtures") - t.end() - }) -}) - -files.forEach(function (f) { - tap.test(f, function (t) { - var d = path.dirname(f) - mkdirp(d, 0755, function (er) { - if (er) { - t.fail(er) - return t.bailout() - } - fs.writeFile(f, "i like tests", function (er) { - t.ifError(er, "make file") - t.end() - }) - }) - }) -}) - -if (process.platform !== "win32") { - tap.test("symlinky", function (t) { - var d = path.dirname(symlinkTo) - console.error("mkdirp", d) - mkdirp(d, 0755, function (er) { - t.ifError(er) - fs.symlink(symlinkFrom, symlinkTo, "dir", function (er) { - t.ifError(er, "make symlink") - t.end() - }) - }) - }) -} - -;["foo","bar","baz","asdf","quux","qwer","rewq"].forEach(function (w) { - w = "/tmp/glob-test/" + w - tap.test("create " + w, function (t) { - mkdirp(w, function (er) { - if (er) - throw er - t.pass(w) - t.end() - }) - }) -}) - - -// generate the bash pattern test-fixtures if possible -if (process.platform === "win32" || !process.env.TEST_REGEN) { - console.error("Windows, or TEST_REGEN unset. Using cached fixtures.") - return -} - -var spawn = require("child_process").spawn; -var globs = - // put more patterns here. - // anything that would be directly in / should be in /tmp/glob-test - ["test/a/*/+(c|g)/./d" - ,"test/a/**/[cg]/../[cg]" - ,"test/a/{b,c,d,e,f}/**/g" - ,"test/a/b/**" - ,"test/**/g" - ,"test/a/abc{fed,def}/g/h" - ,"test/a/abc{fed/g,def}/**/" - ,"test/a/abc{fed/g,def}/**///**/" - ,"test/**/a/**/" - ,"test/+(a|b|c)/a{/,bc*}/**" - ,"test/*/*/*/f" - ,"test/**/f" - ,"test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**" - ,"{./*/*,/tmp/glob-test/*}" - ,"{/tmp/glob-test/*,*}" // evil owl face! how you taunt me! - ,"test/a/!(symlink)/**" - ] -var bashOutput = {} -var fs = require("fs") - -globs.forEach(function (pattern) { - tap.test("generate fixture " + pattern, function (t) { - var cmd = "shopt -s globstar && " + - "shopt -s extglob && " + - "shopt -s nullglob && " + - // "shopt >&2; " + - "eval \'for i in " + pattern + "; do echo $i; done\'" - var cp = spawn("bash", ["-c", cmd], { cwd: path.dirname(__dirname) }) - var out = [] - cp.stdout.on("data", function (c) { - out.push(c) - }) - cp.stderr.pipe(process.stderr) - cp.on("close", function (code) { - out = flatten(out) - if (!out) - out = [] - else - out = cleanResults(out.split(/\r*\n/)) - - bashOutput[pattern] = out - t.notOk(code, "bash test should finish nicely") - t.end() - }) - }) -}) - -tap.test("save fixtures", function (t) { - var fname = path.resolve(__dirname, "bash-results.json") - var data = JSON.stringify(bashOutput, null, 2) + "\n" - fs.writeFile(fname, data, function (er) { - t.ifError(er) - t.end() - }) -}) - -function cleanResults (m) { - // normalize discrepancies in ordering, duplication, - // and ending slashes. - return m.map(function (m) { - return m.replace(/\/+/g, "/").replace(/\/$/, "") - }).sort(alphasort).reduce(function (set, f) { - if (f !== set[set.length - 1]) set.push(f) - return set - }, []).sort(alphasort).map(function (f) { - // de-windows - return (process.platform !== 'win32') ? f - : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') - }) -} - -function flatten (chunks) { - var s = 0 - chunks.forEach(function (c) { s += c.length }) - var out = new Buffer(s) - s = 0 - chunks.forEach(function (c) { - c.copy(out, s) - s += c.length - }) - - return out.toString().trim() -} - -function alphasort (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return a > b ? 1 : a < b ? -1 : 0 -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-comparison.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-comparison.js deleted file mode 100644 index 239ed1a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-comparison.js +++ /dev/null @@ -1,63 +0,0 @@ -// basic test -// show that it does the same thing by default as the shell. -var tap = require("tap") -, child_process = require("child_process") -, bashResults = require("./bash-results.json") -, globs = Object.keys(bashResults) -, glob = require("../") -, path = require("path") - -// run from the root of the project -// this is usually where you're at anyway, but be sure. -process.chdir(path.resolve(__dirname, "..")) - -function alphasort (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return a > b ? 1 : a < b ? -1 : 0 -} - -globs.forEach(function (pattern) { - var expect = bashResults[pattern] - // anything regarding the symlink thing will fail on windows, so just skip it - if (process.platform === "win32" && - expect.some(function (m) { - return /\/symlink\//.test(m) - })) - return - - tap.test(pattern, function (t) { - glob(pattern, function (er, matches) { - if (er) - throw er - - // sort and unmark, just to match the shell results - matches = cleanResults(matches) - - t.deepEqual(matches, expect, pattern) - t.end() - }) - }) - - tap.test(pattern + " sync", function (t) { - var matches = cleanResults(glob.sync(pattern)) - - t.deepEqual(matches, expect, "should match shell") - t.end() - }) -}) - -function cleanResults (m) { - // normalize discrepancies in ordering, duplication, - // and ending slashes. - return m.map(function (m) { - return m.replace(/\/+/g, "/").replace(/\/$/, "") - }).sort(alphasort).reduce(function (set, f) { - if (f !== set[set.length - 1]) set.push(f) - return set - }, []).sort(alphasort).map(function (f) { - // de-windows - return (process.platform !== 'win32') ? f - : f.replace(/^[a-zA-Z]:[\/\\]+/, '/').replace(/[\\\/]+/g, '/') - }) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-results.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-results.json deleted file mode 100644 index 8051c72..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/bash-results.json +++ /dev/null @@ -1,351 +0,0 @@ -{ - "test/a/*/+(c|g)/./d": [ - "test/a/b/c/./d" - ], - "test/a/**/[cg]/../[cg]": [ - "test/a/abcdef/g/../g", - "test/a/abcfed/g/../g", - "test/a/b/c/../c", - "test/a/c/../c", - "test/a/c/d/c/../c", - "test/a/symlink/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/../c" - ], - "test/a/{b,c,d,e,f}/**/g": [], - "test/a/b/**": [ - "test/a/b", - "test/a/b/c", - "test/a/b/c/d" - ], - "test/**/g": [ - "test/a/abcdef/g", - "test/a/abcfed/g" - ], - "test/a/abc{fed,def}/g/h": [ - "test/a/abcdef/g/h", - "test/a/abcfed/g/h" - ], - "test/a/abc{fed/g,def}/**/": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcfed/g" - ], - "test/a/abc{fed/g,def}/**///**/": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcfed/g" - ], - "test/**/a/**/": [ - "test/a", - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcfed", - "test/a/abcfed/g", - "test/a/b", - "test/a/b/c", - "test/a/bc", - "test/a/bc/e", - "test/a/c", - "test/a/c/d", - "test/a/c/d/c", - "test/a/cb", - "test/a/cb/e", - "test/a/symlink", - "test/a/symlink/a", - "test/a/symlink/a/b", - "test/a/symlink/a/b/c", - "test/a/symlink/a/b/c/a", - "test/a/symlink/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b" - ], - "test/+(a|b|c)/a{/,bc*}/**": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcdef/g/h", - "test/a/abcfed", - "test/a/abcfed/g", - "test/a/abcfed/g/h" - ], - "test/*/*/*/f": [ - "test/a/bc/e/f", - "test/a/cb/e/f" - ], - "test/**/f": [ - "test/a/bc/e/f", - "test/a/cb/e/f" - ], - "test/a/symlink/a/b/c/a/b/c/a/b/c//a/b/c////a/b/c/**/b/c/**": [ - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b", - "test/a/symlink/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c/a/b/c" - ], - "{./*/*,/tmp/glob-test/*}": [ - "./examples/g.js", - "./examples/usr-local.js", - "./node_modules/inherits", - "./node_modules/minimatch", - "./node_modules/mkdirp", - "./node_modules/rimraf", - "./node_modules/tap", - "./test/00-setup.js", - "./test/a", - "./test/bash-comparison.js", - "./test/bash-results.json", - "./test/cwd-test.js", - "./test/globstar-match.js", - "./test/mark.js", - "./test/new-glob-optional-options.js", - "./test/nocase-nomagic.js", - "./test/pause-resume.js", - "./test/readme-issue.js", - "./test/root-nomount.js", - "./test/root.js", - "./test/stat.js", - "./test/zz-cleanup.js", - "/tmp/glob-test/asdf", - "/tmp/glob-test/bar", - "/tmp/glob-test/baz", - "/tmp/glob-test/foo", - "/tmp/glob-test/quux", - "/tmp/glob-test/qwer", - "/tmp/glob-test/rewq" - ], - "{/tmp/glob-test/*,*}": [ - "/tmp/glob-test/asdf", - "/tmp/glob-test/bar", - "/tmp/glob-test/baz", - "/tmp/glob-test/foo", - "/tmp/glob-test/quux", - "/tmp/glob-test/qwer", - "/tmp/glob-test/rewq", - "examples", - "glob.js", - "LICENSE", - "node_modules", - "package.json", - "README.md", - "test" - ], - "test/a/!(symlink)/**": [ - "test/a/abcdef", - "test/a/abcdef/g", - "test/a/abcdef/g/h", - "test/a/abcfed", - "test/a/abcfed/g", - "test/a/abcfed/g/h", - "test/a/b", - "test/a/b/c", - "test/a/b/c/d", - "test/a/bc", - "test/a/bc/e", - "test/a/bc/e/f", - "test/a/c", - "test/a/c/d", - "test/a/c/d/c", - "test/a/c/d/c/b", - "test/a/cb", - "test/a/cb/e", - "test/a/cb/e/f" - ] -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/cwd-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/cwd-test.js deleted file mode 100644 index 352c27e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/cwd-test.js +++ /dev/null @@ -1,55 +0,0 @@ -var tap = require("tap") - -var origCwd = process.cwd() -process.chdir(__dirname) - -tap.test("changing cwd and searching for **/d", function (t) { - var glob = require('../') - var path = require('path') - t.test('.', function (t) { - glob('**/d', function (er, matches) { - t.ifError(er) - t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) - t.end() - }) - }) - - t.test('a', function (t) { - glob('**/d', {cwd:path.resolve('a')}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'b/c/d', 'c/d' ]) - t.end() - }) - }) - - t.test('a/b', function (t) { - glob('**/d', {cwd:path.resolve('a/b')}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'c/d' ]) - t.end() - }) - }) - - t.test('a/b/', function (t) { - glob('**/d', {cwd:path.resolve('a/b/')}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'c/d' ]) - t.end() - }) - }) - - t.test('.', function (t) { - glob('**/d', {cwd: process.cwd()}, function (er, matches) { - t.ifError(er) - t.like(matches, [ 'a/b/c/d', 'a/c/d' ]) - t.end() - }) - }) - - t.test('cd -', function (t) { - process.chdir(origCwd) - t.end() - }) - - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/globstar-match.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/globstar-match.js deleted file mode 100644 index 9b234fa..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/globstar-match.js +++ /dev/null @@ -1,19 +0,0 @@ -var Glob = require("../glob.js").Glob -var test = require('tap').test - -test('globstar should not have dupe matches', function(t) { - var pattern = 'a/**/[gh]' - var g = new Glob(pattern, { cwd: __dirname }) - var matches = [] - g.on('match', function(m) { - console.error('match %j', m) - matches.push(m) - }) - g.on('end', function(set) { - console.error('set', set) - matches = matches.sort() - set = set.sort() - t.same(matches, set, 'should have same set of matches') - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/mark.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/mark.js deleted file mode 100644 index bf411c0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/mark.js +++ /dev/null @@ -1,118 +0,0 @@ -var test = require("tap").test -var glob = require('../') -process.chdir(__dirname) - -// expose timing issues -var lag = 5 -glob.Glob.prototype._stat = function(o) { return function(f, cb) { - var args = arguments - setTimeout(function() { - o.call(this, f, cb) - }.bind(this), lag += 5) -}}(glob.Glob.prototype._stat) - - -test("mark, with **", function (t) { - glob("a/*b*/**", {mark: true}, function (er, results) { - if (er) - throw er - var expect = - [ 'a/abcdef/', - 'a/abcdef/g/', - 'a/abcdef/g/h', - 'a/abcfed/', - 'a/abcfed/g/', - 'a/abcfed/g/h', - 'a/b/', - 'a/b/c/', - 'a/b/c/d', - 'a/bc/', - 'a/bc/e/', - 'a/bc/e/f', - 'a/cb/', - 'a/cb/e/', - 'a/cb/e/f' ] - - t.same(results, expect) - t.end() - }) -}) - -test("mark, no / on pattern", function (t) { - glob("a/*", {mark: true}, function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef/', - 'a/abcfed/', - 'a/b/', - 'a/bc/', - 'a/c/', - 'a/cb/' ] - - if (process.platform !== "win32") - expect.push('a/symlink/') - - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /\/$/) - }) -}) - -test("mark=false, no / on pattern", function (t) { - glob("a/*", function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef', - 'a/abcfed', - 'a/b', - 'a/bc', - 'a/c', - 'a/cb' ] - - if (process.platform !== "win32") - expect.push('a/symlink') - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /[^\/]$/) - }) -}) - -test("mark=true, / on pattern", function (t) { - glob("a/*/", {mark: true}, function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef/', - 'a/abcfed/', - 'a/b/', - 'a/bc/', - 'a/c/', - 'a/cb/' ] - if (process.platform !== "win32") - expect.push('a/symlink/') - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /\/$/) - }) -}) - -test("mark=false, / on pattern", function (t) { - glob("a/*/", function (er, results) { - if (er) - throw er - var expect = [ 'a/abcdef/', - 'a/abcfed/', - 'a/b/', - 'a/bc/', - 'a/c/', - 'a/cb/' ] - if (process.platform !== "win32") - expect.push('a/symlink/') - t.same(results, expect) - t.end() - }).on('match', function(m) { - t.similar(m, /\/$/) - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/new-glob-optional-options.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/new-glob-optional-options.js deleted file mode 100644 index 3e7dc5a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/new-glob-optional-options.js +++ /dev/null @@ -1,10 +0,0 @@ -var Glob = require('../glob.js').Glob; -var test = require('tap').test; - -test('new glob, with cb, and no options', function (t) { - new Glob(__filename, function(er, results) { - if (er) throw er; - t.same(results, [__filename]); - t.end(); - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/nocase-nomagic.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/nocase-nomagic.js deleted file mode 100644 index 2503f23..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/nocase-nomagic.js +++ /dev/null @@ -1,113 +0,0 @@ -var fs = require('fs'); -var test = require('tap').test; -var glob = require('../'); - -test('mock fs', function(t) { - var stat = fs.stat - var statSync = fs.statSync - var readdir = fs.readdir - var readdirSync = fs.readdirSync - - function fakeStat(path) { - var ret - switch (path.toLowerCase()) { - case '/tmp': case '/tmp/': - ret = { isDirectory: function() { return true } } - break - case '/tmp/a': - ret = { isDirectory: function() { return false } } - break - } - return ret - } - - fs.stat = function(path, cb) { - var f = fakeStat(path); - if (f) { - process.nextTick(function() { - cb(null, f) - }) - } else { - stat.call(fs, path, cb) - } - } - - fs.statSync = function(path) { - return fakeStat(path) || statSync.call(fs, path) - } - - function fakeReaddir(path) { - var ret - switch (path.toLowerCase()) { - case '/tmp': case '/tmp/': - ret = [ 'a', 'A' ] - break - case '/': - ret = ['tmp', 'tMp', 'tMP', 'TMP'] - } - return ret - } - - fs.readdir = function(path, cb) { - var f = fakeReaddir(path) - if (f) - process.nextTick(function() { - cb(null, f) - }) - else - readdir.call(fs, path, cb) - } - - fs.readdirSync = function(path) { - return fakeReaddir(path) || readdirSync.call(fs, path) - } - - t.pass('mocked') - t.end() -}) - -test('nocase, nomagic', function(t) { - var n = 2 - var want = [ '/TMP/A', - '/TMP/a', - '/tMP/A', - '/tMP/a', - '/tMp/A', - '/tMp/a', - '/tmp/A', - '/tmp/a' ] - glob('/tmp/a', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - if (--n === 0) t.end() - }) - glob('/tmp/A', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - if (--n === 0) t.end() - }) -}) - -test('nocase, with some magic', function(t) { - t.plan(2) - var want = [ '/TMP/A', - '/TMP/a', - '/tMP/A', - '/tMP/a', - '/tMp/A', - '/tMp/a', - '/tmp/A', - '/tmp/a' ] - glob('/tmp/*', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - }) - glob('/tmp/*', { nocase: true }, function(er, res) { - if (er) - throw er - t.same(res.sort(), want) - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/pause-resume.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/pause-resume.js deleted file mode 100644 index e1ffbab..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/pause-resume.js +++ /dev/null @@ -1,73 +0,0 @@ -// show that no match events happen while paused. -var tap = require("tap") -, child_process = require("child_process") -// just some gnarly pattern with lots of matches -, pattern = "test/a/!(symlink)/**" -, bashResults = require("./bash-results.json") -, patterns = Object.keys(bashResults) -, glob = require("../") -, Glob = glob.Glob -, path = require("path") - -// run from the root of the project -// this is usually where you're at anyway, but be sure. -process.chdir(path.resolve(__dirname, "..")) - -function alphasort (a, b) { - a = a.toLowerCase() - b = b.toLowerCase() - return a > b ? 1 : a < b ? -1 : 0 -} - -function cleanResults (m) { - // normalize discrepancies in ordering, duplication, - // and ending slashes. - return m.map(function (m) { - return m.replace(/\/+/g, "/").replace(/\/$/, "") - }).sort(alphasort).reduce(function (set, f) { - if (f !== set[set.length - 1]) set.push(f) - return set - }, []).sort(alphasort).map(function (f) { - // de-windows - return (process.platform !== 'win32') ? f - : f.replace(/^[a-zA-Z]:\\\\/, '/').replace(/\\/g, '/') - }) -} - -var globResults = [] -tap.test("use a Glob object, and pause/resume it", function (t) { - var g = new Glob(pattern) - , paused = false - , res = [] - , expect = bashResults[pattern] - - g.on("pause", function () { - console.error("pause") - }) - - g.on("resume", function () { - console.error("resume") - }) - - g.on("match", function (m) { - t.notOk(g.paused, "must not be paused") - globResults.push(m) - g.pause() - t.ok(g.paused, "must be paused") - setTimeout(g.resume.bind(g), 10) - }) - - g.on("end", function (matches) { - t.pass("reached glob end") - globResults = cleanResults(globResults) - matches = cleanResults(matches) - t.deepEqual(matches, globResults, - "end event matches should be the same as match events") - - t.deepEqual(matches, expect, - "glob matches should be the same as bash results") - - t.end() - }) -}) - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/readme-issue.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/readme-issue.js deleted file mode 100644 index 0b4e0be..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/readme-issue.js +++ /dev/null @@ -1,36 +0,0 @@ -var test = require("tap").test -var glob = require("../") - -var mkdirp = require("mkdirp") -var fs = require("fs") -var rimraf = require("rimraf") -var dir = __dirname + "/package" - -test("setup", function (t) { - mkdirp.sync(dir) - fs.writeFileSync(dir + "/package.json", "{}", "ascii") - fs.writeFileSync(dir + "/README", "x", "ascii") - t.pass("setup done") - t.end() -}) - -test("glob", function (t) { - var opt = { - cwd: dir, - nocase: true, - mark: true - } - - glob("README?(.*)", opt, function (er, files) { - if (er) - throw er - t.same(files, ["README"]) - t.end() - }) -}) - -test("cleanup", function (t) { - rimraf.sync(dir) - t.pass("clean") - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root-nomount.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root-nomount.js deleted file mode 100644 index 3ac5979..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root-nomount.js +++ /dev/null @@ -1,39 +0,0 @@ -var tap = require("tap") - -var origCwd = process.cwd() -process.chdir(__dirname) - -tap.test("changing root and searching for /b*/**", function (t) { - var glob = require('../') - var path = require('path') - t.test('.', function (t) { - glob('/b*/**', { globDebug: true, root: '.', nomount: true }, function (er, matches) { - t.ifError(er) - t.like(matches, []) - t.end() - }) - }) - - t.test('a', function (t) { - glob('/b*/**', { globDebug: true, root: path.resolve('a'), nomount: true }, function (er, matches) { - t.ifError(er) - t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) - t.end() - }) - }) - - t.test('root=a, cwd=a/b', function (t) { - glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b'), nomount: true }, function (er, matches) { - t.ifError(er) - t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ]) - t.end() - }) - }) - - t.test('cd -', function (t) { - process.chdir(origCwd) - t.end() - }) - - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root.js deleted file mode 100644 index 95c23f9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/root.js +++ /dev/null @@ -1,46 +0,0 @@ -var t = require("tap") - -var origCwd = process.cwd() -process.chdir(__dirname) - -var glob = require('../') -var path = require('path') - -t.test('.', function (t) { - glob('/b*/**', { globDebug: true, root: '.' }, function (er, matches) { - t.ifError(er) - t.like(matches, []) - t.end() - }) -}) - - -t.test('a', function (t) { - console.error("root=" + path.resolve('a')) - glob('/b*/**', { globDebug: true, root: path.resolve('a') }, function (er, matches) { - t.ifError(er) - var wanted = [ - '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' - ].map(function (m) { - return path.join(path.resolve('a'), m).replace(/\\/g, '/') - }) - - t.like(matches, wanted) - t.end() - }) -}) - -t.test('root=a, cwd=a/b', function (t) { - glob('/b*/**', { globDebug: true, root: 'a', cwd: path.resolve('a/b') }, function (er, matches) { - t.ifError(er) - t.like(matches, [ '/b', '/b/c', '/b/c/d', '/bc', '/bc/e', '/bc/e/f' ].map(function (m) { - return path.join(path.resolve('a'), m).replace(/\\/g, '/') - })) - t.end() - }) -}) - -t.test('cd -', function (t) { - process.chdir(origCwd) - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/stat.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/stat.js deleted file mode 100644 index 6291711..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/stat.js +++ /dev/null @@ -1,32 +0,0 @@ -var glob = require('../') -var test = require('tap').test -var path = require('path') - -test('stat all the things', function(t) { - var g = new glob.Glob('a/*abc*/**', { stat: true, cwd: __dirname }) - var matches = [] - g.on('match', function(m) { - matches.push(m) - }) - var stats = [] - g.on('stat', function(m) { - stats.push(m) - }) - g.on('end', function(eof) { - stats = stats.sort() - matches = matches.sort() - eof = eof.sort() - t.same(stats, matches) - t.same(eof, matches) - var cache = Object.keys(this.statCache) - t.same(cache.map(function (f) { - return path.relative(__dirname, f) - }).sort(), matches) - - cache.forEach(function(c) { - t.equal(typeof this.statCache[c], 'object') - }, this) - - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/zz-cleanup.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/zz-cleanup.js deleted file mode 100644 index e085f0f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/glob/test/zz-cleanup.js +++ /dev/null @@ -1,11 +0,0 @@ -// remove the fixtures -var tap = require("tap") -, rimraf = require("rimraf") -, path = require("path") - -tap.test("cleanup fixtures", function (t) { - rimraf(path.resolve(__dirname, "a"), function (er) { - t.ifError(er, "removed") - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/LICENSE deleted file mode 100644 index dea3013..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/LICENSE +++ /dev/null @@ -1,16 +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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/README.md deleted file mode 100644 index b1c5665..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/README.md +++ /dev/null @@ -1,42 +0,0 @@ -Browser-friendly inheritance fully compatible with standard node.js -[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor). - -This package exports standard `inherits` from node.js `util` module in -node environment, but also provides alternative browser-friendly -implementation through [browser -field](https://gist.github.com/shtylman/4339901). Alternative -implementation is a literal copy of standard one located in standalone -module to avoid requiring of `util`. It also has a shim for old -browsers with no `Object.create` support. - -While keeping you sure you are using standard `inherits` -implementation in node.js environment, it allows bundlers such as -[browserify](https://github.com/substack/node-browserify) to not -include full `util` package to your client code if all you need is -just `inherits` function. It worth, because browser shim for `util` -package is large and `inherits` is often the single function you need -from it. - -It's recommended to use this package instead of -`require('util').inherits` for any code that has chances to be used -not only in node.js but in browser too. - -## usage - -```js -var inherits = require('inherits'); -// then use exactly as the standard one -``` - -## note on version ~1.0 - -Version ~1.0 had completely different motivation and is not compatible -neither with 2.0 nor with standard node.js `inherits`. - -If you are using version ~1.0 and planning to switch to ~2.0, be -careful: - -* new version uses `super_` instead of `super` for referencing - superclass -* new version overwrites current prototype while old one preserves any - existing fields on it diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits.js deleted file mode 100644 index 29f5e24..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('util').inherits diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits_browser.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits_browser.js deleted file mode 100644 index c1e78a7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/inherits_browser.js +++ /dev/null @@ -1,23 +0,0 @@ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/package.json deleted file mode 100644 index 1d7b9d5..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "inherits", - "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()", - "version": "2.0.1", - "keywords": [ - "inheritance", - "class", - "klass", - "oop", - "object-oriented", - "inherits", - "browser", - "browserify" - ], - "main": "./inherits.js", - "browser": "./inherits_browser.js", - "repository": { - "type": "git", - "url": "git://github.com/isaacs/inherits" - }, - "license": "ISC", - "scripts": { - "test": "node test" - }, - "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n superclass\n* new version overwrites current prototype while old one preserves any\n existing fields on it\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/inherits/issues" - }, - "homepage": "https://github.com/isaacs/inherits", - "_id": "inherits@2.0.1", - "_from": "inherits@*" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/test.js deleted file mode 100644 index fc53012..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/inherits/test.js +++ /dev/null @@ -1,25 +0,0 @@ -var inherits = require('./inherits.js') -var assert = require('assert') - -function test(c) { - assert(c.constructor === Child) - assert(c.constructor.super_ === Parent) - assert(Object.getPrototypeOf(c) === Child.prototype) - assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype) - assert(c instanceof Child) - assert(c instanceof Parent) -} - -function Child() { - Parent.call(this) - test(this) -} - -function Parent() {} - -inherits(Child, Parent) - -var c = new Child -test(c) - -console.log('ok') diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.npmignore deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.travis.yml deleted file mode 100644 index 84fd7ca..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/examples/pow.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/examples/pow.js deleted file mode 100644 index e692421..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/index.js deleted file mode 100644 index fda6de8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/index.js +++ /dev/null @@ -1,82 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, mode, f, made) { - if (typeof mode === 'function' || mode === undefined) { - f = mode; - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - fs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), mode, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, mode, 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: - fs.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, mode, made) { - if (mode === undefined) { - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - try { - fs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), mode, made); - sync(p, mode, 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 = fs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - } - } - - return made; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/package.json deleted file mode 100644 index 43feac7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "mkdirp", - "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.5", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "main": "./index", - "keywords": [ - "mkdir", - "directory" - ], - "repository": { - "type": "git", - "url": "http://github.com/substack/node-mkdirp.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "~0.4.0" - }, - "license": "MIT", - "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n \nmkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, mode, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\n## mkdirp.sync(dir, mode)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\n# license\n\nMIT\n", - "readmeFilename": "readme.markdown", - "bugs": { - "url": "https://github.com/substack/node-mkdirp/issues" - }, - "homepage": "https://github.com/substack/node-mkdirp", - "_id": "mkdirp@0.3.5", - "_from": "mkdirp@~0.3" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/readme.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/readme.markdown deleted file mode 100644 index 83b0216..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/readme.markdown +++ /dev/null @@ -1,63 +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, mode, cb) - -Create a new directory and any necessary subdirectories at `dir` with octal -permission string `mode`. - -If `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. - -## mkdirp.sync(dir, mode) - -Synchronously create a new directory and any necessary subdirectories at `dir` -with octal permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -Returns the first directory that had to be created, if any. - -# install - -With [npm](http://npmjs.org) do: - -``` -npm install mkdirp -``` - -# license - -MIT diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/chmod.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/chmod.js deleted file mode 100644 index 520dcb8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/chmod.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 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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/clobber.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/clobber.js deleted file mode 100644 index 0eb7099..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/clobber.js +++ /dev/null @@ -1,37 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -// a file in the way -var itw = ps.slice(0, 3).join('/'); - - -test('clobber-pre', function (t) { - console.error("about to write to "+itw) - fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); - - fs.stat(itw, function (er, stat) { - t.ifError(er) - t.ok(stat && stat.isFile(), 'should be file') - t.end() - }) -}) - -test('clobber', function (t) { - t.plan(2); - mkdirp(file, 0755, function (err) { - t.ok(err); - t.equal(err.code, 'ENOTDIR'); - t.end(); - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/mkdirp.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/mkdirp.js deleted file mode 100644 index b07cd70..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/mkdirp.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('woo', 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('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm.js deleted file mode 100644 index 23a7abb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('async perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); - -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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm_sync.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm_sync.js deleted file mode 100644 index f685f60..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/perm_sync.js +++ /dev/null @@ -1,39 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; - - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); - -test('sync root perm', function (t) { - t.plan(1); - - var file = '/tmp'; - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/race.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/race.js deleted file mode 100644 index 96a0447..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/race.js +++ /dev/null @@ -1,41 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('race', function (t) { - t.plan(4); - var ps = [ '', 'tmp' ]; - - for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); - } - var file = ps.join('/'); - - var res = 2; - mk(file, function () { - if (--res === 0) t.end(); - }); - - mk(file, function () { - if (--res === 0) t.end(); - }); - - function mk (file, cb) { - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - if (cb) cb(); - } - }) - }) - }); - } -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/rel.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/rel.js deleted file mode 100644 index 7985824..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/rel.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('rel', 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 cwd = process.cwd(); - process.chdir('/tmp'); - - var file = [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - process.chdir(cwd); - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/return.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/return.js deleted file mode 100644 index bce68e5..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/return_sync.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/return_sync.js deleted file mode 100644 index 7c222d3..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/root.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/root.js deleted file mode 100644 index 97ad7a2..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/root.js +++ /dev/null @@ -1,18 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('root', function (t) { - // '/' on unix, 'c:/' on windows. - var file = path.resolve('/'); - - mkdirp(file, 0755, function (err) { - if (err) throw err - fs.stat(file, function (er, stat) { - if (er) throw er - t.ok(stat.isDirectory(), 'target is a directory'); - t.end(); - }) - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/sync.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/sync.js deleted file mode 100644 index 7530cad..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync', 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('/'); - - try { - mkdirp.sync(file, 0755); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask.js deleted file mode 100644 index 64ccafe..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('implicit mode from umask', 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('/'); - - mkdirp(file, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0777 & (~process.umask())); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask_sync.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/mkdirp/test/umask_sync.js deleted file mode 100644 index 35bd5cb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/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 test = require('tap').test; - -test('umask sync modes', 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('/'); - - try { - mkdirp.sync(file); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, (0777 & (~process.umask()))); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/README.md deleted file mode 100644 index 96798a1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/README.md +++ /dev/null @@ -1,210 +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 go half-insane just trying to manage them all, and put -it off with duct-tape solutions until you see exactly to the core of the -problem, and finally snap and write an awesome option parser. - -If you want to write an option parser, don't write an option parser. -Write a package manager, or a source control system, or a service -restarter, or an operating system. You probably won't end up with a -good one of those, but if you don't give up, and you are relentless and -diligent enough in your procrastination, you may just end up with a very -nice option parser. - -## USAGE - - // my-program.js - var nopt = require("nopt") - , Stream = require("stream").Stream - , path = require("path") - , knownOpts = { "foo" : [String, null] - , "bar" : [Stream, Number] - , "baz" : path - , "bloo" : [ "big", "medium", "small" ] - , "flag" : Boolean - , "pick" : Boolean - , "many" : [String, Array] - } - , shortHands = { "foofoo" : ["--foo", "Mr. Foo"] - , "b7" : ["--bar", "7"] - , "m" : ["--bloo", "medium"] - , "p" : ["--pick"] - , "f" : ["--flag"] - } - // everything is optional. - // knownOpts and shorthands default to {} - // arg list defaults to process.argv - // slice defaults to 2 - , parsed = nopt(knownOpts, shortHands, process.argv, 2) - console.log(parsed) - -This would give you support for any of the following: - -```bash -$ node my-program.js --foo "blerp" --no-flag -{ "foo" : "blerp", "flag" : false } - -$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag -{ bar: 7, foo: "Mr. Hand", flag: true } - -$ node my-program.js --foo "blerp" -f -----p -{ foo: "blerp", flag: true, pick: true } - -$ node my-program.js -fp --foofoo -{ foo: "Mr. Foo", flag: true, pick: true } - -$ node my-program.js --foofoo -- -fp # -- stops the flag parsing. -{ foo: "Mr. Foo", argv: { remain: ["-fp"] } } - -$ node my-program.js --blatzk -fp # unknown opts are ok. -{ blatzk: true, flag: true, pick: true } - -$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value -{ blatzk: 1000, flag: true, pick: true } - -$ node my-program.js --no-blatzk -fp # unless they start with "no-" -{ blatzk: false, flag: true, pick: true } - -$ node my-program.js --baz b/a/z # known paths are resolved. -{ baz: "/Users/isaacs/b/a/z" } - -# if Array is one of the types, then it can take many -# values, and will always be an array. The other types provided -# specify what types are allowed in the list. - -$ node my-program.js --many 1 --many null --many foo -{ many: ["1", "null", "foo"] } - -$ node my-program.js --many foo -{ many: ["foo"] } -``` - -Read the tests at the bottom of `lib/nopt.js` for more examples of -what this puppy can do. - -## Types - -The following types are supported, and defined on `nopt.typeDefs` - -* String: A normal string. No parsing is done. -* path: A file system path. Gets resolved against cwd if not absolute. -* url: A url. If it doesn't parse, it isn't accepted. -* Number: Must be numeric. -* Date: Must parse as a date. If it does, and `Date` is one of the options, - then it will return a Date object, not a string. -* Boolean: Must be either `true` or `false`. If an option is a boolean, - then it does not need a value, and its presence will imply `true` as - the value. To negate boolean flags, do `--no-whatever` or `--whatever - false` -* NaN: Means that the option is strictly not allowed. Any value will - fail. -* Stream: An object matching the "Stream" class in node. Valuable - for use when validating programmatically. (npm uses this to let you - supply any WriteStream on the `outfd` and `logfd` config options.) -* Array: If `Array` is specified as one of the types, then the value - will be parsed as a list of options. This means that multiple values - can be specified, and that the value will always be an array. - -If a type is an array of values not on this list, then those are -considered valid values. For instance, in the example above, the -`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`, -and any other value will be rejected. - -When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be -interpreted as their JavaScript equivalents, and numeric values will be -interpreted as a number. - -You can also mix types and values, or multiple types, in a list. For -instance `{ blah: [Number, null] }` would allow a value to be set to -either a Number or null. When types are ordered, this implies a -preference, and the first type that can be used to properly interpret -the value will be used. - -To define a new type, add it to `nopt.typeDefs`. Each item in that -hash is an object with a `type` member and a `validate` method. The -`type` member is an object that matches what goes in the type list. The -`validate` method is a function that gets called with `validate(data, -key, val)`. Validate methods should assign `data[key]` to the valid -value of `val` if it can be handled properly, or return boolean -`false` if it cannot. - -You can also call `nopt.clean(data, types, typeDefs)` to clean up a -config object and remove its invalid properties. - -## Error Handling - -By default, nopt outputs a warning to standard error when invalid -options are found. You can change this behavior by assigning a method -to `nopt.invalidHandler`. This method will be called with -the offending `nopt.invalidHandler(key, val, types)`. - -If no `nopt.invalidHandler` is assigned, then it will console.error -its whining. If it is assigned to boolean `false` then the warning is -suppressed. - -## Abbreviations - -Yes, they are supported. If you define options like this: - -```javascript -{ "foolhardyelephants" : Boolean -, "pileofmonkeys" : Boolean } -``` - -Then this will work: - -```bash -node program.js --foolhar --pil -node program.js --no-f --pileofmon -# etc. -``` - -## Shorthands - -Shorthands are a hash of shorter option names to a snippet of args that -they expand to. - -If multiple one-character shorthands are all combined, and the -combination does not unambiguously match any other option or shorthand, -then they will be broken up into their constituent parts. For example: - -```json -{ "s" : ["--loglevel", "silent"] -, "g" : "--global" -, "f" : "--force" -, "p" : "--parseable" -, "l" : "--long" -} -``` - -```bash -npm ls -sgflp -# just like doing this: -npm ls --loglevel silent --global --force --long --parseable -``` - -## The Rest of the args - -The config object returned by nopt is given a special member called -`argv`, which is an object with the following fields: - -* `remain`: The remaining args after all the parsing has occurred. -* `original`: The args as they originally appeared. -* `cooked`: The args after flags and shorthands are expanded. - -## Slicing - -Node programs are called with more or less the exact argv as it appears -in C land, after the v8 and node-specific options have been plucked off. -As such, `argv[0]` is always `node` and `argv[1]` is always the -JavaScript program being run. - -That's usually not very useful to you. So they're sliced off by -default. If you want them, then you can pass in `0` as the last -argument, or any other number that you'd like to slice off the start of -the list. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/bin/nopt.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/bin/nopt.js deleted file mode 100755 index 30e9fdb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/bin/nopt.js +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env node -var nopt = require("../lib/nopt") - , 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 - } - , 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"] - } - , 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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/examples/my-program.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/examples/my-program.js deleted file mode 100755 index 142447e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/lib/nopt.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/lib/nopt.js deleted file mode 100644 index 9efab7a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/lib/nopt.js +++ /dev/null @@ -1,412 +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") - -module.exports = exports = nopt -exports.clean = clean - -exports.typeDefs = - { String : { type: String, validate: validateString } - , Boolean : { type: Boolean, validate: validateBoolean } - , url : { type: url, validate: validateUrl } - , Number : { type: Number, validate: validateNumber } - , path : { type: path, validate: validatePath } - , Stream : { type: Stream, validate: validateStream } - , Date : { type: Date, validate: validateDate } - } - -function nopt (types, shorthands, args, slice) { - args = args || process.argv - types = types || {} - shorthands = shorthands || {} - if (typeof slice !== "number") slice = 2 - - debug(types, shorthands, args, slice) - - args = args.slice(slice) - var data = {} - , key - , remain = [] - , cooked = args - , original = args.slice(0) - - parse(args, data, remain, types, shorthands) - // now data is full - clean(data, types, exports.typeDefs) - data.argv = {remain:remain,cooked:cooked,original:original} - Object.defineProperty(data.argv, 'toString', { value: function () { - return this.original.map(JSON.stringify).join(" ") - }, enumerable: false }) - return data -} - -function clean (data, types, typeDefs) { - typeDefs = typeDefs || exports.typeDefs - var remove = {} - , typeDefault = [false, true, null, String, Number, 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 - val = String(val) - var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\// - if (val.match(homePattern) && process.env.HOME) { - val = path.resolve(process.env.HOME, val.substr(2)) - } - data[k] = path.resolve(String(val)) - return true -} - -function validateNumber (data, k, val) { - debug("validate Number %j %j %j", k, val, isNaN(val)) - if (isNaN(val)) return false - data[k] = +val -} - -function validateDate (data, k, val) { - debug("validate Date %j %j %j", k, val, Date.parse(val)) - var s = Date.parse(val) - if (isNaN(s)) return false - data[k] = new Date(val) -} - -function validateBoolean (data, k, val) { - if (val instanceof Boolean) val = val.valueOf() - else if (typeof val === "string") { - if (!isNaN(val)) val = !!(+val) - else if (val === "null" || val === "false") val = false - else val = true - } else val = !!val - data[k] = val -} - -function validateUrl (data, k, val) { - val = url.parse(String(val)) - if (!val.host) return false - data[k] = val.href -} - -function validateStream (data, k, val) { - if (!(val instanceof Stream)) return false - data[k] = val -} - -function validate (data, k, val, type, typeDefs) { - // arrays are lists of types. - if (Array.isArray(type)) { - for (var i = 0, l = type.length; i < l; i ++) { - if (type[i] === Array) continue - if (validate(data, k, val, type[i], typeDefs)) return true - } - delete data[k] - return false - } - - // an array of anything? - if (type === Array) return true - - // NaN is poisonous. Means that something is not allowed. - if (type !== type) { - debug("Poison NaN", k, val, type) - delete data[k] - return false - } - - // explicit list of values - if (val === type) { - debug("Explicitly allowed %j", val) - // if (isArray) (data[k] = data[k] || []).push(val) - // else data[k] = val - data[k] = val - return true - } - - // now go through the list of typeDefs, validate against each one. - var ok = false - , types = Object.keys(typeDefs) - for (var i = 0, l = types.length; i < l; i ++) { - debug("test type %j %j %j", k, val, types[i]) - var t = typeDefs[types[i]] - if (t && type === t.type) { - var d = {} - ok = false !== t.validate(d, k, val) - val = d[k] - if (ok) { - // if (isArray) (data[k] = data[k] || []).push(val) - // else data[k] = val - data[k] = val - break - } - } - } - debug("OK? %j (%j %j %j)", ok, k, val, types[i]) - - if (!ok) delete data[k] - return ok -} - -function parse (args, data, remain, types, shorthands) { - debug("parse", args, data, remain) - - var key = null - , abbrevs = abbrev(Object.keys(types)) - , shortAbbr = abbrev(Object.keys(shorthands)) - - for (var i = 0; i < args.length; i ++) { - var arg = args[i] - debug("arg", arg) - - if (arg.match(/^-{2,}$/)) { - // done with keys. - // the rest are args. - remain.push.apply(remain, args.slice(i + 1)) - args[i] = "--" - break - } - var hadEq = false - if (arg.charAt(0) === "-" && arg.length > 1) { - if (arg.indexOf("=") !== -1) { - hadEq = true - var v = arg.split("=") - arg = v.shift() - v = v.join("=") - args.splice.apply(args, [i, 1].concat([arg, v])) - } - - // see if it's a shorthand - // if so, splice and back up to re-parse it. - var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs) - debug("arg=%j shRes=%j", arg, shRes) - if (shRes) { - debug(arg, shRes) - args.splice.apply(args, [i, 1].concat(shRes)) - if (arg !== shRes[0]) { - i -- - continue - } - } - arg = arg.replace(/^-+/, "") - var no = null - while (arg.toLowerCase().indexOf("no-") === 0) { - no = !no - arg = arg.substr(3) - } - - if (abbrevs[arg]) arg = abbrevs[arg] - - var isArray = types[arg] === Array || - Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1 - - // allow unknown things to be arrays if specified multiple times. - if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) { - if (!Array.isArray(data[arg])) - data[arg] = [data[arg]] - isArray = true - } - - var val - , la = args[i + 1] - - var isBool = typeof no === 'boolean' || - types[arg] === Boolean || - Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 || - (typeof types[arg] === 'undefined' && !hadEq) || - (la === "false" && - (types[arg] === null || - Array.isArray(types[arg]) && ~types[arg].indexOf(null))) - - if (isBool) { - // just set and move along - val = !no - // however, also support --bool true or --bool false - if (la === "true" || la === "false") { - val = JSON.parse(la) - la = null - if (no) val = !val - i ++ - } - - // also support "foo":[Boolean, "bar"] and "--foo bar" - if (Array.isArray(types[arg]) && la) { - if (~types[arg].indexOf(la)) { - // an explicit type - val = la - i ++ - } else if ( la === "null" && ~types[arg].indexOf(null) ) { - // null allowed - val = null - i ++ - } else if ( !la.match(/^-{2,}[^-]/) && - !isNaN(la) && - ~types[arg].indexOf(Number) ) { - // number - val = +la - i ++ - } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) { - // string - val = la - i ++ - } - } - - if (isArray) (data[arg] = data[arg] || []).push(val) - else data[arg] = val - - continue - } - - if (types[arg] === String && la === undefined) - la = "" - - if (la && la.match(/^-{2,}$/)) { - la = undefined - i -- - } - - val = la === undefined ? true : la - if (isArray) (data[arg] = data[arg] || []).push(val) - else data[arg] = val - - i ++ - continue - } - remain.push(arg) - } -} - -function resolveShort (arg, shorthands, shortAbbr, abbrevs) { - // handle single-char shorthands glommed together, like - // npm ls -glp, but only if there is one dash, and only if - // all of the chars are single-char shorthands, and it's - // not a match to some other abbrev. - arg = arg.replace(/^-+/, '') - - // if it's an exact known option, then don't go any further - if (abbrevs[arg] === arg) - return null - - // if it's an exact known shortopt, same deal - if (shorthands[arg]) { - // make it an array, if it's a list of words - if (shorthands[arg] && !Array.isArray(shorthands[arg])) - shorthands[arg] = shorthands[arg].split(/\s+/) - - return shorthands[arg] - } - - // first check to see if this arg is a set of single-char shorthands - var singles = shorthands.___singles - if (!singles) { - singles = Object.keys(shorthands).filter(function (s) { - return s.length === 1 - }).reduce(function (l,r) { - l[r] = true - return l - }, {}) - shorthands.___singles = singles - debug('shorthand singles', singles) - } - - var chrs = arg.split("").filter(function (c) { - return singles[c] - }) - - if (chrs.join("") === arg) return chrs.map(function (c) { - return shorthands[c] - }).reduce(function (l, r) { - return l.concat(r) - }, []) - - - // if it's an arg abbrev, and not a literal shorthand, then prefer the arg - if (abbrevs[arg] && !shorthands[arg]) - return null - - // if it's an abbr for a shorthand, then use that - if (shortAbbr[arg]) - arg = shortAbbr[arg] - - // make it an array, if it's a list of words - if (shorthands[arg] && !Array.isArray(shorthands[arg])) - shorthands[arg] = shorthands[arg].split(/\s+/) - - return shorthands[arg] -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md deleted file mode 100644 index 2f30261..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ - To get started, sign the - Contributor License Agreement. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/LICENSE deleted file mode 100644 index 05a4010..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/README.md deleted file mode 100644 index 99746fe..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/abbrev.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/abbrev.js deleted file mode 100644 index 69cfeac..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/abbrev.js +++ /dev/null @@ -1,62 +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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/package.json deleted file mode 100644 index b189020..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "abbrev", - "version": "1.0.5", - "description": "Like ruby's abbrev module, but in js", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me" - }, - "main": "abbrev.js", - "scripts": { - "test": "node test.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/isaacs/abbrev-js" - }, - "license": { - "type": "MIT", - "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE" - }, - "readme": "# abbrev-js\n\nJust like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).\n\nUsage:\n\n var abbrev = require(\"abbrev\");\n abbrev(\"foo\", \"fool\", \"folding\", \"flop\");\n \n // returns:\n { fl: 'flop'\n , flo: 'flop'\n , flop: 'flop'\n , fol: 'folding'\n , fold: 'folding'\n , foldi: 'folding'\n , foldin: 'folding'\n , folding: 'folding'\n , foo: 'foo'\n , fool: 'fool'\n }\n\nThis is handy for command-line scripts, or other cases where you want to be able to accept shorthands.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/abbrev-js/issues" - }, - "homepage": "https://github.com/isaacs/abbrev-js", - "_id": "abbrev@1.0.5", - "_from": "abbrev@1" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/test.js deleted file mode 100644 index d5a7303..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/node_modules/abbrev/test.js +++ /dev/null @@ -1,47 +0,0 @@ -var abbrev = require('./abbrev.js') -var assert = require("assert") -var util = require("util") - -console.log("TAP Version 13") -var count = 0 - -function test (list, expect) { - count++ - var actual = abbrev(list) - assert.deepEqual(actual, expect, - "abbrev("+util.inspect(list)+") === " + util.inspect(expect) + "\n"+ - "actual: "+util.inspect(actual)) - actual = abbrev.apply(exports, list) - assert.deepEqual(abbrev.apply(exports, list), expect, - "abbrev("+list.map(JSON.stringify).join(",")+") === " + util.inspect(expect) + "\n"+ - "actual: "+util.inspect(actual)) - console.log('ok - ' + list.join(' ')) -} - -test([ "ruby", "ruby", "rules", "rules", "rules" ], -{ rub: 'ruby' -, ruby: 'ruby' -, rul: 'rules' -, rule: 'rules' -, rules: 'rules' -}) -test(["fool", "foom", "pool", "pope"], -{ fool: 'fool' -, foom: 'foom' -, poo: 'pool' -, pool: 'pool' -, pop: 'pope' -, pope: 'pope' -}) -test(["a", "ab", "abc", "abcd", "abcde", "acde"], -{ a: 'a' -, ab: 'ab' -, abc: 'abc' -, abcd: 'abcd' -, abcde: 'abcde' -, ac: 'acde' -, acd: 'acde' -, acde: 'acde' -}) - -console.log("0..%d", count) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/package.json deleted file mode 100644 index a45179f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "nopt", - "version": "2.2.1", - "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "main": "lib/nopt.js", - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/isaacs/nopt" - }, - "bin": { - "nopt": "./bin/nopt.js" - }, - "license": { - "type": "MIT", - "url": "https://github.com/isaacs/nopt/raw/master/LICENSE" - }, - "dependencies": { - "abbrev": "1" - }, - "devDependencies": { - "tap": "~0.4.8" - }, - "readme": "If you want to write an option parser, and have it be good, there are\ntwo ways to do it. The Right Way, and the Wrong Way.\n\nThe Wrong Way is to sit down and write an option parser. We've all done\nthat.\n\nThe Right Way is to write some complex configurable program with so many\noptions that you go half-insane just trying to manage them all, and put\nit off with duct-tape solutions until you see exactly to the core of the\nproblem, and finally snap and write an awesome option parser.\n\nIf you want to write an option parser, don't write an option parser.\nWrite a package manager, or a source control system, or a service\nrestarter, or an operating system. You probably won't end up with a\ngood one of those, but if you don't give up, and you are relentless and\ndiligent enough in your procrastination, you may just end up with a very\nnice option parser.\n\n## USAGE\n\n // my-program.js\n var nopt = require(\"nopt\")\n , Stream = require(\"stream\").Stream\n , path = require(\"path\")\n , knownOpts = { \"foo\" : [String, null]\n , \"bar\" : [Stream, Number]\n , \"baz\" : path\n , \"bloo\" : [ \"big\", \"medium\", \"small\" ]\n , \"flag\" : Boolean\n , \"pick\" : Boolean\n , \"many\" : [String, Array]\n }\n , shortHands = { \"foofoo\" : [\"--foo\", \"Mr. Foo\"]\n , \"b7\" : [\"--bar\", \"7\"]\n , \"m\" : [\"--bloo\", \"medium\"]\n , \"p\" : [\"--pick\"]\n , \"f\" : [\"--flag\"]\n }\n // everything is optional.\n // knownOpts and shorthands default to {}\n // arg list defaults to process.argv\n // slice defaults to 2\n , parsed = nopt(knownOpts, shortHands, process.argv, 2)\n console.log(parsed)\n\nThis would give you support for any of the following:\n\n```bash\n$ node my-program.js --foo \"blerp\" --no-flag\n{ \"foo\" : \"blerp\", \"flag\" : false }\n\n$ node my-program.js ---bar 7 --foo \"Mr. Hand\" --flag\n{ bar: 7, foo: \"Mr. Hand\", flag: true }\n\n$ node my-program.js --foo \"blerp\" -f -----p\n{ foo: \"blerp\", flag: true, pick: true }\n\n$ node my-program.js -fp --foofoo\n{ foo: \"Mr. Foo\", flag: true, pick: true }\n\n$ node my-program.js --foofoo -- -fp # -- stops the flag parsing.\n{ foo: \"Mr. Foo\", argv: { remain: [\"-fp\"] } }\n\n$ node my-program.js --blatzk -fp # unknown opts are ok.\n{ blatzk: true, flag: true, pick: true }\n\n$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value\n{ blatzk: 1000, flag: true, pick: true }\n\n$ node my-program.js --no-blatzk -fp # unless they start with \"no-\"\n{ blatzk: false, flag: true, pick: true }\n\n$ node my-program.js --baz b/a/z # known paths are resolved.\n{ baz: \"/Users/isaacs/b/a/z\" }\n\n# if Array is one of the types, then it can take many\n# values, and will always be an array. The other types provided\n# specify what types are allowed in the list.\n\n$ node my-program.js --many 1 --many null --many foo\n{ many: [\"1\", \"null\", \"foo\"] }\n\n$ node my-program.js --many foo\n{ many: [\"foo\"] }\n```\n\nRead the tests at the bottom of `lib/nopt.js` for more examples of\nwhat this puppy can do.\n\n## Types\n\nThe following types are supported, and defined on `nopt.typeDefs`\n\n* String: A normal string. No parsing is done.\n* path: A file system path. Gets resolved against cwd if not absolute.\n* url: A url. If it doesn't parse, it isn't accepted.\n* Number: Must be numeric.\n* Date: Must parse as a date. If it does, and `Date` is one of the options,\n then it will return a Date object, not a string.\n* Boolean: Must be either `true` or `false`. If an option is a boolean,\n then it does not need a value, and its presence will imply `true` as\n the value. To negate boolean flags, do `--no-whatever` or `--whatever\n false`\n* NaN: Means that the option is strictly not allowed. Any value will\n fail.\n* Stream: An object matching the \"Stream\" class in node. Valuable\n for use when validating programmatically. (npm uses this to let you\n supply any WriteStream on the `outfd` and `logfd` config options.)\n* Array: If `Array` is specified as one of the types, then the value\n will be parsed as a list of options. This means that multiple values\n can be specified, and that the value will always be an array.\n\nIf a type is an array of values not on this list, then those are\nconsidered valid values. For instance, in the example above, the\n`--bloo` option can only be one of `\"big\"`, `\"medium\"`, or `\"small\"`,\nand any other value will be rejected.\n\nWhen parsing unknown fields, `\"true\"`, `\"false\"`, and `\"null\"` will be\ninterpreted as their JavaScript equivalents, and numeric values will be\ninterpreted as a number.\n\nYou can also mix types and values, or multiple types, in a list. For\ninstance `{ blah: [Number, null] }` would allow a value to be set to\neither a Number or null. When types are ordered, this implies a\npreference, and the first type that can be used to properly interpret\nthe value will be used.\n\nTo define a new type, add it to `nopt.typeDefs`. Each item in that\nhash is an object with a `type` member and a `validate` method. The\n`type` member is an object that matches what goes in the type list. The\n`validate` method is a function that gets called with `validate(data,\nkey, val)`. Validate methods should assign `data[key]` to the valid\nvalue of `val` if it can be handled properly, or return boolean\n`false` if it cannot.\n\nYou can also call `nopt.clean(data, types, typeDefs)` to clean up a\nconfig object and remove its invalid properties.\n\n## Error Handling\n\nBy default, nopt outputs a warning to standard error when invalid\noptions are found. You can change this behavior by assigning a method\nto `nopt.invalidHandler`. This method will be called with\nthe offending `nopt.invalidHandler(key, val, types)`.\n\nIf no `nopt.invalidHandler` is assigned, then it will console.error\nits whining. If it is assigned to boolean `false` then the warning is\nsuppressed.\n\n## Abbreviations\n\nYes, they are supported. If you define options like this:\n\n```javascript\n{ \"foolhardyelephants\" : Boolean\n, \"pileofmonkeys\" : Boolean }\n```\n\nThen this will work:\n\n```bash\nnode program.js --foolhar --pil\nnode program.js --no-f --pileofmon\n# etc.\n```\n\n## Shorthands\n\nShorthands are a hash of shorter option names to a snippet of args that\nthey expand to.\n\nIf multiple one-character shorthands are all combined, and the\ncombination does not unambiguously match any other option or shorthand,\nthen they will be broken up into their constituent parts. For example:\n\n```json\n{ \"s\" : [\"--loglevel\", \"silent\"]\n, \"g\" : \"--global\"\n, \"f\" : \"--force\"\n, \"p\" : \"--parseable\"\n, \"l\" : \"--long\"\n}\n```\n\n```bash\nnpm ls -sgflp\n# just like doing this:\nnpm ls --loglevel silent --global --force --long --parseable\n```\n\n## The Rest of the args\n\nThe config object returned by nopt is given a special member called\n`argv`, which is an object with the following fields:\n\n* `remain`: The remaining args after all the parsing has occurred.\n* `original`: The args as they originally appeared.\n* `cooked`: The args after flags and shorthands are expanded.\n\n## Slicing\n\nNode programs are called with more or less the exact argv as it appears\nin C land, after the v8 and node-specific options have been plucked off.\nAs such, `argv[0]` is always `node` and `argv[1]` is always the\nJavaScript program being run.\n\nThat's usually not very useful to you. So they're sliced off by\ndefault. If you want them, then you can pass in `0` as the last\nargument, or any other number that you'd like to slice off the start of\nthe list.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/nopt/issues" - }, - "homepage": "https://github.com/isaacs/nopt", - "_id": "nopt@2.2.1", - "_from": "nopt@~2" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/test/basic.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/test/basic.js deleted file mode 100644 index b31dccf..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/nopt/test/basic.js +++ /dev/null @@ -1,243 +0,0 @@ -var nopt = require("../") - , test = require('tap').test - - -test("passing a string results in a string", function (t) { - var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0) - t.same(parsed.key, "myvalue") - t.end() -}) - -// https://github.com/npm/nopt/issues/31 -test("Empty String results in empty string, not true", function (t) { - var parsed = nopt({ empty: String }, {}, ["--empty"], 0) - t.same(parsed.empty, "") - t.end() -}) - -test("~ path is resolved to $HOME", function (t) { - var path = require("path") - if (!process.env.HOME) process.env.HOME = "/tmp" - var parsed = nopt({key: path}, {}, ["--key=~/val"], 0) - t.same(parsed.key, path.resolve(process.env.HOME, "val")) - t.end() -}) - -test("other tests", function (t) { - - var util = require("util") - , Stream = require("stream") - , path = require("path") - , url = require("url") - - , shorthands = - { s : ["--loglevel", "silent"] - , d : ["--loglevel", "info"] - , dd : ["--loglevel", "verbose"] - , ddd : ["--loglevel", "silly"] - , noreg : ["--no-registry"] - , reg : ["--registry"] - , "no-reg" : ["--no-registry"] - , silent : ["--loglevel", "silent"] - , verbose : ["--loglevel", "verbose"] - , h : ["--usage"] - , H : ["--usage"] - , "?" : ["--usage"] - , help : ["--usage"] - , v : ["--version"] - , f : ["--force"] - , desc : ["--description"] - , "no-desc" : ["--no-description"] - , "local" : ["--no-global"] - , l : ["--long"] - , p : ["--parseable"] - , porcelain : ["--parseable"] - , g : ["--global"] - } - - , types = - { aoa: Array - , nullstream: [null, Stream] - , date: Date - , str: String - , browser : String - , cache : path - , color : ["always", Boolean] - , depth : Number - , description : Boolean - , dev : Boolean - , editor : path - , force : Boolean - , global : Boolean - , globalconfig : path - , group : [String, Number] - , gzipbin : String - , logfd : [Number, Stream] - , loglevel : ["silent","win","error","warn","info","verbose","silly"] - , long : Boolean - , "node-version" : [false, String] - , npaturl : url - , npat : Boolean - , "onload-script" : [false, String] - , outfd : [Number, Stream] - , parseable : Boolean - , pre: Boolean - , prefix: path - , proxy : url - , "rebuild-bundle" : Boolean - , registry : url - , searchopts : String - , searchexclude: [null, String] - , shell : path - , t: [Array, String] - , tag : String - , tar : String - , tmp : path - , "unsafe-perm" : Boolean - , usage : Boolean - , user : String - , username : String - , userconfig : path - , version : Boolean - , viewer: path - , _exit : Boolean - , path: path - } - - ; [["-v", {version:true}, []] - ,["---v", {version:true}, []] - ,["ls -s --no-reg connect -d", - {loglevel:"info",registry:null},["ls","connect"]] - ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]] - ,["ls --registry blargle", {}, ["ls"]] - ,["--no-registry", {registry:null}, []] - ,["--no-color true", {color:false}, []] - ,["--no-color false", {color:true}, []] - ,["--no-color", {color:false}, []] - ,["--color false", {color:false}, []] - ,["--color --logfd 7", {logfd:7,color:true}, []] - ,["--color=true", {color:true}, []] - ,["--logfd=10", {logfd:10}, []] - ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]] - ,["--tmp=tmp -tar=gtar", - {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]] - ,["--logfd x", {}, []] - ,["a -true -- -no-false", {true:true},["a","-no-false"]] - ,["a -no-false", {false:false},["a"]] - ,["a -no-no-true", {true:true}, ["a"]] - ,["a -no-no-no-false", {false:false}, ["a"]] - ,["---NO-no-No-no-no-no-nO-no-no"+ - "-No-no-no-no-no-no-no-no-no"+ - "-no-no-no-no-NO-NO-no-no-no-no-no-no"+ - "-no-body-can-do-the-boogaloo-like-I-do" - ,{"body-can-do-the-boogaloo-like-I-do":false}, []] - ,["we are -no-strangers-to-love "+ - "--you-know=the-rules --and=so-do-i "+ - "---im-thinking-of=a-full-commitment "+ - "--no-you-would-get-this-from-any-other-guy "+ - "--no-gonna-give-you-up "+ - "-no-gonna-let-you-down=true "+ - "--no-no-gonna-run-around false "+ - "--desert-you=false "+ - "--make-you-cry false "+ - "--no-tell-a-lie "+ - "--no-no-and-hurt-you false" - ,{"strangers-to-love":false - ,"you-know":"the-rules" - ,"and":"so-do-i" - ,"you-would-get-this-from-any-other-guy":false - ,"gonna-give-you-up":false - ,"gonna-let-you-down":false - ,"gonna-run-around":false - ,"desert-you":false - ,"make-you-cry":false - ,"tell-a-lie":false - ,"and-hurt-you":false - },["we", "are"]] - ,["-t one -t two -t three" - ,{t: ["one", "two", "three"]} - ,[]] - ,["-t one -t null -t three four five null" - ,{t: ["one", "null", "three"]} - ,["four", "five", "null"]] - ,["-t foo" - ,{t:["foo"]} - ,[]] - ,["--no-t" - ,{t:["false"]} - ,[]] - ,["-no-no-t" - ,{t:["true"]} - ,[]] - ,["-aoa one -aoa null -aoa 100" - ,{aoa:["one", null, 100]} - ,[]] - ,["-str 100" - ,{str:"100"} - ,[]] - ,["--color always" - ,{color:"always"} - ,[]] - ,["--no-nullstream" - ,{nullstream:null} - ,[]] - ,["--nullstream false" - ,{nullstream:null} - ,[]] - ,["--notadate=2011-01-25" - ,{notadate: "2011-01-25"} - ,[]] - ,["--date 2011-01-25" - ,{date: new Date("2011-01-25")} - ,[]] - ,["-cl 1" - ,{config: true, length: 1} - ,[] - ,{config: Boolean, length: Number, clear: Boolean} - ,{c: "--config", l: "--length"}] - ,["--acount bla" - ,{"acount":true} - ,["bla"] - ,{account: Boolean, credentials: Boolean, options: String} - ,{a:"--account", c:"--credentials",o:"--options"}] - ,["--clear" - ,{clear:true} - ,[] - ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean} - ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}] - ,["--file -" - ,{"file":"-"} - ,[] - ,{file:String} - ,{}] - ,["--file -" - ,{"file":true} - ,["-"] - ,{file:Boolean} - ,{}] - ,["--path" - ,{"path":null} - ,[]] - ,["--path ." - ,{"path":process.cwd()} - ,[]] - ].forEach(function (test) { - var argv = test[0].split(/\s+/) - , opts = test[1] - , rem = test[2] - , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0) - , parsed = actual.argv - delete actual.argv - for (var i in opts) { - var e = JSON.stringify(opts[i]) - , a = JSON.stringify(actual[i] === undefined ? null : actual[i]) - if (e && typeof e === "object") { - t.deepEqual(e, a) - } else { - t.equal(e, a) - } - } - t.deepEqual(rem, parsed.remain) - }) - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/README.markdown deleted file mode 100644 index 1e56ebd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/README.markdown +++ /dev/null @@ -1,56 +0,0 @@ -runforcover -====== - -Runforcover is a require-hook library that uses node-bunker to provide code coverage data -for your unit test library, whatever it might be. - -methods -======= -var runforcover = require('runforcover'); - -var coverage = runforcover.cover([RegExp | path]); -------- - -Attach runforcover to the global `require` object and patch `require.extensions['.js']` to -provide coverage metadata for all files required after this point. Returns a function -object that can be called to obtain a object keying files to `CoverageData` objects, with -a method for releasing control back to vanilla `require`. Usage: - -````javascript - -var coverage = runforcover.cover(/.*/g); - -require('some/library'); - -coverage(function(coverageData) { - // coverageData is an object keyed by filename. - var stats = coverageData['/full/path/to/file.js'].stats() - - // the percentage of lines run versus total lines in file - console.log(stats.percentage); - - // the number of missing lines - console.log(stats.missing); - - // the number of lines run (seen) - console.log(stats.seen); - - // an array of line objects representing 'missed' lines - stats.lines; - - stats.lines.forEach(function(line) { - // the line number of the line: - console.log(line.number); - - // returns a string containing the source data for the line: - console.log(line.source()); - }); - - // return control back to the original require function - coverage.release(); -}); -```` - -license -======= -new BSD. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/index.js deleted file mode 100644 index b5318ac..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/index.js +++ /dev/null @@ -1,127 +0,0 @@ -var bunker = require('bunker'), - Module = require('module').Module, - path = require('path'), - fs = require('fs'), - vm = require('vm'); - -function CoverageData (filename, bunker) { - this.bunker = bunker; - this.filename = filename; - this.nodes = {}; -}; - -CoverageData.prototype.visit = function(node) { - ++(this.nodes[node.id] = this.nodes[node.id] || {node:node, count:0}).count; -}; - -CoverageData.prototype.missing = function() { - var nodes = this.nodes, - missing = this.bunker.nodes.filter(function(node) { - return !nodes[node.id]; - }); - - return missing; -}; - -CoverageData.prototype.stats = function() { - var missing = this.missing(), - filedata = fs.readFileSync(this.filename, 'utf8').split('\n'); - - var seenLines = [], - lines = - missing.sort(function(lhs, rhs) { - return lhs.node[0].start.line < rhs.node[0].start.line ? -1 : - lhs.node[0].start.line > rhs.node[0].start.line ? 1 : - 0; - }).filter(function(node) { - - var okay = (seenLines.indexOf(node.node[0].start.line) < 0); - if(okay) - seenLines.push(node.node[0].start.line); - return okay; - - }).map(function(node, idx, all) { - return { - lineno:node.node[0].start.line + 1, - source:function() { return filedata[node.node[0].start.line]; } - }; - }); - - return { - percentage:(filedata.length-seenLines.length)/filedata.length, - lines:lines, - missing:seenLines.length, - seen:(filedata.length-seenLines.length) - }; -}; - -module.exports.createEnvironment = function(module, filename) { - var req = function(path) { - return Module._load(path, module); - }; - req.resolve = function(request) { - return Module._resolveFilename(request, module)[1]; - } - req.paths = Module._paths; - req.main = process.mainModule; - req.extensions = Module._extensions; - req.registerExtension = function() { - throw new Error('require.registerExtension() removed. Use ' + - 'require.extensions instead.'); - } - require.cache = Module._cache; - - var ctxt = {}; - for(var k in global) - ctxt[k] = global[k]; - - ctxt.require = req; - ctxt.exports = module.exports; - ctxt.__filename = filename; - ctxt.__dirname = path.dirname(filename); - ctxt.process = process; - ctxt.console = console; - ctxt.module = module; - ctxt.global = ctxt; - - return ctxt; -}; - -module.exports.cover = function(fileRegex) { - var originalRequire = require.extensions['.js'], - coverageData = {}, - match = fileRegex instanceof RegExp ? - fileRegex : new RegExp( - fileRegex ? fileRegex.replace(/\//g, '\\/').replace(/\./g, '\\.') : '.*' - , 'g'), - target = this; - - require.extensions['.js'] = function(module, filename) { - if(!match.test(filename)) return originalRequire(module, filename); - - var context = target.createEnvironment(module, filename), - data = fs.readFileSync(filename, 'utf8'), - bunkerized = bunker(data), - coverage = coverageData[filename] = new CoverageData(filename, bunkerized); - - bunkerized.on('node', coverage.visit.bind(coverage)); - bunkerized.assign(context); - - var wrapper = '(function(ctxt) { with(ctxt) { return '+Module.wrap(bunkerized.compile())+'; } })', - compiledWrapper = vm.runInThisContext(wrapper, filename, true)(context); - - var args = [context.exports, context.require, module, filename, context.__dirname]; - return compiledWrapper.apply(module.exports, args); - }; - - var retval = function(ready) { - ready(coverageData); - }; - - retval.release = function() { - require.extensions['.js'] = originalRequire; - }; - - return retval; -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/README.markdown deleted file mode 100644 index 0d0c387..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/README.markdown +++ /dev/null @@ -1,82 +0,0 @@ -bunker -====== - -Bunker is a module to calculate code coverage using native javascript -[burrito](https://github.com/substack/node-burrito) AST trickery. - -[![build status](https://secure.travis-ci.org/substack/node-bunker.png)](http://travis-ci.org/substack/node-bunker) - -![code coverage](http://substack.net/images/code_coverage.png) - -examples -======== - -tiny ----- - -````javascript -var bunker = require('bunker'); -var b = bunker('var x = 0; for (var i = 0; i < 30; i++) { x++ }'); - -var counts = {}; - -b.on('node', function (node) { - if (!counts[node.id]) { - counts[node.id] = { times : 0, node : node }; - } - counts[node.id].times ++; -}); - -b.run(); - -Object.keys(counts).forEach(function (key) { - var count = counts[key]; - console.log(count.times + ' : ' + count.node.source()); -}); -```` - -output: - - $ node example/tiny.js - 1 : var x=0; - 31 : i<30 - 30 : i++ - 30 : x++; - 30 : x++ - -methods -======= - -var bunker = require('bunker'); - -var b = bunker(src) -------------------- - -Create a new bunker code coverageifier with some source `src`. - -The bunker object `b` is an `EventEmitter` that emits `'node'` events with two -parameters: - -* `node` - the [burrito](https://github.com/substack/node-burrito) node object -* `stack` - the stack, [stackedy](https://github.com/substack/node-stackedy) style - -b.include(src) --------------- - -Include some source into the bunker. - -b.compile() ------------ - -Return the source wrapped with burrito. - -b.assign(context={}) --------------------- - -Assign the statement-tracking functions into `context`. - -b.run(context={}) ------------------ - -Run the source using `vm.runInNewContext()` with some `context`. -The statement-tracking functions will be added to `context` by `assign()`. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/prof.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/prof.js deleted file mode 100644 index 5cac4cc..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/prof.js +++ /dev/null @@ -1,51 +0,0 @@ -var bunker = require('bunker'); -var b = bunker('(' + function () { - function beep () { - var x = 0; - for (var i = 0; i < 1000; i++) { - for (var j = 0; j < 100; j++) { - x += j; - } - } - return x; - } - - beep(); - -} + ')()'); - -var counts = {}; - -b.on('node', function (node) { - if (!counts[node.id]) { - counts[node.id] = { times : 0, node : node, elapsed : 0 }; - } - counts[node.id].times ++; - - var now = Date.now(); - - if (last.id !== undefined) { - counts[last.id].elapsed += last. - } - - if (node.name === 'call') { - var start = now; - - last.id = node.id; - counts[node.id].elapsed += Date.now() - start; - } - else { - counts[node.id].elapsed += now - last; - last = now; - } -}); - -b.run(); - -Object.keys(counts).forEach(function (key) { - var count = counts[key]; - console.log( - [ count.times, count.node.source(), count.elapsed ] - .join(' : ') - ); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/tiny.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/tiny.js deleted file mode 100644 index aa5b034..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/tiny.js +++ /dev/null @@ -1,18 +0,0 @@ -var bunker = require('bunker'); -var b = bunker('var x = 0; for (var i = 0; i < 30; i++) { x++ }'); - -var counts = {}; - -b.on('node', function (node) { - if (!counts[node.id]) { - counts[node.id] = { times : 0, node : node }; - } - counts[node.id].times ++; -}); - -b.run(); - -Object.keys(counts).forEach(function (key) { - var count = counts[key]; - console.log(count.times + ' : ' + count.node.source()); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/run.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/run.js deleted file mode 100644 index d9eaa10..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/run.js +++ /dev/null @@ -1,31 +0,0 @@ -var bunker = require('bunker'); -var fs = require('fs'); -var src = fs.readFileSync(__dirname + '/src.js', 'utf8'); - -var counts = {}; - -var b = bunker(src); -b.on('node', function (node) { - if (!counts[node.id]) { - counts[node.id] = { times : 0, node : node }; - } - counts[node.id].times ++; -}); - -b.run({ - setInterval : setInterval, - clearInterval : clearInterval, - end : function () { - Object.keys(counts) - .sort(function (a, b) { - return counts[b].times - counts[a].times - }) - .forEach(function (key) { - var count = counts[key]; - console.log( - count.times + ' : ' + count.node.source() - ); - }) - ; - } -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/src.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/src.js deleted file mode 100644 index 0c92e48..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/example/top/src.js +++ /dev/null @@ -1,18 +0,0 @@ -function boop () { - for (var i = 0; i < 30; i++) { - nop(); - } -} - -function nop () { - return undefined; -} - -var times = 0; -var iv = setInterval(function () { - if (++times === 10) { - clearInterval(iv); - end(); - } - else boop() -}, 100); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/index.js deleted file mode 100644 index ed5d437..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/index.js +++ /dev/null @@ -1,116 +0,0 @@ -var burrito = require('burrito'); -var vm = require('vm'); -var EventEmitter = require('events').EventEmitter; - -module.exports = function (src) { - var b = new Bunker(); - if (src) b.include(src); - return b; -}; - -function Bunker () { - this.sources = []; - this.nodes = []; - - this.names = { - call : burrito.generateName(6), - expr : burrito.generateName(6), - stat : burrito.generateName(6), - return : burrito.generateName(6) - }; -} - -Bunker.prototype = new EventEmitter; - -Bunker.prototype.include = function (src) { - this.sources.push(src); - this.source = null; - return this; -}; - -Bunker.prototype.compile = function () { - var src = this.sources.join('\n'); - var nodes = this.nodes; - var names = this.names; - - return burrito(src, function (node) { - var i = nodes.length; - - if (node.name === 'call') { - nodes.push(node); - node.wrap(names.call + '(' + i + ')(%s)'); - } - else if (node.name === 'stat' || node.name === 'throw' - || node.name === 'var') { - nodes.push(node); - node.wrap('{' + names.stat + '(' + i + ');%s}'); - } - else if (node.name === 'return') { - nodes.push(node); - // We need to wrap the new source in a function definition - // so that UglifyJS will allow the presence of return - var stat = names.stat + '(' + i + ');'; - var wrapped = 'function ' + names.return + '() {' - + stat + node.source() - +'}' - ; - var parsed = burrito.parse(wrapped); - // Remove the function definition from the AST - parsed[1] = parsed[1][0][3]; - node.state.update(parsed, true); - } - else if (node.name === 'binary') { - nodes.push(node); - node.wrap(names.expr + '(' + i + ')(%s)'); - } - else if (node.name === 'unary-postfix' || node.name === 'unary-prefix') { - nodes.push(node); - node.wrap(names.expr + '(' + i + ')(%s)'); - } - - if (i !== nodes.length) { - node.id = i; - } - }); -}; - -Bunker.prototype.assign = function (context) { - if (!context) context = {}; - - var self = this; - var stack = []; - - context[self.names.call] = function (i) { - var node = self.nodes[i]; - stack.unshift(node); - self.emit('node', node, stack); - - return function (expr) { - stack.shift(); - return expr; - }; - }; - - context[self.names.expr] = function (i) { - var node = self.nodes[i]; - self.emit('node', node, stack); - - return function (expr) { - return expr; - }; - }; - - context[self.names.stat] = function (i) { - var node = self.nodes[i]; - self.emit('node', node, stack); - }; - - return context; -}; - -Bunker.prototype.run = function (context) { - var src = this.compile(); - vm.runInNewContext(src, this.assign(context)); - - return this; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.travis.yml b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/README.markdown deleted file mode 100644 index 7c9097c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/README.markdown +++ /dev/null @@ -1,187 +0,0 @@ -burrito -======= - -Burrito makes it easy to do crazy stuff with the javascript AST. - -This is super useful if you want to roll your own stack traces or build a code -coverage tool. - -[![build status](https://secure.travis-ci.org/substack/node-burrito.png)](http://travis-ci.org/substack/node-burrito) - -![node.wrap("burrito")](http://substack.net/images/burrito.png) - -examples -======== - -microwave ---------- - -examples/microwave.js - -````javascript -var burrito = require('burrito'); - -var res = burrito.microwave('Math.sin(2)', function (node) { - if (node.name === 'num') node.wrap('Math.PI / %s'); -}); - -console.log(res); // sin(pi / 2) == 1 -```` - -output: - - 1 - -wrap ----- - -examples/wrap.js - -````javascript -var burrito = require('burrito'); - -var src = burrito('f() && g(h())\nfoo()', function (node) { - if (node.name === 'call') node.wrap('qqq(%s)'); -}); - -console.log(src); -```` - -output: - - qqq(f()) && qqq(g(qqq(h()))); - - qqq(foo()); - -methods -======= - - var burrito = require('burrito'); - -burrito(code, cb) ------------------ - -Given some source `code` and a function `trace`, walk the ast by expression. - -The `cb` gets called with a node object described below. - -If `code` is an Array then it is assumbed to be an AST which you can generate -yourself with `burrito.parse()`. The AST must be annotated, so make sure to -`burrito.parse(src, false, true)`. - -burrito.microwave(code, context={}, cb) ---------------------------------------- - -Like `burrito()` except the result is run using -`vm.runInNewContext(res, context)`. - -node object -=========== - -node.name ---------- - -Name is a string that contains the type of the expression as named by uglify. - -node.wrap(s) ------------- - -Wrap the current expression in `s`. - -If `s` is a string, `"%s"` will be replaced with the stringified current -expression. - -If `s` is a function, it is called with the stringified current expression and -should return a new stringified expression. - -If the `node.name === "binary"`, you get the subterms "%a" and "%b" to play with -too. These subterms are applied if `s` is a function too: `s(expr, a, b)`. - -Protip: to insert multiple statements you can use javascript's lesser-known block -syntax that it gets from C: - -````javascript -if (node.name === 'stat') node.wrap('{ foo(); %s }') -```` - -node.node ---------- - -raw ast data generated by uglify - -node.value ----------- - -`node.node.slice(1)` to skip the annotations - -node.start ----------- - -The start location of the expression, like this: - -````javascript -{ type: 'name', - value: 'b', - line: 0, - col: 3, - pos: 3, - nlb: false, - comments_before: [] } -```` - -node.end --------- - -The end location of the expression, formatted the same as `node.start`. - -node.state ----------- - -The state of the traversal using traverse. - -node.source() -------------- - -Returns a stringified version of the expression. - -node.parent() -------------- - -Returns the parent `node` or `null` if the node is the root element. - -node.label() ------------- - -Return the label of the present node or `null` if there is no label. - -Labels are returned for "call", "var", "defun", and "function" nodes. - -Returns an array for "var" nodes since `var` statements can -contain multiple labels in assignment. - -install -======= - -With [npm](http://npmjs.org) you can just: - - npm install burrito - -in the browser -============== - -Burrito works in browser with -[browserify](https://github.com/substack/node-browserify). - -It has been tested against: - -* Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0 -* Firefox 3.5 -* Chrome 6.0 -* Opera 10.6 -* Safari 5.0 - -kudos -===== - -Heavily inspired by (and previously mostly lifted outright from) isaacs's nifty -tmp/instrument.js thingy from uglify-js. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/microwave.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/microwave.js deleted file mode 100644 index c6fcf45..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/microwave.js +++ /dev/null @@ -1,8 +0,0 @@ -var burrito = require('burrito'); - -var res = burrito.microwave('Math.sin(2)', function (node) { - console.dir(node); - if (node.name === 'num') node.wrap('Math.PI / %s'); -}); - -console.log(res); // sin(pi / 2) == 1 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/bs.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/bs.js deleted file mode 100644 index 3583c7f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/bs.js +++ /dev/null @@ -1,4832 +0,0 @@ -var require = function (file, cwd) { - var resolved = require.resolve(file, cwd || '/'); - var mod = require.modules[resolved]; - if (!mod) throw new Error( - 'Failed to resolve module ' + file + ', tried ' + resolved - ); - var res = mod._cached ? mod._cached : mod(); - return res; -} -var __require = require; - -require.paths = []; -require.modules = {}; -require.extensions = [".js",".coffee"]; - -require.resolve = (function () { - var core = { - 'assert': true, - 'events': true, - 'fs': true, - 'path': true, - 'vm': true - }; - - return function (x, cwd) { - if (!cwd) cwd = '/'; - - if (core[x]) return x; - var path = require.modules.path(); - var y = cwd || '.'; - - if (x.match(/^(?:\.\.?\/|\/)/)) { - var m = loadAsFileSync(path.resolve(y, x)) - || loadAsDirectorySync(path.resolve(y, x)); - if (m) return m; - } - - var n = loadNodeModulesSync(x, y); - if (n) return n; - - throw new Error("Cannot find module '" + x + "'"); - - function loadAsFileSync (x) { - if (require.modules[x]) { - return x; - } - - for (var i = 0; i < require.extensions.length; i++) { - var ext = require.extensions[i]; - if (require.modules[x + ext]) return x + ext; - } - } - - function loadAsDirectorySync (x) { - x = x.replace(/\/+$/, ''); - var pkgfile = x + '/package.json'; - if (require.modules[pkgfile]) { - var pkg = require.modules[pkgfile](); - var b = pkg.browserify; - if (typeof b === 'object' && b.main) { - var m = loadAsFileSync(path.resolve(x, b.main)); - if (m) return m; - } - else if (typeof b === 'string') { - var m = loadAsFileSync(path.resolve(x, b)); - if (m) return m; - } - else if (pkg.main) { - var m = loadAsFileSync(path.resolve(x, pkg.main)); - if (m) return m; - } - } - - return loadAsFileSync(x + '/index'); - } - - function loadNodeModulesSync (x, start) { - var dirs = nodeModulesPathsSync(start); - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var m = loadAsFileSync(dir + '/' + x); - if (m) return m; - var n = loadAsDirectorySync(dir + '/' + x); - if (n) return n; - } - - var m = loadAsFileSync(x); - if (m) return m; - } - - function nodeModulesPathsSync (start) { - var parts; - if (start === '/') parts = [ '' ]; - else parts = path.normalize(start).split('/'); - - var dirs = []; - for (var i = parts.length - 1; i >= 0; i--) { - if (parts[i] === 'node_modules') continue; - var dir = parts.slice(0, i + 1).join('/') + '/node_modules'; - dirs.push(dir); - } - - return dirs; - } - }; -})(); - -require.alias = function (from, to) { - var path = require.modules.path(); - var res = null; - try { - res = require.resolve(from + '/package.json', '/'); - } - catch (err) { - res = require.resolve(from, '/'); - } - var basedir = path.dirname(res); - - var keys = Object_keys(require.modules); - - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (key.slice(0, basedir.length + 1) === basedir + '/') { - var f = key.slice(basedir.length); - require.modules[to + f] = require.modules[basedir + f]; - } - else if (key === basedir) { - require.modules[to] = require.modules[basedir]; - } - } -}; - -var Object_keys = Object.keys || function (obj) { - var res = []; - for (var key in obj) res.push(key) - return res; -}; - -if (typeof process === 'undefined') process = {}; - -if (!process.nextTick) process.nextTick = function (fn) { - setTimeout(fn, 0); -}; - -if (!process.title) process.title = 'browser'; - -if (!process.binding) process.binding = function (name) { - if (name === 'evals') return require('vm') - else throw new Error('No such module') -}; - -if (!process.cwd) process.cwd = function () { return '.' }; - -require.modules["path"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "."; - var __filename = "path"; - - var require = function (file) { - return __require(file, "."); - }; - - require.resolve = function (file) { - return __require.resolve(name, "."); - }; - - require.modules = __require.modules; - __require.modules["path"]._cached = module.exports; - - (function () { - function filter (xs, fn) { - var res = []; - for (var i = 0; i < xs.length; i++) { - if (fn(xs[i], i, xs)) res.push(xs[i]); - } - return res; -} - -// resolves . and .. elements in a path array with directory names there -// must be no slashes, empty elements, or device names (c:\) in the array -// (so also no leading and trailing slashes - it does not distinguish -// relative and absolute paths) -function normalizeArray(parts, allowAboveRoot) { - // if the path tries to go above the root, `up` ends up > 0 - var up = 0; - for (var i = parts.length; i >= 0; i--) { - var last = parts[i]; - if (last == '.') { - parts.splice(i, 1); - } else if (last === '..') { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - - // if the path is allowed to go above the root, restore leading ..s - if (allowAboveRoot) { - for (; up--; up) { - parts.unshift('..'); - } - } - - return parts; -} - -// Regex to split a filename into [*, dir, basename, ext] -// posix version -var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/; - -// path.resolve([from ...], to) -// posix version -exports.resolve = function() { -var resolvedPath = '', - resolvedAbsolute = false; - -for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) { - var path = (i >= 0) - ? arguments[i] - : process.cwd(); - - // Skip empty and invalid entries - if (typeof path !== 'string' || !path) { - continue; - } - - resolvedPath = path + '/' + resolvedPath; - resolvedAbsolute = path.charAt(0) === '/'; -} - -// At this point the path should be resolved to a full absolute path, but -// handle relative paths to be safe (might happen when process.cwd() fails) - -// Normalize the path -resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { - return !!p; - }), !resolvedAbsolute).join('/'); - - return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; -}; - -// path.normalize(path) -// posix version -exports.normalize = function(path) { -var isAbsolute = path.charAt(0) === '/', - trailingSlash = path.slice(-1) === '/'; - -// Normalize the path -path = normalizeArray(filter(path.split('/'), function(p) { - return !!p; - }), !isAbsolute).join('/'); - - if (!path && !isAbsolute) { - path = '.'; - } - if (path && trailingSlash) { - path += '/'; - } - - return (isAbsolute ? '/' : '') + path; -}; - - -// posix version -exports.join = function() { - var paths = Array.prototype.slice.call(arguments, 0); - return exports.normalize(filter(paths, function(p, index) { - return p && typeof p === 'string'; - }).join('/')); -}; - - -exports.dirname = function(path) { - var dir = splitPathRe.exec(path)[1] || ''; - var isWindows = false; - if (!dir) { - // No dirname - return '.'; - } else if (dir.length === 1 || - (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) { - // It is just a slash or a drive letter with a slash - return dir; - } else { - // It is a full dirname, strip trailing slash - return dir.substring(0, dir.length - 1); - } -}; - - -exports.basename = function(path, ext) { - var f = splitPathRe.exec(path)[2] || ''; - // TODO: make this comparison case-insensitive on windows? - if (ext && f.substr(-1 * ext.length) === ext) { - f = f.substr(0, f.length - ext.length); - } - return f; -}; - - -exports.extname = function(path) { - return splitPathRe.exec(path)[3] || ''; -}; -; - }).call(module.exports); - - __require.modules["path"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/package.json"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito"; - var __filename = "/node_modules/burrito/package.json"; - - var require = function (file) { - return __require(file, "/node_modules/burrito"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/package.json"]._cached = module.exports; - - (function () { - module.exports = {"name":"burrito","description":"Wrap up expressions with a trace function while walking the AST with rice and beans on the side","version":"0.2.8","repository":{"type":"git","url":"git://github.com/substack/node-burrito.git"},"main":"./index.js","keywords":["trace","ast","walk","syntax","source","tree","uglify"],"directories":{"lib":".","example":"example","test":"test"},"scripts":{"test":"expresso"},"dependencies":{"traverse":">=0.5.1 <0.6","uglify-js":"1.0.4"},"devDependencies":{"expresso":"=0.7.x"},"engines":{"node":">=0.4.0"},"license":"BSD","author":{"name":"James Halliday","email":"mail@substack.net","url":"http://substack.net"}}; - }).call(module.exports); - - __require.modules["/node_modules/burrito/package.json"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/uglify-js/package.json"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/uglify-js"; - var __filename = "/node_modules/burrito/node_modules/uglify-js/package.json"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/uglify-js"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/uglify-js"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/uglify-js/package.json"]._cached = module.exports; - - (function () { - module.exports = {"name":"uglify-js","author":{"name":"Mihai Bazon","email":"mihai.bazon@gmail.com","url":"http://mihai.bazon.net/blog"},"version":"1.0.4","main":"./uglify-js.js","bin":{"uglifyjs":"./bin/uglifyjs"},"repository":{"type":"git","url":"git@github.com:mishoo/UglifyJS.git"}}; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/uglify-js/package.json"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/uglify-js/uglify-js.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/uglify-js"; - var __filename = "/node_modules/burrito/node_modules/uglify-js/uglify-js.js"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/uglify-js"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/uglify-js"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/uglify-js/uglify-js.js"]._cached = module.exports; - - (function () { - //convienence function(src, [options]); -function uglify(orig_code, options){ - options || (options = {}); - var jsp = uglify.parser; - var pro = uglify.uglify; - - var ast = jsp.parse(orig_code, options.strict_semicolons); // parse code and get the initial AST - ast = pro.ast_mangle(ast, options.mangle_options); // get a new AST with mangled names - ast = pro.ast_squeeze(ast, options.squeeze_options); // get an AST with compression optimizations - var final_code = pro.gen_code(ast, options.gen_options); // compressed code here - return final_code; -}; - -uglify.parser = require("./lib/parse-js"); -uglify.uglify = require("./lib/process"); - -module.exports = uglify; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/uglify-js/uglify-js.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/uglify-js/lib/parse-js.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/uglify-js/lib"; - var __filename = "/node_modules/burrito/node_modules/uglify-js/lib/parse-js.js"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/uglify-js/lib"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/uglify-js/lib"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/uglify-js/lib/parse-js.js"]._cached = module.exports; - - (function () { - /*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - - This version is suitable for Node.js. With minimal changes (the - exports stuff) it should work on any JS platform. - - This file contains the tokenizer/parser. It is a port to JavaScript - of parse-js [1], a JavaScript parser library written in Common Lisp - by Marijn Haverbeke. Thank you Marijn! - - [1] http://marijn.haverbeke.nl/parse-js/ - - Exported functions: - - - tokenizer(code) -- returns a function. Call the returned - function to fetch the next token. - - - parse(code) -- returns an AST of the given JavaScript code. - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2010 (c) Mihai Bazon - Based on parse-js (http://marijn.haverbeke.nl/parse-js/). - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - ***********************************************************************/ - -/* -----[ Tokenizer (constants) ]----- */ - -var KEYWORDS = array_to_hash([ - "break", - "case", - "catch", - "const", - "continue", - "default", - "delete", - "do", - "else", - "finally", - "for", - "function", - "if", - "in", - "instanceof", - "new", - "return", - "switch", - "throw", - "try", - "typeof", - "var", - "void", - "while", - "with" -]); - -var RESERVED_WORDS = array_to_hash([ - "abstract", - "boolean", - "byte", - "char", - "class", - "debugger", - "double", - "enum", - "export", - "extends", - "final", - "float", - "goto", - "implements", - "import", - "int", - "interface", - "long", - "native", - "package", - "private", - "protected", - "public", - "short", - "static", - "super", - "synchronized", - "throws", - "transient", - "volatile" -]); - -var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([ - "return", - "new", - "delete", - "throw", - "else", - "case" -]); - -var KEYWORDS_ATOM = array_to_hash([ - "false", - "null", - "true", - "undefined" -]); - -var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^")); - -var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i; -var RE_OCT_NUMBER = /^0[0-7]+$/; -var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i; - -var OPERATORS = array_to_hash([ - "in", - "instanceof", - "typeof", - "new", - "void", - "delete", - "++", - "--", - "+", - "-", - "!", - "~", - "&", - "|", - "^", - "*", - "/", - "%", - ">>", - "<<", - ">>>", - "<", - ">", - "<=", - ">=", - "==", - "===", - "!=", - "!==", - "?", - "=", - "+=", - "-=", - "/=", - "*=", - "%=", - ">>=", - "<<=", - ">>>=", - "|=", - "^=", - "&=", - "&&", - "||" -]); - -var WHITESPACE_CHARS = array_to_hash(characters(" \u00a0\n\r\t\f\v\u200b")); - -var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:")); - -var PUNC_CHARS = array_to_hash(characters("[]{}(),;:")); - -var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy")); - -/* -----[ Tokenizer ]----- */ - -// regexps adapted from http://xregexp.com/plugins/#unicode -var UNICODE = { - letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\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\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\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\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\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-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\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-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\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]"), - non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"), - space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"), - connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]") -}; - -function is_letter(ch) { - return UNICODE.letter.test(ch); -}; - -function is_digit(ch) { - ch = ch.charCodeAt(0); - return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9 -}; - -function is_alphanumeric_char(ch) { - return is_digit(ch) || is_letter(ch); -}; - -function is_unicode_combining_mark(ch) { - return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch); -}; - -function is_unicode_connector_punctuation(ch) { - return UNICODE.connector_punctuation.test(ch); -}; - -function is_identifier_start(ch) { - return ch == "$" || ch == "_" || is_letter(ch); -}; - -function is_identifier_char(ch) { - return is_identifier_start(ch) - || is_unicode_combining_mark(ch) - || is_digit(ch) - || is_unicode_connector_punctuation(ch) - || ch == "\u200c" // zero-width non-joiner - || ch == "\u200d" // zero-width joiner (in my ECMA-262 PDF, this is also 200c) - ; -}; - -function parse_js_number(num) { - if (RE_HEX_NUMBER.test(num)) { - return parseInt(num.substr(2), 16); - } else if (RE_OCT_NUMBER.test(num)) { - return parseInt(num.substr(1), 8); - } else if (RE_DEC_NUMBER.test(num)) { - return parseFloat(num); - } -}; - -function JS_Parse_Error(message, line, col, pos) { - this.message = message; - this.line = line; - this.col = col; - this.pos = pos; - try { - ({})(); - } catch(ex) { - this.stack = ex.stack; - }; -}; - -JS_Parse_Error.prototype.toString = function() { - return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack; -}; - -function js_error(message, line, col, pos) { - throw new JS_Parse_Error(message, line, col, pos); -}; - -function is_token(token, type, val) { - return token.type == type && (val == null || token.value == val); -}; - -var EX_EOF = {}; - -function tokenizer($TEXT) { - - var S = { - text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''), - pos : 0, - tokpos : 0, - line : 0, - tokline : 0, - col : 0, - tokcol : 0, - newline_before : false, - regex_allowed : false, - comments_before : [] - }; - - function peek() { return S.text.charAt(S.pos); }; - - function next(signal_eof) { - var ch = S.text.charAt(S.pos++); - if (signal_eof && !ch) - throw EX_EOF; - if (ch == "\n") { - S.newline_before = true; - ++S.line; - S.col = 0; - } else { - ++S.col; - } - return ch; - }; - - function eof() { - return !S.peek(); - }; - - function find(what, signal_eof) { - var pos = S.text.indexOf(what, S.pos); - if (signal_eof && pos == -1) throw EX_EOF; - return pos; - }; - - function start_token() { - S.tokline = S.line; - S.tokcol = S.col; - S.tokpos = S.pos; - }; - - function token(type, value, is_comment) { - S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) || - (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) || - (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value))); - var ret = { - type : type, - value : value, - line : S.tokline, - col : S.tokcol, - pos : S.tokpos, - nlb : S.newline_before - }; - if (!is_comment) { - ret.comments_before = S.comments_before; - S.comments_before = []; - } - S.newline_before = false; - return ret; - }; - - function skip_whitespace() { - while (HOP(WHITESPACE_CHARS, peek())) - next(); - }; - - function read_while(pred) { - var ret = "", ch = peek(), i = 0; - while (ch && pred(ch, i++)) { - ret += next(); - ch = peek(); - } - return ret; - }; - - function parse_error(err) { - js_error(err, S.tokline, S.tokcol, S.tokpos); - }; - - function read_num(prefix) { - var has_e = false, after_e = false, has_x = false, has_dot = prefix == "."; - var num = read_while(function(ch, i){ - if (ch == "x" || ch == "X") { - if (has_x) return false; - return has_x = true; - } - if (!has_x && (ch == "E" || ch == "e")) { - if (has_e) return false; - return has_e = after_e = true; - } - if (ch == "-") { - if (after_e || (i == 0 && !prefix)) return true; - return false; - } - if (ch == "+") return after_e; - after_e = false; - if (ch == ".") { - if (!has_dot && !has_x) - return has_dot = true; - return false; - } - return is_alphanumeric_char(ch); - }); - if (prefix) - num = prefix + num; - var valid = parse_js_number(num); - if (!isNaN(valid)) { - return token("num", valid); - } else { - parse_error("Invalid syntax: " + num); - } - }; - - function read_escaped_char() { - var ch = next(true); - switch (ch) { - case "n" : return "\n"; - case "r" : return "\r"; - case "t" : return "\t"; - case "b" : return "\b"; - case "v" : return "\v"; - case "f" : return "\f"; - case "0" : return "\0"; - case "x" : return String.fromCharCode(hex_bytes(2)); - case "u" : return String.fromCharCode(hex_bytes(4)); - default : return ch; - } - }; - - function hex_bytes(n) { - var num = 0; - for (; n > 0; --n) { - var digit = parseInt(next(true), 16); - if (isNaN(digit)) - parse_error("Invalid hex-character pattern in string"); - num = (num << 4) | digit; - } - return num; - }; - - function read_string() { - return with_eof_error("Unterminated string constant", function(){ - var quote = next(), ret = ""; - for (;;) { - var ch = next(true); - if (ch == "\\") ch = read_escaped_char(); - else if (ch == quote) break; - ret += ch; - } - return token("string", ret); - }); - }; - - function read_line_comment() { - next(); - var i = find("\n"), ret; - if (i == -1) { - ret = S.text.substr(S.pos); - S.pos = S.text.length; - } else { - ret = S.text.substring(S.pos, i); - S.pos = i; - } - return token("comment1", ret, true); - }; - - function read_multiline_comment() { - next(); - return with_eof_error("Unterminated multiline comment", function(){ - var i = find("*/", true), - text = S.text.substring(S.pos, i), - tok = token("comment2", text, true); - S.pos = i + 2; - S.line += text.split("\n").length - 1; - S.newline_before = text.indexOf("\n") >= 0; - - // https://github.com/mishoo/UglifyJS/issues/#issue/100 - if (/^@cc_on/i.test(text)) { - warn("WARNING: at line " + S.line); - warn("*** Found \"conditional comment\": " + text); - warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer."); - } - - return tok; - }); - }; - - function read_name() { - var backslash = false, name = "", ch; - while ((ch = peek()) != null) { - if (!backslash) { - if (ch == "\\") backslash = true, next(); - else if (is_identifier_char(ch)) name += next(); - else break; - } - else { - if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX"); - ch = read_escaped_char(); - if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier"); - name += ch; - backslash = false; - } - } - return name; - }; - - function read_regexp() { - return with_eof_error("Unterminated regular expression", function(){ - var prev_backslash = false, regexp = "", ch, in_class = false; - while ((ch = next(true))) if (prev_backslash) { - regexp += "\\" + ch; - prev_backslash = false; - } else if (ch == "[") { - in_class = true; - regexp += ch; - } else if (ch == "]" && in_class) { - in_class = false; - regexp += ch; - } else if (ch == "/" && !in_class) { - break; - } else if (ch == "\\") { - prev_backslash = true; - } else { - regexp += ch; - } - var mods = read_name(); - return token("regexp", [ regexp, mods ]); - }); - }; - - function read_operator(prefix) { - function grow(op) { - if (!peek()) return op; - var bigger = op + peek(); - if (HOP(OPERATORS, bigger)) { - next(); - return grow(bigger); - } else { - return op; - } - }; - return token("operator", grow(prefix || next())); - }; - - function handle_slash() { - next(); - var regex_allowed = S.regex_allowed; - switch (peek()) { - case "/": - S.comments_before.push(read_line_comment()); - S.regex_allowed = regex_allowed; - return next_token(); - case "*": - S.comments_before.push(read_multiline_comment()); - S.regex_allowed = regex_allowed; - return next_token(); - } - return S.regex_allowed ? read_regexp() : read_operator("/"); - }; - - function handle_dot() { - next(); - return is_digit(peek()) - ? read_num(".") - : token("punc", "."); - }; - - function read_word() { - var word = read_name(); - return !HOP(KEYWORDS, word) - ? token("name", word) - : HOP(OPERATORS, word) - ? token("operator", word) - : HOP(KEYWORDS_ATOM, word) - ? token("atom", word) - : token("keyword", word); - }; - - function with_eof_error(eof_error, cont) { - try { - return cont(); - } catch(ex) { - if (ex === EX_EOF) parse_error(eof_error); - else throw ex; - } - }; - - function next_token(force_regexp) { - if (force_regexp) - return read_regexp(); - skip_whitespace(); - start_token(); - var ch = peek(); - if (!ch) return token("eof"); - if (is_digit(ch)) return read_num(); - if (ch == '"' || ch == "'") return read_string(); - if (HOP(PUNC_CHARS, ch)) return token("punc", next()); - if (ch == ".") return handle_dot(); - if (ch == "/") return handle_slash(); - if (HOP(OPERATOR_CHARS, ch)) return read_operator(); - if (ch == "\\" || is_identifier_start(ch)) return read_word(); - parse_error("Unexpected character '" + ch + "'"); - }; - - next_token.context = function(nc) { - if (nc) S = nc; - return S; - }; - - return next_token; - -}; - -/* -----[ Parser (constants) ]----- */ - -var UNARY_PREFIX = array_to_hash([ - "typeof", - "void", - "delete", - "--", - "++", - "!", - "~", - "-", - "+" -]); - -var UNARY_POSTFIX = array_to_hash([ "--", "++" ]); - -var ASSIGNMENT = (function(a, ret, i){ - while (i < a.length) { - ret[a[i]] = a[i].substr(0, a[i].length - 1); - i++; - } - return ret; -})( - ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="], - { "=": true }, - 0 -); - -var PRECEDENCE = (function(a, ret){ - for (var i = 0, n = 1; i < a.length; ++i, ++n) { - var b = a[i]; - for (var j = 0; j < b.length; ++j) { - ret[b[j]] = n; - } - } - return ret; -})( - [ - ["||"], - ["&&"], - ["|"], - ["^"], - ["&"], - ["==", "===", "!=", "!=="], - ["<", ">", "<=", ">=", "in", "instanceof"], - [">>", "<<", ">>>"], - ["+", "-"], - ["*", "/", "%"] - ], - {} -); - -var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]); - -var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]); - -/* -----[ Parser ]----- */ - -function NodeWithToken(str, start, end) { - this.name = str; - this.start = start; - this.end = end; -}; - -NodeWithToken.prototype.toString = function() { return this.name; }; - -function parse($TEXT, exigent_mode, embed_tokens) { - - var S = { - input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT, - token : null, - prev : null, - peeked : null, - in_function : 0, - in_loop : 0, - labels : [] - }; - - S.token = next(); - - function is(type, value) { - return is_token(S.token, type, value); - }; - - function peek() { return S.peeked || (S.peeked = S.input()); }; - - function next() { - S.prev = S.token; - if (S.peeked) { - S.token = S.peeked; - S.peeked = null; - } else { - S.token = S.input(); - } - return S.token; - }; - - function prev() { - return S.prev; - }; - - function croak(msg, line, col, pos) { - var ctx = S.input.context(); - js_error(msg, - line != null ? line : ctx.tokline, - col != null ? col : ctx.tokcol, - pos != null ? pos : ctx.tokpos); - }; - - function token_error(token, msg) { - croak(msg, token.line, token.col); - }; - - function unexpected(token) { - if (token == null) - token = S.token; - token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")"); - }; - - function expect_token(type, val) { - if (is(type, val)) { - return next(); - } - token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type); - }; - - function expect(punc) { return expect_token("punc", punc); }; - - function can_insert_semicolon() { - return !exigent_mode && ( - S.token.nlb || is("eof") || is("punc", "}") - ); - }; - - function semicolon() { - if (is("punc", ";")) next(); - else if (!can_insert_semicolon()) unexpected(); - }; - - function as() { - return slice(arguments); - }; - - function parenthesised() { - expect("("); - var ex = expression(); - expect(")"); - return ex; - }; - - function add_tokens(str, start, end) { - return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end); - }; - - function maybe_embed_tokens(parser) { - if (embed_tokens) return function() { - var start = S.token; - var ast = parser.apply(this, arguments); - ast[0] = add_tokens(ast[0], start, prev()); - return ast; - }; - else return parser; - }; - - var statement = maybe_embed_tokens(function() { - if (is("operator", "/")) { - S.peeked = null; - S.token = S.input(true); // force regexp - } - switch (S.token.type) { - case "num": - case "string": - case "regexp": - case "operator": - case "atom": - return simple_statement(); - - case "name": - return is_token(peek(), "punc", ":") - ? labeled_statement(prog1(S.token.value, next, next)) - : simple_statement(); - - case "punc": - switch (S.token.value) { - case "{": - return as("block", block_()); - case "[": - case "(": - return simple_statement(); - case ";": - next(); - return as("block"); - default: - unexpected(); - } - - case "keyword": - switch (prog1(S.token.value, next)) { - case "break": - return break_cont("break"); - - case "continue": - return break_cont("continue"); - - case "debugger": - semicolon(); - return as("debugger"); - - case "do": - return (function(body){ - expect_token("keyword", "while"); - return as("do", prog1(parenthesised, semicolon), body); - })(in_loop(statement)); - - case "for": - return for_(); - - case "function": - return function_(true); - - case "if": - return if_(); - - case "return": - if (S.in_function == 0) - croak("'return' outside of function"); - return as("return", - is("punc", ";") - ? (next(), null) - : can_insert_semicolon() - ? null - : prog1(expression, semicolon)); - - case "switch": - return as("switch", parenthesised(), switch_block_()); - - case "throw": - return as("throw", prog1(expression, semicolon)); - - case "try": - return try_(); - - case "var": - return prog1(var_, semicolon); - - case "const": - return prog1(const_, semicolon); - - case "while": - return as("while", parenthesised(), in_loop(statement)); - - case "with": - return as("with", parenthesised(), statement()); - - default: - unexpected(); - } - } - }); - - function labeled_statement(label) { - S.labels.push(label); - var start = S.token, stat = statement(); - if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0])) - unexpected(start); - S.labels.pop(); - return as("label", label, stat); - }; - - function simple_statement() { - return as("stat", prog1(expression, semicolon)); - }; - - function break_cont(type) { - var name; - if (!can_insert_semicolon()) { - name = is("name") ? S.token.value : null; - } - if (name != null) { - next(); - if (!member(name, S.labels)) - croak("Label " + name + " without matching loop or statement"); - } - else if (S.in_loop == 0) - croak(type + " not inside a loop or switch"); - semicolon(); - return as(type, name); - }; - - function for_() { - expect("("); - var init = null; - if (!is("punc", ";")) { - init = is("keyword", "var") - ? (next(), var_(true)) - : expression(true, true); - if (is("operator", "in")) - return for_in(init); - } - return regular_for(init); - }; - - function regular_for(init) { - expect(";"); - var test = is("punc", ";") ? null : expression(); - expect(";"); - var step = is("punc", ")") ? null : expression(); - expect(")"); - return as("for", init, test, step, in_loop(statement)); - }; - - function for_in(init) { - var lhs = init[0] == "var" ? as("name", init[1][0]) : init; - next(); - var obj = expression(); - expect(")"); - return as("for-in", init, lhs, obj, in_loop(statement)); - }; - - var function_ = maybe_embed_tokens(function(in_statement) { - var name = is("name") ? prog1(S.token.value, next) : null; - if (in_statement && !name) - unexpected(); - expect("("); - return as(in_statement ? "defun" : "function", - name, - // arguments - (function(first, a){ - while (!is("punc", ")")) { - if (first) first = false; else expect(","); - if (!is("name")) unexpected(); - a.push(S.token.value); - next(); - } - next(); - return a; - })(true, []), - // body - (function(){ - ++S.in_function; - var loop = S.in_loop; - S.in_loop = 0; - var a = block_(); - --S.in_function; - S.in_loop = loop; - return a; - })()); - }); - - function if_() { - var cond = parenthesised(), body = statement(), belse; - if (is("keyword", "else")) { - next(); - belse = statement(); - } - return as("if", cond, body, belse); - }; - - function block_() { - expect("{"); - var a = []; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - a.push(statement()); - } - next(); - return a; - }; - - var switch_block_ = curry(in_loop, function(){ - expect("{"); - var a = [], cur = null; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - if (is("keyword", "case")) { - next(); - cur = []; - a.push([ expression(), cur ]); - expect(":"); - } - else if (is("keyword", "default")) { - next(); - expect(":"); - cur = []; - a.push([ null, cur ]); - } - else { - if (!cur) unexpected(); - cur.push(statement()); - } - } - next(); - return a; - }); - - function try_() { - var body = block_(), bcatch, bfinally; - if (is("keyword", "catch")) { - next(); - expect("("); - if (!is("name")) - croak("Name expected"); - var name = S.token.value; - next(); - expect(")"); - bcatch = [ name, block_() ]; - } - if (is("keyword", "finally")) { - next(); - bfinally = block_(); - } - if (!bcatch && !bfinally) - croak("Missing catch/finally blocks"); - return as("try", body, bcatch, bfinally); - }; - - function vardefs(no_in) { - var a = []; - for (;;) { - if (!is("name")) - unexpected(); - var name = S.token.value; - next(); - if (is("operator", "=")) { - next(); - a.push([ name, expression(false, no_in) ]); - } else { - a.push([ name ]); - } - if (!is("punc", ",")) - break; - next(); - } - return a; - }; - - function var_(no_in) { - return as("var", vardefs(no_in)); - }; - - function const_() { - return as("const", vardefs()); - }; - - function new_() { - var newexp = expr_atom(false), args; - if (is("punc", "(")) { - next(); - args = expr_list(")"); - } else { - args = []; - } - return subscripts(as("new", newexp, args), true); - }; - - var expr_atom = maybe_embed_tokens(function(allow_calls) { - if (is("operator", "new")) { - next(); - return new_(); - } - if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) { - return make_unary("unary-prefix", - prog1(S.token.value, next), - expr_atom(allow_calls)); - } - if (is("punc")) { - switch (S.token.value) { - case "(": - next(); - return subscripts(prog1(expression, curry(expect, ")")), allow_calls); - case "[": - next(); - return subscripts(array_(), allow_calls); - case "{": - next(); - return subscripts(object_(), allow_calls); - } - unexpected(); - } - if (is("keyword", "function")) { - next(); - return subscripts(function_(false), allow_calls); - } - if (HOP(ATOMIC_START_TOKEN, S.token.type)) { - var atom = S.token.type == "regexp" - ? as("regexp", S.token.value[0], S.token.value[1]) - : as(S.token.type, S.token.value); - return subscripts(prog1(atom, next), allow_calls); - } - unexpected(); - }); - - function expr_list(closing, allow_trailing_comma, allow_empty) { - var first = true, a = []; - while (!is("punc", closing)) { - if (first) first = false; else expect(","); - if (allow_trailing_comma && is("punc", closing)) break; - if (is("punc", ",") && allow_empty) { - a.push([ "atom", "undefined" ]); - } else { - a.push(expression(false)); - } - } - next(); - return a; - }; - - function array_() { - return as("array", expr_list("]", !exigent_mode, true)); - }; - - function object_() { - var first = true, a = []; - while (!is("punc", "}")) { - if (first) first = false; else expect(","); - if (!exigent_mode && is("punc", "}")) - // allow trailing comma - break; - var type = S.token.type; - var name = as_property_name(); - if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) { - a.push([ as_name(), function_(false), name ]); - } else { - expect(":"); - a.push([ name, expression(false) ]); - } - } - next(); - return as("object", a); - }; - - function as_property_name() { - switch (S.token.type) { - case "num": - case "string": - return prog1(S.token.value, next); - } - return as_name(); - }; - - function as_name() { - switch (S.token.type) { - case "name": - case "operator": - case "keyword": - case "atom": - return prog1(S.token.value, next); - default: - unexpected(); - } - }; - - function subscripts(expr, allow_calls) { - if (is("punc", ".")) { - next(); - return subscripts(as("dot", expr, as_name()), allow_calls); - } - if (is("punc", "[")) { - next(); - return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls); - } - if (allow_calls && is("punc", "(")) { - next(); - return subscripts(as("call", expr, expr_list(")")), true); - } - if (allow_calls && is("operator") && HOP(UNARY_POSTFIX, S.token.value)) { - return prog1(curry(make_unary, "unary-postfix", S.token.value, expr), - next); - } - return expr; - }; - - function make_unary(tag, op, expr) { - if ((op == "++" || op == "--") && !is_assignable(expr)) - croak("Invalid use of " + op + " operator"); - return as(tag, op, expr); - }; - - function expr_op(left, min_prec, no_in) { - var op = is("operator") ? S.token.value : null; - if (op && op == "in" && no_in) op = null; - var prec = op != null ? PRECEDENCE[op] : null; - if (prec != null && prec > min_prec) { - next(); - var right = expr_op(expr_atom(true), prec, no_in); - return expr_op(as("binary", op, left, right), min_prec, no_in); - } - return left; - }; - - function expr_ops(no_in) { - return expr_op(expr_atom(true), 0, no_in); - }; - - function maybe_conditional(no_in) { - var expr = expr_ops(no_in); - if (is("operator", "?")) { - next(); - var yes = expression(false); - expect(":"); - return as("conditional", expr, yes, expression(false, no_in)); - } - return expr; - }; - - function is_assignable(expr) { - if (!exigent_mode) return true; - switch (expr[0]) { - case "dot": - case "sub": - case "new": - case "call": - return true; - case "name": - return expr[1] != "this"; - } - }; - - function maybe_assign(no_in) { - var left = maybe_conditional(no_in), val = S.token.value; - if (is("operator") && HOP(ASSIGNMENT, val)) { - if (is_assignable(left)) { - next(); - return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in)); - } - croak("Invalid assignment"); - } - return left; - }; - - var expression = maybe_embed_tokens(function(commas, no_in) { - if (arguments.length == 0) - commas = true; - var expr = maybe_assign(no_in); - if (commas && is("punc", ",")) { - next(); - return as("seq", expr, expression(true, no_in)); - } - return expr; - }); - - function in_loop(cont) { - try { - ++S.in_loop; - return cont(); - } finally { - --S.in_loop; - } - }; - - return as("toplevel", (function(a){ - while (!is("eof")) - a.push(statement()); - return a; - })([])); - -}; - -/* -----[ Utilities ]----- */ - -function curry(f) { - var args = slice(arguments, 1); - return function() { return f.apply(this, args.concat(slice(arguments))); }; -}; - -function prog1(ret) { - if (ret instanceof Function) - ret = ret(); - for (var i = 1, n = arguments.length; --n > 0; ++i) - arguments[i](); - return ret; -}; - -function array_to_hash(a) { - var ret = {}; - for (var i = 0; i < a.length; ++i) - ret[a[i]] = true; - return ret; -}; - -function slice(a, start) { - return Array.prototype.slice.call(a, start == null ? 0 : start); -}; - -function characters(str) { - return str.split(""); -}; - -function member(name, array) { - for (var i = array.length; --i >= 0;) - if (array[i] === name) - return true; - return false; -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -}; - -var warn = function() {}; - -/* -----[ Exports ]----- */ - -exports.tokenizer = tokenizer; -exports.parse = parse; -exports.slice = slice; -exports.curry = curry; -exports.member = member; -exports.array_to_hash = array_to_hash; -exports.PRECEDENCE = PRECEDENCE; -exports.KEYWORDS_ATOM = KEYWORDS_ATOM; -exports.RESERVED_WORDS = RESERVED_WORDS; -exports.KEYWORDS = KEYWORDS; -exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN; -exports.OPERATORS = OPERATORS; -exports.is_alphanumeric_char = is_alphanumeric_char; -exports.set_logger = function(logger) { - warn = logger; -}; -; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/uglify-js/lib/parse-js.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/uglify-js/lib/process.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/uglify-js/lib"; - var __filename = "/node_modules/burrito/node_modules/uglify-js/lib/process.js"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/uglify-js/lib"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/uglify-js/lib"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/uglify-js/lib/process.js"]._cached = module.exports; - - (function () { - /*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - - This version is suitable for Node.js. With minimal changes (the - exports stuff) it should work on any JS platform. - - This file implements some AST processors. They work on data built - by parse-js. - - Exported functions: - - - ast_mangle(ast, options) -- mangles the variable/function names - in the AST. Returns an AST. - - - ast_squeeze(ast) -- employs various optimizations to make the - final generated code even smaller. Returns an AST. - - - gen_code(ast, options) -- generates JS code from the AST. Pass - true (or an object, see the code for some options) as second - argument to get "pretty" (indented) code. - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2010 (c) Mihai Bazon - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - ***********************************************************************/ - -var jsp = require("./parse-js"), - slice = jsp.slice, - member = jsp.member, - PRECEDENCE = jsp.PRECEDENCE, - OPERATORS = jsp.OPERATORS; - -/* -----[ helper for AST traversal ]----- */ - -function ast_walker(ast) { - function _vardefs(defs) { - return [ this[0], MAP(defs, function(def){ - var a = [ def[0] ]; - if (def.length > 1) - a[1] = walk(def[1]); - return a; - }) ]; - }; - function _block(statements) { - var out = [ this[0] ]; - if (statements != null) - out.push(MAP(statements, walk)); - return out; - }; - var walkers = { - "string": function(str) { - return [ this[0], str ]; - }, - "num": function(num) { - return [ this[0], num ]; - }, - "name": function(name) { - return [ this[0], name ]; - }, - "toplevel": function(statements) { - return [ this[0], MAP(statements, walk) ]; - }, - "block": _block, - "splice": _block, - "var": _vardefs, - "const": _vardefs, - "try": function(t, c, f) { - return [ - this[0], - MAP(t, walk), - c != null ? [ c[0], MAP(c[1], walk) ] : null, - f != null ? MAP(f, walk) : null - ]; - }, - "throw": function(expr) { - return [ this[0], walk(expr) ]; - }, - "new": function(ctor, args) { - return [ this[0], walk(ctor), MAP(args, walk) ]; - }, - "switch": function(expr, body) { - return [ this[0], walk(expr), MAP(body, function(branch){ - return [ branch[0] ? walk(branch[0]) : null, - MAP(branch[1], walk) ]; - }) ]; - }, - "break": function(label) { - return [ this[0], label ]; - }, - "continue": function(label) { - return [ this[0], label ]; - }, - "conditional": function(cond, t, e) { - return [ this[0], walk(cond), walk(t), walk(e) ]; - }, - "assign": function(op, lvalue, rvalue) { - return [ this[0], op, walk(lvalue), walk(rvalue) ]; - }, - "dot": function(expr) { - return [ this[0], walk(expr) ].concat(slice(arguments, 1)); - }, - "call": function(expr, args) { - return [ this[0], walk(expr), MAP(args, walk) ]; - }, - "function": function(name, args, body) { - return [ this[0], name, args.slice(), MAP(body, walk) ]; - }, - "defun": function(name, args, body) { - return [ this[0], name, args.slice(), MAP(body, walk) ]; - }, - "if": function(conditional, t, e) { - return [ this[0], walk(conditional), walk(t), walk(e) ]; - }, - "for": function(init, cond, step, block) { - return [ this[0], walk(init), walk(cond), walk(step), walk(block) ]; - }, - "for-in": function(vvar, key, hash, block) { - return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ]; - }, - "while": function(cond, block) { - return [ this[0], walk(cond), walk(block) ]; - }, - "do": function(cond, block) { - return [ this[0], walk(cond), walk(block) ]; - }, - "return": function(expr) { - return [ this[0], walk(expr) ]; - }, - "binary": function(op, left, right) { - return [ this[0], op, walk(left), walk(right) ]; - }, - "unary-prefix": function(op, expr) { - return [ this[0], op, walk(expr) ]; - }, - "unary-postfix": function(op, expr) { - return [ this[0], op, walk(expr) ]; - }, - "sub": function(expr, subscript) { - return [ this[0], walk(expr), walk(subscript) ]; - }, - "object": function(props) { - return [ this[0], MAP(props, function(p){ - return p.length == 2 - ? [ p[0], walk(p[1]) ] - : [ p[0], walk(p[1]), p[2] ]; // get/set-ter - }) ]; - }, - "regexp": function(rx, mods) { - return [ this[0], rx, mods ]; - }, - "array": function(elements) { - return [ this[0], MAP(elements, walk) ]; - }, - "stat": function(stat) { - return [ this[0], walk(stat) ]; - }, - "seq": function() { - return [ this[0] ].concat(MAP(slice(arguments), walk)); - }, - "label": function(name, block) { - return [ this[0], name, walk(block) ]; - }, - "with": function(expr, block) { - return [ this[0], walk(expr), walk(block) ]; - }, - "atom": function(name) { - return [ this[0], name ]; - } - }; - - var user = {}; - var stack = []; - function walk(ast) { - if (ast == null) - return null; - try { - stack.push(ast); - var type = ast[0]; - var gen = user[type]; - if (gen) { - var ret = gen.apply(ast, ast.slice(1)); - if (ret != null) - return ret; - } - gen = walkers[type]; - return gen.apply(ast, ast.slice(1)); - } finally { - stack.pop(); - } - }; - - function with_walkers(walkers, cont){ - var save = {}, i; - for (i in walkers) if (HOP(walkers, i)) { - save[i] = user[i]; - user[i] = walkers[i]; - } - var ret = cont(); - for (i in save) if (HOP(save, i)) { - if (!save[i]) delete user[i]; - else user[i] = save[i]; - } - return ret; - }; - - return { - walk: walk, - with_walkers: with_walkers, - parent: function() { - return stack[stack.length - 2]; // last one is current node - }, - stack: function() { - return stack; - } - }; -}; - -/* -----[ Scope and mangling ]----- */ - -function Scope(parent) { - this.names = {}; // names defined in this scope - this.mangled = {}; // mangled names (orig.name => mangled) - this.rev_mangled = {}; // reverse lookup (mangled => orig.name) - this.cname = -1; // current mangled name - this.refs = {}; // names referenced from this scope - this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes - this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes - this.parent = parent; // parent scope - this.children = []; // sub-scopes - if (parent) { - this.level = parent.level + 1; - parent.children.push(this); - } else { - this.level = 0; - } -}; - -var base54 = (function(){ - var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_"; - return function(num) { - var ret = ""; - do { - ret = DIGITS.charAt(num % 54) + ret; - num = Math.floor(num / 54); - } while (num > 0); - return ret; - }; -})(); - -Scope.prototype = { - has: function(name) { - for (var s = this; s; s = s.parent) - if (HOP(s.names, name)) - return s; - }, - has_mangled: function(mname) { - for (var s = this; s; s = s.parent) - if (HOP(s.rev_mangled, mname)) - return s; - }, - toJSON: function() { - return { - names: this.names, - uses_eval: this.uses_eval, - uses_with: this.uses_with - }; - }, - - next_mangled: function() { - // we must be careful that the new mangled name: - // - // 1. doesn't shadow a mangled name from a parent - // scope, unless we don't reference the original - // name from this scope OR from any sub-scopes! - // This will get slow. - // - // 2. doesn't shadow an original name from a parent - // scope, in the event that the name is not mangled - // in the parent scope and we reference that name - // here OR IN ANY SUBSCOPES! - // - // 3. doesn't shadow a name that is referenced but not - // defined (possibly global defined elsewhere). - for (;;) { - var m = base54(++this.cname), prior; - - // case 1. - prior = this.has_mangled(m); - if (prior && this.refs[prior.rev_mangled[m]] === prior) - continue; - - // case 2. - prior = this.has(m); - if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m)) - continue; - - // case 3. - if (HOP(this.refs, m) && this.refs[m] == null) - continue; - - // I got "do" once. :-/ - if (!is_identifier(m)) - continue; - - return m; - } - }, - set_mangle: function(name, m) { - this.rev_mangled[m] = name; - return this.mangled[name] = m; - }, - get_mangled: function(name, newMangle) { - if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use - var s = this.has(name); - if (!s) return name; // not in visible scope, no mangle - if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope - if (!newMangle) return name; // not found and no mangling requested - return s.set_mangle(name, s.next_mangled()); - }, - define: function(name) { - if (name != null) - return this.names[name] = name; - } -}; - -function ast_add_scope(ast) { - - var current_scope = null; - var w = ast_walker(), walk = w.walk; - var having_eval = []; - - function with_new_scope(cont) { - current_scope = new Scope(current_scope); - var ret = current_scope.body = cont(); - ret.scope = current_scope; - current_scope = current_scope.parent; - return ret; - }; - - function define(name) { - return current_scope.define(name); - }; - - function reference(name) { - current_scope.refs[name] = true; - }; - - function _lambda(name, args, body) { - var is_defun = this[0] == "defun"; - return [ this[0], is_defun ? define(name) : name, args, with_new_scope(function(){ - if (!is_defun) define(name); - MAP(args, define); - return MAP(body, walk); - })]; - }; - - return with_new_scope(function(){ - // process AST - var ret = w.with_walkers({ - "function": _lambda, - "defun": _lambda, - "with": function(expr, block) { - for (var s = current_scope; s; s = s.parent) - s.uses_with = true; - }, - "var": function(defs) { - MAP(defs, function(d){ define(d[0]) }); - }, - "const": function(defs) { - MAP(defs, function(d){ define(d[0]) }); - }, - "try": function(t, c, f) { - if (c != null) return [ - this[0], - MAP(t, walk), - [ define(c[0]), MAP(c[1], walk) ], - f != null ? MAP(f, walk) : null - ]; - }, - "name": function(name) { - if (name == "eval") - having_eval.push(current_scope); - reference(name); - } - }, function(){ - return walk(ast); - }); - - // the reason why we need an additional pass here is - // that names can be used prior to their definition. - - // scopes where eval was detected and their parents - // are marked with uses_eval, unless they define the - // "eval" name. - MAP(having_eval, function(scope){ - if (!scope.has("eval")) while (scope) { - scope.uses_eval = true; - scope = scope.parent; - } - }); - - // for referenced names it might be useful to know - // their origin scope. current_scope here is the - // toplevel one. - function fixrefs(scope, i) { - // do children first; order shouldn't matter - for (i = scope.children.length; --i >= 0;) - fixrefs(scope.children[i]); - for (i in scope.refs) if (HOP(scope.refs, i)) { - // find origin scope and propagate the reference to origin - for (var origin = scope.has(i), s = scope; s; s = s.parent) { - s.refs[i] = origin; - if (s === origin) break; - } - } - }; - fixrefs(current_scope); - - return ret; - }); - -}; - -/* -----[ mangle names ]----- */ - -function ast_mangle(ast, options) { - var w = ast_walker(), walk = w.walk, scope; - options = options || {}; - - function get_mangled(name, newMangle) { - if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel - if (options.except && member(name, options.except)) - return name; - return scope.get_mangled(name, newMangle); - }; - - function get_define(name) { - if (options.defines) { - // we always lookup a defined symbol for the current scope FIRST, so declared - // vars trump a DEFINE symbol, but if no such var is found, then match a DEFINE value - if (!scope.has(name)) { - if (HOP(options.defines, name)) { - return options.defines[name]; - } - } - return null; - } - }; - - function _lambda(name, args, body) { - var is_defun = this[0] == "defun", extra; - if (name) { - if (is_defun) name = get_mangled(name); - else { - extra = {}; - name = extra[name] = scope.next_mangled(); - } - } - body = with_scope(body.scope, function(){ - args = MAP(args, function(name){ return get_mangled(name) }); - return MAP(body, walk); - }, extra); - return [ this[0], name, args, body ]; - }; - - function with_scope(s, cont, extra) { - var _scope = scope; - scope = s; - if (extra) for (var i in extra) if (HOP(extra, i)) { - s.set_mangle(i, extra[i]); - } - for (var i in s.names) if (HOP(s.names, i)) { - get_mangled(i, true); - } - var ret = cont(); - ret.scope = s; - scope = _scope; - return ret; - }; - - function _vardefs(defs) { - return [ this[0], MAP(defs, function(d){ - return [ get_mangled(d[0]), walk(d[1]) ]; - }) ]; - }; - - return w.with_walkers({ - "function": _lambda, - "defun": function() { - // move function declarations to the top when - // they are not in some block. - var ast = _lambda.apply(this, arguments); - switch (w.parent()[0]) { - case "toplevel": - case "function": - case "defun": - return MAP.at_top(ast); - } - return ast; - }, - "var": _vardefs, - "const": _vardefs, - "name": function(name) { - return get_define(name) || [ this[0], get_mangled(name) ]; - }, - "try": function(t, c, f) { - return [ this[0], - MAP(t, walk), - c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null, - f != null ? MAP(f, walk) : null ]; - }, - "toplevel": function(body) { - var self = this; - return with_scope(self.scope, function(){ - return [ self[0], MAP(body, walk) ]; - }); - } - }, function() { - return walk(ast_add_scope(ast)); - }); -}; - -/* -----[ - - compress foo["bar"] into foo.bar, - - remove block brackets {} where possible - - join consecutive var declarations - - various optimizations for IFs: - - if (cond) foo(); else bar(); ==> cond?foo():bar(); - - if (cond) foo(); ==> cond&&foo(); - - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); // also for throw - - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()} - ]----- */ - -var warn = function(){}; - -function best_of(ast1, ast2) { - return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1; -}; - -function last_stat(b) { - if (b[0] == "block" && b[1] && b[1].length > 0) - return b[1][b[1].length - 1]; - return b; -} - -function aborts(t) { - if (t) { - t = last_stat(t); - if (t[0] == "return" || t[0] == "break" || t[0] == "continue" || t[0] == "throw") - return true; - } -}; - -function boolean_expr(expr) { - return ( (expr[0] == "unary-prefix" - && member(expr[1], [ "!", "delete" ])) || - - (expr[0] == "binary" - && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) || - - (expr[0] == "binary" - && member(expr[1], [ "&&", "||" ]) - && boolean_expr(expr[2]) - && boolean_expr(expr[3])) || - - (expr[0] == "conditional" - && boolean_expr(expr[2]) - && boolean_expr(expr[3])) || - - (expr[0] == "assign" - && expr[1] === true - && boolean_expr(expr[3])) || - - (expr[0] == "seq" - && boolean_expr(expr[expr.length - 1])) - ); -}; - -function make_conditional(c, t, e) { - var make_real_conditional = function() { - if (c[0] == "unary-prefix" && c[1] == "!") { - return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ]; - } else { - return e ? [ "conditional", c, t, e ] : [ "binary", "&&", c, t ]; - } - }; - // shortcut the conditional if the expression has a constant value - return when_constant(c, function(ast, val){ - warn_unreachable(val ? e : t); - return (val ? t : e); - }, make_real_conditional); -}; - -function empty(b) { - return !b || (b[0] == "block" && (!b[1] || b[1].length == 0)); -}; - -function is_string(node) { - return (node[0] == "string" || - node[0] == "unary-prefix" && node[1] == "typeof" || - node[0] == "binary" && node[1] == "+" && - (is_string(node[2]) || is_string(node[3]))); -}; - -var when_constant = (function(){ - - var $NOT_CONSTANT = {}; - - // this can only evaluate constant expressions. If it finds anything - // not constant, it throws $NOT_CONSTANT. - function evaluate(expr) { - switch (expr[0]) { - case "string": - case "num": - return expr[1]; - case "name": - case "atom": - switch (expr[1]) { - case "true": return true; - case "false": return false; - } - break; - case "unary-prefix": - switch (expr[1]) { - case "!": return !evaluate(expr[2]); - case "typeof": return typeof evaluate(expr[2]); - case "~": return ~evaluate(expr[2]); - case "-": return -evaluate(expr[2]); - case "+": return +evaluate(expr[2]); - } - break; - case "binary": - var left = expr[2], right = expr[3]; - switch (expr[1]) { - case "&&" : return evaluate(left) && evaluate(right); - case "||" : return evaluate(left) || evaluate(right); - case "|" : return evaluate(left) | evaluate(right); - case "&" : return evaluate(left) & evaluate(right); - case "^" : return evaluate(left) ^ evaluate(right); - case "+" : return evaluate(left) + evaluate(right); - case "*" : return evaluate(left) * evaluate(right); - case "/" : return evaluate(left) / evaluate(right); - case "-" : return evaluate(left) - evaluate(right); - case "<<" : return evaluate(left) << evaluate(right); - case ">>" : return evaluate(left) >> evaluate(right); - case ">>>" : return evaluate(left) >>> evaluate(right); - case "==" : return evaluate(left) == evaluate(right); - case "===" : return evaluate(left) === evaluate(right); - case "!=" : return evaluate(left) != evaluate(right); - case "!==" : return evaluate(left) !== evaluate(right); - case "<" : return evaluate(left) < evaluate(right); - case "<=" : return evaluate(left) <= evaluate(right); - case ">" : return evaluate(left) > evaluate(right); - case ">=" : return evaluate(left) >= evaluate(right); - case "in" : return evaluate(left) in evaluate(right); - case "instanceof" : return evaluate(left) instanceof evaluate(right); - } - } - throw $NOT_CONSTANT; - }; - - return function(expr, yes, no) { - try { - var val = evaluate(expr), ast; - switch (typeof val) { - case "string": ast = [ "string", val ]; break; - case "number": ast = [ "num", val ]; break; - case "boolean": ast = [ "name", String(val) ]; break; - default: throw new Error("Can't handle constant of type: " + (typeof val)); - } - return yes.call(expr, ast, val); - } catch(ex) { - if (ex === $NOT_CONSTANT) { - if (expr[0] == "binary" - && (expr[1] == "===" || expr[1] == "!==") - && ((is_string(expr[2]) && is_string(expr[3])) - || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) { - expr[1] = expr[1].substr(0, 2); - } - else if (no && expr[0] == "binary" - && (expr[1] == "||" || expr[1] == "&&")) { - // the whole expression is not constant but the lval may be... - try { - var lval = evaluate(expr[2]); - expr = ((expr[1] == "&&" && (lval ? expr[3] : lval)) || - (expr[1] == "||" && (lval ? lval : expr[3])) || - expr); - } catch(ex2) { - // IGNORE... lval is not constant - } - } - return no ? no.call(expr, expr) : null; - } - else throw ex; - } - }; - -})(); - -function warn_unreachable(ast) { - if (!empty(ast)) - warn("Dropping unreachable code: " + gen_code(ast, true)); -}; - -function prepare_ifs(ast) { - var w = ast_walker(), walk = w.walk; - // In this first pass, we rewrite ifs which abort with no else with an - // if-else. For example: - // - // if (x) { - // blah(); - // return y; - // } - // foobar(); - // - // is rewritten into: - // - // if (x) { - // blah(); - // return y; - // } else { - // foobar(); - // } - function redo_if(statements) { - statements = MAP(statements, walk); - - for (var i = 0; i < statements.length; ++i) { - var fi = statements[i]; - if (fi[0] != "if") continue; - - if (fi[3] && walk(fi[3])) continue; - - var t = walk(fi[2]); - if (!aborts(t)) continue; - - var conditional = walk(fi[1]); - - var e_body = statements.slice(i + 1); - var e; - if (e_body.length == 1) e = e_body[0]; - else e = [ "block", e_body ]; - - var ret = statements.slice(0, i).concat([ [ - fi[0], // "if" - conditional, // conditional - t, // then - e // else - ] ]); - - return redo_if(ret); - } - - return statements; - }; - - function redo_if_lambda(name, args, body) { - body = redo_if(body); - return [ this[0], name, args.slice(), body ]; - }; - - function redo_if_block(statements) { - var out = [ this[0] ]; - if (statements != null) - out.push(redo_if(statements)); - return out; - }; - - return w.with_walkers({ - "defun": redo_if_lambda, - "function": redo_if_lambda, - "block": redo_if_block, - "splice": redo_if_block, - "toplevel": function(statements) { - return [ this[0], redo_if(statements) ]; - }, - "try": function(t, c, f) { - return [ - this[0], - redo_if(t), - c != null ? [ c[0], redo_if(c[1]) ] : null, - f != null ? redo_if(f) : null - ]; - }, - "with": function(expr, block) { - return [ this[0], walk(expr), redo_if(block) ]; - } - }, function() { - return walk(ast); - }); -}; - -function ast_squeeze(ast, options) { - options = defaults(options, { - make_seqs : true, - dead_code : true, - keep_comps : true, - no_warnings : false - }); - - var w = ast_walker(), walk = w.walk, scope; - - function negate(c) { - var not_c = [ "unary-prefix", "!", c ]; - switch (c[0]) { - case "unary-prefix": - return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c; - case "seq": - c = slice(c); - c[c.length - 1] = negate(c[c.length - 1]); - return c; - case "conditional": - return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]); - case "binary": - var op = c[1], left = c[2], right = c[3]; - if (!options.keep_comps) switch (op) { - case "<=" : return [ "binary", ">", left, right ]; - case "<" : return [ "binary", ">=", left, right ]; - case ">=" : return [ "binary", "<", left, right ]; - case ">" : return [ "binary", "<=", left, right ]; - } - switch (op) { - case "==" : return [ "binary", "!=", left, right ]; - case "!=" : return [ "binary", "==", left, right ]; - case "===" : return [ "binary", "!==", left, right ]; - case "!==" : return [ "binary", "===", left, right ]; - case "&&" : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]); - case "||" : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]); - } - break; - } - return not_c; - }; - - function with_scope(s, cont) { - var _scope = scope; - scope = s; - var ret = cont(); - ret.scope = s; - scope = _scope; - return ret; - }; - - function rmblock(block) { - if (block != null && block[0] == "block" && block[1]) { - if (block[1].length == 1) - block = block[1][0]; - else if (block[1].length == 0) - block = [ "block" ]; - } - return block; - }; - - function _lambda(name, args, body) { - var is_defun = this[0] == "defun"; - body = with_scope(body.scope, function(){ - var ret = tighten(MAP(body, walk), "lambda"); - if (!is_defun && name && !HOP(scope.refs, name)) - name = null; - return ret; - }); - return [ this[0], name, args, body ]; - }; - - // we get here for blocks that have been already transformed. - // this function does a few things: - // 1. discard useless blocks - // 2. join consecutive var declarations - // 3. remove obviously dead code - // 4. transform consecutive statements using the comma operator - // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... } - function tighten(statements, block_type) { - statements = statements.reduce(function(a, stat){ - if (stat[0] == "block") { - if (stat[1]) { - a.push.apply(a, stat[1]); - } - } else { - a.push(stat); - } - return a; - }, []); - - statements = (function(a, prev){ - statements.forEach(function(cur){ - if (prev && ((cur[0] == "var" && prev[0] == "var") || - (cur[0] == "const" && prev[0] == "const"))) { - prev[1] = prev[1].concat(cur[1]); - } else { - a.push(cur); - prev = cur; - } - }); - return a; - })([]); - - if (options.dead_code) statements = (function(a, has_quit){ - statements.forEach(function(st){ - if (has_quit) { - if (member(st[0], [ "function", "defun" , "var", "const" ])) { - a.push(st); - } - else if (!options.no_warnings) - warn_unreachable(st); - } - else { - a.push(st); - if (member(st[0], [ "return", "throw", "break", "continue" ])) - has_quit = true; - } - }); - return a; - })([]); - - if (options.make_seqs) statements = (function(a, prev) { - statements.forEach(function(cur){ - if (prev && prev[0] == "stat" && cur[0] == "stat") { - prev[1] = [ "seq", prev[1], cur[1] ]; - } else { - a.push(cur); - prev = cur; - } - }); - return a; - })([]); - - if (block_type == "lambda") statements = (function(i, a, stat){ - while (i < statements.length) { - stat = statements[i++]; - if (stat[0] == "if" && !stat[3]) { - if (stat[2][0] == "return" && stat[2][1] == null) { - a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ])); - break; - } - var last = last_stat(stat[2]); - if (last[0] == "return" && last[1] == null) { - a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ])); - break; - } - } - a.push(stat); - } - return a; - })(0, []); - - return statements; - }; - - function make_if(c, t, e) { - return when_constant(c, function(ast, val){ - if (val) { - warn_unreachable(e); - return t; - } else { - warn_unreachable(t); - return e; - } - }, function() { - return make_real_if(c, t, e); - }); - }; - - function make_real_if(c, t, e) { - c = walk(c); - t = walk(t); - e = walk(e); - - if (empty(t)) { - c = negate(c); - t = e; - e = null; - } else if (empty(e)) { - e = null; - } else { - // if we have both else and then, maybe it makes sense to switch them? - (function(){ - var a = gen_code(c); - var n = negate(c); - var b = gen_code(n); - if (b.length < a.length) { - var tmp = t; - t = e; - e = tmp; - c = n; - } - })(); - } - if (empty(e) && empty(t)) - return [ "stat", c ]; - var ret = [ "if", c, t, e ]; - if (t[0] == "if" && empty(t[3]) && empty(e)) { - ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ])); - } - else if (t[0] == "stat") { - if (e) { - if (e[0] == "stat") { - ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]); - } - } - else { - ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]); - } - } - else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) { - ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]); - } - else if (e && aborts(t)) { - ret = [ [ "if", c, t ] ]; - if (e[0] == "block") { - if (e[1]) ret = ret.concat(e[1]); - } - else { - ret.push(e); - } - ret = walk([ "block", ret ]); - } - else if (t && aborts(e)) { - ret = [ [ "if", negate(c), e ] ]; - if (t[0] == "block") { - if (t[1]) ret = ret.concat(t[1]); - } else { - ret.push(t); - } - ret = walk([ "block", ret ]); - } - return ret; - }; - - function _do_while(cond, body) { - return when_constant(cond, function(cond, val){ - if (!val) { - warn_unreachable(body); - return [ "block" ]; - } else { - return [ "for", null, null, null, walk(body) ]; - } - }); - }; - - ast = prepare_ifs(ast); - ast = ast_add_scope(ast); - - return w.with_walkers({ - "sub": function(expr, subscript) { - if (subscript[0] == "string") { - var name = subscript[1]; - if (is_identifier(name)) - return [ "dot", walk(expr), name ]; - else if (/^[1-9][0-9]*$/.test(name) || name === "0") - return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ]; - } - }, - "if": make_if, - "toplevel": function(body) { - return [ "toplevel", with_scope(this.scope, function(){ - return tighten(MAP(body, walk)); - }) ]; - }, - "switch": function(expr, body) { - var last = body.length - 1; - return [ "switch", walk(expr), MAP(body, function(branch, i){ - var block = tighten(MAP(branch[1], walk)); - if (i == last && block.length > 0) { - var node = block[block.length - 1]; - if (node[0] == "break" && !node[1]) - block.pop(); - } - return [ branch[0] ? walk(branch[0]) : null, block ]; - }) ]; - }, - "function": _lambda, - "defun": _lambda, - "block": function(body) { - if (body) return rmblock([ "block", tighten(MAP(body, walk)) ]); - }, - "binary": function(op, left, right) { - return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){ - return best_of(walk(c), this); - }, function no() { - return this; - }); - }, - "conditional": function(c, t, e) { - return make_conditional(walk(c), walk(t), walk(e)); - }, - "try": function(t, c, f) { - return [ - "try", - tighten(MAP(t, walk)), - c != null ? [ c[0], tighten(MAP(c[1], walk)) ] : null, - f != null ? tighten(MAP(f, walk)) : null - ]; - }, - "unary-prefix": function(op, expr) { - expr = walk(expr); - var ret = [ "unary-prefix", op, expr ]; - if (op == "!") - ret = best_of(ret, negate(expr)); - return when_constant(ret, function(ast, val){ - return walk(ast); // it's either true or false, so minifies to !0 or !1 - }, function() { return ret }); - }, - "name": function(name) { - switch (name) { - case "true": return [ "unary-prefix", "!", [ "num", 0 ]]; - case "false": return [ "unary-prefix", "!", [ "num", 1 ]]; - } - }, - "new": function(ctor, args) { - if (ctor[0] == "name" && ctor[1] == "Array" && !scope.has("Array")) { - if (args.length != 1) { - return [ "array", args ]; - } else { - return [ "call", [ "name", "Array" ], args ]; - } - } - }, - "call": function(expr, args) { - if (expr[0] == "name" && expr[1] == "Array" && args.length != 1 && !scope.has("Array")) { - return [ "array", args ]; - } - }, - "while": _do_while - }, function() { - return walk(ast); - }); -}; - -/* -----[ re-generate code from the AST ]----- */ - -var DOT_CALL_NO_PARENS = jsp.array_to_hash([ - "name", - "array", - "object", - "string", - "dot", - "sub", - "call", - "regexp" -]); - -function make_string(str, ascii_only) { - var dq = 0, sq = 0; - str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029]/g, function(s){ - switch (s) { - case "\\": return "\\\\"; - case "\b": return "\\b"; - case "\f": return "\\f"; - case "\n": return "\\n"; - case "\r": return "\\r"; - case "\t": return "\\t"; - case "\u2028": return "\\u2028"; - case "\u2029": return "\\u2029"; - case '"': ++dq; return '"'; - case "'": ++sq; return "'"; - } - return s; - }); - if (ascii_only) str = to_ascii(str); - if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'"; - else return '"' + str.replace(/\x22/g, '\\"') + '"'; -}; - -function to_ascii(str) { - return str.replace(/[\u0080-\uffff]/g, function(ch) { - var code = ch.charCodeAt(0).toString(16); - while (code.length < 4) code = "0" + code; - return "\\u" + code; - }); -}; - -var SPLICE_NEEDS_BRACKETS = jsp.array_to_hash([ "if", "while", "do", "for", "for-in", "with" ]); - -function gen_code(ast, options) { - options = defaults(options, { - indent_start : 0, - indent_level : 4, - quote_keys : false, - space_colon : false, - beautify : false, - ascii_only : false - }); - var beautify = !!options.beautify; - var indentation = 0, - newline = beautify ? "\n" : "", - space = beautify ? " " : ""; - - function encode_string(str) { - return make_string(str, options.ascii_only); - }; - - function make_name(name) { - name = name.toString(); - if (options.ascii_only) - name = to_ascii(name); - return name; - }; - - function indent(line) { - if (line == null) - line = ""; - if (beautify) - line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line; - return line; - }; - - function with_indent(cont, incr) { - if (incr == null) incr = 1; - indentation += incr; - try { return cont.apply(null, slice(arguments, 1)); } - finally { indentation -= incr; } - }; - - function add_spaces(a) { - if (beautify) - return a.join(" "); - var b = []; - for (var i = 0; i < a.length; ++i) { - var next = a[i + 1]; - b.push(a[i]); - if (next && - ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) || - (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) { - b.push(" "); - } - } - return b.join(""); - }; - - function add_commas(a) { - return a.join("," + space); - }; - - function parenthesize(expr) { - var gen = make(expr); - for (var i = 1; i < arguments.length; ++i) { - var el = arguments[i]; - if ((el instanceof Function && el(expr)) || expr[0] == el) - return "(" + gen + ")"; - } - return gen; - }; - - function best_of(a) { - if (a.length == 1) { - return a[0]; - } - if (a.length == 2) { - var b = a[1]; - a = a[0]; - return a.length <= b.length ? a : b; - } - return best_of([ a[0], best_of(a.slice(1)) ]); - }; - - function needs_parens(expr) { - if (expr[0] == "function" || expr[0] == "object") { - // dot/call on a literal function requires the - // function literal itself to be parenthesized - // only if it's the first "thing" in a - // statement. This means that the parent is - // "stat", but it could also be a "seq" and - // we're the first in this "seq" and the - // parent is "stat", and so on. Messy stuff, - // but it worths the trouble. - var a = slice($stack), self = a.pop(), p = a.pop(); - while (p) { - if (p[0] == "stat") return true; - if (((p[0] == "seq" || p[0] == "call" || p[0] == "dot" || p[0] == "sub" || p[0] == "conditional") && p[1] === self) || - ((p[0] == "binary" || p[0] == "assign" || p[0] == "unary-postfix") && p[2] === self)) { - self = p; - p = a.pop(); - } else { - return false; - } - } - } - return !HOP(DOT_CALL_NO_PARENS, expr[0]); - }; - - function make_num(num) { - var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m; - if (Math.floor(num) === num) { - a.push("0x" + num.toString(16).toLowerCase(), // probably pointless - "0" + num.toString(8)); // same. - if ((m = /^(.*?)(0+)$/.exec(num))) { - a.push(m[1] + "e" + m[2].length); - } - } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) { - a.push(m[2] + "e-" + (m[1].length + m[2].length), - str.substr(str.indexOf("."))); - } - return best_of(a); - }; - - var generators = { - "string": encode_string, - "num": make_num, - "name": make_name, - "toplevel": function(statements) { - return make_block_statements(statements) - .join(newline + newline); - }, - "splice": function(statements) { - var parent = $stack[$stack.length - 2][0]; - if (HOP(SPLICE_NEEDS_BRACKETS, parent)) { - // we need block brackets in this case - return make_block.apply(this, arguments); - } else { - return MAP(make_block_statements(statements, true), - function(line, i) { - // the first line is already indented - return i > 0 ? indent(line) : line; - }).join(newline); - } - }, - "block": make_block, - "var": function(defs) { - return "var " + add_commas(MAP(defs, make_1vardef)) + ";"; - }, - "const": function(defs) { - return "const " + add_commas(MAP(defs, make_1vardef)) + ";"; - }, - "try": function(tr, ca, fi) { - var out = [ "try", make_block(tr) ]; - if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1])); - if (fi) out.push("finally", make_block(fi)); - return add_spaces(out); - }, - "throw": function(expr) { - return add_spaces([ "throw", make(expr) ]) + ";"; - }, - "new": function(ctor, args) { - args = args.length > 0 ? "(" + add_commas(MAP(args, make)) + ")" : ""; - return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){ - var w = ast_walker(), has_call = {}; - try { - w.with_walkers({ - "call": function() { throw has_call }, - "function": function() { return this } - }, function(){ - w.walk(expr); - }); - } catch(ex) { - if (ex === has_call) - return true; - throw ex; - } - }) + args ]); - }, - "switch": function(expr, body) { - return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]); - }, - "break": function(label) { - var out = "break"; - if (label != null) - out += " " + make_name(label); - return out + ";"; - }, - "continue": function(label) { - var out = "continue"; - if (label != null) - out += " " + make_name(label); - return out + ";"; - }, - "conditional": function(co, th, el) { - return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?", - parenthesize(th, "seq"), ":", - parenthesize(el, "seq") ]); - }, - "assign": function(op, lvalue, rvalue) { - if (op && op !== true) op += "="; - else op = "="; - return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]); - }, - "dot": function(expr) { - var out = make(expr), i = 1; - if (expr[0] == "num") { - if (!/\./.test(expr[1])) - out += "."; - } else if (needs_parens(expr)) - out = "(" + out + ")"; - while (i < arguments.length) - out += "." + make_name(arguments[i++]); - return out; - }, - "call": function(func, args) { - var f = make(func); - if (needs_parens(func)) - f = "(" + f + ")"; - return f + "(" + add_commas(MAP(args, function(expr){ - return parenthesize(expr, "seq"); - })) + ")"; - }, - "function": make_function, - "defun": make_function, - "if": function(co, th, el) { - var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ]; - if (el) { - out.push("else", make(el)); - } - return add_spaces(out); - }, - "for": function(init, cond, step, block) { - var out = [ "for" ]; - init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space); - cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space); - step = (step != null ? make(step) : "").replace(/;*\s*$/, ""); - var args = init + cond + step; - if (args == "; ; ") args = ";;"; - out.push("(" + args + ")", make(block)); - return add_spaces(out); - }, - "for-in": function(vvar, key, hash, block) { - return add_spaces([ "for", "(" + - (vvar ? make(vvar).replace(/;+$/, "") : make(key)), - "in", - make(hash) + ")", make(block) ]); - }, - "while": function(condition, block) { - return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]); - }, - "do": function(condition, block) { - return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";"; - }, - "return": function(expr) { - var out = [ "return" ]; - if (expr != null) out.push(make(expr)); - return add_spaces(out) + ";"; - }, - "binary": function(operator, lvalue, rvalue) { - var left = make(lvalue), right = make(rvalue); - // XXX: I'm pretty sure other cases will bite here. - // we need to be smarter. - // adding parens all the time is the safest bet. - if (member(lvalue[0], [ "assign", "conditional", "seq" ]) || - lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]]) { - left = "(" + left + ")"; - } - if (member(rvalue[0], [ "assign", "conditional", "seq" ]) || - rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] && - !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) { - right = "(" + right + ")"; - } - return add_spaces([ left, operator, right ]); - }, - "unary-prefix": function(operator, expr) { - var val = make(expr); - if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr))) - val = "(" + val + ")"; - return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val; - }, - "unary-postfix": function(operator, expr) { - var val = make(expr); - if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr))) - val = "(" + val + ")"; - return val + operator; - }, - "sub": function(expr, subscript) { - var hash = make(expr); - if (needs_parens(expr)) - hash = "(" + hash + ")"; - return hash + "[" + make(subscript) + "]"; - }, - "object": function(props) { - if (props.length == 0) - return "{}"; - return "{" + newline + with_indent(function(){ - return MAP(props, function(p){ - if (p.length == 3) { - // getter/setter. The name is in p[0], the arg.list in p[1][2], the - // body in p[1][3] and type ("get" / "set") in p[2]. - return indent(make_function(p[0], p[1][2], p[1][3], p[2])); - } - var key = p[0], val = make(p[1]); - if (options.quote_keys) { - key = encode_string(key); - } else if ((typeof key == "number" || !beautify && +key + "" == key) - && parseFloat(key) >= 0) { - key = make_num(+key); - } else if (!is_identifier(key)) { - key = encode_string(key); - } - return indent(add_spaces(beautify && options.space_colon - ? [ key, ":", val ] - : [ key + ":", val ])); - }).join("," + newline); - }) + newline + indent("}"); - }, - "regexp": function(rx, mods) { - return "/" + rx + "/" + mods; - }, - "array": function(elements) { - if (elements.length == 0) return "[]"; - return add_spaces([ "[", add_commas(MAP(elements, function(el){ - if (!beautify && el[0] == "atom" && el[1] == "undefined") return ""; - return parenthesize(el, "seq"); - })), "]" ]); - }, - "stat": function(stmt) { - return make(stmt).replace(/;*\s*$/, ";"); - }, - "seq": function() { - return add_commas(MAP(slice(arguments), make)); - }, - "label": function(name, block) { - return add_spaces([ make_name(name), ":", make(block) ]); - }, - "with": function(expr, block) { - return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]); - }, - "atom": function(name) { - return make_name(name); - } - }; - - // The squeezer replaces "block"-s that contain only a single - // statement with the statement itself; technically, the AST - // is correct, but this can create problems when we output an - // IF having an ELSE clause where the THEN clause ends in an - // IF *without* an ELSE block (then the outer ELSE would refer - // to the inner IF). This function checks for this case and - // adds the block brackets if needed. - function make_then(th) { - if (th[0] == "do") { - // https://github.com/mishoo/UglifyJS/issues/#issue/57 - // IE croaks with "syntax error" on code like this: - // if (foo) do ... while(cond); else ... - // we need block brackets around do/while - return make([ "block", [ th ]]); - } - var b = th; - while (true) { - var type = b[0]; - if (type == "if") { - if (!b[3]) - // no else, we must add the block - return make([ "block", [ th ]]); - b = b[3]; - } - else if (type == "while" || type == "do") b = b[2]; - else if (type == "for" || type == "for-in") b = b[4]; - else break; - } - return make(th); - }; - - function make_function(name, args, body, keyword) { - var out = keyword || "function"; - if (name) { - out += " " + make_name(name); - } - out += "(" + add_commas(MAP(args, make_name)) + ")"; - return add_spaces([ out, make_block(body) ]); - }; - - function make_block_statements(statements, noindent) { - for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) { - var stat = statements[i]; - var code = make(stat); - if (code != ";") { - if (!beautify && i == last) { - if ((stat[0] == "while" && empty(stat[2])) || - (member(stat[0], [ "for", "for-in"] ) && empty(stat[4])) || - (stat[0] == "if" && empty(stat[2]) && !stat[3]) || - (stat[0] == "if" && stat[3] && empty(stat[3]))) { - code = code.replace(/;*\s*$/, ";"); - } else { - code = code.replace(/;+\s*$/, ""); - } - } - a.push(code); - } - } - return noindent ? a : MAP(a, indent); - }; - - function make_switch_block(body) { - var n = body.length; - if (n == 0) return "{}"; - return "{" + newline + MAP(body, function(branch, i){ - var has_body = branch[1].length > 0, code = with_indent(function(){ - return indent(branch[0] - ? add_spaces([ "case", make(branch[0]) + ":" ]) - : "default:"); - }, 0.5) + (has_body ? newline + with_indent(function(){ - return make_block_statements(branch[1]).join(newline); - }) : ""); - if (!beautify && has_body && i < n - 1) - code += ";"; - return code; - }).join(newline) + newline + indent("}"); - }; - - function make_block(statements) { - if (!statements) return ";"; - if (statements.length == 0) return "{}"; - return "{" + newline + with_indent(function(){ - return make_block_statements(statements).join(newline); - }) + newline + indent("}"); - }; - - function make_1vardef(def) { - var name = def[0], val = def[1]; - if (val != null) - name = add_spaces([ make_name(name), "=", parenthesize(val, "seq") ]); - return name; - }; - - var $stack = []; - - function make(node) { - var type = node[0]; - var gen = generators[type]; - if (!gen) - throw new Error("Can't find generator for \"" + type + "\""); - $stack.push(node); - var ret = gen.apply(type, node.slice(1)); - $stack.pop(); - return ret; - }; - - return make(ast); -}; - -function split_lines(code, max_line_length) { - var splits = [ 0 ]; - jsp.parse(function(){ - var next_token = jsp.tokenizer(code); - var last_split = 0; - var prev_token; - function current_length(tok) { - return tok.pos - last_split; - }; - function split_here(tok) { - last_split = tok.pos; - splits.push(last_split); - }; - function custom(){ - var tok = next_token.apply(this, arguments); - out: { - if (prev_token) { - if (prev_token.type == "keyword") break out; - } - if (current_length(tok) > max_line_length) { - switch (tok.type) { - case "keyword": - case "atom": - case "name": - case "punc": - split_here(tok); - break out; - } - } - } - prev_token = tok; - return tok; - }; - custom.context = function() { - return next_token.context.apply(this, arguments); - }; - return custom; - }()); - return splits.map(function(pos, i){ - return code.substring(pos, splits[i + 1] || code.length); - }).join("\n"); -}; - -/* -----[ Utilities ]----- */ - -function repeat_string(str, i) { - if (i <= 0) return ""; - if (i == 1) return str; - var d = repeat_string(str, i >> 1); - d += d; - if (i & 1) d += str; - return d; -}; - -function defaults(args, defs) { - var ret = {}; - if (args === true) - args = {}; - for (var i in defs) if (HOP(defs, i)) { - ret[i] = (args && HOP(args, i)) ? args[i] : defs[i]; - } - return ret; -}; - -function is_identifier(name) { - return /^[a-z_$][a-z0-9_$]*$/i.test(name) - && name != "this" - && !HOP(jsp.KEYWORDS_ATOM, name) - && !HOP(jsp.RESERVED_WORDS, name) - && !HOP(jsp.KEYWORDS, name); -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -}; - -// some utilities - -var MAP; - -(function(){ - MAP = function(a, f, o) { - var ret = []; - for (var i = 0; i < a.length; ++i) { - var val = f.call(o, a[i], i); - if (val instanceof AtTop) ret.unshift(val.v); - else ret.push(val); - } - return ret; - }; - MAP.at_top = function(val) { return new AtTop(val) }; - function AtTop(val) { this.v = val }; -})(); - -/* -----[ Exports ]----- */ - -exports.ast_walker = ast_walker; -exports.ast_mangle = ast_mangle; -exports.ast_squeeze = ast_squeeze; -exports.gen_code = gen_code; -exports.ast_add_scope = ast_add_scope; -exports.set_logger = function(logger) { warn = logger }; -exports.make_string = make_string; -exports.split_lines = split_lines; -exports.MAP = MAP; - -// keep this last! -exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more; -; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/uglify-js/lib/process.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/uglify-js/lib/squeeze-more.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/uglify-js/lib"; - var __filename = "/node_modules/burrito/node_modules/uglify-js/lib/squeeze-more.js"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/uglify-js/lib"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/uglify-js/lib"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/uglify-js/lib/squeeze-more.js"]._cached = module.exports; - - (function () { - var jsp = require("./parse-js"), - pro = require("./process"), - slice = jsp.slice, - member = jsp.member, - PRECEDENCE = jsp.PRECEDENCE, - OPERATORS = jsp.OPERATORS; - -function ast_squeeze_more(ast) { - var w = pro.ast_walker(), walk = w.walk; - return w.with_walkers({ - "call": function(expr, args) { - if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) { - // foo.toString() ==> foo+"" - return [ "binary", "+", expr[1], [ "string", "" ]]; - } - } - }, function() { - return walk(ast); - }); -}; - -exports.ast_squeeze_more = ast_squeeze_more; -; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/uglify-js/lib/squeeze-more.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/traverse/package.json"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/traverse"; - var __filename = "/node_modules/burrito/node_modules/traverse/package.json"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/traverse"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/traverse"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/traverse/package.json"]._cached = module.exports; - - (function () { - module.exports = {"name":"traverse","version":"0.5.0","description":"Traverse and transform objects by visiting every node on a recursive walk","author":"James Halliday","license":"MIT/X11","main":"./index","repository":{"type":"git","url":"http://github.com/substack/js-traverse.git"},"devDependencies":{"expresso":"0.7.x"},"scripts":{"test":"expresso"}}; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/traverse/package.json"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/node_modules/traverse/index.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito/node_modules/traverse"; - var __filename = "/node_modules/burrito/node_modules/traverse/index.js"; - - var require = function (file) { - return __require(file, "/node_modules/burrito/node_modules/traverse"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito/node_modules/traverse"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/node_modules/traverse/index.js"]._cached = module.exports; - - (function () { - module.exports = Traverse; -function Traverse (obj) { - if (!(this instanceof Traverse)) return new Traverse(obj); - this.value = obj; -} - -Traverse.prototype.get = function (ps) { - var node = this.value; - for (var i = 0; i < ps.length; i ++) { - var key = ps[i]; - if (!Object.hasOwnProperty.call(node, key)) { - node = undefined; - break; - } - node = node[key]; - } - return node; -}; - -Traverse.prototype.set = function (ps, value) { - var node = this.value; - for (var i = 0; i < ps.length - 1; i ++) { - var key = ps[i]; - if (!Object.hasOwnProperty.call(node, key)) node[key] = {}; - node = node[key]; - } - node[ps[i]] = value; - return value; -}; - -Traverse.prototype.map = function (cb) { - return walk(this.value, cb, true); -}; - -Traverse.prototype.forEach = function (cb) { - this.value = walk(this.value, cb, false); - return this.value; -}; - -Traverse.prototype.reduce = function (cb, init) { - var skip = arguments.length === 1; - var acc = skip ? this.value : init; - this.forEach(function (x) { - if (!this.isRoot || !skip) { - acc = cb.call(this, acc, x); - } - }); - return acc; -}; - -Traverse.prototype.paths = function () { - var acc = []; - this.forEach(function (x) { - acc.push(this.path); - }); - return acc; -}; - -Traverse.prototype.nodes = function () { - var acc = []; - this.forEach(function (x) { - acc.push(this.node); - }); - return acc; -}; - -Traverse.prototype.clone = function () { - var parents = [], nodes = []; - - return (function clone (src) { - for (var i = 0; i < parents.length; i++) { - if (parents[i] === src) { - return nodes[i]; - } - } - - if (typeof src === 'object' && src !== null) { - var dst = copy(src); - - parents.push(src); - nodes.push(dst); - - forEach(Object_keys(src), function (key) { - dst[key] = clone(src[key]); - }); - - parents.pop(); - nodes.pop(); - return dst; - } - else { - return src; - } - })(this.value); -}; - -function walk (root, cb, immutable) { - var path = []; - var parents = []; - var alive = true; - - return (function walker (node_) { - var node = immutable ? copy(node_) : node_; - var modifiers = {}; - - var keepGoing = true; - - var state = { - node : node, - node_ : node_, - path : [].concat(path), - parent : parents[parents.length - 1], - parents : parents, - key : path.slice(-1)[0], - isRoot : path.length === 0, - level : path.length, - circular : null, - update : function (x, stopHere) { - if (!state.isRoot) { - state.parent.node[state.key] = x; - } - state.node = x; - if (stopHere) keepGoing = false; - }, - 'delete' : function () { - delete state.parent.node[state.key]; - }, - remove : function () { - if (Array_isArray(state.parent.node)) { - state.parent.node.splice(state.key, 1); - } - else { - delete state.parent.node[state.key]; - } - }, - keys : null, - before : function (f) { modifiers.before = f }, - after : function (f) { modifiers.after = f }, - pre : function (f) { modifiers.pre = f }, - post : function (f) { modifiers.post = f }, - stop : function () { alive = false }, - block : function () { keepGoing = false } - }; - - if (!alive) return state; - - if (typeof node === 'object' && node !== null) { - state.keys = Object_keys(node); - - state.isLeaf = state.keys.length == 0; - - for (var i = 0; i < parents.length; i++) { - if (parents[i].node_ === node_) { - state.circular = parents[i]; - break; - } - } - } - else { - state.isLeaf = true; - } - - state.notLeaf = !state.isLeaf; - state.notRoot = !state.isRoot; - - // use return values to update if defined - var ret = cb.call(state, state.node); - if (ret !== undefined && state.update) state.update(ret); - - if (modifiers.before) modifiers.before.call(state, state.node); - - if (!keepGoing) return state; - - if (typeof state.node == 'object' - && state.node !== null && !state.circular) { - parents.push(state); - - forEach(state.keys, function (key, i) { - path.push(key); - - if (modifiers.pre) modifiers.pre.call(state, state.node[key], key); - - var child = walker(state.node[key]); - if (immutable && Object.hasOwnProperty.call(state.node, key)) { - state.node[key] = child.node; - } - - child.isLast = i == state.keys.length - 1; - child.isFirst = i == 0; - - if (modifiers.post) modifiers.post.call(state, child); - - path.pop(); - }); - parents.pop(); - } - - if (modifiers.after) modifiers.after.call(state, state.node); - - return state; - })(root).node; -} - -function copy (src) { - if (typeof src === 'object' && src !== null) { - var dst; - - if (Array_isArray(src)) { - dst = []; - } - else if (src instanceof Date) { - dst = new Date(src); - } - else if (src instanceof Boolean) { - dst = new Boolean(src); - } - else if (src instanceof Number) { - dst = new Number(src); - } - else if (src instanceof String) { - dst = new String(src); - } - else if (Object.create && Object.getPrototypeOf) { - dst = Object.create(Object.getPrototypeOf(src)); - } - else if (src.__proto__ || src.constructor.prototype) { - var proto = src.__proto__ || src.constructor.prototype || {}; - var T = function () {}; - T.prototype = proto; - dst = new T; - if (!dst.__proto__) dst.__proto__ = proto; - } - - forEach(Object_keys(src), function (key) { - dst[key] = src[key]; - }); - return dst; - } - else return src; -} - -var Object_keys = Object.keys || function keys (obj) { - var res = []; - for (var key in obj) res.push(key) - return res; -}; - -var Array_isArray = Array.isArray || function isArray (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - -var forEach = function (xs, fn) { - if (xs.forEach) return xs.forEach(fn) - else for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } -}; - -forEach(Object_keys(Traverse.prototype), function (key) { - Traverse[key] = function (obj) { - var args = [].slice.call(arguments, 1); - var t = Traverse(obj); - return t[key].apply(t, args); - }; -}); -; - }).call(module.exports); - - __require.modules["/node_modules/burrito/node_modules/traverse/index.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["vm"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "."; - var __filename = "vm"; - - var require = function (file) { - return __require(file, "."); - }; - - require.resolve = function (file) { - return __require.resolve(name, "."); - }; - - require.modules = __require.modules; - __require.modules["vm"]._cached = module.exports; - - (function () { - var Object_keys = function (obj) { - if (Object.keys) return Object.keys(obj) - else { - var res = []; - for (var key in obj) res.push(key) - return res; - } -}; - -var forEach = function (xs, fn) { - if (xs.forEach) return xs.forEach(fn) - else for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } -}; - -var Script = exports.Script = function NodeScript (code) { - if (!(this instanceof Script)) return new Script(code); - this.code = code; -}; - -var iframe = document.createElement('iframe'); -if (!iframe.style) iframe.style = {}; -iframe.style.display = 'none'; - -var iframeCapable = true; // until proven otherwise -if (navigator.appName === 'Microsoft Internet Explorer') { - var m = navigator.appVersion.match(/\bMSIE (\d+\.\d+);/); - if (m && parseFloat(m[1]) <= 9.0) { - iframeCapable = false; - } -} - -Script.prototype.runInNewContext = function (context) { - if (!context) context = {}; - - if (!iframeCapable) { - var keys = Object_keys(context); - var args = []; - for (var i = 0; i < keys.length; i++) { - args.push(context[keys[i]]); - } - - var fn = Function(keys, this.code); - return fn.apply(null, args); - } - - document.body.appendChild(iframe); - - var win = iframe.contentWindow - || (window.frames && window.frames[window.frames.length - 1]) - || window[window.length - 1] - ; - - forEach(Object_keys(context), function (key) { - win[key] = context[key]; - iframe[key] = context[key]; - }); - - if (win.eval) { - // chrome and ff can just .eval() - var res = win.eval(this.code); - } - else { - // this works in IE9 but not anything newer - iframe.setAttribute('src', - 'javascript:__browserifyVmResult=(' + this.code + ')' - ); - if ('__browserifyVmResult' in win) { - var res = win.__browserifyVmResult; - } - else { - iframeCapable = false; - res = this.runInThisContext(context); - } - } - - forEach(Object_keys(win), function (key) { - context[key] = win[key]; - }); - - document.body.removeChild(iframe); - - return res; -}; - -Script.prototype.runInThisContext = function () { - return eval(this.code); // maybe... -}; - -Script.prototype.runInContext = function (context) { - // seems to be just runInNewContext on magical context objects which are - // otherwise indistinguishable from objects except plain old objects - // for the parameter segfaults node - return this.runInNewContext(context); -}; - -forEach(Object_keys(Script.prototype), function (name) { - exports[name] = Script[name] = function (code) { - var s = Script(code); - return s[name].apply(s, [].slice.call(arguments, 1)); - }; -}); - -exports.createScript = function (code) { - return exports.Script(code); -}; - -exports.createContext = Script.createContext = function (context) { - // not really sure what this one does - // seems to just make a shallow copy - var copy = {}; - forEach(Object_keys(context), function (key) { - copy[key] = context[key]; - }); - return copy; -}; -; - }).call(module.exports); - - __require.modules["vm"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/jsonify/package.json"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/jsonify"; - var __filename = "/node_modules/jsonify/package.json"; - - var require = function (file) { - return __require(file, "/node_modules/jsonify"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/jsonify"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/jsonify/package.json"]._cached = module.exports; - - (function () { - module.exports = {"name":"jsonify","version":"0.0.0","description":"JSON without touching any globals","main":"index.js","directories":{"lib":".","test":"test"},"devDependencies":{"tap":"0.0.x","garbage":"0.0.x"},"scripts":{"test":"tap test"},"repository":{"type":"git","url":"http://github.com/substack/jsonify.git"},"keywords":["json","browser"],"author":{"name":"Douglas Crockford","url":"http://crockford.com/"},"license":"Public Domain"}; - }).call(module.exports); - - __require.modules["/node_modules/jsonify/package.json"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/jsonify/index.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/jsonify"; - var __filename = "/node_modules/jsonify/index.js"; - - var require = function (file) { - return __require(file, "/node_modules/jsonify"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/jsonify"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/jsonify/index.js"]._cached = module.exports; - - (function () { - exports.parse = require('./lib/parse'); -exports.stringify = require('./lib/stringify'); -; - }).call(module.exports); - - __require.modules["/node_modules/jsonify/index.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/jsonify/lib/parse.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/jsonify/lib"; - var __filename = "/node_modules/jsonify/lib/parse.js"; - - var require = function (file) { - return __require(file, "/node_modules/jsonify/lib"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/jsonify/lib"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/jsonify/lib/parse.js"]._cached = module.exports; - - (function () { - var at, // The index of the current character - ch, // The current character - escapee = { - '"': '"', - '\\': '\\', - '/': '/', - b: '\b', - f: '\f', - n: '\n', - r: '\r', - t: '\t' - }, - text, - - error = function (m) { - // Call error when something is wrong. - throw { - name: 'SyntaxError', - message: m, - at: at, - text: text - }; - }, - - next = function (c) { - // If a c parameter is provided, verify that it matches the current character. - if (c && c !== ch) { - error("Expected '" + c + "' instead of '" + ch + "'"); - } - - // Get the next character. When there are no more characters, - // return the empty string. - - ch = text.charAt(at); - at += 1; - return ch; - }, - - number = function () { - // Parse a number value. - var number, - string = ''; - - if (ch === '-') { - string = '-'; - next('-'); - } - while (ch >= '0' && ch <= '9') { - string += ch; - next(); - } - if (ch === '.') { - string += '.'; - while (next() && ch >= '0' && ch <= '9') { - string += ch; - } - } - if (ch === 'e' || ch === 'E') { - string += ch; - next(); - if (ch === '-' || ch === '+') { - string += ch; - next(); - } - while (ch >= '0' && ch <= '9') { - string += ch; - next(); - } - } - number = +string; - if (!isFinite(number)) { - error("Bad number"); - } else { - return number; - } - }, - - string = function () { - // Parse a string value. - var hex, - i, - string = '', - uffff; - - // When parsing for string values, we must look for " and \ characters. - if (ch === '"') { - while (next()) { - if (ch === '"') { - next(); - return string; - } else if (ch === '\\') { - next(); - if (ch === 'u') { - uffff = 0; - for (i = 0; i < 4; i += 1) { - hex = parseInt(next(), 16); - if (!isFinite(hex)) { - break; - } - uffff = uffff * 16 + hex; - } - string += String.fromCharCode(uffff); - } else if (typeof escapee[ch] === 'string') { - string += escapee[ch]; - } else { - break; - } - } else { - string += ch; - } - } - } - error("Bad string"); - }, - - white = function () { - -// Skip whitespace. - - while (ch && ch <= ' ') { - next(); - } - }, - - word = function () { - -// true, false, or null. - - switch (ch) { - case 't': - next('t'); - next('r'); - next('u'); - next('e'); - return true; - case 'f': - next('f'); - next('a'); - next('l'); - next('s'); - next('e'); - return false; - case 'n': - next('n'); - next('u'); - next('l'); - next('l'); - return null; - } - error("Unexpected '" + ch + "'"); - }, - - value, // Place holder for the value function. - - array = function () { - -// Parse an array value. - - var array = []; - - if (ch === '[') { - next('['); - white(); - if (ch === ']') { - next(']'); - return array; // empty array - } - while (ch) { - array.push(value()); - white(); - if (ch === ']') { - next(']'); - return array; - } - next(','); - white(); - } - } - error("Bad array"); - }, - - object = function () { - -// Parse an object value. - - var key, - object = {}; - - if (ch === '{') { - next('{'); - white(); - if (ch === '}') { - next('}'); - return object; // empty object - } - while (ch) { - key = string(); - white(); - next(':'); - if (Object.hasOwnProperty.call(object, key)) { - error('Duplicate key "' + key + '"'); - } - object[key] = value(); - white(); - if (ch === '}') { - next('}'); - return object; - } - next(','); - white(); - } - } - error("Bad object"); - }; - -value = function () { - -// Parse a JSON value. It could be an object, an array, a string, a number, -// or a word. - - white(); - switch (ch) { - case '{': - return object(); - case '[': - return array(); - case '"': - return string(); - case '-': - return number(); - default: - return ch >= '0' && ch <= '9' ? number() : word(); - } -}; - -// Return the json_parse function. It will have access to all of the above -// functions and variables. - -module.exports = function (source, reviver) { - var result; - - text = source; - at = 0; - ch = ' '; - result = value(); - white(); - if (ch) { - error("Syntax error"); - } - - // If there is a reviver function, we recursively walk the new structure, - // passing each name/value pair to the reviver function for possible - // transformation, starting with a temporary root object that holds the result - // in an empty key. If there is not a reviver function, we simply return the - // result. - - return typeof reviver === 'function' ? (function walk(holder, key) { - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - }({'': result}, '')) : result; -}; -; - }).call(module.exports); - - __require.modules["/node_modules/jsonify/lib/parse.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/jsonify/lib/stringify.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/jsonify/lib"; - var __filename = "/node_modules/jsonify/lib/stringify.js"; - - var require = function (file) { - return __require(file, "/node_modules/jsonify/lib"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/jsonify/lib"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/jsonify/lib/stringify.js"]._cached = module.exports; - - (function () { - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - -function quote(string) { - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : '"' + string + '"'; -} - -function str(key, holder) { - // Produce a string from holder[key]. - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - // JSON numbers must be finite. Encode non-finite numbers as null. - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - return String(value); - - case 'object': - if (!value) return 'null'; - gap += indent; - partial = []; - - // Array.isArray - if (Object.prototype.toString.apply(value) === '[object Array]') { - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - - // Join all of the elements together, separated with commas, and - // wrap them in brackets. - v = partial.length === 0 ? '[]' : gap ? - '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be - // stringified. - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - else { - // Otherwise, iterate through all of the keys in the object. - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = partial.length === 0 ? '{}' : gap ? - '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : - '{' + partial.join(',') + '}'; - gap = mind; - return v; - } -} - -module.exports = function (value, replacer, space) { - var i; - gap = ''; - indent = ''; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - } - // If the space parameter is a string, it will be used as the indent string. - else if (typeof space === 'string') { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - rep = replacer; - if (replacer && typeof replacer !== 'function' - && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - return str('', {'': value}); -}; -; - }).call(module.exports); - - __require.modules["/node_modules/jsonify/lib/stringify.js"]._cached = module.exports; - return module.exports; -}; - -require.modules["/node_modules/burrito/index.js"] = function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/node_modules/burrito"; - var __filename = "/node_modules/burrito/index.js"; - - var require = function (file) { - return __require(file, "/node_modules/burrito"); - }; - - require.resolve = function (file) { - return __require.resolve(name, "/node_modules/burrito"); - }; - - require.modules = __require.modules; - __require.modules["/node_modules/burrito/index.js"]._cached = module.exports; - - (function () { - var uglify = require('uglify-js'); -var parser = uglify.parser; -var parse = function (expr) { - if (typeof expr !== 'string') throw 'expression should be a string'; - - //try { - var args = [].slice.call(arguments); - var ast = parser.parse.apply(null, args); - /* } - catch (err) { - if (err.message === undefined - || err.line === undefined - || err.col === undefined - || err.pos === undefined - ) { throw err } - - var e = new SyntaxError( - err.message - + '\n at line ' + err.line + ':' + err.col + ' in expression:\n\n' - + ' ' + expr.split(/\r?\n/)[err.line] - ); - - e.original = err; - e.line = err.line; - e.col = err.col; - e.pos = err.pos; - throw e; - } - */ - return ast; -}; - -var deparse = function (ast, b) { - return uglify.uglify.gen_code(ast, { beautify : b }); -}; - -var traverse = require('traverse'); -var vm = require('vm'); - -var burrito = module.exports = function (code, cb) { - var ast = Array_isArray(code) - ? code // already an ast - : parse(code.toString(), false, true) - ; - - var ast_ = traverse(ast).map(function mapper () { - wrapNode(this, cb); - }); - - return deparse(parse(deparse(ast_)), true); -}; - -var wrapNode = burrito.wrapNode = function (state, cb) { - var node = state.node; - - var ann = Array_isArray(node) && node[0] - && typeof node[0] === 'object' && node[0].name - ? node[0] - : null - ; - - if (!ann) return undefined; - - var self = { - name : ann.name, - node : node, - start : node[0].start, - end : node[0].end, - value : node.slice(1), - state : state - }; - - self.wrap = function (s) { - var subsrc = deparse( - traverse(node).map(function (x) { - if (!this.isRoot) wrapNode(this, cb) - }) - ); - - if (self.name === 'binary') { - var a = deparse(traverse(node[2]).map(function (x) { - if (!this.isRoot) wrapNode(this, cb) - })); - var b = deparse(traverse(node[3]).map(function (x) { - if (!this.isRoot) wrapNode(this, cb) - })); - } - - var src = ''; - - if (typeof s === 'function') { - if (self.name === 'binary') { - src = s(subsrc, a, b); - } - else { - src = s(subsrc); - } - } - else { - src = s.toString() - .replace(/%s/g, function () { - return subsrc - }) - ; - - if (self.name === 'binary') { - src = src - .replace(/%a/g, function () { return a }) - .replace(/%b/g, function () { return b }) - ; - } - } - - var expr = parse(src); - state.update(expr, true); - }; - - var cache = {}; - - self.parent = state.isRoot ? null : function () { - if (!cache.parent) { - var s = state; - var x; - do { - s = s.parent; - if (s) x = wrapNode(s); - } while (s && !x); - - cache.parent = x; - } - - return cache.parent; - }; - - self.source = function () { - if (!cache.source) cache.source = deparse(node); - return cache.source; - }; - - self.label = function () { - return burrito.label(self); - }; - - if (cb) cb.call(state, self); - - if (self.node[0].name === 'conditional') { - self.wrap('[%s][0]'); - } - - return self; -} - -burrito.microwave = function (code, context, cb) { - if (!cb) { cb = context; context = {} }; - if (!context) context = {}; - - var src = burrito(code, cb); - return vm.runInNewContext(src, context); -}; - -burrito.generateName = function (len) { - var name = ''; - var lower = '$'.charCodeAt(0); - var upper = 'z'.charCodeAt(0); - - while (name.length < len) { - var c = String.fromCharCode(Math.floor( - Math.random() * (upper - lower + 1) + lower - )); - if ((name + c).match(/^[A-Za-z_$][A-Za-z0-9_$]*$/)) name += c; - } - - return name; -}; - -burrito.parse = parse; -burrito.deparse = deparse; - -burrito.label = function (node) { - if (node.name === 'call') { - if (typeof node.value[0] === 'string') { - return node.value[0]; - } - else if (node.value[0] && typeof node.value[0][1] === 'string') { - return node.value[0][1]; - } - else { - return null; - } - } - else if (node.name === 'var') { - return node.value[0].map(function (x) { return x[0] }); - } - else if (node.name === 'defun') { - return node.value[0]; - } - else if (node.name === 'function') { - return node.value[0]; - } - else { - return null; - } -}; - -var Array_isArray = Array.isArray || function isArray (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; -; - }).call(module.exports); - - __require.modules["/node_modules/burrito/index.js"]._cached = module.exports; - return module.exports; -}; - -process.nextTick(function () { - var module = { exports : {} }; - var exports = module.exports; - var __dirname = "/"; - var __filename = "//home/substack/projects/node-burrito/example/web"; - - var require = function (file) { - return __require(file, "/"); - }; - require.modules = __require.modules; - - var burrito = require('burrito'); -var json = require('jsonify'); - -var src = [ - 'function f () { g() }', - 'function g () { h() }', - 'function h () { throw "moo" + Array(x).join("!") }', - 'var x = 4', - 'f()' -].join('\r\n'); - -window.onload = function () { - burrito(src, function (node) { - document.body.innerHTML += node.name + '
\n'; - }); -}; -if (document.readyState === 'complete') window.onload(); -; -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/index.html b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/index.html deleted file mode 100644 index 66804fb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -

-
-
diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/main.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/main.js
deleted file mode 100644
index cc81a8b..0000000
--- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/main.js
+++ /dev/null
@@ -1,17 +0,0 @@
-var burrito = require('burrito');
-var json = require('jsonify');
-
-var src = [
-    'function f () { g() }',
-    'function g () { h() }',
-    'function h () { throw "moo" + Array(x).join("!") }',
-    'var x = 4',
-    'f()'
-].join('\r\n');
-
-window.onload = function () {
-    burrito(src, function (node) {
-        document.body.innerHTML += node.name + '
\n'; - }); -}; -if (document.readyState === 'complete') window.onload(); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/server.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/server.js deleted file mode 100644 index 6bce020..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/web/server.js +++ /dev/null @@ -1,12 +0,0 @@ -var express = require('express'); -var browserify = require('browserify'); - -var app = express.createServer(); -app.use(express.static(__dirname)); -app.use(browserify({ - entry : __dirname + '/main.js', - watch : true, -})); - -app.listen(8081); -console.log('Listening on :8081'); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/wrap.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/wrap.js deleted file mode 100644 index 1642401..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/example/wrap.js +++ /dev/null @@ -1,7 +0,0 @@ -var burrito = require('burrito'); - -var src = burrito('f() && g(h())\nfoo()', function (node) { - if (node.name === 'call') node.wrap('qqq(%s)'); -}); - -console.log(src); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/index.js deleted file mode 100644 index 60ef569..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/index.js +++ /dev/null @@ -1,208 +0,0 @@ -var uglify = require('uglify-js'); -var parser = uglify.parser; -var parse = function (expr) { - if (typeof expr !== 'string') throw 'expression should be a string'; - - try { - var ast = parser.parse.apply(null, arguments); - } - catch (err) { - if (err.message === undefined - || err.line === undefined - || err.col === undefined - || err.pos === undefined - ) { throw err } - - var e = new SyntaxError( - err.message - + '\n at line ' + err.line + ':' + err.col + ' in expression:\n\n' - + ' ' + expr.split(/\r?\n/)[err.line] - ); - - e.original = err; - e.line = err.line; - e.col = err.col; - e.pos = err.pos; - throw e; - } - return ast; -}; - -var deparse = function (ast, b) { - return uglify.uglify.gen_code(ast, { beautify : b }); -}; - -var traverse = require('traverse'); -var vm = require('vm'); - -var burrito = module.exports = function (code, cb) { - var ast = Array_isArray(code) - ? code // already an ast - : parse(code.toString(), false, true) - ; - - var ast_ = traverse(ast).map(function mapper () { - wrapNode(this, cb); - }); - - return deparse(parse(deparse(ast_)), true); -}; - -var wrapNode = burrito.wrapNode = function (state, cb) { - var node = state.node; - - var ann = Array_isArray(node) && node[0] - && typeof node[0] === 'object' && node[0].name - ? node[0] - : null - ; - - if (!ann) return undefined; - - var self = { - name : ann.name, - node : node, - start : node[0].start, - end : node[0].end, - value : node.slice(1), - state : state - }; - - self.wrap = function (s) { - var subsrc = deparse( - traverse(node).map(function (x) { - if (!this.isRoot) wrapNode(this, cb) - }) - ); - - if (self.name === 'binary') { - var a = deparse(traverse(node[2]).map(function (x) { - if (!this.isRoot) wrapNode(this, cb) - })); - var b = deparse(traverse(node[3]).map(function (x) { - if (!this.isRoot) wrapNode(this, cb) - })); - } - - var src = ''; - - if (typeof s === 'function') { - if (self.name === 'binary') { - src = s(subsrc, a, b); - } - else { - src = s(subsrc); - } - } - else { - src = s.toString() - .replace(/%s/g, function () { - return subsrc - }) - ; - - if (self.name === 'binary') { - src = src - .replace(/%a/g, function () { return a }) - .replace(/%b/g, function () { return b }) - ; - } - } - - var expr = parse(src); - state.update(expr, true); - }; - - var cache = {}; - - self.parent = state.isRoot ? null : function () { - if (!cache.parent) { - var s = state; - var x; - do { - s = s.parent; - if (s) x = wrapNode(s); - } while (s && !x); - - cache.parent = x; - } - - return cache.parent; - }; - - self.source = function () { - if (!cache.source) cache.source = deparse(node); - return cache.source; - }; - - self.label = function () { - return burrito.label(self); - }; - - if (cb) cb.call(state, self); - - if (self.node[0].name === 'conditional') { - self.wrap('[%s][0]'); - } - - return self; -} - -burrito.microwave = function (code, context, cb) { - if (!cb) { cb = context; context = {} }; - if (!context) context = {}; - - var src = burrito(code, cb); - return vm.runInNewContext(src, context); -}; - -burrito.generateName = function (len) { - var name = ''; - var lower = '$'.charCodeAt(0); - var upper = 'z'.charCodeAt(0); - - while (name.length < len) { - var c = String.fromCharCode(Math.floor( - Math.random() * (upper - lower + 1) + lower - )); - if ((name + c).match(/^[A-Za-z_$][A-Za-z0-9_$]*$/)) name += c; - } - - return name; -}; - -burrito.parse = parse; -burrito.deparse = deparse; - -burrito.label = function (node) { - if (node.name === 'call') { - if (typeof node.value[0] === 'string') { - return node.value[0]; - } - else if (node.value[0] && typeof node.value[0][1] === 'string') { - return node.value[0][1]; - } - else if (node.value[0][0] === 'dot') { - return node.value[0][node.value[0].length - 1]; - } - else { - return null; - } - } - else if (node.name === 'var') { - return node.value[0].map(function (x) { return x[0] }); - } - else if (node.name === 'defun') { - return node.value[0]; - } - else if (node.name === 'function') { - return node.value[0]; - } - else { - return null; - } -}; - -var Array_isArray = Array.isArray || function isArray (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/.bin/uglifyjs b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/.bin/uglifyjs deleted file mode 120000 index fef3468..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/.bin/uglifyjs +++ /dev/null @@ -1 +0,0 @@ -../uglify-js/bin/uglifyjs \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/LICENSE deleted file mode 100644 index 7b75500..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 license: -http://www.opensource.org/licenses/mit-license.php - -Copyright 2010 James Halliday (mail@substack.net) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/README.markdown b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/README.markdown deleted file mode 100644 index f86ef76..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/README.markdown +++ /dev/null @@ -1,237 +0,0 @@ -traverse -======== - -Traverse and transform objects by visiting every node on a recursive walk. - -examples -======== - -transform negative numbers in-place ------------------------------------ - -negative.js - -````javascript -var traverse = require('traverse'); -var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - -traverse(obj).forEach(function (x) { - if (x < 0) this.update(x + 128); -}); - -console.dir(obj); -```` - -Output: - - [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ] - -collect leaf nodes ------------------- - -leaves.js - -````javascript -var traverse = require('traverse'); - -var obj = { - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 }, -}; - -var leaves = traverse(obj).reduce(function (acc, x) { - if (this.isLeaf) acc.push(x); - return acc; -}, []); - -console.dir(leaves); -```` - -Output: - - [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] - -scrub circular references -------------------------- - -scrub.js: - -````javascript -var traverse = require('traverse'); - -var obj = { a : 1, b : 2, c : [ 3, 4 ] }; -obj.c.push(obj); - -var scrubbed = traverse(obj).map(function (x) { - if (this.circular) this.remove() -}); -console.dir(scrubbed); -```` - -output: - - { a: 1, b: 2, c: [ 3, 4 ] } - -context -======= - -Each method that takes a callback has a context (its `this` object) with these -attributes: - -this.node ---------- - -The present node on the recursive walk - -this.path ---------- - -An array of string keys from the root to the present node - -this.parent ------------ - -The context of the node's parent. -This is `undefined` for the root node. - -this.key --------- - -The name of the key of the present node in its parent. -This is `undefined` for the root node. - -this.isRoot, this.notRoot -------------------------- - -Whether the present node is the root node - -this.isLeaf, this.notLeaf -------------------------- - -Whether or not the present node is a leaf node (has no children) - -this.level ----------- - -Depth of the node within the traversal - -this.circular -------------- - -If the node equals one of its parents, the `circular` attribute is set to the -context of that parent and the traversal progresses no deeper. - -this.update(value, stopHere=false) ----------------------------------- - -Set a new value for the present node. - -All the elements in `value` will be recursively traversed unless `stopHere` is -true. - -this.remove(stopHere=false) -------------- - -Remove the current element from the output. If the node is in an Array it will -be spliced off. Otherwise it will be deleted from its parent. - -this.delete(stopHere=false) -------------- - -Delete the current element from its parent in the output. Calls `delete` even on -Arrays. - -this.before(fn) ---------------- - -Call this function before any of the children are traversed. - -You can assign into `this.keys` here to traverse in a custom order. - -this.after(fn) --------------- - -Call this function after any of the children are traversed. - -this.pre(fn) ------------- - -Call this function before each of the children are traversed. - -this.post(fn) -------------- - -Call this function after each of the children are traversed. - -methods -======= - -.map(fn) --------- - -Execute `fn` for each node in the object and return a new object with the -results of the walk. To update nodes in the result use `this.update(value)`. - -.forEach(fn) ------------- - -Execute `fn` for each node in the object but unlike `.map()`, when -`this.update()` is called it updates the object in-place. - -.reduce(fn, acc) ----------------- - -For each node in the object, perform a -[left-fold](http://en.wikipedia.org/wiki/Fold_(higher-order_function)) -with the return value of `fn(acc, node)`. - -If `acc` isn't specified, `acc` is set to the root object for the first step -and the root element is skipped. - -.paths() --------- - -Return an `Array` of every possible non-cyclic path in the object. -Paths are `Array`s of string keys. - -.nodes() --------- - -Return an `Array` of every node in the object. - -.clone() --------- - -Create a deep clone of the object. - -install -======= - -Using [npm](http://npmjs.org) do: - - $ npm install traverse - -test -==== - -Using [expresso](http://github.com/visionmedia/expresso) do: - - $ expresso - - 100% wahoo, your stuff is not broken! - -in the browser -============== - -Use [browserify](https://github.com/substack/node-browserify) to run traverse in -the browser. - -traverse has been tested and works with: - -* Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0 -* Firefox 3.5 -* Chrome 6.0 -* Opera 10.6 -* Safari 5.0 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/json.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/json.js deleted file mode 100755 index 50d612e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/json.js +++ /dev/null @@ -1,16 +0,0 @@ -var traverse = require('traverse'); - -var id = 54; -var callbacks = {}; -var obj = { moo : function () {}, foo : [2,3,4, function () {}] }; - -var scrubbed = traverse(obj).map(function (x) { - if (typeof x === 'function') { - callbacks[id] = { id : id, f : x, path : this.path }; - this.update('[Function]'); - id++; - } -}); - -console.dir(scrubbed); -console.dir(callbacks); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/leaves.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/leaves.js deleted file mode 100755 index c1b310b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/leaves.js +++ /dev/null @@ -1,15 +0,0 @@ -var traverse = require('traverse'); - -var obj = { - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 }, -}; - -var leaves = traverse(obj).reduce(function (acc, x) { - if (this.isLeaf) acc.push(x); - return acc; -}, []); - -console.dir(leaves); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/negative.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/negative.js deleted file mode 100755 index 78608a0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/negative.js +++ /dev/null @@ -1,8 +0,0 @@ -var traverse = require('traverse'); -var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - -traverse(obj).forEach(function (x) { - if (x < 0) this.update(x + 128); -}); - -console.dir(obj); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/scrub.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/scrub.js deleted file mode 100755 index 5d15b91..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/scrub.js +++ /dev/null @@ -1,10 +0,0 @@ -// scrub out circular references -var traverse = require('traverse'); - -var obj = { a : 1, b : 2, c : [ 3, 4 ] }; -obj.c.push(obj); - -var scrubbed = traverse(obj).map(function (x) { - if (this.circular) this.remove() -}); -console.dir(scrubbed); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/stringify.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/stringify.js deleted file mode 100755 index 167b68b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/examples/stringify.js +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env node -var traverse = require('traverse'); - -var obj = [ 'five', 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - -var s = ''; -traverse(obj).forEach(function to_s (node) { - if (Array.isArray(node)) { - this.before(function () { s += '[' }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += ']' }); - } - else if (typeof node == 'object') { - this.before(function () { s += '{' }); - this.pre(function (x, key) { - to_s(key); - s += ':'; - }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += '}' }); - } - else if (typeof node == 'string') { - s += '"' + node.toString().replace(/"/g, '\\"') + '"'; - } - else if (typeof node == 'function') { - s += 'null'; - } - else { - s += node.toString(); - } -}); - -console.log('JSON.stringify: ' + JSON.stringify(obj)); -console.log('this stringify: ' + s); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/index.js deleted file mode 100644 index 038a1ad..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/index.js +++ /dev/null @@ -1,267 +0,0 @@ -module.exports = Traverse; -function Traverse (obj) { - if (!(this instanceof Traverse)) return new Traverse(obj); - this.value = obj; -} - -Traverse.prototype.get = function (ps) { - var node = this.value; - for (var i = 0; i < ps.length; i ++) { - var key = ps[i]; - if (!Object.hasOwnProperty.call(node, key)) { - node = undefined; - break; - } - node = node[key]; - } - return node; -}; - -Traverse.prototype.set = function (ps, value) { - var node = this.value; - for (var i = 0; i < ps.length - 1; i ++) { - var key = ps[i]; - if (!Object.hasOwnProperty.call(node, key)) node[key] = {}; - node = node[key]; - } - node[ps[i]] = value; - return value; -}; - -Traverse.prototype.map = function (cb) { - return walk(this.value, cb, true); -}; - -Traverse.prototype.forEach = function (cb) { - this.value = walk(this.value, cb, false); - return this.value; -}; - -Traverse.prototype.reduce = function (cb, init) { - var skip = arguments.length === 1; - var acc = skip ? this.value : init; - this.forEach(function (x) { - if (!this.isRoot || !skip) { - acc = cb.call(this, acc, x); - } - }); - return acc; -}; - -Traverse.prototype.paths = function () { - var acc = []; - this.forEach(function (x) { - acc.push(this.path); - }); - return acc; -}; - -Traverse.prototype.nodes = function () { - var acc = []; - this.forEach(function (x) { - acc.push(this.node); - }); - return acc; -}; - -Traverse.prototype.clone = function () { - var parents = [], nodes = []; - - return (function clone (src) { - for (var i = 0; i < parents.length; i++) { - if (parents[i] === src) { - return nodes[i]; - } - } - - if (typeof src === 'object' && src !== null) { - var dst = copy(src); - - parents.push(src); - nodes.push(dst); - - forEach(Object_keys(src), function (key) { - dst[key] = clone(src[key]); - }); - - parents.pop(); - nodes.pop(); - return dst; - } - else { - return src; - } - })(this.value); -}; - -function walk (root, cb, immutable) { - var path = []; - var parents = []; - var alive = true; - - return (function walker (node_) { - var node = immutable ? copy(node_) : node_; - var modifiers = {}; - - var keepGoing = true; - - var state = { - node : node, - node_ : node_, - path : [].concat(path), - parent : parents[parents.length - 1], - parents : parents, - key : path.slice(-1)[0], - isRoot : path.length === 0, - level : path.length, - circular : null, - update : function (x, stopHere) { - if (!state.isRoot) { - state.parent.node[state.key] = x; - } - state.node = x; - if (stopHere) keepGoing = false; - }, - 'delete' : function (stopHere) { - delete state.parent.node[state.key]; - if (stopHere) keepGoing = false; - }, - remove : function (stopHere) { - if (Array_isArray(state.parent.node)) { - state.parent.node.splice(state.key, 1); - } - else { - delete state.parent.node[state.key]; - } - if (stopHere) keepGoing = false; - }, - keys : null, - before : function (f) { modifiers.before = f }, - after : function (f) { modifiers.after = f }, - pre : function (f) { modifiers.pre = f }, - post : function (f) { modifiers.post = f }, - stop : function () { alive = false }, - block : function () { keepGoing = false } - }; - - if (!alive) return state; - - if (typeof node === 'object' && node !== null) { - state.keys = Object_keys(node); - - state.isLeaf = state.keys.length == 0; - - for (var i = 0; i < parents.length; i++) { - if (parents[i].node_ === node_) { - state.circular = parents[i]; - break; - } - } - } - else { - state.isLeaf = true; - } - - state.notLeaf = !state.isLeaf; - state.notRoot = !state.isRoot; - - // use return values to update if defined - var ret = cb.call(state, state.node); - if (ret !== undefined && state.update) state.update(ret); - - if (modifiers.before) modifiers.before.call(state, state.node); - - if (!keepGoing) return state; - - if (typeof state.node == 'object' - && state.node !== null && !state.circular) { - parents.push(state); - - forEach(state.keys, function (key, i) { - path.push(key); - - if (modifiers.pre) modifiers.pre.call(state, state.node[key], key); - - var child = walker(state.node[key]); - if (immutable && Object.hasOwnProperty.call(state.node, key)) { - state.node[key] = child.node; - } - - child.isLast = i == state.keys.length - 1; - child.isFirst = i == 0; - - if (modifiers.post) modifiers.post.call(state, child); - - path.pop(); - }); - parents.pop(); - } - - if (modifiers.after) modifiers.after.call(state, state.node); - - return state; - })(root).node; -} - -function copy (src) { - if (typeof src === 'object' && src !== null) { - var dst; - - if (Array_isArray(src)) { - dst = []; - } - else if (src instanceof Date) { - dst = new Date(src); - } - else if (src instanceof Boolean) { - dst = new Boolean(src); - } - else if (src instanceof Number) { - dst = new Number(src); - } - else if (src instanceof String) { - dst = new String(src); - } - else if (Object.create && Object.getPrototypeOf) { - dst = Object.create(Object.getPrototypeOf(src)); - } - else if (src.__proto__ || src.constructor.prototype) { - var proto = src.__proto__ || src.constructor.prototype || {}; - var T = function () {}; - T.prototype = proto; - dst = new T; - if (!dst.__proto__) dst.__proto__ = proto; - } - - forEach(Object_keys(src), function (key) { - dst[key] = src[key]; - }); - return dst; - } - else return src; -} - -var Object_keys = Object.keys || function keys (obj) { - var res = []; - for (var key in obj) res.push(key) - return res; -}; - -var Array_isArray = Array.isArray || function isArray (xs) { - return Object.prototype.toString.call(xs) === '[object Array]'; -}; - -var forEach = function (xs, fn) { - if (xs.forEach) return xs.forEach(fn) - else for (var i = 0; i < xs.length; i++) { - fn(xs[i], i, xs); - } -}; - -forEach(Object_keys(Traverse.prototype), function (key) { - Traverse[key] = function (obj) { - var args = [].slice.call(arguments, 1); - var t = Traverse(obj); - return t[key].apply(t, args); - }; -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/main.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/main.js deleted file mode 100755 index d562d37..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/main.js +++ /dev/null @@ -1,10 +0,0 @@ -// scrub out circular references -var traverse = require('./index.js'); - -var obj = { a : 1, b : 2, c : [ 3, 4 ] }; -obj.c.push(obj); - -var scrubbed = traverse(obj).map(function (x) { - if (this.circular) this.remove() -}); -console.dir(scrubbed); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/package.json deleted file mode 100644 index f86ebf9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "traverse", - "version": "0.5.2", - "description": "Traverse and transform objects by visiting every node on a recursive walk", - "author": { - "name": "James Halliday" - }, - "license": "MIT/X11", - "main": "./index", - "repository": { - "type": "git", - "url": "http://github.com/substack/js-traverse.git" - }, - "devDependencies": { - "expresso": "0.7.x" - }, - "scripts": { - "test": "expresso" - }, - "readme": "traverse\n========\n\nTraverse and transform objects by visiting every node on a recursive walk.\n\nexamples\n========\n\ntransform negative numbers in-place\n-----------------------------------\n\nnegative.js\n\n````javascript\nvar traverse = require('traverse');\nvar obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ];\n\ntraverse(obj).forEach(function (x) {\n if (x < 0) this.update(x + 128);\n});\n\nconsole.dir(obj);\n````\n\nOutput:\n\n [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ]\n\ncollect leaf nodes\n------------------\n\nleaves.js\n\n````javascript\nvar traverse = require('traverse');\n\nvar obj = {\n a : [1,2,3],\n b : 4,\n c : [5,6],\n d : { e : [7,8], f : 9 },\n};\n\nvar leaves = traverse(obj).reduce(function (acc, x) {\n if (this.isLeaf) acc.push(x);\n return acc;\n}, []);\n\nconsole.dir(leaves);\n````\n\nOutput:\n\n [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]\n\nscrub circular references\n-------------------------\n\nscrub.js:\n\n````javascript\nvar traverse = require('traverse');\n\nvar obj = { a : 1, b : 2, c : [ 3, 4 ] };\nobj.c.push(obj);\n\nvar scrubbed = traverse(obj).map(function (x) {\n if (this.circular) this.remove()\n});\nconsole.dir(scrubbed);\n````\n\noutput:\n\n { a: 1, b: 2, c: [ 3, 4 ] }\n\ncontext\n=======\n\nEach method that takes a callback has a context (its `this` object) with these\nattributes:\n\nthis.node\n---------\n\nThe present node on the recursive walk\n\nthis.path\n---------\n\nAn array of string keys from the root to the present node\n\nthis.parent\n-----------\n\nThe context of the node's parent.\nThis is `undefined` for the root node.\n\nthis.key\n--------\n\nThe name of the key of the present node in its parent.\nThis is `undefined` for the root node.\n\nthis.isRoot, this.notRoot\n-------------------------\n\nWhether the present node is the root node\n\nthis.isLeaf, this.notLeaf\n-------------------------\n\nWhether or not the present node is a leaf node (has no children)\n\nthis.level\n----------\n\nDepth of the node within the traversal\n\nthis.circular\n-------------\n\nIf the node equals one of its parents, the `circular` attribute is set to the\ncontext of that parent and the traversal progresses no deeper.\n\nthis.update(value, stopHere=false)\n----------------------------------\n\nSet a new value for the present node.\n\nAll the elements in `value` will be recursively traversed unless `stopHere` is\ntrue.\n\nthis.remove(stopHere=false)\n-------------\n\nRemove the current element from the output. If the node is in an Array it will\nbe spliced off. Otherwise it will be deleted from its parent.\n\nthis.delete(stopHere=false)\n-------------\n\nDelete the current element from its parent in the output. Calls `delete` even on\nArrays.\n\nthis.before(fn)\n---------------\n\nCall this function before any of the children are traversed.\n\nYou can assign into `this.keys` here to traverse in a custom order.\n\nthis.after(fn)\n--------------\n\nCall this function after any of the children are traversed.\n\nthis.pre(fn)\n------------\n\nCall this function before each of the children are traversed.\n\nthis.post(fn)\n-------------\n\nCall this function after each of the children are traversed.\n\nmethods\n=======\n\n.map(fn)\n--------\n\nExecute `fn` for each node in the object and return a new object with the\nresults of the walk. To update nodes in the result use `this.update(value)`.\n\n.forEach(fn)\n------------\n\nExecute `fn` for each node in the object but unlike `.map()`, when\n`this.update()` is called it updates the object in-place.\n\n.reduce(fn, acc)\n----------------\n\nFor each node in the object, perform a\n[left-fold](http://en.wikipedia.org/wiki/Fold_(higher-order_function))\nwith the return value of `fn(acc, node)`.\n\nIf `acc` isn't specified, `acc` is set to the root object for the first step\nand the root element is skipped.\n\n.paths()\n--------\n\nReturn an `Array` of every possible non-cyclic path in the object.\nPaths are `Array`s of string keys.\n\n.nodes()\n--------\n\nReturn an `Array` of every node in the object.\n\n.clone()\n--------\n\nCreate a deep clone of the object.\n\ninstall\n=======\n\nUsing [npm](http://npmjs.org) do:\n\n $ npm install traverse\n\ntest\n====\n\nUsing [expresso](http://github.com/visionmedia/expresso) do:\n\n $ expresso\n \n 100% wahoo, your stuff is not broken!\n\nin the browser\n==============\n\nUse [browserify](https://github.com/substack/node-browserify) to run traverse in\nthe browser.\n\ntraverse has been tested and works with:\n\n* Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0\n* Firefox 3.5\n* Chrome 6.0\n* Opera 10.6\n* Safari 5.0\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/js-traverse/issues" - }, - "homepage": "https://github.com/substack/js-traverse", - "_id": "traverse@0.5.2", - "_from": "traverse@~0.5.1" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/circular.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/circular.js deleted file mode 100644 index 9162601..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/circular.js +++ /dev/null @@ -1,115 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); -var util = require('util'); - -exports.circular = function () { - var obj = { x : 3 }; - obj.y = obj; - var foundY = false; - Traverse(obj).forEach(function (x) { - if (this.path.join('') == 'y') { - assert.equal( - util.inspect(this.circular.node), - util.inspect(obj) - ); - foundY = true; - } - }); - assert.ok(foundY); -}; - -exports.deepCirc = function () { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - - var times = 0; - Traverse(obj).forEach(function (x) { - if (this.circular) { - assert.deepEqual(this.circular.path, []); - assert.deepEqual(this.path, [ 'y', 2 ]); - times ++; - } - }); - - assert.deepEqual(times, 1); -}; - -exports.doubleCirc = function () { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - var circs = []; - Traverse(obj).forEach(function (x) { - if (this.circular) { - circs.push({ circ : this.circular, self : this, node : x }); - } - }); - - assert.deepEqual(circs[0].self.path, [ 'x', 3, 2 ]); - assert.deepEqual(circs[0].circ.path, []); - - assert.deepEqual(circs[1].self.path, [ 'y', 2 ]); - assert.deepEqual(circs[1].circ.path, []); - - assert.deepEqual(circs.length, 2); -}; - -exports.circDubForEach = function () { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - Traverse(obj).forEach(function (x) { - if (this.circular) this.update('...'); - }); - - assert.deepEqual(obj, { x : [ 1, 2, 3, [ 4, 5, '...' ] ], y : [ 4, 5, '...' ] }); -}; - -exports.circDubMap = function () { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - var c = Traverse(obj).map(function (x) { - if (this.circular) { - this.update('...'); - } - }); - - assert.deepEqual(c, { x : [ 1, 2, 3, [ 4, 5, '...' ] ], y : [ 4, 5, '...' ] }); -}; - -exports.circClone = function () { - var obj = { x : [ 1, 2, 3 ], y : [ 4, 5 ] }; - obj.y[2] = obj; - obj.x.push(obj.y); - - var clone = Traverse.clone(obj); - assert.ok(obj !== clone); - - assert.ok(clone.y[2] === clone); - assert.ok(clone.y[2] !== obj); - assert.ok(clone.x[3][2] === clone); - assert.ok(clone.x[3][2] !== obj); - assert.deepEqual(clone.x.slice(0,3), [1,2,3]); - assert.deepEqual(clone.y.slice(0,2), [4,5]); -}; - -exports.circMapScrub = function () { - var obj = { a : 1, b : 2 }; - obj.c = obj; - - var scrubbed = Traverse(obj).map(function (node) { - if (this.circular) this.remove(); - }); - assert.deepEqual( - Object.keys(scrubbed).sort(), - [ 'a', 'b' ] - ); - assert.ok(deepEqual(scrubbed, { a : 1, b : 2 })); - - assert.equal(obj.c, obj); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/date.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/date.js deleted file mode 100644 index 4ca06dc..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/date.js +++ /dev/null @@ -1,35 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports.dateEach = function () { - var obj = { x : new Date, y : 10, z : 5 }; - - var counts = {}; - - Traverse(obj).forEach(function (node) { - var t = (node instanceof Date && 'Date') || typeof node; - counts[t] = (counts[t] || 0) + 1; - }); - - assert.deepEqual(counts, { - object : 1, - Date : 1, - number : 2, - }); -}; - -exports.dateMap = function () { - var obj = { x : new Date, y : 10, z : 5 }; - - var res = Traverse(obj).map(function (node) { - if (typeof node === 'number') this.update(node + 100); - }); - - assert.ok(obj.x !== res.x); - assert.deepEqual(res, { - x : obj.x, - y : 110, - z : 105, - }); -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/equal.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/equal.js deleted file mode 100644 index decc755..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/equal.js +++ /dev/null @@ -1,220 +0,0 @@ -var assert = require('assert'); -var traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); - -exports.deepDates = function () { - assert.ok( - deepEqual( - { d : new Date, x : [ 1, 2, 3 ] }, - { d : new Date, x : [ 1, 2, 3 ] } - ), - 'dates should be equal' - ); - - var d0 = new Date; - setTimeout(function () { - assert.ok( - !deepEqual( - { d : d0, x : [ 1, 2, 3 ], }, - { d : new Date, x : [ 1, 2, 3 ] } - ), - 'microseconds should count in date equality' - ); - }, 5); -}; - -exports.deepCircular = function () { - var a = [1]; - a.push(a); // a = [ 1, *a ] - - var b = [1]; - b.push(a); // b = [ 1, [ 1, *a ] ] - - assert.ok( - !deepEqual(a, b), - 'circular ref mount points count towards equality' - ); - - var c = [1]; - c.push(c); // c = [ 1, *c ] - assert.ok( - deepEqual(a, c), - 'circular refs are structurally the same here' - ); - - var d = [1]; - d.push(a); // c = [ 1, [ 1, *d ] ] - assert.ok( - deepEqual(b, d), - 'non-root circular ref structural comparison' - ); -}; - -exports.deepInstances = function () { - assert.ok( - !deepEqual([ new Boolean(false) ], [ false ]), - 'boolean instances are not real booleans' - ); - - assert.ok( - !deepEqual([ new String('x') ], [ 'x' ]), - 'string instances are not real strings' - ); - - assert.ok( - !deepEqual([ new Number(4) ], [ 4 ]), - 'number instances are not real numbers' - ); - - assert.ok( - deepEqual([ new RegExp('x') ], [ /x/ ]), - 'regexp instances are real regexps' - ); - - assert.ok( - !deepEqual([ new RegExp(/./) ], [ /../ ]), - 'these regexps aren\'t the same' - ); - - assert.ok( - !deepEqual( - [ function (x) { return x * 2 } ], - [ function (x) { return x * 2 } ] - ), - 'functions with the same .toString() aren\'t necessarily the same' - ); - - var f = function (x) { return x * 2 }; - assert.ok( - deepEqual([ f ], [ f ]), - 'these functions are actually equal' - ); -}; - -exports.deepEqual = function () { - assert.ok( - !deepEqual([ 1, 2, 3 ], { 0 : 1, 1 : 2, 2 : 3 }), - 'arrays are not objects' - ); -}; - -exports.falsy = function () { - assert.ok( - !deepEqual([ undefined ], [ null ]), - 'null is not undefined!' - ); - - assert.ok( - !deepEqual([ null ], [ undefined ]), - 'undefined is not null!' - ); - - assert.ok( - !deepEqual( - { a : 1, b : 2, c : [ 3, undefined, 5 ] }, - { a : 1, b : 2, c : [ 3, null, 5 ] } - ), - 'undefined is not null, however deeply!' - ); - - assert.ok( - !deepEqual( - { a : 1, b : 2, c : [ 3, undefined, 5 ] }, - { a : 1, b : 2, c : [ 3, null, 5 ] } - ), - 'null is not undefined, however deeply!' - ); - - assert.ok( - !deepEqual( - { a : 1, b : 2, c : [ 3, undefined, 5 ] }, - { a : 1, b : 2, c : [ 3, null, 5 ] } - ), - 'null is not undefined, however deeply!' - ); -}; - -exports.deletedArrayEqual = function () { - var xs = [ 1, 2, 3, 4 ]; - delete xs[2]; - - var ys = Object.create(Array.prototype); - ys[0] = 1; - ys[1] = 2; - ys[3] = 4; - - assert.ok( - deepEqual(xs, ys), - 'arrays with deleted elements are only equal to' - + ' arrays with similarly deleted elements' - ); - - assert.ok( - !deepEqual(xs, [ 1, 2, undefined, 4 ]), - 'deleted array elements cannot be undefined' - ); - - assert.ok( - !deepEqual(xs, [ 1, 2, null, 4 ]), - 'deleted array elements cannot be null' - ); -}; - -exports.deletedObjectEqual = function () { - var obj = { a : 1, b : 2, c : 3 }; - delete obj.c; - - assert.ok( - deepEqual(obj, { a : 1, b : 2 }), - 'deleted object elements should not show up' - ); - - assert.ok( - !deepEqual(obj, { a : 1, b : 2, c : undefined }), - 'deleted object elements are not undefined' - ); - - assert.ok( - !deepEqual(obj, { a : 1, b : 2, c : null }), - 'deleted object elements are not null' - ); -}; - -exports.emptyKeyEqual = function () { - assert.ok(!deepEqual( - { a : 1 }, { a : 1, '' : 55 } - )); -}; - -exports.deepArguments = function () { - assert.ok( - !deepEqual( - [ 4, 5, 6 ], - (function () { return arguments })(4, 5, 6) - ), - 'arguments are not arrays' - ); - - assert.ok( - deepEqual( - (function () { return arguments })(4, 5, 6), - (function () { return arguments })(4, 5, 6) - ), - 'arguments should equal' - ); -}; - -exports.deepUn = function () { - assert.ok(!deepEqual({ a : 1, b : 2 }, undefined)); - assert.ok(!deepEqual({ a : 1, b : 2 }, {})); - assert.ok(!deepEqual(undefined, { a : 1, b : 2 })); - assert.ok(!deepEqual({}, { a : 1, b : 2 })); - assert.ok(deepEqual(undefined, undefined)); - assert.ok(deepEqual(null, null)); - assert.ok(!deepEqual(undefined, null)); -}; - -exports.deepLevels = function () { - var xs = [ 1, 2, [ 3, 4, [ 5, 6 ] ] ]; - assert.ok(!deepEqual(xs, [])); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/instance.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/instance.js deleted file mode 100644 index 8d73525..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/instance.js +++ /dev/null @@ -1,17 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); -var EventEmitter = require('events').EventEmitter; - -exports['check instanceof on node elems'] = function () { - - var counts = { emitter : 0 }; - - Traverse([ new EventEmitter, 3, 4, { ev : new EventEmitter }]) - .forEach(function (node) { - if (node instanceof EventEmitter) counts.emitter ++; - }) - ; - - assert.equal(counts.emitter, 2); -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/interface.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/interface.js deleted file mode 100644 index fce5bf9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/interface.js +++ /dev/null @@ -1,42 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports['interface map'] = function () { - var obj = { a : [ 5,6,7 ], b : { c : [8] } }; - - assert.deepEqual( - Traverse.paths(obj) - .sort() - .map(function (path) { return path.join('/') }) - .slice(1) - .join(' ') - , - 'a a/0 a/1 a/2 b b/c b/c/0' - ); - - assert.deepEqual( - Traverse.nodes(obj), - [ - { a: [ 5, 6, 7 ], b: { c: [ 8 ] } }, - [ 5, 6, 7 ], 5, 6, 7, - { c: [ 8 ] }, [ 8 ], 8 - ] - ); - - assert.deepEqual( - Traverse.map(obj, function (node) { - if (typeof node == 'number') { - return node + 1000; - } - else if (Array.isArray(node)) { - return node.join(' '); - } - }), - { a: '5 6 7', b: { c: '8' } } - ); - - var nodes = 0; - Traverse.forEach(obj, function (node) { nodes ++ }); - assert.deepEqual(nodes, 8); -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/json.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/json.js deleted file mode 100644 index 0a04529..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/json.js +++ /dev/null @@ -1,47 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports['json test'] = function () { - var id = 54; - var callbacks = {}; - var obj = { moo : function () {}, foo : [2,3,4, function () {}] }; - - var scrubbed = Traverse(obj).map(function (x) { - if (typeof x === 'function') { - callbacks[id] = { id : id, f : x, path : this.path }; - this.update('[Function]'); - id++; - } - }); - - assert.equal( - scrubbed.moo, '[Function]', - 'obj.moo replaced with "[Function]"' - ); - - assert.equal( - scrubbed.foo[3], '[Function]', - 'obj.foo[3] replaced with "[Function]"' - ); - - assert.deepEqual(scrubbed, { - moo : '[Function]', - foo : [ 2, 3, 4, "[Function]" ] - }, 'Full JSON string matches'); - - assert.deepEqual( - typeof obj.moo, 'function', - 'Original obj.moo still a function' - ); - - assert.deepEqual( - typeof obj.foo[3], 'function', - 'Original obj.foo[3] still a function' - ); - - assert.deepEqual(callbacks, { - 54: { id: 54, f : obj.moo, path: [ 'moo' ] }, - 55: { id: 55, f : obj.foo[3], path: [ 'foo', '3' ] }, - }, 'Check the generated callbacks list'); -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/keys.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/keys.js deleted file mode 100644 index 7ecd545..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/keys.js +++ /dev/null @@ -1,29 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports['sort test'] = function () { - var acc = []; - Traverse({ - a: 30, - b: 22, - id: 9 - }).forEach(function (node) { - if ((! Array.isArray(node)) && typeof node === 'object') { - this.before(function(node) { - this.keys = Object.keys(node); - this.keys.sort(function(a, b) { - a = [a === "id" ? 0 : 1, a]; - b = [b === "id" ? 0 : 1, b]; - return a < b ? -1 : a > b ? 1 : 0; - }); - }); - } - if (this.isLeaf) acc.push(node); - }); - - assert.equal( - acc.join(' '), - '9 30 22', - 'Traversal in a custom order' - ); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/leaves.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/leaves.js deleted file mode 100644 index e520b72..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/leaves.js +++ /dev/null @@ -1,21 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports['leaves test'] = function () { - var acc = []; - Traverse({ - a : [1,2,3], - b : 4, - c : [5,6], - d : { e : [7,8], f : 9 } - }).forEach(function (x) { - if (this.isLeaf) acc.push(x); - }); - - assert.equal( - acc.join(' '), - '1 2 3 4 5 6 7 8 9', - 'Traversal in the right(?) order' - ); -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/lib/deep_equal.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/lib/deep_equal.js deleted file mode 100644 index 4fa07bb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/lib/deep_equal.js +++ /dev/null @@ -1,92 +0,0 @@ -var traverse = require('../../'); - -module.exports = function (a, b) { - if (arguments.length !== 2) { - throw new Error( - 'deepEqual requires exactly two objects to compare against' - ); - } - - var equal = true; - var node = b; - - traverse(a).forEach(function (y) { - var notEqual = (function () { - equal = false; - //this.stop(); - return undefined; - }).bind(this); - - //if (node === undefined || node === null) return notEqual(); - - if (!this.isRoot) { - /* - if (!Object.hasOwnProperty.call(node, this.key)) { - return notEqual(); - } - */ - if (typeof node !== 'object') return notEqual(); - node = node[this.key]; - } - - var x = node; - - this.post(function () { - node = x; - }); - - var toS = function (o) { - return Object.prototype.toString.call(o); - }; - - if (this.circular) { - if (traverse(b).get(this.circular.path) !== x) notEqual(); - } - else if (typeof x !== typeof y) { - notEqual(); - } - else if (x === null || y === null || x === undefined || y === undefined) { - if (x !== y) notEqual(); - } - else if (x.__proto__ !== y.__proto__) { - notEqual(); - } - else if (x === y) { - // nop - } - else if (typeof x === 'function') { - if (x instanceof RegExp) { - // both regexps on account of the __proto__ check - if (x.toString() != y.toString()) notEqual(); - } - else if (x !== y) notEqual(); - } - else if (typeof x === 'object') { - if (toS(y) === '[object Arguments]' - || toS(x) === '[object Arguments]') { - if (toS(x) !== toS(y)) { - notEqual(); - } - } - else if (x instanceof Date || y instanceof Date) { - if (!(x instanceof Date) || !(y instanceof Date) - || x.getTime() !== y.getTime()) { - notEqual(); - } - } - else { - var kx = Object.keys(x); - var ky = Object.keys(y); - if (kx.length !== ky.length) return notEqual(); - for (var i = 0; i < kx.length; i++) { - var k = kx[i]; - if (!Object.hasOwnProperty.call(y, k)) { - notEqual(); - } - } - } - } - }); - - return equal; -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/mutability.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/mutability.js deleted file mode 100644 index 2236f56..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/mutability.js +++ /dev/null @@ -1,252 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); - -exports.mutate = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).forEach(function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - assert.deepEqual(obj, res); - assert.deepEqual(obj, { a : 1, b : 20, c : [ 3, 40 ] }); -}; - -exports.mutateT = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse.forEach(obj, function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - assert.deepEqual(obj, res); - assert.deepEqual(obj, { a : 1, b : 20, c : [ 3, 40 ] }); -}; - -exports.map = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).map(function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - assert.deepEqual(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - assert.deepEqual(res, { a : 1, b : 20, c : [ 3, 40 ] }); -}; - -exports.mapT = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse.map(obj, function (x) { - if (typeof x === 'number' && x % 2 === 0) { - this.update(x * 10); - } - }); - assert.deepEqual(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - assert.deepEqual(res, { a : 1, b : 20, c : [ 3, 40 ] }); -}; - -exports.clone = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).clone(); - assert.deepEqual(obj, res); - assert.ok(obj !== res); - obj.a ++; - assert.deepEqual(res.a, 1); - obj.c.push(5); - assert.deepEqual(res.c, [ 3, 4 ]); -}; - -exports.cloneT = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse.clone(obj); - assert.deepEqual(obj, res); - assert.ok(obj !== res); - obj.a ++; - assert.deepEqual(res.a, 1); - obj.c.push(5); - assert.deepEqual(res.c, [ 3, 4 ]); -}; - -exports.reduce = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).reduce(function (acc, x) { - if (this.isLeaf) acc.push(x); - return acc; - }, []); - assert.deepEqual(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - assert.deepEqual(res, [ 1, 2, 3, 4 ]); -}; - -exports.reduceInit = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).reduce(function (acc, x) { - if (this.isRoot) assert.fail('got root'); - return acc; - }); - assert.deepEqual(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - assert.deepEqual(res, obj); -}; - -exports.remove = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - Traverse(obj).forEach(function (x) { - if (this.isLeaf && x % 2 == 0) this.remove(); - }); - - assert.deepEqual(obj, { a : 1, c : [ 3 ] }); -}; - -exports.removeNoStop = function() { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 }, f: 5 }; - - var keys = []; - Traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.remove(); - }); - - assert.deepEqual(keys, [undefined, 'a', 'b', 'c', 'd', 'e', 'f']) -} - -exports.removeStop = function() { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 }, f: 5 }; - - var keys = []; - Traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.remove(true); - }); - - assert.deepEqual(keys, [undefined, 'a', 'b', 'c', 'f']) -} - -exports.removeMap = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).map(function (x) { - if (this.isLeaf && x % 2 == 0) this.remove(); - }); - - assert.deepEqual(obj, { a : 1, b : 2, c : [ 3, 4 ] }); - assert.deepEqual(res, { a : 1, c : [ 3 ] }); -}; - -exports.delete = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - Traverse(obj).forEach(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - assert.ok(!deepEqual( - obj, { a : 1, c : [ 3, undefined ] } - )); - - assert.ok(deepEqual( - obj, { a : 1, c : [ 3 ] } - )); - - assert.ok(!deepEqual( - obj, { a : 1, c : [ 3, null ] } - )); -}; - -exports.deleteNoStop = function() { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 } }; - - var keys = []; - Traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.delete(); - }); - - assert.deepEqual(keys, [undefined, 'a', 'b', 'c', 'd', 'e']) -} - -exports.deleteStop = function() { - var obj = { a : 1, b : 2, c : { d: 3, e: 4 } }; - - var keys = []; - Traverse(obj).forEach(function (x) { - keys.push(this.key) - if (this.key == 'c') this.delete(true); - }); - - assert.deepEqual(keys, [undefined, 'a', 'b', 'c']) -} - -exports.deleteRedux = function () { - var obj = { a : 1, b : 2, c : [ 3, 4, 5 ] }; - Traverse(obj).forEach(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - assert.ok(!deepEqual( - obj, { a : 1, c : [ 3, undefined, 5 ] } - )); - - assert.ok(deepEqual( - obj, { a : 1, c : [ 3 ,, 5 ] } - )); - - assert.ok(!deepEqual( - obj, { a : 1, c : [ 3, null, 5 ] } - )); - - assert.ok(!deepEqual( - obj, { a : 1, c : [ 3, 5 ] } - )); -}; - -exports.deleteMap = function () { - var obj = { a : 1, b : 2, c : [ 3, 4 ] }; - var res = Traverse(obj).map(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - assert.ok(deepEqual( - obj, - { a : 1, b : 2, c : [ 3, 4 ] } - )); - - var xs = [ 3, 4 ]; - delete xs[1]; - - assert.ok(deepEqual( - res, { a : 1, c : xs } - )); - - assert.ok(deepEqual( - res, { a : 1, c : [ 3, ] } - )); - - assert.ok(deepEqual( - res, { a : 1, c : [ 3 ] } - )); -}; - -exports.deleteMapRedux = function () { - var obj = { a : 1, b : 2, c : [ 3, 4, 5 ] }; - var res = Traverse(obj).map(function (x) { - if (this.isLeaf && x % 2 == 0) this.delete(); - }); - - assert.ok(deepEqual( - obj, - { a : 1, b : 2, c : [ 3, 4, 5 ] } - )); - - var xs = [ 3, 4, 5 ]; - delete xs[1]; - - assert.ok(deepEqual( - res, { a : 1, c : xs } - )); - - assert.ok(!deepEqual( - res, { a : 1, c : [ 3, 5 ] } - )); - - assert.ok(deepEqual( - res, { a : 1, c : [ 3 ,, 5 ] } - )); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/negative.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/negative.js deleted file mode 100644 index f92dfb0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/negative.js +++ /dev/null @@ -1,20 +0,0 @@ -var Traverse = require('../'); -var assert = require('assert'); - -exports['negative update test'] = function () { - var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - var fixed = Traverse.map(obj, function (x) { - if (x < 0) this.update(x + 128); - }); - - assert.deepEqual(fixed, - [ 5, 6, 125, [ 7, 8, 126, 1 ], { f: 10, g: 115 } ], - 'Negative values += 128' - ); - - assert.deepEqual(obj, - [ 5, 6, -3, [ 7, 8, -2, 1 ], { f: 10, g: -13 } ], - 'Original references not modified' - ); -} - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/obj.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/obj.js deleted file mode 100644 index d46fd38..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/obj.js +++ /dev/null @@ -1,15 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports['traverse an object with nested functions'] = function () { - var to = setTimeout(function () { - assert.fail('never ran'); - }, 1000); - - function Cons (x) { - clearTimeout(to); - assert.equal(x, 10); - }; - Traverse(new Cons(10)); -}; - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/siblings.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/siblings.js deleted file mode 100644 index 99c0f1b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/siblings.js +++ /dev/null @@ -1,35 +0,0 @@ -var assert = require('assert'); -var traverse = require('../'); - -exports.siblings = function () { - var obj = { a : 1, b : 2, c : [ 4, 5, 6 ] }; - - var res = traverse(obj).reduce(function (acc, x) { - var p = '/' + this.path.join('/'); - if (this.parent) { - acc[p] = { - siblings : this.parent.keys, - key : this.key, - index : this.parent.keys.indexOf(this.key) - }; - } - else { - acc[p] = { - siblings : [], - key : this.key, - index : -1 - } - } - return acc; - }, {}); - - assert.deepEqual(res, { - '/' : { siblings : [], key : undefined, index : -1 }, - '/a' : { siblings : [ 'a', 'b', 'c' ], key : 'a', index : 0 }, - '/b' : { siblings : [ 'a', 'b', 'c' ], key : 'b', index : 1 }, - '/c' : { siblings : [ 'a', 'b', 'c' ], key : 'c', index : 2 }, - '/c/0' : { siblings : [ '0', '1', '2' ], key : '0', index : 0 }, - '/c/1' : { siblings : [ '0', '1', '2' ], key : '1', index : 1 }, - '/c/2' : { siblings : [ '0', '1', '2' ], key : '2', index : 2 } - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stop.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stop.js deleted file mode 100644 index 3529847..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stop.js +++ /dev/null @@ -1,41 +0,0 @@ -var assert = require('assert'); -var traverse = require('../'); - -exports.stop = function () { - var visits = 0; - traverse('abcdefghij'.split('')).forEach(function (node) { - if (typeof node === 'string') { - visits ++; - if (node === 'e') this.stop() - } - }); - - assert.equal(visits, 5); -}; - -exports.stopMap = function () { - var s = traverse('abcdefghij'.split('')).map(function (node) { - if (typeof node === 'string') { - if (node === 'e') this.stop() - return node.toUpperCase(); - } - }).join(''); - - assert.equal(s, 'ABCDEfghij'); -}; - -exports.stopReduce = function () { - var obj = { - a : [ 4, 5 ], - b : [ 6, [ 7, 8, 9 ] ] - }; - var xs = traverse(obj).reduce(function (acc, node) { - if (this.isLeaf) { - if (node === 7) this.stop(); - else acc.push(node) - } - return acc; - }, []); - - assert.deepEqual(xs, [ 4, 5, 6 ]); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stringify.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stringify.js deleted file mode 100644 index 932f5d3..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/stringify.js +++ /dev/null @@ -1,36 +0,0 @@ -var assert = require('assert'); -var Traverse = require('../'); - -exports.stringify = function () { - var obj = [ 5, 6, -3, [ 7, 8, -2, 1 ], { f : 10, g : -13 } ]; - - var s = ''; - Traverse(obj).forEach(function (node) { - if (Array.isArray(node)) { - this.before(function () { s += '[' }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += ']' }); - } - else if (typeof node == 'object') { - this.before(function () { s += '{' }); - this.pre(function (x, key) { - s += '"' + key + '"' + ':'; - }); - this.post(function (child) { - if (!child.isLast) s += ','; - }); - this.after(function () { s += '}' }); - } - else if (typeof node == 'function') { - s += 'null'; - } - else { - s += node.toString(); - } - }); - - assert.equal(s, JSON.stringify(obj)); -} - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/subexpr.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/subexpr.js deleted file mode 100644 index a217beb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/subexpr.js +++ /dev/null @@ -1,34 +0,0 @@ -var traverse = require('../'); -var assert = require('assert'); - -exports.subexpr = function () { - var obj = [ 'a', 4, 'b', 5, 'c', 6 ]; - var r = traverse(obj).map(function (x) { - if (typeof x === 'number') { - this.update([ x - 0.1, x, x + 0.1 ], true); - } - }); - - assert.deepEqual(obj, [ 'a', 4, 'b', 5, 'c', 6 ]); - assert.deepEqual(r, [ - 'a', [ 3.9, 4, 4.1 ], - 'b', [ 4.9, 5, 5.1 ], - 'c', [ 5.9, 6, 6.1 ], - ]); -}; - -exports.block = function () { - var obj = [ [ 1 ], [ 2 ], [ 3 ] ]; - var r = traverse(obj).map(function (x) { - if (Array.isArray(x) && !this.isRoot) { - if (x[0] === 5) this.block() - else this.update([ [ x[0] + 1 ] ]) - } - }); - - assert.deepEqual(r, [ - [ [ [ [ [ 5 ] ] ] ] ], - [ [ [ [ 5 ] ] ] ], - [ [ [ 5 ] ] ], - ]); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/super_deep.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/super_deep.js deleted file mode 100644 index acac2fd..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/traverse/test/super_deep.js +++ /dev/null @@ -1,55 +0,0 @@ -var assert = require('assert'); -var traverse = require('../'); -var deepEqual = require('./lib/deep_equal'); - -exports.super_deep = function () { - var util = require('util'); - var a0 = make(); - var a1 = make(); - assert.ok(deepEqual(a0, a1)); - - a0.c.d.moo = true; - assert.ok(!deepEqual(a0, a1)); - - a1.c.d.moo = true; - assert.ok(deepEqual(a0, a1)); - - // TODO: this one - //a0.c.a = a1; - //assert.ok(!deepEqual(a0, a1)); -}; - -function make () { - var a = { self : 'a' }; - var b = { self : 'b' }; - var c = { self : 'c' }; - var d = { self : 'd' }; - var e = { self : 'e' }; - - a.a = a; - a.b = b; - a.c = c; - - b.a = a; - b.b = b; - b.c = c; - - c.a = a; - c.b = b; - c.c = c; - c.d = d; - - d.a = a; - d.b = b; - d.c = c; - d.d = d; - d.e = e; - - e.a = a; - e.b = b; - e.c = c; - e.d = d; - e.e = e; - - return a; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/.npmignore b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/.npmignore deleted file mode 100644 index d97eaa0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -.tmp*~ -*.local.* -.pinf-* \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.html b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.html deleted file mode 100644 index 8f5223f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.html +++ /dev/null @@ -1,1026 +0,0 @@ - - - - -UglifyJS -- a JavaScript parser/compressor/beautifier - - - - - - - - - - - - -
- -

UglifyJS – a JavaScript parser/compressor/beautifier

- - - - -
-

1 UglifyJS — a JavaScript parser/compressor/beautifier

-
- - -

-This package implements a general-purpose JavaScript -parser/compressor/beautifier toolkit. It is developed on NodeJS, but it -should work on any JavaScript platform supporting the CommonJS module system -(and if your platform of choice doesn't support CommonJS, you can easily -implement it, or discard the exports.* lines from UglifyJS sources). -

-

-The tokenizer/parser generates an abstract syntax tree from JS code. You -can then traverse the AST to learn more about the code, or do various -manipulations on it. This part is implemented in parse-js.js and it's a -port to JavaScript of the excellent parse-js Common Lisp library from Marijn Haverbeke. -

-

-( See cl-uglify-js if you're looking for the Common Lisp version of -UglifyJS. ) -

-

-The second part of this package, implemented in process.js, inspects and -manipulates the AST generated by the parser to provide the following: -

-
    -
  • -ability to re-generate JavaScript code from the AST. Optionally -indented—you can use this if you want to “beautify” a program that has -been compressed, so that you can inspect the source. But you can also run -our code generator to print out an AST without any whitespace, so you -achieve compression as well. - -
  • -
  • -shorten variable names (usually to single characters). Our mangler will -analyze the code and generate proper variable names, depending on scope -and usage, and is smart enough to deal with globals defined elsewhere, or -with eval() calls or with{} statements. In short, if eval() or -with{} are used in some scope, then all variables in that scope and any -variables in the parent scopes will remain unmangled, and any references -to such variables remain unmangled as well. - -
  • -
  • -various small optimizations that may lead to faster code but certainly -lead to smaller code. Where possible, we do the following: - -
      -
    • -foo["bar"] ==> foo.bar - -
    • -
    • -remove block brackets {} - -
    • -
    • -join consecutive var declarations: -var a = 10; var b = 20; ==> var a=10,b=20; - -
    • -
    • -resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the -replacement if the result occupies less bytes; for example 1/3 would -translate to 0.333333333333, so in this case we don't replace it. - -
    • -
    • -consecutive statements in blocks are merged into a sequence; in many -cases, this leaves blocks with a single statement, so then we can remove -the block brackets. - -
    • -
    • -various optimizations for IF statements: - -
        -
      • -if (foo) bar(); else baz(); ==> foo?bar():baz(); -
      • -
      • -if (!foo) bar(); else baz(); ==> foo?baz():bar(); -
      • -
      • -if (foo) bar(); ==> foo&&bar(); -
      • -
      • -if (!foo) bar(); ==> foo||bar(); -
      • -
      • -if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); -
      • -
      • -if (foo) return bar(); else something(); ==> {if(foo)return bar();something()} - -
      • -
      -
    • -
    • -remove some unreachable code and warn about it (code that follows a -return, throw, break or continue statement, except -function/variable declarations). - -
    • -
    • -act a limited version of a pre-processor (c.f. the pre-processor of -C/C++) to allow you to safely replace selected global symbols with -specified values. When combined with the optimisations above this can -make UglifyJS operate slightly more like a compilation process, in -that when certain symbols are replaced by constant values, entire code -blocks may be optimised away as unreachable. -
    • -
    -
  • -
- - - -
- -
-

1.1 Unsafe transformations

-
- - -

-The following transformations can in theory break code, although they're -probably safe in most practical cases. To enable them you need to pass the ---unsafe flag. -

- -
- -
-

1.1.1 Calls involving the global Array constructor

-
- - -

-The following transformations occur: -

- - - -
new Array(1, 2, 3, 4)  => [1,2,3,4]
-Array(a, b, c)         => [a,b,c]
-new Array(5)           => Array(5)
-new Array(a)           => Array(a)
-
- - - -

-These are all safe if the Array name isn't redefined. JavaScript does allow -one to globally redefine Array (and pretty much everything, in fact) but I -personally don't see why would anyone do that. -

-

-UglifyJS does handle the case where Array is redefined locally, or even -globally but with a function or var declaration. Therefore, in the -following cases UglifyJS doesn't touch calls or instantiations of Array: -

- - - -
// case 1.  globally declared variable
-  var Array;
-  new Array(1, 2, 3);
-  Array(a, b);
-
-  // or (can be declared later)
-  new Array(1, 2, 3);
-  var Array;
-
-  // or (can be a function)
-  new Array(1, 2, 3);
-  function Array() { ... }
-
-// case 2.  declared in a function
-  (function(){
-    a = new Array(1, 2, 3);
-    b = Array(5, 6);
-    var Array;
-  })();
-
-  // or
-  (function(Array){
-    return Array(5, 6, 7);
-  })();
-
-  // or
-  (function(){
-    return new Array(1, 2, 3, 4);
-    function Array() { ... }
-  })();
-
-  // etc.
-
- - - -
- -
- -
-

1.1.2 obj.toString() ==> obj+“”

-
- - -
-
- -
- -
-

1.2 Install (NPM)

-
- - -

-UglifyJS is now available through NPM — npm install uglify-js should do -the job. -

-
- -
- -
-

1.3 Install latest code from GitHub

-
- - - - - -
## clone the repository
-mkdir -p /where/you/wanna/put/it
-cd /where/you/wanna/put/it
-git clone git://github.com/mishoo/UglifyJS.git
-
-## make the module available to Node
-mkdir -p ~/.node_libraries/
-cd ~/.node_libraries/
-ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
-
-## and if you want the CLI script too:
-mkdir -p ~/bin
-cd ~/bin
-ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
-  # (then add ~/bin to your $PATH if it's not there already)
-
- - - -
- -
- -
-

1.4 Usage

-
- - -

-There is a command-line tool that exposes the functionality of this library -for your shell-scripting needs: -

- - - -
uglifyjs [ options... ] [ filename ]
-
- - - -

-filename should be the last argument and should name the file from which -to read the JavaScript code. If you don't specify it, it will read code -from STDIN. -

-

-Supported options: -

-
    -
  • --b or --beautify — output indented code; when passed, additional -options control the beautifier: - -
      -
    • --i N or --indent N — indentation level (number of spaces) - -
    • -
    • --q or --quote-keys — quote keys in literal objects (by default, -only keys that cannot be identifier names will be quotes). - -
    • -
    -
  • -
  • ---ascii — pass this argument to encode non-ASCII characters as -\uXXXX sequences. By default UglifyJS won't bother to do it and will -output Unicode characters instead. (the output is always encoded in UTF8, -but if you pass this option you'll only get ASCII). - -
  • -
  • --nm or --no-mangle — don't mangle variable names - -
  • -
  • --ns or --no-squeeze — don't call ast_squeeze() (which does various -optimizations that result in smaller, less readable code). - -
  • -
  • --mt or --mangle-toplevel — mangle names in the toplevel scope too -(by default we don't do this). - -
  • -
  • ---no-seqs — when ast_squeeze() is called (thus, unless you pass ---no-squeeze) it will reduce consecutive statements in blocks into a -sequence. For example, "a = 10; b = 20; foo();" will be written as -"a=10,b=20,foo();". In various occasions, this allows us to discard the -block brackets (since the block becomes a single statement). This is ON -by default because it seems safe and saves a few hundred bytes on some -libs that I tested it on, but pass --no-seqs to disable it. - -
  • -
  • ---no-dead-code — by default, UglifyJS will remove code that is -obviously unreachable (code that follows a return, throw, break or -continue statement and is not a function/variable declaration). Pass -this option to disable this optimization. - -
  • -
  • --nc or --no-copyright — by default, uglifyjs will keep the initial -comment tokens in the generated code (assumed to be copyright information -etc.). If you pass this it will discard it. - -
  • -
  • --o filename or --output filename — put the result in filename. If -this isn't given, the result goes to standard output (or see next one). - -
  • -
  • ---overwrite — if the code is read from a file (not from STDIN) and you -pass --overwrite then the output will be written in the same file. - -
  • -
  • ---ast — pass this if you want to get the Abstract Syntax Tree instead -of JavaScript as output. Useful for debugging or learning more about the -internals. - -
  • -
  • --v or --verbose — output some notes on STDERR (for now just how long -each operation takes). - -
  • -
  • --d SYMBOL[=VALUE] or --define SYMBOL[=VALUE] — will replace -all instances of the specified symbol where used as an identifier -(except where symbol has properly declared by a var declaration or -use as function parameter or similar) with the specified value. This -argument may be specified multiple times to define multiple -symbols - if no value is specified the symbol will be replaced with -the value true, or you can specify a numeric value (such as -1024), a quoted string value (such as ="object"= or -='https://github.com'), or the name of another symbol or keyword (such as =null or document). -This allows you, for example, to assign meaningful names to key -constant values but discard the symbolic names in the uglified -version for brevity/efficiency, or when used wth care, allows -UglifyJS to operate as a form of conditional compilation -whereby defining appropriate values may, by dint of the constant -folding and dead code removal features above, remove entire -superfluous code blocks (e.g. completely remove instrumentation or -trace code for production use). -Where string values are being defined, the handling of quotes are -likely to be subject to the specifics of your command shell -environment, so you may need to experiment with quoting styles -depending on your platform, or you may find the option ---define-from-module more suitable for use. - -
  • -
  • --define-from-module SOMEMODULE — will load the named module (as -per the NodeJS require() function) and iterate all the exported -properties of the module defining them as symbol names to be defined -(as if by the --define option) per the name of each property -(i.e. without the module name prefix) and given the value of the -property. This is a much easier way to handle and document groups of -symbols to be defined rather than a large number of --define -options. - -
  • -
  • ---unsafe — enable other additional optimizations that are known to be -unsafe in some contrived situations, but could still be generally useful. -For now only these: - -
      -
    • -foo.toString() ==> foo+"" -
    • -
    • -new Array(x,…) ==> [x,…] -
    • -
    • -new Array(x) ==> Array(x) - -
    • -
    -
  • -
  • ---max-line-len (default 32K characters) — add a newline after around -32K characters. I've seen both FF and Chrome croak when all the code was -on a single line of around 670K. Pass –max-line-len 0 to disable this -safety feature. - -
  • -
  • ---reserved-names — some libraries rely on certain names to be used, as -pointed out in issue #92 and #81, so this option allow you to exclude such -names from the mangler. For example, to keep names require and $super -intact you'd specify –reserved-names "require,$super". - -
  • -
  • ---inline-script – when you want to include the output literally in an -HTML <script> tag you can use this option to prevent </script from -showing up in the output. - -
  • -
  • ---lift-vars – when you pass this, UglifyJS will apply the following -transformations (see the notes in API, ast_lift_variables): - -
      -
    • -put all var declarations at the start of the scope -
    • -
    • -make sure a variable is declared only once -
    • -
    • -discard unused function arguments -
    • -
    • -discard unused inner (named) functions -
    • -
    • -finally, try to merge assignments into that one var declaration, if -possible. -
    • -
    -
  • -
- - - -
- -
-

1.4.1 API

-
- - -

-To use the library from JavaScript, you'd do the following (example for -NodeJS): -

- - - -
var jsp = require("uglify-js").parser;
-var pro = require("uglify-js").uglify;
-
-var orig_code = "... JS code here";
-var ast = jsp.parse(orig_code); // parse code and get the initial AST
-ast = pro.ast_mangle(ast); // get a new AST with mangled names
-ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
-var final_code = pro.gen_code(ast); // compressed code here
-
- - - -

-The above performs the full compression that is possible right now. As you -can see, there are a sequence of steps which you can apply. For example if -you want compressed output but for some reason you don't want to mangle -variable names, you would simply skip the line that calls -pro.ast_mangle(ast). -

-

-Some of these functions take optional arguments. Here's a description: -

-
    -
  • -jsp.parse(code, strict_semicolons) – parses JS code and returns an AST. -strict_semicolons is optional and defaults to false. If you pass -true then the parser will throw an error when it expects a semicolon and -it doesn't find it. For most JS code you don't want that, but it's useful -if you want to strictly sanitize your code. - -
  • -
  • -pro.ast_lift_variables(ast) – merge and move var declarations to the -scop of the scope; discard unused function arguments or variables; discard -unused (named) inner functions. It also tries to merge assignments -following the var declaration into it. - -

    -If your code is very hand-optimized concerning var declarations, this -lifting variable declarations might actually increase size. For me it -helps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also -note that (since it's not enabled by default) this operation isn't yet -heavily tested (please report if you find issues!). -

    -

    -Note that although it might increase the image size (on jQuery it gains -865 bytes, 243 after gzip) it's technically more correct: in certain -situations, dead code removal might drop variable declarations, which -would not happen if the variables are lifted in advance. -

    -

    -Here's an example of what it does: -

    -
  • -
- - - - -
function f(a, b, c, d, e) {
-    var q;
-    var w;
-    w = 10;
-    q = 20;
-    for (var i = 1; i < 10; ++i) {
-        var boo = foo(a);
-    }
-    for (var i = 0; i < 1; ++i) {
-        var boo = bar(c);
-    }
-    function foo(){ ... }
-    function bar(){ ... }
-    function baz(){ ... }
-}
-
-// transforms into ==>
-
-function f(a, b, c) {
-    var i, boo, w = 10, q = 20;
-    for (i = 1; i < 10; ++i) {
-        boo = foo(a);
-    }
-    for (i = 0; i < 1; ++i) {
-        boo = bar(c);
-    }
-    function foo() { ... }
-    function bar() { ... }
-}
-
- - - -
    -
  • -pro.ast_mangle(ast, options) – generates a new AST containing mangled -(compressed) variable and function names. It supports the following -options: - -
      -
    • -toplevel – mangle toplevel names (by default we don't touch them). -
    • -
    • -except – an array of names to exclude from compression. -
    • -
    • -defines – an object with properties named after symbols to -replace (see the --define option for the script) and the values -representing the AST replacement value. - -
    • -
    -
  • -
  • -pro.ast_squeeze(ast, options) – employs further optimizations designed -to reduce the size of the code that gen_code would generate from the -AST. Returns a new AST. options can be a hash; the supported options -are: - -
      -
    • -make_seqs (default true) which will cause consecutive statements in a -block to be merged using the "sequence" (comma) operator - -
    • -
    • -dead_code (default true) which will remove unreachable code. - -
    • -
    -
  • -
  • -pro.gen_code(ast, options) – generates JS code from the AST. By -default it's minified, but using the options argument you can get nicely -formatted output. options is, well, optional :-) and if you pass it it -must be an object and supports the following properties (below you can see -the default values): - -
      -
    • -beautify: false – pass true if you want indented output -
    • -
    • -indent_start: 0 (only applies when beautify is true) – initial -indentation in spaces -
    • -
    • -indent_level: 4 (only applies when beautify is true) -- -indentation level, in spaces (pass an even number) -
    • -
    • -quote_keys: false – if you pass true it will quote all keys in -literal objects -
    • -
    • -space_colon: false (only applies when beautify is true) – wether -to put a space before the colon in object literals -
    • -
    • -ascii_only: false – pass true if you want to encode non-ASCII -characters as \uXXXX. -
    • -
    • -inline_script: false – pass true to escape occurrences of -</script in strings -
    • -
    -
  • -
- - -
- -
- -
-

1.4.2 Beautifier shortcoming – no more comments

-
- - -

-The beautifier can be used as a general purpose indentation tool. It's -useful when you want to make a minified file readable. One limitation, -though, is that it discards all comments, so you don't really want to use it -to reformat your code, unless you don't have, or don't care about, comments. -

-

-In fact it's not the beautifier who discards comments — they are dumped at -the parsing stage, when we build the initial AST. Comments don't really -make sense in the AST, and while we could add nodes for them, it would be -inconvenient because we'd have to add special rules to ignore them at all -the processing stages. -

-
- -
- -
-

1.4.3 Use as a code pre-processor

-
- - -

-The --define option can be used, particularly when combined with the -constant folding logic, as a form of pre-processor to enable or remove -particular constructions, such as might be used for instrumenting -development code, or to produce variations aimed at a specific -platform. -

-

-The code below illustrates the way this can be done, and how the -symbol replacement is performed. -

- - - -
CLAUSE1: if (typeof DEVMODE === 'undefined') {
-    DEVMODE = true;
-}
-
-CLAUSE2: function init() {
-    if (DEVMODE) {
-        console.log("init() called");
-    }
-    ....
-    DEVMODE &amp;&amp; console.log("init() complete");
-}
-
-CLAUSE3: function reportDeviceStatus(device) {
-    var DEVMODE = device.mode, DEVNAME = device.name;
-    if (DEVMODE === 'open') {
-        ....
-    }
-}
-
- - - -

-When the above code is normally executed, the undeclared global -variable DEVMODE will be assigned the value true (see CLAUSE1) -and so the init() function (CLAUSE2) will write messages to the -console log when executed, but in CLAUSE3 a locally declared -variable will mask access to the DEVMODE global symbol. -

-

-If the above code is processed by UglifyJS with an argument of ---define DEVMODE=false then UglifyJS will replace DEVMODE with the -boolean constant value false within CLAUSE1 and CLAUSE2, but it -will leave CLAUSE3 as it stands because there DEVMODE resolves to -a validly declared variable. -

-

-And more so, the constant-folding features of UglifyJS will recognise -that the if condition of CLAUSE1 is thus always false, and so will -remove the test and body of CLAUSE1 altogether (including the -otherwise slightly problematical statement false = true; which it -will have formed by replacing DEVMODE in the body). Similarly, -within CLAUSE2 both calls to console.log() will be removed -altogether. -

-

-In this way you can mimic, to a limited degree, the functionality of -the C/C++ pre-processor to enable or completely remove blocks -depending on how certain symbols are defined - perhaps using UglifyJS -to generate different versions of source aimed at different -environments -

-

-It is recommmended (but not made mandatory) that symbols designed for -this purpose are given names consisting of UPPER_CASE_LETTERS to -distinguish them from other (normal) symbols and avoid the sort of -clash that CLAUSE3 above illustrates. -

-
-
- -
- -
-

1.5 Compression – how good is it?

-
- - -

-Here are updated statistics. (I also updated my Google Closure and YUI -installations). -

-

-We're still a lot better than YUI in terms of compression, though slightly -slower. We're still a lot faster than Closure, and compression after gzip -is comparable. -

- - -- - - - - - - - - - -
FileUglifyJSUglifyJS+gzipClosureClosure+gzipYUIYUI+gzip
jquery-1.6.2.js91001 (0:01.59)3189690678 (0:07.40)31979101527 (0:01.82)34646
paper.js142023 (0:01.65)43334134301 (0:07.42)42495173383 (0:01.58)48785
prototype.js88544 (0:01.09)2668086955 (0:06.97)2632692130 (0:00.79)28624
thelib-full.js (DynarchLIB)251939 (0:02.55)72535249911 (0:09.05)72696258869 (0:01.94)76584
- - -
- -
- -
-

1.6 Bugs?

-
- - -

-Unfortunately, for the time being there is no automated test suite. But I -ran the compressor manually on non-trivial code, and then I tested that the -generated code works as expected. A few hundred times. -

-

-DynarchLIB was started in times when there was no good JS minifier. -Therefore I was quite religious about trying to write short code manually, -and as such DL contains a lot of syntactic hacks1 such as “foo == bar ? a -= 10 : b = 20”, though the more readable version would clearly be to use -“if/else”. -

-

-Since the parser/compressor runs fine on DL and jQuery, I'm quite confident -that it's solid enough for production use. If you can identify any bugs, -I'd love to hear about them (use the Google Group or email me directly). -

-
- -
- -
-

1.7 Links

-
- - - - - -
- -
- -
-

1.8 License

-
- - -

-UglifyJS is released under the BSD license: -

- - - -
Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>
-Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-    * Redistributions of source code must retain the above
-      copyright notice, this list of conditions and the following
-      disclaimer.
-
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials
-      provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
- - - - -
-
-
-
-

Footnotes:

-
-

1 I even reported a few bugs and suggested some fixes in the original -parse-js library, and Marijn pushed fixes literally in minutes. -

-
-
-
-

Author: Mihai Bazon -

-

Date: 2011-08-29 19:17:55 EEST

-

HTML generated by org-mode 7.01trans in emacs 23

-
-
- - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.org b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.org deleted file mode 100644 index 50c9c27..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/README.org +++ /dev/null @@ -1,571 +0,0 @@ -#+TITLE: UglifyJS -- a JavaScript parser/compressor/beautifier -#+KEYWORDS: javascript, js, parser, compiler, compressor, mangle, minify, minifier -#+DESCRIPTION: a JavaScript parser/compressor/beautifier in JavaScript -#+STYLE: -#+AUTHOR: Mihai Bazon -#+EMAIL: mihai.bazon@gmail.com - -* UglifyJS --- a JavaScript parser/compressor/beautifier - -This package implements a general-purpose JavaScript -parser/compressor/beautifier toolkit. It is developed on [[http://nodejs.org/][NodeJS]], but it -should work on any JavaScript platform supporting the CommonJS module system -(and if your platform of choice doesn't support CommonJS, you can easily -implement it, or discard the =exports.*= lines from UglifyJS sources). - -The tokenizer/parser generates an abstract syntax tree from JS code. You -can then traverse the AST to learn more about the code, or do various -manipulations on it. This part is implemented in [[../lib/parse-js.js][parse-js.js]] and it's a -port to JavaScript of the excellent [[http://marijn.haverbeke.nl/parse-js/][parse-js]] Common Lisp library from [[http://marijn.haverbeke.nl/][Marijn -Haverbeke]]. - -( See [[http://github.com/mishoo/cl-uglify-js][cl-uglify-js]] if you're looking for the Common Lisp version of -UglifyJS. ) - -The second part of this package, implemented in [[../lib/process.js][process.js]], inspects and -manipulates the AST generated by the parser to provide the following: - -- ability to re-generate JavaScript code from the AST. Optionally - indented---you can use this if you want to “beautify” a program that has - been compressed, so that you can inspect the source. But you can also run - our code generator to print out an AST without any whitespace, so you - achieve compression as well. - -- shorten variable names (usually to single characters). Our mangler will - analyze the code and generate proper variable names, depending on scope - and usage, and is smart enough to deal with globals defined elsewhere, or - with =eval()= calls or =with{}= statements. In short, if =eval()= or - =with{}= are used in some scope, then all variables in that scope and any - variables in the parent scopes will remain unmangled, and any references - to such variables remain unmangled as well. - -- various small optimizations that may lead to faster code but certainly - lead to smaller code. Where possible, we do the following: - - - foo["bar"] ==> foo.bar - - - remove block brackets ={}= - - - join consecutive var declarations: - var a = 10; var b = 20; ==> var a=10,b=20; - - - resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the - replacement if the result occupies less bytes; for example 1/3 would - translate to 0.333333333333, so in this case we don't replace it. - - - consecutive statements in blocks are merged into a sequence; in many - cases, this leaves blocks with a single statement, so then we can remove - the block brackets. - - - various optimizations for IF statements: - - - if (foo) bar(); else baz(); ==> foo?bar():baz(); - - if (!foo) bar(); else baz(); ==> foo?baz():bar(); - - if (foo) bar(); ==> foo&&bar(); - - if (!foo) bar(); ==> foo||bar(); - - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); - - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()} - - - remove some unreachable code and warn about it (code that follows a - =return=, =throw=, =break= or =continue= statement, except - function/variable declarations). - - - act a limited version of a pre-processor (c.f. the pre-processor of - C/C++) to allow you to safely replace selected global symbols with - specified values. When combined with the optimisations above this can - make UglifyJS operate slightly more like a compilation process, in - that when certain symbols are replaced by constant values, entire code - blocks may be optimised away as unreachable. - -** <> - -The following transformations can in theory break code, although they're -probably safe in most practical cases. To enable them you need to pass the -=--unsafe= flag. - -*** Calls involving the global Array constructor - -The following transformations occur: - -#+BEGIN_SRC js -new Array(1, 2, 3, 4) => [1,2,3,4] -Array(a, b, c) => [a,b,c] -new Array(5) => Array(5) -new Array(a) => Array(a) -#+END_SRC - -These are all safe if the Array name isn't redefined. JavaScript does allow -one to globally redefine Array (and pretty much everything, in fact) but I -personally don't see why would anyone do that. - -UglifyJS does handle the case where Array is redefined locally, or even -globally but with a =function= or =var= declaration. Therefore, in the -following cases UglifyJS *doesn't touch* calls or instantiations of Array: - -#+BEGIN_SRC js -// case 1. globally declared variable - var Array; - new Array(1, 2, 3); - Array(a, b); - - // or (can be declared later) - new Array(1, 2, 3); - var Array; - - // or (can be a function) - new Array(1, 2, 3); - function Array() { ... } - -// case 2. declared in a function - (function(){ - a = new Array(1, 2, 3); - b = Array(5, 6); - var Array; - })(); - - // or - (function(Array){ - return Array(5, 6, 7); - })(); - - // or - (function(){ - return new Array(1, 2, 3, 4); - function Array() { ... } - })(); - - // etc. -#+END_SRC - -*** =obj.toString()= ==> =obj+“”= - -** Install (NPM) - -UglifyJS is now available through NPM --- =npm install uglify-js= should do -the job. - -** Install latest code from GitHub - -#+BEGIN_SRC sh -## clone the repository -mkdir -p /where/you/wanna/put/it -cd /where/you/wanna/put/it -git clone git://github.com/mishoo/UglifyJS.git - -## make the module available to Node -mkdir -p ~/.node_libraries/ -cd ~/.node_libraries/ -ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js - -## and if you want the CLI script too: -mkdir -p ~/bin -cd ~/bin -ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs - # (then add ~/bin to your $PATH if it's not there already) -#+END_SRC - -** Usage - -There is a command-line tool that exposes the functionality of this library -for your shell-scripting needs: - -#+BEGIN_SRC sh -uglifyjs [ options... ] [ filename ] -#+END_SRC - -=filename= should be the last argument and should name the file from which -to read the JavaScript code. If you don't specify it, it will read code -from STDIN. - -Supported options: - -- =-b= or =--beautify= --- output indented code; when passed, additional - options control the beautifier: - - - =-i N= or =--indent N= --- indentation level (number of spaces) - - - =-q= or =--quote-keys= --- quote keys in literal objects (by default, - only keys that cannot be identifier names will be quotes). - -- =--ascii= --- pass this argument to encode non-ASCII characters as - =\uXXXX= sequences. By default UglifyJS won't bother to do it and will - output Unicode characters instead. (the output is always encoded in UTF8, - but if you pass this option you'll only get ASCII). - -- =-nm= or =--no-mangle= --- don't mangle variable names - -- =-ns= or =--no-squeeze= --- don't call =ast_squeeze()= (which does various - optimizations that result in smaller, less readable code). - -- =-mt= or =--mangle-toplevel= --- mangle names in the toplevel scope too - (by default we don't do this). - -- =--no-seqs= --- when =ast_squeeze()= is called (thus, unless you pass - =--no-squeeze=) it will reduce consecutive statements in blocks into a - sequence. For example, "a = 10; b = 20; foo();" will be written as - "a=10,b=20,foo();". In various occasions, this allows us to discard the - block brackets (since the block becomes a single statement). This is ON - by default because it seems safe and saves a few hundred bytes on some - libs that I tested it on, but pass =--no-seqs= to disable it. - -- =--no-dead-code= --- by default, UglifyJS will remove code that is - obviously unreachable (code that follows a =return=, =throw=, =break= or - =continue= statement and is not a function/variable declaration). Pass - this option to disable this optimization. - -- =-nc= or =--no-copyright= --- by default, =uglifyjs= will keep the initial - comment tokens in the generated code (assumed to be copyright information - etc.). If you pass this it will discard it. - -- =-o filename= or =--output filename= --- put the result in =filename=. If - this isn't given, the result goes to standard output (or see next one). - -- =--overwrite= --- if the code is read from a file (not from STDIN) and you - pass =--overwrite= then the output will be written in the same file. - -- =--ast= --- pass this if you want to get the Abstract Syntax Tree instead - of JavaScript as output. Useful for debugging or learning more about the - internals. - -- =-v= or =--verbose= --- output some notes on STDERR (for now just how long - each operation takes). - -- =-d SYMBOL[=VALUE]= or =--define SYMBOL[=VALUE]= --- will replace - all instances of the specified symbol where used as an identifier - (except where symbol has properly declared by a var declaration or - use as function parameter or similar) with the specified value. This - argument may be specified multiple times to define multiple - symbols - if no value is specified the symbol will be replaced with - the value =true=, or you can specify a numeric value (such as - =1024=), a quoted string value (such as ="object"= or - ='https://github.com'=), or the name of another symbol or keyword - (such as =null= or =document=). - This allows you, for example, to assign meaningful names to key - constant values but discard the symbolic names in the uglified - version for brevity/efficiency, or when used wth care, allows - UglifyJS to operate as a form of *conditional compilation* - whereby defining appropriate values may, by dint of the constant - folding and dead code removal features above, remove entire - superfluous code blocks (e.g. completely remove instrumentation or - trace code for production use). - Where string values are being defined, the handling of quotes are - likely to be subject to the specifics of your command shell - environment, so you may need to experiment with quoting styles - depending on your platform, or you may find the option - =--define-from-module= more suitable for use. - -- =-define-from-module SOMEMODULE= --- will load the named module (as - per the NodeJS =require()= function) and iterate all the exported - properties of the module defining them as symbol names to be defined - (as if by the =--define= option) per the name of each property - (i.e. without the module name prefix) and given the value of the - property. This is a much easier way to handle and document groups of - symbols to be defined rather than a large number of =--define= - options. - -- =--unsafe= --- enable other additional optimizations that are known to be - unsafe in some contrived situations, but could still be generally useful. - For now only these: - - - foo.toString() ==> foo+"" - - new Array(x,...) ==> [x,...] - - new Array(x) ==> Array(x) - -- =--max-line-len= (default 32K characters) --- add a newline after around - 32K characters. I've seen both FF and Chrome croak when all the code was - on a single line of around 670K. Pass --max-line-len 0 to disable this - safety feature. - -- =--reserved-names= --- some libraries rely on certain names to be used, as - pointed out in issue #92 and #81, so this option allow you to exclude such - names from the mangler. For example, to keep names =require= and =$super= - intact you'd specify --reserved-names "require,$super". - -- =--inline-script= -- when you want to include the output literally in an - HTML =\n\n\n\n
\n\n

UglifyJS – a JavaScript parser/compressor/beautifier

\n\n\n\n\n
\n

1 UglifyJS — a JavaScript parser/compressor/beautifier

\n
\n\n\n

\nThis package implements a general-purpose JavaScript\nparser/compressor/beautifier toolkit. It is developed on NodeJS, but it\nshould work on any JavaScript platform supporting the CommonJS module system\n(and if your platform of choice doesn't support CommonJS, you can easily\nimplement it, or discard the exports.* lines from UglifyJS sources).\n

\n

\nThe tokenizer/parser generates an abstract syntax tree from JS code. You\ncan then traverse the AST to learn more about the code, or do various\nmanipulations on it. This part is implemented in parse-js.js and it's a\nport to JavaScript of the excellent parse-js Common Lisp library from Marijn Haverbeke.\n

\n

\n( See cl-uglify-js if you're looking for the Common Lisp version of\nUglifyJS. )\n

\n

\nThe second part of this package, implemented in process.js, inspects and\nmanipulates the AST generated by the parser to provide the following:\n

\n
    \n
  • \nability to re-generate JavaScript code from the AST. Optionally\nindented—you can use this if you want to “beautify” a program that has\nbeen compressed, so that you can inspect the source. But you can also run\nour code generator to print out an AST without any whitespace, so you\nachieve compression as well.\n\n
  • \n
  • \nshorten variable names (usually to single characters). Our mangler will\nanalyze the code and generate proper variable names, depending on scope\nand usage, and is smart enough to deal with globals defined elsewhere, or\nwith eval() calls or with{} statements. In short, if eval() or\nwith{} are used in some scope, then all variables in that scope and any\nvariables in the parent scopes will remain unmangled, and any references\nto such variables remain unmangled as well.\n\n
  • \n
  • \nvarious small optimizations that may lead to faster code but certainly\nlead to smaller code. Where possible, we do the following:\n\n
      \n
    • \nfoo[\"bar\"] ==> foo.bar\n\n
    • \n
    • \nremove block brackets {}\n\n
    • \n
    • \njoin consecutive var declarations:\nvar a = 10; var b = 20; ==> var a=10,b=20;\n\n
    • \n
    • \nresolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the\nreplacement if the result occupies less bytes; for example 1/3 would\ntranslate to 0.333333333333, so in this case we don't replace it.\n\n
    • \n
    • \nconsecutive statements in blocks are merged into a sequence; in many\ncases, this leaves blocks with a single statement, so then we can remove\nthe block brackets.\n\n
    • \n
    • \nvarious optimizations for IF statements:\n\n
        \n
      • \nif (foo) bar(); else baz(); ==> foo?bar():baz();\n
      • \n
      • \nif (!foo) bar(); else baz(); ==> foo?baz():bar();\n
      • \n
      • \nif (foo) bar(); ==> foo&&bar();\n
      • \n
      • \nif (!foo) bar(); ==> foo||bar();\n
      • \n
      • \nif (foo) return bar(); else return baz(); ==> return foo?bar():baz();\n
      • \n
      • \nif (foo) return bar(); else something(); ==> {if(foo)return bar();something()}\n\n
      • \n
      \n
    • \n
    • \nremove some unreachable code and warn about it (code that follows a\nreturn, throw, break or continue statement, except\nfunction/variable declarations).\n\n
    • \n
    • \nact a limited version of a pre-processor (c.f. the pre-processor of\nC/C++) to allow you to safely replace selected global symbols with\nspecified values. When combined with the optimisations above this can\nmake UglifyJS operate slightly more like a compilation process, in\nthat when certain symbols are replaced by constant values, entire code\nblocks may be optimised away as unreachable.\n
    • \n
    \n
  • \n
\n\n\n\n
\n\n
\n

1.1 Unsafe transformations

\n
\n\n\n

\nThe following transformations can in theory break code, although they're\nprobably safe in most practical cases. To enable them you need to pass the\n--unsafe flag.\n

\n\n
\n\n
\n

1.1.1 Calls involving the global Array constructor

\n
\n\n\n

\nThe following transformations occur:\n

\n\n\n\n
new Array(1, 2, 3, 4)  => [1,2,3,4]\nArray(a, b, c)         => [a,b,c]\nnew Array(5)           => Array(5)\nnew Array(a)           => Array(a)\n
\n\n\n\n

\nThese are all safe if the Array name isn't redefined. JavaScript does allow\none to globally redefine Array (and pretty much everything, in fact) but I\npersonally don't see why would anyone do that.\n

\n

\nUglifyJS does handle the case where Array is redefined locally, or even\nglobally but with a function or var declaration. Therefore, in the\nfollowing cases UglifyJS doesn't touch calls or instantiations of Array:\n

\n\n\n\n
// case 1.  globally declared variable\n  var Array;\n  new Array(1, 2, 3);\n  Array(a, b);\n\n  // or (can be declared later)\n  new Array(1, 2, 3);\n  var Array;\n\n  // or (can be a function)\n  new Array(1, 2, 3);\n  function Array() { ... }\n\n// case 2.  declared in a function\n  (function(){\n    a = new Array(1, 2, 3);\n    b = Array(5, 6);\n    var Array;\n  })();\n\n  // or\n  (function(Array){\n    return Array(5, 6, 7);\n  })();\n\n  // or\n  (function(){\n    return new Array(1, 2, 3, 4);\n    function Array() { ... }\n  })();\n\n  // etc.\n
\n\n\n\n
\n\n
\n\n
\n

1.1.2 obj.toString() ==> obj+“”

\n
\n\n\n
\n
\n\n
\n\n
\n

1.2 Install (NPM)

\n
\n\n\n

\nUglifyJS is now available through NPM — npm install uglify-js should do\nthe job.\n

\n
\n\n
\n\n
\n

1.3 Install latest code from GitHub

\n
\n\n\n\n\n\n
## clone the repository\nmkdir -p /where/you/wanna/put/it\ncd /where/you/wanna/put/it\ngit clone git://github.com/mishoo/UglifyJS.git\n\n## make the module available to Node\nmkdir -p ~/.node_libraries/\ncd ~/.node_libraries/\nln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js\n\n## and if you want the CLI script too:\nmkdir -p ~/bin\ncd ~/bin\nln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs\n  # (then add ~/bin to your $PATH if it's not there already)\n
\n\n\n\n
\n\n
\n\n
\n

1.4 Usage

\n
\n\n\n

\nThere is a command-line tool that exposes the functionality of this library\nfor your shell-scripting needs:\n

\n\n\n\n
uglifyjs [ options... ] [ filename ]\n
\n\n\n\n

\nfilename should be the last argument and should name the file from which\nto read the JavaScript code. If you don't specify it, it will read code\nfrom STDIN.\n

\n

\nSupported options:\n

\n
    \n
  • \n-b or --beautify — output indented code; when passed, additional\noptions control the beautifier:\n\n
      \n
    • \n-i N or --indent N — indentation level (number of spaces)\n\n
    • \n
    • \n-q or --quote-keys — quote keys in literal objects (by default,\nonly keys that cannot be identifier names will be quotes).\n\n
    • \n
    \n
  • \n
  • \n--ascii — pass this argument to encode non-ASCII characters as\n\\uXXXX sequences. By default UglifyJS won't bother to do it and will\noutput Unicode characters instead. (the output is always encoded in UTF8,\nbut if you pass this option you'll only get ASCII).\n\n
  • \n
  • \n-nm or --no-mangle — don't mangle variable names\n\n
  • \n
  • \n-ns or --no-squeeze — don't call ast_squeeze() (which does various\noptimizations that result in smaller, less readable code).\n\n
  • \n
  • \n-mt or --mangle-toplevel — mangle names in the toplevel scope too\n(by default we don't do this).\n\n
  • \n
  • \n--no-seqs — when ast_squeeze() is called (thus, unless you pass\n--no-squeeze) it will reduce consecutive statements in blocks into a\nsequence. For example, \"a = 10; b = 20; foo();\" will be written as\n\"a=10,b=20,foo();\". In various occasions, this allows us to discard the\nblock brackets (since the block becomes a single statement). This is ON\nby default because it seems safe and saves a few hundred bytes on some\nlibs that I tested it on, but pass --no-seqs to disable it.\n\n
  • \n
  • \n--no-dead-code — by default, UglifyJS will remove code that is\nobviously unreachable (code that follows a return, throw, break or\ncontinue statement and is not a function/variable declaration). Pass\nthis option to disable this optimization.\n\n
  • \n
  • \n-nc or --no-copyright — by default, uglifyjs will keep the initial\ncomment tokens in the generated code (assumed to be copyright information\netc.). If you pass this it will discard it.\n\n
  • \n
  • \n-o filename or --output filename — put the result in filename. If\nthis isn't given, the result goes to standard output (or see next one).\n\n
  • \n
  • \n--overwrite — if the code is read from a file (not from STDIN) and you\npass --overwrite then the output will be written in the same file.\n\n
  • \n
  • \n--ast — pass this if you want to get the Abstract Syntax Tree instead\nof JavaScript as output. Useful for debugging or learning more about the\ninternals.\n\n
  • \n
  • \n-v or --verbose — output some notes on STDERR (for now just how long\neach operation takes).\n\n
  • \n
  • \n-d SYMBOL[=VALUE] or --define SYMBOL[=VALUE] — will replace\nall instances of the specified symbol where used as an identifier\n(except where symbol has properly declared by a var declaration or\nuse as function parameter or similar) with the specified value. This\nargument may be specified multiple times to define multiple\nsymbols - if no value is specified the symbol will be replaced with\nthe value true, or you can specify a numeric value (such as\n1024), a quoted string value (such as =\"object\"= or\n='https://github.com'), or the name of another symbol or keyword (such as =null or document). \nThis allows you, for example, to assign meaningful names to key\nconstant values but discard the symbolic names in the uglified\nversion for brevity/efficiency, or when used wth care, allows\nUglifyJS to operate as a form of conditional compilation\nwhereby defining appropriate values may, by dint of the constant\nfolding and dead code removal features above, remove entire\nsuperfluous code blocks (e.g. completely remove instrumentation or\ntrace code for production use).\nWhere string values are being defined, the handling of quotes are\nlikely to be subject to the specifics of your command shell\nenvironment, so you may need to experiment with quoting styles\ndepending on your platform, or you may find the option\n--define-from-module more suitable for use.\n\n
  • \n
  • \n-define-from-module SOMEMODULE — will load the named module (as\nper the NodeJS require() function) and iterate all the exported\nproperties of the module defining them as symbol names to be defined\n(as if by the --define option) per the name of each property\n(i.e. without the module name prefix) and given the value of the\nproperty. This is a much easier way to handle and document groups of\nsymbols to be defined rather than a large number of --define\noptions.\n\n
  • \n
  • \n--unsafe — enable other additional optimizations that are known to be\nunsafe in some contrived situations, but could still be generally useful.\nFor now only these:\n\n
      \n
    • \nfoo.toString() ==> foo+\"\"\n
    • \n
    • \nnew Array(x,…) ==> [x,…]\n
    • \n
    • \nnew Array(x) ==> Array(x)\n\n
    • \n
    \n
  • \n
  • \n--max-line-len (default 32K characters) — add a newline after around\n32K characters. I've seen both FF and Chrome croak when all the code was\non a single line of around 670K. Pass –max-line-len 0 to disable this\nsafety feature.\n\n
  • \n
  • \n--reserved-names — some libraries rely on certain names to be used, as\npointed out in issue #92 and #81, so this option allow you to exclude such\nnames from the mangler. For example, to keep names require and $super\nintact you'd specify –reserved-names \"require,$super\".\n\n
  • \n
  • \n--inline-script – when you want to include the output literally in an\nHTML <script> tag you can use this option to prevent </script from\nshowing up in the output.\n\n
  • \n
  • \n--lift-vars – when you pass this, UglifyJS will apply the following\ntransformations (see the notes in API, ast_lift_variables):\n\n
      \n
    • \nput all var declarations at the start of the scope\n
    • \n
    • \nmake sure a variable is declared only once\n
    • \n
    • \ndiscard unused function arguments\n
    • \n
    • \ndiscard unused inner (named) functions\n
    • \n
    • \nfinally, try to merge assignments into that one var declaration, if\npossible.\n
    • \n
    \n
  • \n
\n\n\n\n
\n\n
\n

1.4.1 API

\n
\n\n\n

\nTo use the library from JavaScript, you'd do the following (example for\nNodeJS):\n

\n\n\n\n
var jsp = require(\"uglify-js\").parser;\nvar pro = require(\"uglify-js\").uglify;\n\nvar orig_code = \"... JS code here\";\nvar ast = jsp.parse(orig_code); // parse code and get the initial AST\nast = pro.ast_mangle(ast); // get a new AST with mangled names\nast = pro.ast_squeeze(ast); // get an AST with compression optimizations\nvar final_code = pro.gen_code(ast); // compressed code here\n
\n\n\n\n

\nThe above performs the full compression that is possible right now. As you\ncan see, there are a sequence of steps which you can apply. For example if\nyou want compressed output but for some reason you don't want to mangle\nvariable names, you would simply skip the line that calls\npro.ast_mangle(ast).\n

\n

\nSome of these functions take optional arguments. Here's a description:\n

\n
    \n
  • \njsp.parse(code, strict_semicolons) – parses JS code and returns an AST.\nstrict_semicolons is optional and defaults to false. If you pass\ntrue then the parser will throw an error when it expects a semicolon and\nit doesn't find it. For most JS code you don't want that, but it's useful\nif you want to strictly sanitize your code.\n\n
  • \n
  • \npro.ast_lift_variables(ast) – merge and move var declarations to the\nscop of the scope; discard unused function arguments or variables; discard\nunused (named) inner functions. It also tries to merge assignments\nfollowing the var declaration into it.\n\n

    \nIf your code is very hand-optimized concerning var declarations, this\nlifting variable declarations might actually increase size. For me it\nhelps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also\nnote that (since it's not enabled by default) this operation isn't yet\nheavily tested (please report if you find issues!).\n

    \n

    \nNote that although it might increase the image size (on jQuery it gains\n865 bytes, 243 after gzip) it's technically more correct: in certain\nsituations, dead code removal might drop variable declarations, which\nwould not happen if the variables are lifted in advance.\n

    \n

    \nHere's an example of what it does:\n

    \n
  • \n
\n\n\n\n\n
function f(a, b, c, d, e) {\n    var q;\n    var w;\n    w = 10;\n    q = 20;\n    for (var i = 1; i < 10; ++i) {\n        var boo = foo(a);\n    }\n    for (var i = 0; i < 1; ++i) {\n        var boo = bar(c);\n    }\n    function foo(){ ... }\n    function bar(){ ... }\n    function baz(){ ... }\n}\n\n// transforms into ==>\n\nfunction f(a, b, c) {\n    var i, boo, w = 10, q = 20;\n    for (i = 1; i < 10; ++i) {\n        boo = foo(a);\n    }\n    for (i = 0; i < 1; ++i) {\n        boo = bar(c);\n    }\n    function foo() { ... }\n    function bar() { ... }\n}\n
\n\n\n\n
    \n
  • \npro.ast_mangle(ast, options) – generates a new AST containing mangled\n(compressed) variable and function names. It supports the following\noptions:\n\n
      \n
    • \ntoplevel – mangle toplevel names (by default we don't touch them).\n
    • \n
    • \nexcept – an array of names to exclude from compression.\n
    • \n
    • \ndefines – an object with properties named after symbols to\nreplace (see the --define option for the script) and the values\nrepresenting the AST replacement value.\n\n
    • \n
    \n
  • \n
  • \npro.ast_squeeze(ast, options) – employs further optimizations designed\nto reduce the size of the code that gen_code would generate from the\nAST. Returns a new AST. options can be a hash; the supported options\nare:\n\n
      \n
    • \nmake_seqs (default true) which will cause consecutive statements in a\nblock to be merged using the \"sequence\" (comma) operator\n\n
    • \n
    • \ndead_code (default true) which will remove unreachable code.\n\n
    • \n
    \n
  • \n
  • \npro.gen_code(ast, options) – generates JS code from the AST. By\ndefault it's minified, but using the options argument you can get nicely\nformatted output. options is, well, optional :-) and if you pass it it\nmust be an object and supports the following properties (below you can see\nthe default values):\n\n
      \n
    • \nbeautify: false – pass true if you want indented output\n
    • \n
    • \nindent_start: 0 (only applies when beautify is true) – initial\nindentation in spaces\n
    • \n
    • \nindent_level: 4 (only applies when beautify is true) --\nindentation level, in spaces (pass an even number)\n
    • \n
    • \nquote_keys: false – if you pass true it will quote all keys in\nliteral objects\n
    • \n
    • \nspace_colon: false (only applies when beautify is true) – wether\nto put a space before the colon in object literals\n
    • \n
    • \nascii_only: false – pass true if you want to encode non-ASCII\ncharacters as \\uXXXX.\n
    • \n
    • \ninline_script: false – pass true to escape occurrences of\n</script in strings\n
    • \n
    \n
  • \n
\n\n\n
\n\n
\n\n
\n

1.4.2 Beautifier shortcoming – no more comments

\n
\n\n\n

\nThe beautifier can be used as a general purpose indentation tool. It's\nuseful when you want to make a minified file readable. One limitation,\nthough, is that it discards all comments, so you don't really want to use it\nto reformat your code, unless you don't have, or don't care about, comments.\n

\n

\nIn fact it's not the beautifier who discards comments — they are dumped at\nthe parsing stage, when we build the initial AST. Comments don't really\nmake sense in the AST, and while we could add nodes for them, it would be\ninconvenient because we'd have to add special rules to ignore them at all\nthe processing stages.\n

\n
\n\n
\n\n
\n

1.4.3 Use as a code pre-processor

\n
\n\n\n

\nThe --define option can be used, particularly when combined with the\nconstant folding logic, as a form of pre-processor to enable or remove\nparticular constructions, such as might be used for instrumenting\ndevelopment code, or to produce variations aimed at a specific\nplatform.\n

\n

\nThe code below illustrates the way this can be done, and how the\nsymbol replacement is performed.\n

\n\n\n\n
CLAUSE1: if (typeof DEVMODE === 'undefined') {\n    DEVMODE = true;\n}\n\nCLAUSE2: function init() {\n    if (DEVMODE) {\n        console.log(\"init() called\");\n    }\n    ....\n    DEVMODE &amp;&amp; console.log(\"init() complete\");\n}\n\nCLAUSE3: function reportDeviceStatus(device) {\n    var DEVMODE = device.mode, DEVNAME = device.name;\n    if (DEVMODE === 'open') {\n        ....\n    }\n}\n
\n\n\n\n

\nWhen the above code is normally executed, the undeclared global\nvariable DEVMODE will be assigned the value true (see CLAUSE1)\nand so the init() function (CLAUSE2) will write messages to the\nconsole log when executed, but in CLAUSE3 a locally declared\nvariable will mask access to the DEVMODE global symbol.\n

\n

\nIf the above code is processed by UglifyJS with an argument of\n--define DEVMODE=false then UglifyJS will replace DEVMODE with the\nboolean constant value false within CLAUSE1 and CLAUSE2, but it\nwill leave CLAUSE3 as it stands because there DEVMODE resolves to\na validly declared variable.\n

\n

\nAnd more so, the constant-folding features of UglifyJS will recognise\nthat the if condition of CLAUSE1 is thus always false, and so will\nremove the test and body of CLAUSE1 altogether (including the\notherwise slightly problematical statement false = true; which it\nwill have formed by replacing DEVMODE in the body). Similarly,\nwithin CLAUSE2 both calls to console.log() will be removed\naltogether.\n

\n

\nIn this way you can mimic, to a limited degree, the functionality of\nthe C/C++ pre-processor to enable or completely remove blocks\ndepending on how certain symbols are defined - perhaps using UglifyJS\nto generate different versions of source aimed at different\nenvironments\n

\n

\nIt is recommmended (but not made mandatory) that symbols designed for\nthis purpose are given names consisting of UPPER_CASE_LETTERS to\ndistinguish them from other (normal) symbols and avoid the sort of\nclash that CLAUSE3 above illustrates.\n

\n
\n
\n\n
\n\n
\n

1.5 Compression – how good is it?

\n
\n\n\n

\nHere are updated statistics. (I also updated my Google Closure and YUI\ninstallations).\n

\n

\nWe're still a lot better than YUI in terms of compression, though slightly\nslower. We're still a lot faster than Closure, and compression after gzip\nis comparable.\n

\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FileUglifyJSUglifyJS+gzipClosureClosure+gzipYUIYUI+gzip
jquery-1.6.2.js91001 (0:01.59)3189690678 (0:07.40)31979101527 (0:01.82)34646
paper.js142023 (0:01.65)43334134301 (0:07.42)42495173383 (0:01.58)48785
prototype.js88544 (0:01.09)2668086955 (0:06.97)2632692130 (0:00.79)28624
thelib-full.js (DynarchLIB)251939 (0:02.55)72535249911 (0:09.05)72696258869 (0:01.94)76584
\n\n\n
\n\n
\n\n
\n

1.6 Bugs?

\n
\n\n\n

\nUnfortunately, for the time being there is no automated test suite. But I\nran the compressor manually on non-trivial code, and then I tested that the\ngenerated code works as expected. A few hundred times.\n

\n

\nDynarchLIB was started in times when there was no good JS minifier.\nTherefore I was quite religious about trying to write short code manually,\nand as such DL contains a lot of syntactic hacks1 such as “foo == bar ? a\n= 10 : b = 20”, though the more readable version would clearly be to use\n“if/else”.\n

\n

\nSince the parser/compressor runs fine on DL and jQuery, I'm quite confident\nthat it's solid enough for production use. If you can identify any bugs,\nI'd love to hear about them (use the Google Group or email me directly).\n

\n
\n\n
\n\n
\n

1.7 Links

\n
\n\n\n\n\n\n
\n\n
\n\n
\n

1.8 License

\n
\n\n\n

\nUglifyJS is released under the BSD license:\n

\n\n\n\n
Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>\nBased on parse-js (http://marijn.haverbeke.nl/parse-js/).\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n    * Redistributions of source code must retain the above\n      copyright notice, this list of conditions and the following\n      disclaimer.\n\n    * Redistributions in binary form must reproduce the above\n      copyright notice, this list of conditions and the following\n      disclaimer in the documentation and/or other materials\n      provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\nTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n
\n\n\n\n\n
\n
\n
\n
\n

Footnotes:

\n
\n

1 I even reported a few bugs and suggested some fixes in the original\nparse-js library, and Marijn pushed fixes literally in minutes.\n

\n
\n
\n
\n

Author: Mihai Bazon\n

\n

Date: 2011-08-29 19:17:55 EEST

\n

HTML generated by org-mode 7.01trans in emacs 23

\n
\n
\n\n\n", - "readmeFilename": "README.html", - "bugs": { - "url": "https://github.com/mishoo/UglifyJS/issues" - }, - "homepage": "https://github.com/mishoo/UglifyJS", - "_id": "uglify-js@1.1.1", - "_from": "uglify-js@~1.1.1" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/package.json~ b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/package.json~ deleted file mode 100644 index 8ca4d35..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/package.json~ +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name" : "uglify-js", - - "description" : "JavaScript parser and compressor/beautifier toolkit", - - "author" : { - "name" : "Mihai Bazon", - "email" : "mihai.bazon@gmail.com", - "url" : "http://mihai.bazon.net/blog" - }, - - "version" : "1.1.0", - - "main" : "./uglify-js.js", - - "bin" : { - "uglifyjs" : "./bin/uglifyjs" - }, - - "repository": { - "type": "git", - "url": "git@github.com:mishoo/UglifyJS.git" - } -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/beautify.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/beautify.js deleted file mode 100755 index f19369e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/beautify.js +++ /dev/null @@ -1,28 +0,0 @@ -#! /usr/bin/env node - -global.sys = require("sys"); -var fs = require("fs"); - -var jsp = require("../lib/parse-js"); -var pro = require("../lib/process"); - -var filename = process.argv[2]; -fs.readFile(filename, "utf8", function(err, text){ - try { - var ast = time_it("parse", function(){ return jsp.parse(text); }); - ast = time_it("mangle", function(){ return pro.ast_mangle(ast); }); - ast = time_it("squeeze", function(){ return pro.ast_squeeze(ast); }); - var gen = time_it("generate", function(){ return pro.gen_code(ast, false); }); - sys.puts(gen); - } catch(ex) { - sys.debug(ex.stack); - sys.debug(sys.inspect(ex)); - sys.debug(JSON.stringify(ex)); - } -}); - -function time_it(name, cont) { - var t1 = new Date().getTime(); - try { return cont(); } - finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); } -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/testparser.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/testparser.js deleted file mode 100755 index 02c19a9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/testparser.js +++ /dev/null @@ -1,403 +0,0 @@ -#! /usr/bin/env node - -var parseJS = require("../lib/parse-js"); -var sys = require("sys"); - -// write debug in a very straightforward manner -var debug = function(){ - sys.log(Array.prototype.slice.call(arguments).join(', ')); -}; - -ParserTestSuite(function(i, input, desc){ - try { - parseJS.parse(input); - debug("ok " + i + ": " + desc); - } catch(e){ - debug("FAIL " + i + " " + desc + " (" + e + ")"); - } -}); - -function ParserTestSuite(callback){ - var inps = [ - ["var abc;", "Regular variable statement w/o assignment"], - ["var abc = 5;", "Regular variable statement with assignment"], - ["/* */;", "Multiline comment"], - ['/** **/;', 'Double star multiline comment'], - ["var f = function(){;};", "Function expression in var assignment"], - ['hi; // moo\n;', 'single line comment'], - ['var varwithfunction;', 'Dont match keywords as substrings'], // difference between `var withsomevar` and `"str"` (local search and lits) - ['a + b;', 'addition'], - ["'a';", 'single string literal'], - ["'a\\n';", 'single string literal with escaped return'], - ['"a";', 'double string literal'], - ['"a\\n";', 'double string literal with escaped return'], - ['"var";', 'string is a keyword'], - ['"variable";', 'string starts with a keyword'], - ['"somevariable";', 'string contains a keyword'], - ['"somevar";', 'string ends with a keyword'], - ['500;', 'int literal'], - ['500.;', 'float literal w/o decimals'], - ['500.432;', 'float literal with decimals'], - ['.432432;', 'float literal w/o int'], - ['(a,b,c);', 'parens and comma'], - ['[1,2,abc];', 'array literal'], - ['var o = {a:1};', 'object literal unquoted key'], - ['var o = {"b":2};', 'object literal quoted key'], // opening curly may not be at the start of a statement... - ['var o = {c:c};', 'object literal keyname is identifier'], - ['var o = {a:1,"b":2,c:c};', 'object literal combinations'], - ['var x;\nvar y;', 'two lines'], - ['var x;\nfunction n(){; }', 'function def'], - ['var x;\nfunction n(abc){; }', 'function def with arg'], - ['var x;\nfunction n(abc, def){ ;}', 'function def with args'], - ['function n(){ "hello"; }', 'function def with body'], - ['/a/;', 'regex literal'], - ['/a/b;', 'regex literal with flag'], - ['/a/ / /b/;', 'regex div regex'], - ['a/b/c;', 'triple division looks like regex'], - ['+function(){/regex/;};', 'regex at start of function body'], - // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=86 - // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=430 - - // first tests for the lexer, should also parse as program (when you append a semi) - - // comments - ['//foo!@#^&$1234\nbar;', 'single line comment'], - ['/* abcd!@#@$* { } && null*/;', 'single line multi line comment'], - ['/*foo\nbar*/;','multi line comment'], - ['/*x*x*/;','multi line comment with *'], - ['/**/;','empty comment'], - // identifiers - ["x;",'1 identifier'], - ["_x;",'2 identifier'], - ["xyz;",'3 identifier'], - ["$x;",'4 identifier'], - ["x$;",'5 identifier'], - ["_;",'6 identifier'], - ["x5;",'7 identifier'], - ["x_y;",'8 identifier'], - ["x+5;",'9 identifier'], - ["xyz123;",'10 identifier'], - ["x1y1z1;",'11 identifier'], - ["foo\\u00D8bar;",'12 identifier unicode escape'], - //["foo�bar;",'13 identifier unicode embedded (might fail)'], - // numbers - ["5;", '1 number'], - ["5.5;", '2 number'], - ["0;", '3 number'], - ["0.0;", '4 number'], - ["0.001;", '5 number'], - ["1.e2;", '6 number'], - ["1.e-2;", '7 number'], - ["1.E2;", '8 number'], - ["1.E-2;", '9 number'], - [".5;", '10 number'], - [".5e3;", '11 number'], - [".5e-3;", '12 number'], - ["0.5e3;", '13 number'], - ["55;", '14 number'], - ["123;", '15 number'], - ["55.55;", '16 number'], - ["55.55e10;", '17 number'], - ["123.456;", '18 number'], - ["1+e;", '20 number'], - ["0x01;", '22 number'], - ["0XCAFE;", '23 number'], - ["0x12345678;", '24 number'], - ["0x1234ABCD;", '25 number'], - ["0x0001;", '26 number'], - // strings - ["\"foo\";", '1 string'], - ["\'foo\';", '2 string'], - ["\"x\";", '3 string'], - ["\'\';", '4 string'], - ["\"foo\\tbar\";", '5 string'], - ["\"!@#$%^&*()_+{}[]\";", '6 string'], - ["\"/*test*/\";", '7 string'], - ["\"//test\";", '8 string'], - ["\"\\\\\";", '9 string'], - ["\"\\u0001\";", '10 string'], - ["\"\\uFEFF\";", '11 string'], - ["\"\\u10002\";", '12 string'], - ["\"\\x55\";", '13 string'], - ["\"\\x55a\";", '14 string'], - ["\"a\\\\nb\";", '15 string'], - ['";"', '16 string: semi in a string'], - ['"a\\\nb";', '17 string: line terminator escape'], - // literals - ["null;", "null"], - ["true;", "true"], - ["false;", "false"], - // regex - ["/a/;", "1 regex"], - ["/abc/;", "2 regex"], - ["/abc[a-z]*def/g;", "3 regex"], - ["/\\b/;", "4 regex"], - ["/[a-zA-Z]/;", "5 regex"], - - // program tests (for as far as they havent been covered above) - - // regexp - ["/foo(.*)/g;", "another regexp"], - // arrays - ["[];", "1 array"], - ["[ ];", "2 array"], - ["[1];", "3 array"], - ["[1,2];", "4 array"], - ["[1,2,,];", "5 array"], - ["[1,2,3];", "6 array"], - ["[1,2,3,,,];", "7 array"], - // objects - ["{};", "1 object"], - ["({x:5});", "2 object"], - ["({x:5,y:6});", "3 object"], - ["({x:5,});", "4 object"], - ["({if:5});", "5 object"], - ["({ get x() {42;} });", "6 object"], - ["({ set y(a) {1;} });", "7 object"], - // member expression - ["o.m;", "1 member expression"], - ["o['m'];", "2 member expression"], - ["o['n']['m'];", "3 member expression"], - ["o.n.m;", "4 member expression"], - ["o.if;", "5 member expression"], - // call and invoke expressions - ["f();", "1 call/invoke expression"], - ["f(x);", "2 call/invoke expression"], - ["f(x,y);", "3 call/invoke expression"], - ["o.m();", "4 call/invoke expression"], - ["o['m'];", "5 call/invoke expression"], - ["o.m(x);", "6 call/invoke expression"], - ["o['m'](x);", "7 call/invoke expression"], - ["o.m(x,y);", "8 call/invoke expression"], - ["o['m'](x,y);", "9 call/invoke expression"], - ["f(x)(y);", "10 call/invoke expression"], - ["f().x;", "11 call/invoke expression"], - - // eval - ["eval('x');", "1 eval"], - ["(eval)('x');", "2 eval"], - ["(1,eval)('x');", "3 eval"], - ["eval(x,y);", "4 eval"], - // new expression - ["new f();", "1 new expression"], - ["new o;", "2 new expression"], - ["new o.m;", "3 new expression"], - ["new o.m(x);", "4 new expression"], - ["new o.m(x,y);", "5 new expression"], - // prefix/postfix - ["++x;", "1 pre/postfix"], - ["x++;", "2 pre/postfix"], - ["--x;", "3 pre/postfix"], - ["x--;", "4 pre/postfix"], - ["x ++;", "5 pre/postfix"], - ["x /* comment */ ++;", "6 pre/postfix"], - ["++ /* comment */ x;", "7 pre/postfix"], - // unary operators - ["delete x;", "1 unary operator"], - ["void x;", "2 unary operator"], - ["+ x;", "3 unary operator"], - ["-x;", "4 unary operator"], - ["~x;", "5 unary operator"], - ["!x;", "6 unary operator"], - // meh - ["new Date++;", "new date ++"], - ["+x++;", " + x ++"], - // expression expressions - ["1 * 2;", "1 expression expressions"], - ["1 / 2;", "2 expression expressions"], - ["1 % 2;", "3 expression expressions"], - ["1 + 2;", "4 expression expressions"], - ["1 - 2;", "5 expression expressions"], - ["1 << 2;", "6 expression expressions"], - ["1 >>> 2;", "7 expression expressions"], - ["1 >> 2;", "8 expression expressions"], - ["1 * 2 + 3;", "9 expression expressions"], - ["(1+2)*3;", "10 expression expressions"], - ["1*(2+3);", "11 expression expressions"], - ["xy;", "13 expression expressions"], - ["x<=y;", "14 expression expressions"], - ["x>=y;", "15 expression expressions"], - ["x instanceof y;", "16 expression expressions"], - ["x in y;", "17 expression expressions"], - ["x&y;", "18 expression expressions"], - ["x^y;", "19 expression expressions"], - ["x|y;", "20 expression expressions"], - ["x+y>>= y;", "1 assignment"], - ["x <<= y;", "2 assignment"], - ["x = y;", "3 assignment"], - ["x += y;", "4 assignment"], - ["x /= y;", "5 assignment"], - // comma - ["x, y;", "comma"], - // block - ["{};", "1 block"], - ["{x;};", "2 block"], - ["{x;y;};", "3 block"], - // vars - ["var x;", "1 var"], - ["var x,y;", "2 var"], - ["var x=1,y=2;", "3 var"], - ["var x,y=2;", "4 var"], - // empty - [";", "1 empty"], - ["\n;", "2 empty"], - // expression statement - ["x;", "1 expression statement"], - ["5;", "2 expression statement"], - ["1+2;", "3 expression statement"], - // if - ["if (c) x; else y;", "1 if statement"], - ["if (c) x;", "2 if statement"], - ["if (c) {} else {};", "3 if statement"], - ["if (c1) if (c2) s1; else s2;", "4 if statement"], - // while - ["do s; while (e);", "1 while statement"], - ["do { s; } while (e);", "2 while statement"], - ["while (e) s;", "3 while statement"], - ["while (e) { s; };", "4 while statement"], - // for - ["for (;;) ;", "1 for statement"], - ["for (;c;x++) x;", "2 for statement"], - ["for (i;i> 1; -var c = 8 >>> 1; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue34.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue34.js deleted file mode 100644 index 022f7a3..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue34.js +++ /dev/null @@ -1,3 +0,0 @@ -var a = {}; -a["this"] = 1; -a["that"] = 2; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue4.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue4.js deleted file mode 100644 index 0b76103..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue4.js +++ /dev/null @@ -1,3 +0,0 @@ -var a = 2e3; -var b = 2e-3; -var c = 2e-5; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue48.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue48.js deleted file mode 100644 index 031e85b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue48.js +++ /dev/null @@ -1 +0,0 @@ -var s, i; s = ''; i = 0; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue50.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue50.js deleted file mode 100644 index 060f9df..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue50.js +++ /dev/null @@ -1,9 +0,0 @@ -function bar(a) { - try { - foo(); - } catch(e) { - alert("Exception caught (foo not defined)"); - } - alert(a); // 10 in FF, "[object Error]" in IE -} -bar(10); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue53.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue53.js deleted file mode 100644 index 4f8b32f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue53.js +++ /dev/null @@ -1 +0,0 @@ -x = (y, z) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue54.1.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue54.1.js deleted file mode 100644 index 967052e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue54.1.js +++ /dev/null @@ -1,3 +0,0 @@ -foo.toString(); -a.toString(16); -b.toString.call(c); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue68.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue68.js deleted file mode 100644 index 14054d0..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue68.js +++ /dev/null @@ -1,5 +0,0 @@ -function f() { - if (a) return; - g(); - function g(){} -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue69.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue69.js deleted file mode 100644 index d25ecd6..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue69.js +++ /dev/null @@ -1 +0,0 @@ -[(a,b)] diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue9.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue9.js deleted file mode 100644 index 6158861..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/issue9.js +++ /dev/null @@ -1,4 +0,0 @@ -var a = { - a: 1, - b: 2, // <-- trailing comma -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/mangle.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/mangle.js deleted file mode 100644 index c271a26..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/mangle.js +++ /dev/null @@ -1,5 +0,0 @@ -(function() { - var x = function fun(a, fun, b) { - return fun; - }; -}()); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/null_string.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/null_string.js deleted file mode 100644 index a675b1c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/null_string.js +++ /dev/null @@ -1 +0,0 @@ -var nullString = "\0" \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/strict-equals.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/strict-equals.js deleted file mode 100644 index b631f4c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/strict-equals.js +++ /dev/null @@ -1,3 +0,0 @@ -typeof a === 'string' -b + "" !== c + "" -d < e === f < g diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/var.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/var.js deleted file mode 100644 index 609a35d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/var.js +++ /dev/null @@ -1,3 +0,0 @@ -// var declarations after each other should be combined -var a = 1; -var b = 2; \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/whitespace.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/whitespace.js deleted file mode 100644 index 6a15c46..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/whitespace.js +++ /dev/null @@ -1,21 +0,0 @@ -function id(a) { - // Form-Feed - // Vertical Tab - // No-Break Space - ᠎// Mongolian Vowel Separator -  // En quad -  // Em quad -  // En space -  // Em space -  // Three-Per-Em Space -  // Four-Per-Em Space -  // Six-Per-Em Space -  // Figure Space -  // Punctuation Space -  // Thin Space -  // Hair Space -  // Narrow No-Break Space -  // Medium Mathematical Space -  // Ideographic Space - return a; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/with.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/with.js deleted file mode 100644 index de266ed..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/compress/test/with.js +++ /dev/null @@ -1,2 +0,0 @@ -with({}) { -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/scripts.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/scripts.js deleted file mode 100644 index 9fdd96c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/test/unit/scripts.js +++ /dev/null @@ -1,55 +0,0 @@ -var fs = require('fs'), - uglify = require('uglify-js'), - jsp = uglify.parser, - nodeunit = require('nodeunit'), - path = require('path'), - pro = uglify.uglify; - -var Script = process.binding('evals').Script; - -var scriptsPath = __dirname; - -function compress(code) { - var ast = jsp.parse(code); - ast = pro.ast_mangle(ast); - ast = pro.ast_squeeze(ast, { no_warnings: true }); - ast = pro.ast_squeeze_more(ast); - return pro.gen_code(ast); -}; - -var testDir = path.join(scriptsPath, "compress", "test"); -var expectedDir = path.join(scriptsPath, "compress", "expected"); - -function getTester(script) { - return function(test) { - var testPath = path.join(testDir, script); - var expectedPath = path.join(expectedDir, script); - var content = fs.readFileSync(testPath, 'utf-8'); - var outputCompress = compress(content); - - // Check if the noncompressdata is larger or same size as the compressed data - test.ok(content.length >= outputCompress.length); - - // Check that a recompress gives the same result - var outputReCompress = compress(content); - test.equal(outputCompress, outputReCompress); - - // Check if the compressed output is what is expected - var expected = fs.readFileSync(expectedPath, 'utf-8'); - test.equal(outputCompress, expected.replace(/(\r?\n)+$/, "")); - - test.done(); - }; -}; - -var tests = {}; - -var scripts = fs.readdirSync(testDir); -for (var i in scripts) { - var script = scripts[i]; - if (/\.js$/.test(script)) { - tests[script] = getTester(script); - } -} - -module.exports = nodeunit.testCase(tests); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/hoist.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/hoist.js deleted file mode 100644 index 4bf2b94..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/hoist.js +++ /dev/null @@ -1,33 +0,0 @@ -function foo(arg1, arg2, arg3, arg4, arg5, arg6) { - var a = 5; - { - var d = 10, mak = 20, buz = 30; - var q = buz * 2; - } - if (moo) { - var a, b, c; - } - for (var arg1 = 0, d = 20; arg1 < 10; ++arg1) - console.log(arg3); - for (var i in mak) {} - for (j in d) {} - var d; - - function test() { - - }; - - //test(); - - (function moo(first, second){ - console.log(first); - })(1); - - (function moo(first, second){ - console.log(moo()); - })(1); -} - - -var foo; -var bar; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument.js deleted file mode 100644 index c6a9d79..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument.js +++ /dev/null @@ -1,97 +0,0 @@ -// sample on how to use the parser and walker API to instrument some code - -var jsp = require("uglify-js").parser; -var pro = require("uglify-js").uglify; - -function instrument(code) { - var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want - // to have start/end tokens embedded in the - // statements - var w = pro.ast_walker(); - - // we're gonna need this to push elements that we're currently looking at, to avoid - // endless recursion. - var analyzing = []; - function do_stat() { - var ret; - if (this[0].start && analyzing.indexOf(this) < 0) { - // without the `analyzing' hack, w.walk(this) would re-enter here leading - // to infinite recursion - analyzing.push(this); - ret = [ "splice", // XXX: "block" is safer - [ [ "stat", - [ "call", [ "name", "trace" ], - [ [ "string", this[0].toString() ], - [ "num", this[0].start.line ], - [ "num", this[0].start.col ], - [ "num", this[0].end.line ], - [ "num", this[0].end.col ]]]], - w.walk(this) ]]; - analyzing.pop(this); - } - return ret; - }; - var new_ast = w.with_walkers({ - "stat" : do_stat, - "label" : do_stat, - "break" : do_stat, - "continue" : do_stat, - "debugger" : do_stat, - "var" : do_stat, - "const" : do_stat, - "return" : do_stat, - "throw" : do_stat, - "try" : do_stat, - "defun" : do_stat, - "if" : do_stat, - "while" : do_stat, - "do" : do_stat, - "for" : do_stat, - "for-in" : do_stat, - "switch" : do_stat, - "with" : do_stat - }, function(){ - return w.walk(ast); - }); - return pro.gen_code(new_ast, { beautify: true }); -} - - - - -////// test code follows. - -var code = instrument(test.toString()); -console.log(code); - -function test() { - // simple stats - a = 5; - c += a + b; - "foo"; - - // var - var foo = 5; - const bar = 6, baz = 7; - - // switch block. note we can't track case lines the same way. - switch ("foo") { - case "foo": - return 1; - case "bar": - return 2; - } - - // for/for in - for (var i = 0; i < 5; ++i) { - console.log("Hello " + i); - } - for (var i in [ 1, 2, 3]) { - console.log(i); - } - - // note however that the following is broken. I guess we - // should add the block brackets in this case... - for (var i = 0; i < 5; ++i) - console.log("foo"); -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument2.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument2.js deleted file mode 100644 index 6aee5f3..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/instrument2.js +++ /dev/null @@ -1,138 +0,0 @@ -// sample on how to use the parser and walker API to instrument some code - -var jsp = require("uglify-js").parser; -var pro = require("uglify-js").uglify; - -function instrument(code) { - var ast = jsp.parse(code, false, true); // true for the third arg specifies that we want - // to have start/end tokens embedded in the - // statements - var w = pro.ast_walker(); - - function trace (line, comment) { - var code = pro.gen_code(line, { beautify: true }); - var data = line[0] - - var args = [] - if (!comment) comment = "" - if (typeof data === "object") { - code = code.split(/\n/).shift() - args = [ [ "string", data.toString() ], - [ "string", code ], - [ "num", data.start.line ], - [ "num", data.start.col ], - [ "num", data.end.line ], - [ "num", data.end.col ]] - } else { - args = [ [ "string", data ], - [ "string", code ]] - - } - return [ "call", [ "name", "trace" ], args ]; - } - - // we're gonna need this to push elements that we're currently looking at, to avoid - // endless recursion. - var analyzing = []; - function do_stat() { - var ret; - if (this[0].start && analyzing.indexOf(this) < 0) { - // without the `analyzing' hack, w.walk(this) would re-enter here leading - // to infinite recursion - analyzing.push(this); - ret = [ "splice", - [ [ "stat", trace(this) ], - w.walk(this) ]]; - analyzing.pop(this); - } - return ret; - } - - function do_cond(c, t, f) { - return [ this[0], w.walk(c), - ["seq", trace(t), w.walk(t) ], - ["seq", trace(f), w.walk(f) ]]; - } - - function do_binary(c, l, r) { - if (c !== "&&" && c !== "||") { - return [this[0], c, w.walk(l), w.walk(r)]; - } - return [ this[0], c, - ["seq", trace(l), w.walk(l) ], - ["seq", trace(r), w.walk(r) ]]; - } - - var new_ast = w.with_walkers({ - "stat" : do_stat, - "label" : do_stat, - "break" : do_stat, - "continue" : do_stat, - "debugger" : do_stat, - "var" : do_stat, - "const" : do_stat, - "return" : do_stat, - "throw" : do_stat, - "try" : do_stat, - "defun" : do_stat, - "if" : do_stat, - "while" : do_stat, - "do" : do_stat, - "for" : do_stat, - "for-in" : do_stat, - "switch" : do_stat, - "with" : do_stat, - "conditional" : do_cond, - "binary" : do_binary - }, function(){ - return w.walk(ast); - }); - return pro.gen_code(new_ast, { beautify: true }); -} - - -////// test code follows. - -var code = instrument(test.toString()); -console.log(code); - -function test() { - // simple stats - a = 5; - c += a + b; - "foo"; - - // var - var foo = 5; - const bar = 6, baz = 7; - - // switch block. note we can't track case lines the same way. - switch ("foo") { - case "foo": - return 1; - case "bar": - return 2; - } - - // for/for in - for (var i = 0; i < 5; ++i) { - console.log("Hello " + i); - } - for (var i in [ 1, 2, 3]) { - console.log(i); - } - - for (var i = 0; i < 5; ++i) - console.log("foo"); - - for (var i = 0; i < 5; ++i) { - console.log("foo"); - } - - var k = plurp() ? 1 : 0; - var x = a ? doX(y) && goZoo("zoo") - : b ? blerg({ x: y }) - : null; - - var x = X || Y; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/test.js deleted file mode 100755 index f295fba..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/tmp/test.js +++ /dev/null @@ -1,30 +0,0 @@ -#! /usr/bin/env node - -global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util"); -var fs = require("fs"); -var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js - jsp = uglify.parser, - pro = uglify.uglify; - -var code = fs.readFileSync("hoist.js", "utf8"); -var ast = jsp.parse(code); - -ast = pro.ast_lift_variables(ast); - -var w = pro.ast_walker(); -ast = w.with_walkers({ - "function": function() { - var node = w.dive(this); // walk depth first - console.log(pro.gen_code(node, { beautify: true })); - return node; - }, - "name": function(name) { - return [ this[0], "X" ]; - } -}, function(){ - return w.walk(ast); -}); - -console.log(pro.gen_code(ast, { - beautify: true -})); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/uglify-js.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/uglify-js.js deleted file mode 100644 index 4305e23..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/node_modules/uglify-js/uglify-js.js +++ /dev/null @@ -1,17 +0,0 @@ -//convienence function(src, [options]); -function uglify(orig_code, options){ - options || (options = {}); - var jsp = uglify.parser; - var pro = uglify.uglify; - - var ast = jsp.parse(orig_code, options.strict_semicolons); // parse code and get the initial AST - ast = pro.ast_mangle(ast, options.mangle_options); // get a new AST with mangled names - ast = pro.ast_squeeze(ast, options.squeeze_options); // get an AST with compression optimizations - var final_code = pro.gen_code(ast, options.gen_options); // compressed code here - return final_code; -}; - -uglify.parser = require("./lib/parse-js"); -uglify.uglify = require("./lib/process"); - -module.exports = uglify \ No newline at end of file diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/package.json deleted file mode 100644 index 9da006f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/package.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "name": "burrito", - "description": "Wrap up expressions with a trace function while walking the AST with rice and beans on the side", - "version": "0.2.12", - "repository": { - "type": "git", - "url": "git://github.com/substack/node-burrito.git" - }, - "main": "./index.js", - "keywords": [ - "trace", - "ast", - "walk", - "syntax", - "source", - "tree", - "uglify" - ], - "directories": { - "lib": ".", - "example": "example", - "test": "test" - }, - "scripts": { - "test": "tap test/*.js" - }, - "dependencies": { - "traverse": "~0.5.1", - "uglify-js": "~1.1.1" - }, - "devDependencies": { - "tap": "~0.2.5" - }, - "engines": { - "node": ">=0.4.0" - }, - "license": "BSD", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "readme": "burrito\n=======\n\nBurrito makes it easy to do crazy stuff with the javascript AST.\n\nThis is super useful if you want to roll your own stack traces or build a code\ncoverage tool.\n\n[![build status](https://secure.travis-ci.org/substack/node-burrito.png)](http://travis-ci.org/substack/node-burrito)\n\n![node.wrap(\"burrito\")](http://substack.net/images/burrito.png)\n\nexamples\n========\n\nmicrowave\n---------\n\nexamples/microwave.js\n\n````javascript\nvar burrito = require('burrito');\n\nvar res = burrito.microwave('Math.sin(2)', function (node) {\n if (node.name === 'num') node.wrap('Math.PI / %s');\n});\n\nconsole.log(res); // sin(pi / 2) == 1\n````\n\noutput:\n\n 1\n\nwrap\n----\n\nexamples/wrap.js\n\n````javascript\nvar burrito = require('burrito');\n\nvar src = burrito('f() && g(h())\\nfoo()', function (node) {\n if (node.name === 'call') node.wrap('qqq(%s)');\n});\n\nconsole.log(src);\n````\n\noutput:\n\n qqq(f()) && qqq(g(qqq(h())));\n\n qqq(foo());\n\nmethods\n=======\n\n var burrito = require('burrito');\n\nburrito(code, cb)\n-----------------\n\nGiven some source `code` and a function `trace`, walk the ast by expression.\n\nThe `cb` gets called with a node object described below.\n\nIf `code` is an Array then it is assumbed to be an AST which you can generate\nyourself with `burrito.parse()`. The AST must be annotated, so make sure to\n`burrito.parse(src, false, true)`.\n\nburrito.microwave(code, context={}, cb)\n---------------------------------------\n\nLike `burrito()` except the result is run using\n`vm.runInNewContext(res, context)`.\n\nnode object\n===========\n\nnode.name\n---------\n\nName is a string that contains the type of the expression as named by uglify.\n\nnode.wrap(s)\n------------\n\nWrap the current expression in `s`.\n\nIf `s` is a string, `\"%s\"` will be replaced with the stringified current\nexpression.\n\nIf `s` is a function, it is called with the stringified current expression and\nshould return a new stringified expression.\n\nIf the `node.name === \"binary\"`, you get the subterms \"%a\" and \"%b\" to play with\ntoo. These subterms are applied if `s` is a function too: `s(expr, a, b)`.\n\nProtip: to insert multiple statements you can use javascript's lesser-known block\nsyntax that it gets from C:\n\n````javascript\nif (node.name === 'stat') node.wrap('{ foo(); %s }')\n````\n\nnode.node\n---------\n\nraw ast data generated by uglify\n\nnode.value\n----------\n\n`node.node.slice(1)` to skip the annotations\n\nnode.start\n----------\n\nThe start location of the expression, like this:\n\n````javascript\n{ type: 'name',\n value: 'b',\n line: 0,\n col: 3,\n pos: 3,\n nlb: false,\n comments_before: [] }\n````\n\nnode.end\n--------\n\nThe end location of the expression, formatted the same as `node.start`.\n\nnode.state\n----------\n\nThe state of the traversal using traverse.\n\nnode.source()\n-------------\n\nReturns a stringified version of the expression.\n\nnode.parent()\n-------------\n\nReturns the parent `node` or `null` if the node is the root element.\n\nnode.label()\n------------\n\nReturn the label of the present node or `null` if there is no label.\n\nLabels are returned for \"call\", \"var\", \"defun\", and \"function\" nodes.\n\nReturns an array for \"var\" nodes since `var` statements can\ncontain multiple labels in assignment.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) you can just:\n\n npm install burrito\n\nin the browser\n==============\n\nBurrito works in browser with\n[browserify](https://github.com/substack/node-browserify).\n\nIt has been tested against:\n\n* Internet Explorer 5.5, 6.0, 7.0, 8.0, 9.0\n* Firefox 3.5\n* Chrome 6.0\n* Opera 10.6\n* Safari 5.0\n\nkudos\n=====\n\nHeavily inspired by (and previously mostly lifted outright from) isaacs's nifty\ntmp/instrument.js thingy from uglify-js.\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/node-burrito/issues" - }, - "homepage": "https://github.com/substack/node-burrito", - "_id": "burrito@0.2.12", - "_from": "burrito@>=0.2.5 <0.3" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/ast.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/ast.js deleted file mode 100644 index 503b5ab..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/ast.js +++ /dev/null @@ -1,31 +0,0 @@ -var test = require('tap').test; -var burrito = require('../'); -var vm = require('vm'); - -test('ast', function (t) { - t.plan(2); - - var ast = burrito.parse('f(g(h(5)))', false, true); - var src = burrito(ast, function (node) { - if (node.name === 'call') { - node.wrap(function (s) { - return 'z(' + s + ')'; - }); - } - }); - - var times = 0; - t.equal( - vm.runInNewContext(src, { - f : function (x) { return x + 1 }, - g : function (x) { return x + 2 }, - h : function (x) { return x + 3 }, - z : function (x) { - times ++; - return x * 10; - }, - }), - (((((5 + 3) * 10) + 2) * 10) + 1) * 10 - ); - t.equal(times, 3); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/err.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/err.js deleted file mode 100644 index af1611d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/err.js +++ /dev/null @@ -1,52 +0,0 @@ -var test = require('tap').test; -var burrito = require('../'); - -test('wrap error', function (t) { - t.plan(6); - - try { - var src = burrito('f() && g()', function (node) { - if (node.name === 'binary') node.wrap('h(%a, %b') - }); - t.fail('should have blown up'); - } - catch (err) { - t.ok(err.message.match(/unexpected/i)); - t.ok(err instanceof SyntaxError); - t.ok(!err.stack.match(/uglify-js/)); - t.equal(err.line, 0); - t.equal(err.col, 10); - t.equal(err.pos, 10); - } -}); - -test('non string', function (t) { - t.plan(3); - - t.throws(function () { - burrito.parse(new Buffer('[]')); - }); - - t.throws(function () { - burrito.parse(new String('[]')); - }); - - t.throws(function () { - burrito.parse(); - }); -}); - -test('syntax error', function (t) { - t.plan(3); - try { - var src = burrito('f() && g())', function (node) { - if (node.name === 'binary') node.wrap('h(%a, %b)') - }); - assert.fail('should have blown up'); - } - catch (err) { - t.ok(err.message.match(/unexpected/i)); - t.ok(err instanceof SyntaxError); - t.ok(!err.stack.match(/uglify-js/)); - } -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail.js deleted file mode 100644 index 70d453f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail.js +++ /dev/null @@ -1,9 +0,0 @@ -var burrito = require('../'); -var test = require('tap').test; -var fs = require('fs'); -var src = fs.readFileSync(__dirname + '/fail/src.js', 'utf8'); - -test('fail', function (t) { - burrito(src, function (node) {}); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail/src.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail/src.js deleted file mode 100644 index eb02736..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/fail/src.js +++ /dev/null @@ -1,60 +0,0 @@ -var path = require('path') - -module.exports = function(fs, ready) { - var global_files = {} - - var recurse = function(dir, okay) { - fs.readdir(dir, function(err, dir_files) { - var countdown = 0 - , files = [] - , dirs = [] - , checked = 0 - dir_files.forEach(function(file, idx, all) { - fs.stat(path.join(dir, file), function(err, stat) { - if(stat.isDirectory() && !/node_modules/g.test(dir)) { - dirs.push(file) - } else if(/\.js$/g.test(file)) { - files.push(file) - } - - if(++checked >= dir_files.length) - recurse_dirs() - }) - }) - - function recurse_dirs() { - var total = 0 - dirs.forEach(function(this_dir) { - recurse(path.join(dir, this_dir), function(err, data) { - if(++total >= dirs.length) - recurse_files() - }) - }) - - if(!dirs.length) - recurse_files() - } - - function recurse_files() { - var total = 0 - files.forEach(function(file) { - fs.readFile(path.join(dir, file), 'utf8', function(err, src) { - global_files[path.join(dir, file)] = src - ++total >= files.length && - okay(null, global_files) - }) - }) - - if(!files.length) - okay(null, global_files) - } - - if(!dir_files.length) - okay(null, global_files) - }) - } - - recurse('.', ready) -} - - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/label.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/label.js deleted file mode 100644 index 368d7c4..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/label.js +++ /dev/null @@ -1,92 +0,0 @@ -var test = require('tap').test; -var burrito = require('../'); - -test('call label', function (t) { - t.plan(1); - - burrito('foo(10)', function (node) { - if (node.name === 'call') { - t.equal(node.label(), 'foo'); - } - }); -}); - -test('var label', function (t) { - t.plan(1); - - burrito('var x = 2', function (node) { - if (node.name === 'var') { - t.same(node.label(), [ 'x' ]); - } - }); -}); - -test('vars label', function (t) { - t.plan(1); - - burrito('var x = 2, y = 3', function (node) { - if (node.name === 'var') { - t.same(node.label(), [ 'x', 'y' ]); - } - }); -}); - -test('defun label', function (t) { - t.plan(1); - - burrito('function moo () {}', function (node) { - if (node.name === 'defun') { - t.same(node.label(), 'moo'); - } - }); -}); - -test('function label', function (t) { - t.plan(1); - - burrito('(function zzz () {})()', function (node) { - if (node.name === 'function') { - t.same(node.label(), 'zzz'); - } - }); -}); - -test('anon function label', function (t) { - t.plan(1); - - burrito('(function () {})()', function (node) { - if (node.name === 'function') { - t.equal(node.label(), null); - } - }); -}); - -test('dot call label', function (t) { - t.plan(1); - - burrito('process.nextTick(fn)', function (node) { - if (node.name === 'call') { - t.equal(node.label(), 'nextTick'); - } - }); -}); - -test('triple dot label', function (t) { - t.plan(1); - - burrito('a.b.c(fn)', function (node) { - if (node.name === 'call') { - t.equal(node.label(), 'c'); - } - }); -}); - -test('expr label', function (t) { - t.plan(1); - - burrito('a.b[x+1](fn)', function (node) { - if (node.name === 'call') { - t.ok(node.label() === null); - } - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/microwave.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/microwave.js deleted file mode 100644 index 43f80a7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/microwave.js +++ /dev/null @@ -1,34 +0,0 @@ -var test = require('tap').test; -var burrito = require('../'); - -test('microwave', function (t) { - t.plan(4); - - var context = { - f : function (x) { return x + 1 }, - g : function (x) { return x + 2 }, - h : function (x) { return x + 3 }, - z : function (x) { - t.ok(true); // 3 times - return x * 10; - }, - }; - - var res = burrito.microwave('f(g(h(5)))', context, function (node) { - if (node.name === 'call') { - node.wrap(function (s) { - return 'z(' + s + ')'; - }); - } - }); - - t.equal(res, (((((5 + 3) * 10) + 2) * 10) + 1) * 10); -}); - -test('empty context', function (t) { - var res = burrito.microwave('Math.sin(2)', function (node) { - if (node.name === 'num') node.wrap('Math.PI / %s'); - }); - t.equal(res, 1); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/parent.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/parent.js deleted file mode 100644 index 2d613af..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/parent.js +++ /dev/null @@ -1,27 +0,0 @@ -var test = require('tap').test; -var burrito = require('../'); - -test('check parent', function (t) { - t.plan(5); - var src = 'Math.tan(0) + Math.sin(0)'; - - var res = burrito.microwave(src, function (node) { - if (node.name === 'binary') { - node.wrap('%a - %b'); - } - else if (node.name === 'num') { - t.equal(node.parent().value[0][0], 'dot'); - - var fn = node.parent().value[0][2]; - if (fn === 'sin') { - node.wrap('Math.PI / 2'); - } - else if (fn === 'tan') { - node.wrap('Math.PI / 4'); - } - else t.fail('Unknown fn'); - } - }); - - t.equal(res, Math.tan(Math.PI / 4) - Math.sin(Math.PI / 2)); // ~ 0 -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/wrap.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/wrap.js deleted file mode 100644 index b9eda49..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/node_modules/burrito/test/wrap.js +++ /dev/null @@ -1,159 +0,0 @@ -var test = require('tap').test; -var burrito = require('../'); -var vm = require('vm'); - -test('preserve ternary parentheses', function (t) { - var originalSource = '"anything" + (x ? y : z) + "anything"'; - var burritoSource = burrito(originalSource, function (node) { - // do nothing. we just want to check that ternary parens are persisted - }); - - var ctxt = { - x : false, - y : 'y_'+~~(Math.random()*10), - z : 'z_'+~~(Math.random()*10) - }; - - var expectedOutput = vm.runInNewContext(originalSource, ctxt); - var burritoOutput = vm.runInNewContext(burritoSource, ctxt); - - t.equal(burritoOutput, expectedOutput); - - ctxt.x = true; - - expectedOutput = vm.runInNewContext(originalSource, ctxt); - burritoOutput = vm.runInNewContext(burritoSource, ctxt); - - t.equal(burritoOutput, expectedOutput); - t.end(); -}); - -test('wrap calls', function (t) { - t.plan(20); - var src = burrito('f() && g(h())\nfoo()', function (node) { - if (node.name === 'call') node.wrap('qqq(%s)'); - if (node.name === 'binary') node.wrap('bbb(%s)'); - t.ok(node.state); - t.equal(this, node.state); - }); - - var times = { bbb : 0, qqq : 0 }; - - var res = []; - vm.runInNewContext(src, { - bbb : function (x) { - times.bbb ++; - res.push(x); - return x; - }, - qqq : function (x) { - times.qqq ++; - res.push(x); - return x; - }, - f : function () { return true }, - g : function (h) { - t.equal(h, 7); - return h !== 7 - }, - h : function () { return 7 }, - foo : function () { return 'foo!' }, - }); - - t.same(res, [ - true, // f() - 7, // h() - false, // g(h()) - false, // f() && g(h()) - 'foo!', // foo() - ]); - t.equal(times.bbb, 1); - t.equal(times.qqq, 4); - t.end(); -}); - -test('wrap fn', function (t) { - var src = burrito('f(g(h(5)))', function (node) { - if (node.name === 'call') { - node.wrap(function (s) { - return 'z(' + s + ')'; - }); - } - }); - - var times = 0; - t.equal( - vm.runInNewContext(src, { - f : function (x) { return x + 1 }, - g : function (x) { return x + 2 }, - h : function (x) { return x + 3 }, - z : function (x) { - times ++; - return x * 10; - }, - }), - (((((5 + 3) * 10) + 2) * 10) + 1) * 10 - ); - t.equal(times, 3); - t.end(); -}); - -test('binary string', function (t) { - var src = 'z(x + y)'; - var context = { - x : 3, - y : 4, - z : function (n) { return n * 10 }, - }; - - var res = burrito.microwave(src, context, function (node) { - if (node.name === 'binary') { - node.wrap('%a*2 - %b*2'); - } - }); - - t.equal(res, 10 * (3*2 - 4*2)); - t.end(); -}); - -test('binary fn', function (t) { - var src = 'z(x + y)'; - var context = { - x : 3, - y : 4, - z : function (n) { return n * 10 }, - }; - - var res = burrito.microwave(src, context, function (node) { - if (node.name === 'binary') { - node.wrap(function (expr, a, b) { - return '(' + a + ')*2 - ' + '(' + b + ')*2'; - }); - } - }); - - t.equal(res, 10 * (3*2 - 4*2)); - t.end(); -}); - -test('intersperse', function (t) { - var src = '(' + (function () { - f(); - g(); - }).toString() + ')()'; - - var times = { f : 0, g : 0, zzz : 0 }; - - var context = { - f : function () { times.f ++ }, - g : function () { times.g ++ }, - zzz : function () { times.zzz ++ }, - }; - - burrito.microwave(src, context, function (node) { - if (node.name === 'stat') node.wrap('{ zzz(); %s }'); - }); - - t.same(times, { f : 1, g : 1, zzz : 3 }); - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/package.json deleted file mode 100644 index da4f59e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "bunker", - "version": "0.1.2", - "description": "code coverage in native javascript", - "main": "index.js", - "directories": { - "lib": ".", - "example": "example", - "test": "test" - }, - "dependencies": { - "burrito": ">=0.2.5 <0.3" - }, - "devDependencies": { - "tap": "~0.2.4" - }, - "scripts": { - "test": "tap test/*.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/substack/node-bunker.git" - }, - "keywords": [ - "code", - "coverage" - ], - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "license": "MIT/X11", - "engine": { - "node": ">=0.4" - }, - "readme": "bunker\n======\n\nBunker is a module to calculate code coverage using native javascript\n[burrito](https://github.com/substack/node-burrito) AST trickery.\n\n[![build status](https://secure.travis-ci.org/substack/node-bunker.png)](http://travis-ci.org/substack/node-bunker)\n\n![code coverage](http://substack.net/images/code_coverage.png)\n\nexamples\n========\n\ntiny\n----\n\n````javascript\nvar bunker = require('bunker');\nvar b = bunker('var x = 0; for (var i = 0; i < 30; i++) { x++ }');\n\nvar counts = {};\n\nb.on('node', function (node) {\n if (!counts[node.id]) {\n counts[node.id] = { times : 0, node : node };\n }\n counts[node.id].times ++;\n});\n\nb.run();\n\nObject.keys(counts).forEach(function (key) {\n var count = counts[key];\n console.log(count.times + ' : ' + count.node.source());\n});\n````\n\noutput:\n\n $ node example/tiny.js \n 1 : var x=0;\n 31 : i<30\n 30 : i++\n 30 : x++;\n 30 : x++\n\nmethods\n=======\n\nvar bunker = require('bunker');\n\nvar b = bunker(src)\n-------------------\n\nCreate a new bunker code coverageifier with some source `src`.\n\nThe bunker object `b` is an `EventEmitter` that emits `'node'` events with two\nparameters:\n\n* `node` - the [burrito](https://github.com/substack/node-burrito) node object\n* `stack` - the stack, [stackedy](https://github.com/substack/node-stackedy) style\n\nb.include(src)\n--------------\n\nInclude some source into the bunker.\n\nb.compile()\n-----------\n\nReturn the source wrapped with burrito.\n\nb.assign(context={})\n--------------------\n\nAssign the statement-tracking functions into `context`.\n\nb.run(context={})\n-----------------\n\nRun the source using `vm.runInNewContext()` with some `context`.\nThe statement-tracking functions will be added to `context` by `assign()`.\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/substack/node-bunker/issues" - }, - "homepage": "https://github.com/substack/node-bunker", - "_id": "bunker@0.1.2", - "_from": "bunker@0.1.X" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/cover.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/cover.js deleted file mode 100644 index b04795d..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/cover.js +++ /dev/null @@ -1,36 +0,0 @@ -var test = require('tap').test; -var bunker = require('../'); -var fs = require('fs'); - -var src = fs.readdirSync(__dirname + '/src').reduce(function (acc, file) { - acc[file] = fs.readFileSync(__dirname + '/src/' + file, 'utf8'); - return acc; -}, {}); - -test('cover', function (t) { - t.plan(1); - - var b = bunker(src['cover.js']); - var counts = {}; - - b.on('node', function (node) { - counts[node.name] = (counts[node.name] || 0) + 1; - }); - - b.run({ - setInterval : setInterval, - clearInterval : function () { - process.nextTick(function () { - t.same(counts, { - binary : 11, - 'unary-postfix' : 11, - 'var' : 2, - call : 2, // setInterval and clearInterval - stat : 1, // clearInterval - }); - }); - - return clearInterval.apply(this, arguments); - }, - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/return.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/return.js deleted file mode 100644 index 9be1700..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/return.js +++ /dev/null @@ -1,29 +0,0 @@ -var test = require('tap').test; -var bunker = require('../'); - -test('cover', function (t) { - t.plan(1); - - var b = bunker('(' + function () { - function foo () {} - function bar () {} - - (function () { - return foo(); - })(); - } + ')()'); - var counts = {}; - - b.on('node', function (node) { - counts[node.name] = (counts[node.name] || 0) + 1; - }); - b.run(); - - process.nextTick(function () { - t.same(counts, { - stat : 2, - call : 2, - return : 1, - }); - }); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/src/cover.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/src/cover.js deleted file mode 100644 index e640151..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/node_modules/bunker/test/src/cover.js +++ /dev/null @@ -1,6 +0,0 @@ -var i = 0; -var iv = setInterval(function () { - if (i++ === 10) { - clearInterval(iv); - } -}, 10); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/package.json deleted file mode 100644 index 998ed60..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "runforcover", - "version": "0.0.2", - "description": "require plugin for js code coverage using bunker", - "main": "index.js", - "directories": { - "lib": ".", - "test": "test" - }, - "dependencies": { - "bunker": "0.1.X" - }, - "scripts": { - "test": "node test/index.js" - }, - "repository": { - "type": "git", - "url": "http://github.com/chrisdickinson/node-runforcover.git" - }, - "keywords": [ - "code", - "coverage", - "bunker" - ], - "author": { - "name": "Chris Dickinson", - "email": "chris@neversaw.us", - "url": "http://neversaw.us" - }, - "license": "new BSD", - "engine": { - "node": ">=0.4" - }, - "readme": "runforcover\n======\n\nRunforcover is a require-hook library that uses node-bunker to provide code coverage data\nfor your unit test library, whatever it might be.\n\nmethods\n=======\nvar runforcover = require('runforcover');\n\nvar coverage = runforcover.cover([RegExp | path]);\n-------\n\nAttach runforcover to the global `require` object and patch `require.extensions['.js']` to\nprovide coverage metadata for all files required after this point. Returns a function\nobject that can be called to obtain a object keying files to `CoverageData` objects, with \na method for releasing control back to vanilla `require`. Usage:\n\n````javascript\n\nvar coverage = runforcover.cover(/.*/g);\n\nrequire('some/library');\n\ncoverage(function(coverageData) {\n // coverageData is an object keyed by filename.\n var stats = coverageData['/full/path/to/file.js'].stats()\n\n // the percentage of lines run versus total lines in file\n console.log(stats.percentage);\n\n // the number of missing lines\n console.log(stats.missing);\n\n // the number of lines run (seen)\n console.log(stats.seen);\n\n // an array of line objects representing 'missed' lines\n stats.lines;\n\n stats.lines.forEach(function(line) {\n // the line number of the line:\n console.log(line.number);\n\n // returns a string containing the source data for the line:\n console.log(line.source()); \n }); \n \n // return control back to the original require function\n coverage.release(); \n});\n````\n\nlicense\n=======\nnew BSD.\n", - "readmeFilename": "README.markdown", - "bugs": { - "url": "https://github.com/chrisdickinson/node-runforcover/issues" - }, - "homepage": "https://github.com/chrisdickinson/node-runforcover", - "_id": "runforcover@0.0.2", - "_from": "runforcover@~0.0.2" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/index.js deleted file mode 100644 index ea59662..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/index.js +++ /dev/null @@ -1 +0,0 @@ -require('./interface').coverageInterface() diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/interface.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/interface.js deleted file mode 100644 index a6455ed..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/interface.js +++ /dev/null @@ -1,50 +0,0 @@ -var assert = require('assert'); -var runforcover = require('../'); - -exports.coverageInterface = function() { - assert.ok(runforcover.cover); - - var originalRequire = require.extensions['.js']; - - var coverage = runforcover.cover(); - - assert.notEqual(originalRequire, require.extensions['.js']); - - var file = require('./src/coverage'); - - coverage(function(coverageData) { - assert.equal(Object.keys(coverageData).length, 1); - assert.equal(Object.keys(coverageData)[0], __dirname + '/src/coverage.js'); - - var fileCoverageData = coverageData[Object.keys(coverageData)[0]]; - - assert.ok(fileCoverageData.stats); - assert.ok(fileCoverageData.missing); - - var stats = fileCoverageData.stats(); - - assert.ok(stats.percentage !== undefined); - assert.ok(stats.lines !== undefined); - assert.ok(stats.missing !== undefined); - assert.ok(stats.seen !== undefined); - - assert.equal(stats.lines.length, 3); - assert.equal(stats.lines[0].source(), ' if(a > 0) {'); - assert.equal(stats.lines[1].source(), ' return a + 1;'); - assert.equal(stats.lines[2].source(), ' return a - 1;'); - - file.something(1); - stats = fileCoverageData.stats(); - - assert.equal(stats.lines.length, 1); - assert.equal(stats.lines[0].source(), ' return a - 1;'); - - file.something(-1); - stats = fileCoverageData.stats(); - - assert.equal(stats.lines.length, 0); - - coverage.release(); - assert.equal(require.extensions['.js'], originalRequire); - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/src/coverage.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/src/coverage.js deleted file mode 100644 index 5b88dfe..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/runforcover/test/src/coverage.js +++ /dev/null @@ -1,7 +0,0 @@ -exports.something = function(a) { - if(a > 0) { - return a + 1; - } else { - return a - 1; - } -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/LICENSE deleted file mode 100644 index 05eeeb8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/README.md deleted file mode 100644 index 59ad738..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/README.md +++ /dev/null @@ -1,143 +0,0 @@ -# Controlling Flow: callbacks are easy - -## What's actually hard? - -- Doing a bunch of things in a specific order. -- Knowing when stuff is done. -- Handling failures. -- Breaking up functionality into parts (avoid nested inline callbacks) - - -## Common Mistakes - -- Abandoning convention and consistency. -- Putting all callbacks inline. -- Using libraries without grokking them. -- Trying to make async code look sync. - -## Define Conventions - -- Two kinds of functions: *actors* take action, *callbacks* get results. -- Essentially the continuation pattern. Resulting code *looks* similar - to fibers, but is *much* simpler to implement. -- Node works this way in the lowlevel APIs already, and it's very flexible. - -## Callbacks - -- Simple responders -- Must always be prepared to handle errors, that's why it's the first argument. -- Often inline anonymous, but not always. -- Can trap and call other callbacks with modified data, or pass errors upwards. - -## Actors - -- Last argument is a callback. -- If any error occurs, and can't be handled, pass it to the callback and return. -- Must not throw. Return value ignored. -- return x ==> return cb(null, x) -- throw er ==> return cb(er) - -```javascript -// return true if a path is either -// a symlink or a directory. -function isLinkOrDir (path, cb) { - fs.lstat(path, function (er, s) { - if (er) return cb(er) - return cb(null, s.isDirectory() || s.isSymbolicLink()) - }) -} -``` - -# asyncMap - -## Usecases - -- I have a list of 10 files, and need to read all of them, and then continue when they're all done. -- I have a dozen URLs, and need to fetch them all, and then continue when they're all done. -- I have 4 connected users, and need to send a message to all of them, and then continue when that's done. -- I have a list of n things, and I need to dosomething with all of them, in parallel, and get the results once they're all complete. - - -## Solution - -```javascript -var asyncMap = require("slide").asyncMap -function writeFiles (files, what, cb) { - asyncMap(files, function (f, cb) { - fs.writeFile(f, what, cb) - }, cb) -} -writeFiles([my, file, list], "foo", cb) -``` - -# chain - -## Usecases - -- I have to do a bunch of things, in order. Get db credentials out of a file, - read the data from the db, write that data to another file. -- If anything fails, do not continue. -- I still have to provide an array of functions, which is a lot of boilerplate, - and a pita if your functions take args like - -```javascript -function (cb) { - blah(a, b, c, cb) -} -``` - -- Results are discarded, which is a bit lame. -- No way to branch. - -## Solution - -- reduces boilerplate by converting an array of [fn, args] to an actor - that takes no arguments (except cb) -- A bit like Function#bind, but tailored for our use-case. -- bindActor(obj, "method", a, b, c) -- bindActor(fn, a, b, c) -- bindActor(obj, fn, a, b, c) -- branching, skipping over falsey arguments - -```javascript -chain([ - doThing && [thing, a, b, c] -, isFoo && [doFoo, "foo"] -, subChain && [chain, [one, two]] -], cb) -``` - -- tracking results: results are stored in an optional array passed as argument, - last result is always in results[results.length - 1]. -- treat chain.first and chain.last as placeholders for the first/last - result up until that point. - - -## Non-trivial example - -- Read number files in a directory -- Add the results together -- Ping a web service with the result -- Write the response to a file -- Delete the number files - -```javascript -var chain = require("slide").chain -function myProgram (cb) { - var res = [], last = chain.last, first = chain.first - chain([ - [fs, "readdir", "the-directory"] - , [readFiles, "the-directory", last] - , [sum, last] - , [ping, "POST", "example.com", 80, "/foo", last] - , [fs, "writeFile", "result.txt", last] - , [rmFiles, "./the-directory", first] - ], res, cb) -} -``` - -# Conclusion: Convention Profits - -- Consistent API from top to bottom. -- Sneak in at any point to inject functionality. Testable, reusable, ... -- When ruby and python users whine, you can smile condescendingly. diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/index.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/index.js deleted file mode 100644 index 0a9277f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports=require("./lib/slide") diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map-ordered.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map-ordered.js deleted file mode 100644 index 5cca79a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map-ordered.js +++ /dev/null @@ -1,65 +0,0 @@ - -throw new Error("TODO: Not yet implemented.") - -/* -usage: - -Like asyncMap, but only can take a single cb, and guarantees -the order of the results. -*/ - -module.exports = asyncMapOrdered - -function asyncMapOrdered (list, fn, cb_) { - if (typeof cb_ !== "function") throw new Error( - "No callback provided to asyncMapOrdered") - - if (typeof fn !== "function") throw new Error( - "No map function provided to asyncMapOrdered") - - if (list === undefined || list === null) return cb_(null, []) - if (!Array.isArray(list)) list = [list] - if (!list.length) return cb_(null, []) - - var errState = null - , l = list.length - , a = l - , res = [] - , resCount = 0 - , maxArgLen = 0 - - function cb (index) { return function () { - if (errState) return - var er = arguments[0] - var argLen = arguments.length - maxArgLen = Math.max(maxArgLen, argLen) - res[index] = argLen === 1 ? [er] : Array.apply(null, arguments) - - // see if any new things have been added. - if (list.length > l) { - var newList = list.slice(l) - a += (list.length - l) - var oldLen = l - l = list.length - process.nextTick(function () { - newList.forEach(function (ar, i) { fn(ar, cb(i + oldLen)) }) - }) - } - - if (er || --a === 0) { - errState = er - cb_.apply(null, [errState].concat(flip(res, resCount, maxArgLen))) - } - }} - // expect the supplied cb function to be called - // "n" times for each thing in the array. - list.forEach(function (ar) { - steps.forEach(function (fn, i) { fn(ar, cb(i)) }) - }) -} - -function flip (res, resCount, argLen) { - var flat = [] - // res = [[er, x, y], [er, x1, y1], [er, x2, y2, z2]] - // return [[x, x1, x2], [y, y1, y2], [undefined, undefined, z2]] - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map.js deleted file mode 100644 index 1ced158..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/async-map.js +++ /dev/null @@ -1,56 +0,0 @@ - -/* -usage: - -// do something to a list of things -asyncMap(myListOfStuff, function (thing, cb) { doSomething(thing.foo, cb) }, cb) -// do more than one thing to each item -asyncMap(list, fooFn, barFn, cb) - -*/ - -module.exports = asyncMap - -function asyncMap () { - var steps = Array.prototype.slice.call(arguments) - , list = steps.shift() || [] - , cb_ = steps.pop() - if (typeof cb_ !== "function") throw new Error( - "No callback provided to asyncMap") - if (!list) return cb_(null, []) - if (!Array.isArray(list)) list = [list] - var n = steps.length - , data = [] // 2d array - , errState = null - , l = list.length - , a = l * n - if (!a) return cb_(null, []) - function cb (er) { - if (errState) return - var argLen = arguments.length - for (var i = 1; i < argLen; i ++) if (arguments[i] !== undefined) { - data[i - 1] = (data[i - 1] || []).concat(arguments[i]) - } - // see if any new things have been added. - if (list.length > l) { - var newList = list.slice(l) - a += (list.length - l) * n - l = list.length - process.nextTick(function () { - newList.forEach(function (ar) { - steps.forEach(function (fn) { fn(ar, cb) }) - }) - }) - } - - if (er || --a === 0) { - errState = er - cb_.apply(null, [errState].concat(data)) - } - } - // expect the supplied cb function to be called - // "n" times for each thing in the array. - list.forEach(function (ar) { - steps.forEach(function (fn) { fn(ar, cb) }) - }) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/bind-actor.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/bind-actor.js deleted file mode 100644 index 6a37072..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/bind-actor.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = bindActor -function bindActor () { - var args = - Array.prototype.slice.call - (arguments) // jswtf. - , obj = null - , fn - if (typeof args[0] === "object") { - obj = args.shift() - fn = args.shift() - if (typeof fn === "string") - fn = obj[ fn ] - } else fn = args.shift() - return function (cb) { - fn.apply(obj, args.concat(cb)) } -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/chain.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/chain.js deleted file mode 100644 index 17b3711..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/chain.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = chain -var bindActor = require("./bind-actor.js") -chain.first = {} ; chain.last = {} -function chain (things, cb) { - var res = [] - ;(function LOOP (i, len) { - if (i >= len) return cb(null,res) - if (Array.isArray(things[i])) - things[i] = bindActor.apply(null, - things[i].map(function(i){ - return (i===chain.first) ? res[0] - : (i===chain.last) - ? res[res.length - 1] : i })) - if (!things[i]) return LOOP(i + 1, len) - things[i](function (er, data) { - if (er) return cb(er, res) - if (data !== undefined) res = res.concat(data) - LOOP(i + 1, len) - }) - })(0, things.length) } diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/slide.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/slide.js deleted file mode 100644 index 6e9ec23..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/lib/slide.js +++ /dev/null @@ -1,3 +0,0 @@ -exports.asyncMap = require("./async-map") -exports.bindActor = require("./bind-actor") -exports.chain = require("./chain") diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/package.json deleted file mode 100644 index d4f2fd8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/slide/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "slide", - "version": "1.1.5", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "contributors": [ - { - "name": "S. Sriram", - "email": "ssriram@gmail.com", - "url": "http://www.565labs.com" - } - ], - "description": "A flow control lib small enough to fit on in a slide presentation. Derived live at Oak.JS", - "main": "./lib/slide.js", - "dependencies": {}, - "devDependencies": {}, - "engines": { - "node": "*" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/slide-flow-control.git" - }, - "license": "ISC", - "readme": "# Controlling Flow: callbacks are easy\n\n## What's actually hard?\n\n- Doing a bunch of things in a specific order.\n- Knowing when stuff is done.\n- Handling failures.\n- Breaking up functionality into parts (avoid nested inline callbacks)\n\n\n## Common Mistakes\n\n- Abandoning convention and consistency.\n- Putting all callbacks inline.\n- Using libraries without grokking them.\n- Trying to make async code look sync.\n\n## Define Conventions\n\n- Two kinds of functions: *actors* take action, *callbacks* get results.\n- Essentially the continuation pattern. Resulting code *looks* similar\n to fibers, but is *much* simpler to implement.\n- Node works this way in the lowlevel APIs already, and it's very flexible.\n\n## Callbacks\n\n- Simple responders\n- Must always be prepared to handle errors, that's why it's the first argument.\n- Often inline anonymous, but not always.\n- Can trap and call other callbacks with modified data, or pass errors upwards.\n\n## Actors\n\n- Last argument is a callback.\n- If any error occurs, and can't be handled, pass it to the callback and return.\n- Must not throw. Return value ignored.\n- return x ==> return cb(null, x)\n- throw er ==> return cb(er)\n\n```javascript\n// return true if a path is either\n// a symlink or a directory.\nfunction isLinkOrDir (path, cb) {\n fs.lstat(path, function (er, s) {\n if (er) return cb(er)\n return cb(null, s.isDirectory() || s.isSymbolicLink())\n })\n}\n```\n\n# asyncMap\n\n## Usecases\n\n- I have a list of 10 files, and need to read all of them, and then continue when they're all done.\n- I have a dozen URLs, and need to fetch them all, and then continue when they're all done.\n- I have 4 connected users, and need to send a message to all of them, and then continue when that's done.\n- I have a list of n things, and I need to dosomething with all of them, in parallel, and get the results once they're all complete.\n\n\n## Solution\n\n```javascript\nvar asyncMap = require(\"slide\").asyncMap\nfunction writeFiles (files, what, cb) {\n asyncMap(files, function (f, cb) {\n fs.writeFile(f, what, cb)\n }, cb)\n}\nwriteFiles([my, file, list], \"foo\", cb)\n```\n\n# chain\n\n## Usecases\n\n- I have to do a bunch of things, in order. Get db credentials out of a file,\n read the data from the db, write that data to another file.\n- If anything fails, do not continue.\n- I still have to provide an array of functions, which is a lot of boilerplate,\n and a pita if your functions take args like\n\n```javascript\nfunction (cb) {\n blah(a, b, c, cb)\n}\n```\n\n- Results are discarded, which is a bit lame.\n- No way to branch.\n\n## Solution\n\n- reduces boilerplate by converting an array of [fn, args] to an actor\n that takes no arguments (except cb)\n- A bit like Function#bind, but tailored for our use-case.\n- bindActor(obj, \"method\", a, b, c)\n- bindActor(fn, a, b, c)\n- bindActor(obj, fn, a, b, c)\n- branching, skipping over falsey arguments\n\n```javascript\nchain([\n doThing && [thing, a, b, c]\n, isFoo && [doFoo, \"foo\"]\n, subChain && [chain, [one, two]]\n], cb)\n```\n\n- tracking results: results are stored in an optional array passed as argument,\n last result is always in results[results.length - 1].\n- treat chain.first and chain.last as placeholders for the first/last\n result up until that point.\n\n\n## Non-trivial example\n\n- Read number files in a directory\n- Add the results together\n- Ping a web service with the result\n- Write the response to a file\n- Delete the number files\n\n```javascript\nvar chain = require(\"slide\").chain\nfunction myProgram (cb) {\n var res = [], last = chain.last, first = chain.first\n chain([\n [fs, \"readdir\", \"the-directory\"]\n , [readFiles, \"the-directory\", last]\n , [sum, last]\n , [ping, \"POST\", \"example.com\", 80, \"/foo\", last]\n , [fs, \"writeFile\", \"result.txt\", last]\n , [rmFiles, \"./the-directory\", first]\n ], res, cb)\n}\n```\n\n# Conclusion: Convention Profits\n\n- Consistent API from top to bottom.\n- Sneak in at any point to inject functionality. Testable, reusable, ...\n- When ruby and python users whine, you can smile condescendingly.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/slide-flow-control/issues" - }, - "homepage": "https://github.com/isaacs/slide-flow-control", - "_id": "slide@1.1.5", - "_from": "slide@*" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/LICENSE b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/LICENSE deleted file mode 100644 index 187e8db..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Isaac Z. Schlueter - -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/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/README.md b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/README.md deleted file mode 100644 index 954d063..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/README.md +++ /dev/null @@ -1,20 +0,0 @@ -This is a thingie to parse the "yamlish" format used to serialize -objects in the TAP format. - -It's like yaml, but just a tiny little bit smaller. - -Usage: - - var yamlish = require("yamlish") - // returns a string like: - /* - some: - object: - - full - - of - pretty: things - */ - yamlish.encode({some:{object:["full", "of"]}, pretty:"things"}) - - // returns the object - yamlish.decode(someYamlishString) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/package.json deleted file mode 100644 index 4409acc..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "yamlish", - "description": "Parser/encoder for the yamlish format", - "repository": { - "type": "git", - "url": "https://github.com/isaacs/yamlish" - }, - "version": "0.0.5", - "main": "yamlish.js", - "keywords": [ - "yaml", - "yamlish", - "test", - "anything", - "protocol", - "tap" - ], - "license": { - "type": "MIT", - "url": "http://github.com/isaacs/yamlish/raw/master/LICENSE" - }, - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me/" - }, - "readme": "This is a thingie to parse the \"yamlish\" format used to serialize\nobjects in the TAP format.\n\nIt's like yaml, but just a tiny little bit smaller.\n\nUsage:\n\n var yamlish = require(\"yamlish\")\n // returns a string like:\n /*\n some:\n object:\n - full\n - of\n pretty: things\n */\n yamlish.encode({some:{object:[\"full\", \"of\"]}, pretty:\"things\"})\n\n // returns the object\n yamlish.decode(someYamlishString)\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/yamlish/issues" - }, - "homepage": "https://github.com/isaacs/yamlish", - "_id": "yamlish@0.0.5", - "_from": "yamlish@*" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/yamlish.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/yamlish.js deleted file mode 100644 index dd8c370..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/node_modules/yamlish/yamlish.js +++ /dev/null @@ -1,260 +0,0 @@ -exports.encode = encode -exports.decode = decode - -var seen = [] -function encode (obj, indent) { - var deep = arguments[2] - if (!indent) indent = " " - - if (obj instanceof String || - Object.prototype.toString.call(obj) === "[object String]") { - obj = obj.toString() - } - - if (obj instanceof Number || - Object.prototype.toString.call(obj) === "[object Number]") { - obj = obj.valueOf() - } - - // take out the easy ones. - switch (typeof obj) { - case "string": - obj = obj.trim() - if (obj.indexOf("\n") !== -1) { - return "|\n" + indent + obj.split(/\r?\n/).join("\n"+indent) - } else { - return (obj) - } - - case "number": - return obj.toString(10) - - case "function": - return encode(obj.toString(), indent, true) - - case "boolean": - return obj.toString() - - case "undefined": - // fallthrough - case "object": - // at this point we know it types as an object - if (!obj) return "~" - - if (obj instanceof Date || - Object.prototype.toString.call(obj) === "[object Date]") { - return JSON.stringify("[Date " + obj.toISOString() + "]") - } - - if (obj instanceof RegExp || - Object.prototype.toString.call(obj) === "[object RegExp]") { - return JSON.stringify(obj.toString()) - } - - if (obj instanceof Boolean || - Object.prototype.toString.call(obj) === "[object Boolean]") { - return obj.toString() - } - - if (seen.indexOf(obj) !== -1) { - return "[Circular]" - } - seen.push(obj) - - if (typeof Buffer === "function" && - typeof Buffer.isBuffer === "function" && - Buffer.isBuffer(obj)) return obj.inspect() - - if (obj instanceof Error) { - var o = { name: obj.name - , message: obj.message - , type: obj.type } - - if (obj.code) o.code = obj.code - if (obj.errno) o.errno = obj.errno - if (obj.type) o.type = obj.type - obj = o - } - - var out = "" - - if (Array.isArray(obj)) { - var out = "\n" + indent + "- " +obj.map(function (item) { - return encode(item, indent + " ", true) - }).join("\n"+indent + "- ") - break - } - - // an actual object - var keys = Object.keys(obj) - , niceKeys = keys.map(function (k) { - return (k.match(/^[a-zA-Z0-9_]+$/) ? k : JSON.stringify(k)) + ": " - }) - //console.error(keys, niceKeys, obj) - var maxLength = Math.max.apply(Math, niceKeys.map(function (k) { - return k.length - }).concat(0)) - //console.error(niceKeys, maxLength) - - var spaces = new Array(maxLength + 1).join(" ") - - if (!deep) indent += " " - out = "\n" + indent + keys.map(function (k, i) { - var niceKey = niceKeys[i] - return niceKey + spaces.substr(niceKey.length) - + encode(obj[k], indent + " ", true) - }).join("\n" + indent) - break - - default: return "" - } - if (!deep) seen.length = 0 - return out -} - -function decode (str) { - var v = str.trim() - , d - , dateRe = /^\[Date ([0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(?::[0-9]{2})?(?:\.[0-9]{3})?(?:[A-Z]+)?)\]$/ - - if (v === "~") return null - - try { - var jp = JSON.parse(str) - } catch (e) { - var jp = "" - } - - if (jp && - typeof jp === "string" && - (d = jp.match(dateRe)) && - (d = Date.parse(d[1]))) { - return new Date(d) - } - - if (typeof jp === "boolean") return jp - if (v && !isNaN(v)) return parseInt(v, 10) - - // something interesting. - var lines = str.split(/\r?\n/) - // check if it's some kind of string or something. - // if the first line is > or | then it's a wrapping indented string. - // if the first line is blank, and there are many lines, - // then it's an array or object. - // otherwise, it's just "" - var first = lines.shift().trim() - if (lines.length) lines = undent(lines) - switch (first) { - case "|": - return lines.join("\n") - case ">": - return lines.join("\n").split(/\n{2,}/).map(function (l) { - return l.split(/\n/).join(" ") - }).join("\n") - default: - if (!lines.length) return first - // array or object. - // the first line will be either "- value" or "key: value" - return lines[0].charAt(0) === "-" ? decodeArr(lines) : decodeObj(lines) - } -} - -function decodeArr (lines) { - var out = [] - , key = 0 - , val = [] - for (var i = 0, l = lines.length; i < l; i ++) { - // if it starts with a -, then it's a new thing - var line = lines[i] - if (line.charAt(0) === "-") { - if (val.length) { - out[key ++] = decode(val.join("\n")) - val.length = 0 - } - val.push(line.substr(1).trim()) - } else if (line.charAt(0) === " ") { - val.push(line) - } else return [] - } - if (val.length) { - out[key ++] = decode(val.join("\n")) - } - return out -} - -function decodeObj (lines) { - var out = {} - , val = [] - , key = null - - for (var i = 0, l = lines.length; i < l; i ++) { - var line = lines[i] - if (line.charAt(0) === " ") { - val.push(line) - continue - } - // some key:val - if (val.length) { - out[key] = decode(val.join("\n")) - val.length = 0 - } - // parse out the quoted key - var first - if (line.charAt(0) === "\"") { - for (var ii = 1, ll = line.length, esc = false; ii < ll; ii ++) { - var c = line.charAt(ii) - if (c === "\\") { - esc = !esc - } else if (c === "\"" && !esc) { - break - } - } - key = JSON.parse(line.substr(0, ii + 1)) - line = line.substr(ii + 1) - first = line.substr(line.indexOf(":") + 1).trim() - } else { - var kv = line.split(":") - key = kv.shift() - first = kv.join(":").trim() - } - // now we've set a key, and "first" has the first line of the value. - val.push(first.trim()) - } - if (val.length) out[key] = decode(val.join("\n")) - return out -} - -function undent (lines) { - var i = lines[0].match(/^\s*/)[0].length - return lines.map(function (line) { - return line.substr(i) - }) -} - - -// XXX Turn this into proper tests. -if (require.main === module) { -var obj = [{"bigstring":new Error().stack} - ,{ar:[{list:"of"},{some:"objects"}]} - ,{date:new Date()} - ,{"super huge string":new Error().stack} - ] - -Date.prototype.toJSON = function (k, val) { - console.error(k, val, this) - return this.toISOString() + " (it's a date)" -} - -var enc = encode(obj) - , dec = decode(enc) - , encDec = encode(dec) - -console.error(JSON.stringify({ obj : obj - , enc : enc.split(/\n/) - , dec : dec }, null, 2), encDec === enc) - -var num = 100 - , encNum = encode(num) - , decEncNum = decode(encNum) -console.error([num, encNum, decEncNum]) -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/package.json deleted file mode 100644 index c86cb7c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/package.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "name": "tap", - "version": "0.4.11", - "author": { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - "description": "A Test-Anything-Protocol library", - "bin": { - "tap": "bin/tap.js" - }, - "main": "lib/main.js", - "engines": { - "node": ">=0.8" - }, - "dependencies": { - "buffer-equal": "~0.0.0", - "deep-equal": "~0.0.0", - "difflet": "~0.2.0", - "glob": "~3.2.1", - "inherits": "*", - "mkdirp": "~0.3", - "nopt": "~2", - "runforcover": "~0.0.2", - "slide": "*", - "yamlish": "*" - }, - "keywords": [ - "assert", - "test", - "tap" - ], - "contributors": [ - { - "name": "Isaac Z. Schlueter", - "email": "i@izs.me", - "url": "http://blog.izs.me" - }, - { - "name": "baudehlo", - "email": "helpme+github@gmail.com" - } - ], - "license": { - "type": "MIT", - "url": "https://github.com/isaacs/node-tap/raw/master/LICENSE" - }, - "repository": { - "type": "git", - "url": "git://github.com/isaacs/node-tap.git" - }, - "scripts": { - "test": "bin/tap.js test/*.js" - }, - "devDependencies": {}, - "readme": "This is a mix-and-match set of utilities that you can use to write test\nharnesses and frameworks that communicate with one another using the\nTest Anything Protocol.\n\nIf you don't yet know what TAP is, [you better ask\nsomebody](http://testanything.org/).\n\nDefault Usage:\n\n1. Make a directory. Maybe call it 'test'. That'd be nice and obvious.\n2. Put a bunch of test scripts in there. If they're node programs, then\n they should be \".js\". Anything else is assumed to be some kind of shell\n script, which should have a shebang line.\n3. `npm install tap`\n4. Update package.json scripts.test to include `tap ./test` [example\n gist](https://gist.github.com/4469613)\n5. `npm test`\n\nThe output will be TAP-compliant.\n\nFor extra special bonus points, you can do something like this:\n\n var test = require(\"tap\").test\n test(\"make sure the thingie is a thing\", function (t) {\n t.equal(thingie, \"thing\", \"thingie should be thing\")\n t.deepEqual(array, [\"foo\", \"bar\"], \"array has foo and bar elements\")\n t.deepEqual(object, {foo: 42}, \"object has foo property\")\n t.type(thingie, \"string\", \"type of thingie is string\")\n t.ok(true, \"this is always true\")\n t.notOk(false, \"this is never true\")\n t.test(\"a child test\", function (t) {\n t.equal(this, superEasy, \"right!?\")\n t.similar(7, 2, \"ever notice 7 is kinda like 2?\", {todo: true})\n t.test(\"so skippable\", {skip: true}, function (t) {\n t.plan(1) // only one test in this block\n t.ok(true, \"but when the flag changes, it'll pass\")\n // no need to end, since we had a plan.\n })\n t.end()\n })\n t.ok(99, \"can also skip individual assertions\", {skip: true})\n // end lets it know it's over.\n t.end()\n })\n test(\"another one\", function (t) {\n t.plan(1)\n t.ok(true, \"It's ok to plan, and also end. Watch.\")\n t.end() // but it must match the plan!\n })\n\nNode-tap is actually a collection of several modules, any of which may be\nmixed and matched however you please.\n\nIf you don't like this test framework, and think you can do much much\nbetter, *I strongly encourage you to do so!* If you use this library,\nhowever, at least to output TAP-compliant results when `process.env.TAP`\nis set, then the data coming out of your framework will be much more\nconsumable by machines.\n\nYou can also use this to build programs that *consume* the TAP data, so\nthis is very useful for CI systems and such.\n\n* tap-assert: A collection of assert functions that return TAP result\n objects.\n* tap-consumer: A stream interface for consuming TAP data.\n* tap-producer: A class that produces a TAP stream by taking in result\n objects.\n* tap-results: A class for keeping track of TAP result objects as they\n pass by, counting up skips, passes, fails, and so on.\n* tap-runner: A program that runs through a directory running all the\n tests in it. (Tests which may or may not be TAP-outputting tests. But\n it's better if they are.)\n* tap-test: A class for actually running tests.\n* tap-harness: A class that runs tests. (Tests are also Harnesses,\n which is how sub-tests run.)\n* tap-global-harness: A default harness that provides the top-level\n support for running TAP tests.\n\n## Experimental Code Coverage with runforcover & bunker:\n\n```\nTAP_COV=1 tap ./test [--cover=./lib,foo.js] [--coverage-dir=./coverage]\n```\n\nThis feature is experimental, and will most likely change somewhat\nbefore being finalized. Feedback welcome.\n", - "readmeFilename": "README.md", - "bugs": { - "url": "https://github.com/isaacs/node-tap/issues" - }, - "homepage": "https://github.com/isaacs/node-tap", - "bundleDependencies": [ - "inherits", - "tap-consumer", - "yamlish" - ], - "_id": "tap@0.4.11", - "_shasum": "458f386816927287da2d1ff996e3541750b0bf29", - "_from": "tap@>=0.2.3", - "_resolved": "https://registry.npmjs.org/tap/-/tap-0.4.11.tgz" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/bailout.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/bailout.js deleted file mode 100644 index 498035c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/bailout.js +++ /dev/null @@ -1,36 +0,0 @@ -var tap = require("tap") - , test = tap.test - -test("bailout test", { skip: false }, function (t) { - - // t.once("bailout", function () { - // console.error("bailout event")//, t) - // t.clear() - // }) - - // t.once("end", function () { - // console.error("end event") - // }) - - // simulate three tests where the second bails out. - t.test("first", function (t) { - t.pass("this is ok") - t.end() - }) - - t.test("bailout", function (t) { - console.error("bailout test") - t.pass("pass") - t.bailout("bail out message") - t.fail("fail") - t.end() - }) - - t.test("second (should not happen)", function (t) { - t.fail("this should not happen") - t.end() - }) - - t.end() - -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/foo.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/foo.js deleted file mode 100644 index 6360156..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/foo.js +++ /dev/null @@ -1 +0,0 @@ -process.stdin diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/t.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/t.js deleted file mode 100644 index 581d24b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test-disabled/t.js +++ /dev/null @@ -1,16 +0,0 @@ -var test = require('tap').test; - -function foo() { - throw new Error('one'); -} - -test('demonstrate bug in t.throws', function (t) { - t.throws( - function () { - foo(); - }, - new Error('two')), - // "this should throw", - // {}); // not 'one'! - t.end(); -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/buffer_compare.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/buffer_compare.js deleted file mode 100644 index b1e1505..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/buffer_compare.js +++ /dev/null @@ -1,11 +0,0 @@ -var test = require("../").test - -test("same buffers", function (t) { - t.same(new Buffer([3,4,243]), new Buffer([3,4,243])) - t.end() -}) - -test("not same buffers", function (t) { - t.notSame(new Buffer([3,5,243]), new Buffer([3,4,243])) - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/common.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/common.js deleted file mode 100644 index 7cc43c1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/common.js +++ /dev/null @@ -1,32 +0,0 @@ -exports.taps = ["Tests for the foo module" - ,{ok:true, name:"test that the foo is fooish" - ,file:"foo.js", line:8, name:"fooish test" - ,stack:new Error("fooish").stack} - ,{ok:false, name:"a test that the bar is barish" - ,file:"bar.js", line:25 - ,expected:"bar\nbar\nbaz", actual:"rab\nrib\nzib" - ,hash:{more:"\nstuff\nhere\n",regexp:/asdf/}} - ,"Quux module tests" - ,"This is a longer comment" - ,{ok:true, name:"an easy one."} - ,{ok:false, name:"bloooooo" - ,expected:"blerggeyyy" - ,actual:"blorggeyy"} - ,{ok:false, name:"array test" - ,expected:[{ok:true},{ok:true},{stack:new Error().stack}] - ,actual:[1234567890,123456789,{error:new Error("yikes")}]} - ,{ok:true, name:"nulltest" - ,expected:undefined, actual:null} - ,{ok:true, name:"weird key test" - ,expected:"weird key" - ,actual:"weird key" - ,"this object":{"has a ":"weird key" - ,"and a looooooooonnnnnnnnnggg":"jacket"}} - ,{ok:true, name:"regexp test" - ,regexp:/asdf/,function:function (a,b) { return a + b }} - ] - -if (require.main === module) { - console.log("1..1") - console.log("ok 1 - just setup, nothing relevant") -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/debug-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/debug-test.js deleted file mode 100644 index a99ad40..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/debug-test.js +++ /dev/null @@ -1,16 +0,0 @@ -var tap = require("../") - , fs = require("fs") - , cp = require("child_process") - , util = require("util") - -tap.test("debug test", function (t) { - console.error("debug test") - t.plan(1) - console.error("t.plan="+t._plan) - - cp.exec("../bin/tap.js --debug meta-test.js", function (err, stdo, stde) { - console.error(util.inspect(stde)) - t.notEqual(stde.indexOf("debugger listening on port"), -1, "Should output debugger message") - t.end(); - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/deep.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/deep.js deleted file mode 100644 index 52b6110..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/deep.js +++ /dev/null @@ -1,43 +0,0 @@ -var tap = require("../") - , test = tap.test - -test("deepEquals shouldn't care about key order", function (t) { - t.deepEqual({ a : 1, b : 2 }, { b : 2, a : 1 }) - t.end() -}) - -test("deepEquals shouldn't care about key order recursively", function (t) { - t.deepEqual( - { x : { a : 1, b : 2 }, y : { c : 3, d : 4 } }, - { y : { d : 4, c : 3 }, x : { b : 2, a : 1 } } - ) - t.end() -}) - -test("deepEquals shoudn't care about key order but still might", function (t) { - t.deepEqual( - [ { foo: - { z: 100 - , y: 200 - , x: 300 } } - , "bar" - , 11 - , { baz: - { d : 4 - , a: 1 - , b: 2 - , c: 3 } } ] - , [ { foo : - { z: 100 - , y: 200 - , x: 300 } } - , "bar" - , 11 - , { baz: - { a: 1 - , b: 2 - , c: 3 - , d: 4 } } ] - ) - t.end() -}); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/end-exception/t.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/end-exception/t.js deleted file mode 100644 index eaa5b46..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/end-exception/t.js +++ /dev/null @@ -1,12 +0,0 @@ -var test = require("../../").test - -test(function (t) { - t.plan(1) - - t.on('end', function () { - console.log('end()') - throw new Error('beep') - }) - - t.equal(3, 3) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/executed.sh b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/executed.sh deleted file mode 100755 index 7300937..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/executed.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "1..1" -echo "ok 1 File with executable bit should be executed" diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/expose-gc-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/expose-gc-test.js deleted file mode 100644 index 87377c1..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/expose-gc-test.js +++ /dev/null @@ -1,46 +0,0 @@ -var tap = require("../") - , fs = require("fs") - , cp = require("child_process") - -fs.writeFileSync("gc-script.js", "console.log(!!global.gc)", "utf8") - -tap.test("gc test when the gc isn't there", function (t) { - console.error("gc test") - t.plan(1) - console.error("t.plan="+t._plan) - - cp.exec("../bin/tap.js ./gc-script", function (err, stdo, stde) { - console.error("assert gc does not exist") - t.ok("false", stdo) - }) -}) - -tap.test("gc test when the gc should be there", function (t) { - console.error("gc test") - t.plan(2) - console.error("t.plan="+t._plan) - - t.test("test for gc using --gc", function (t) { - console.error("gc test using --gc") - t.plan(1) - console.error("t.plan="+t._plan) - - cp.exec("../bin/tap.js --gc ./gc-script", function (err, stdo, stde) { - console.error("assert gc exists") - t.ok("true", stdo) - }) - }) - - t.test("test for gc using --expose-gc", function (t) { - console.error("gc test using --expose-gc") - t.plan(1) - console.error("t.plan="+t._plan) - - cp.exec("../bin/tap.js --expose-gc ./gc-script", function (err, stdo) { - console.error("assert gc exists") - t.ok("true", stdo) - }) - }) -}) - -fs.unlinkSync("gc-script.js"); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/independent-timeouts.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/independent-timeouts.js deleted file mode 100644 index 5a35e61..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/independent-timeouts.js +++ /dev/null @@ -1,16 +0,0 @@ -// https://github.com/isaacs/node-tap/issues/23 - -var tap = require("../") - , test = tap.test - -test("finishes in time", {timeout: 500}, function(t) { - setTimeout(function () { - t.end(); - }, 300); -}) -test("finishes in time too", {timeout: 500}, function(t) { - setTimeout(function () { - t.end(); - }, 300); -}) - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/isolated-conf-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/isolated-conf-test.js deleted file mode 100644 index d8bfae6..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/isolated-conf-test.js +++ /dev/null @@ -1,16 +0,0 @@ -// https://github.com/isaacs/node-tap/issues/24 - -var tap = require("../") - , test = tap.test - -var config = {foo: "bar"} -test("one", config, function(t) { - t.equal(t.conf.foo, "bar") - t.equal(t.conf.name, "one") // before fix this would be "two" - t.end() -}) -test("two", config, function(t) { - t.equal(t.conf.foo, "bar") - t.equal(t.conf.name, "two") - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/meta-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/meta-test.js deleted file mode 100644 index 8f56f26..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/meta-test.js +++ /dev/null @@ -1,73 +0,0 @@ -var tap = require("../") - , test = tap.test - -test("meta test", { skip: false }, function (t) { - - function thr0w() { throw new Error('raburt') } - function noop () {} - - // this also tests the ok/notOk functions - t.once("end", section2) - t.ok(true, "true is ok") - t.ok(noop, "function is ok") - t.ok({}, "object is ok") - t.ok(t, "t is ok") - t.ok(100, "number is ok") - t.ok("asdf", "string is ok") - t.notOk(false, "false is notOk") - t.notOk(0, "0 is notOk") - t.notOk(null, "null is notOk") - t.notOk(undefined, "undefined is notOk") - t.notOk(NaN, "NaN is notOk") - t.notOk("", "empty string is notOk") - t.throws(thr0w, "Thrower throws"); - t.doesNotThrow(noop, "noop does not throw"); - t.similar({foo:"bar", bar:"foo"}, {foo:"bar"}, "similar objects are ok"); - t.dissimilar({}, {mandatory:"value"}, "dissimilar objects are ok"); - t.dissimilar(null, {}, "null is dissimilar from an object, even with no keys"); - - // a few failures. - t.ifError(new Error("this is an error")) - t.ifError({ message: "this is a custom error" }) - t.ok(false, "false is not ok") - t.notOk(true, "true is not not ok") - t.similar(null, {}, "Null is not similar to an object, even with no keys"); - t.throws(noop, "noop does not throw"); - t.throws(noop, new Error("Whoops!"), "noop does not throw an Error"); - t.throws(noop, {name:"MyError", message:"Whoops!"}, "noop does not throw a MyError"); - t.doesNotThrow(thr0w, "thrower does throw"); - - // things that are like other things - t.like("asdf", "asdf") - t.like("asdf", /^a.*f$/) - t.like(100, 100) - t.like(100, '100') - t.like(100, 100.0) - t.unlike("asdf", "fdsa") - t.unlike("asdf", /^you jelly, bro?/) - t.unlike(100, 100.1) - t.like(true, 1) - t.like(null, undefined) - t.like(true, [1]) - t.like(false, []) - t.like('', []) - t.end() - - function section2 () { - var results = t.results - t.clear() - t.ok(true, "sanity check") - t.notOk(results.ok, "not ok") - t.equal(results.tests, 39, "total test count") - t.equal(results.passTotal, 30, "tests passed") - t.equal(results.fail, 9, "tests failed") - t.type(results.ok, "boolean", "ok is boolean") - t.type(results.skip, "number", "skip is number") - t.type(results, "Results", "results isa Results") - t.type(t, "Test", "test isa Test") - t.type(t, "Harness", "test isa Harness") - t.end() - } -}) - - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/nested-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/nested-test.js deleted file mode 100644 index 493f13a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/nested-test.js +++ /dev/null @@ -1,23 +0,0 @@ -var tap = require("../"), - test = tap.test, - util = require('util'); - -test("parent", function (t) { - // TODO: Make grandchildren tests count? - t.plan(3); - t.ok(true, 'p test'); - t.test("subtest", function (t) { - t.ok(true, 'ch test'); - t.test('nested subtest', function(t) { - t.ok(true, 'grch test'); - t.end(); - }); - t.end(); - }); - t.test('another subtest', function(t) { - t.ok(true, 'ch test 2'); - t.end(); - }); - t.end(); -}) - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/non-tap-output.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/non-tap-output.js deleted file mode 100644 index 929e9aa..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/non-tap-output.js +++ /dev/null @@ -1,12 +0,0 @@ -console.log("everything is fine\n" - +"there are no errors\n" - +"this output is not haiku.\n\n" - +"is 8 ok?\n" - +"ok, 8 can stay.\n" - +"ok 100 might be confusing\n" - +" but: nevertheless, here we are\n" - +" this: is indented\n" - +" and: it\n" - +" might: ~\n" - +" be: yaml?\n" - +"ok done now, exiting") diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/not-executed.sh b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/not-executed.sh deleted file mode 100644 index de46caa..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/not-executed.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -echo "1..1" -echo "not ok 1 File without executable bit should not be run" diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/output-childtest-description.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/output-childtest-description.js deleted file mode 100644 index e025ba8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/output-childtest-description.js +++ /dev/null @@ -1,50 +0,0 @@ -var tap = require("../") - , fs = require("fs") - , path = require('path') - , cp = require("child_process") - , nestedTests = - [ "var test = require('..').test" - , "test('parent test description', function (t) {" - , " t.plan(2)" - , " t.ok(true, 'test in parent')" - , " t.test('child test description', function (t) {" - , " t.plan(1)" - , " t.ok(true, 'test in child') " - , " })" - , "})" - ].join("\n") - , nestedTestsFile = path.join(__dirname, "nested-tests-fixture.js") - -fs.writeFileSync(nestedTestsFile, nestedTests, "utf8") -console.log(nestedTestsFile); - -tap.test("nested tests, parent and child pass", function (t) { - /* - * Ensure the output includes the following lines in the right order: - * '# parent test description' - * 'ok 1 test in parent' - * '# child test description' - * 'ok 2 test in child' - */ - - t.plan(5) - - cp.exec("node " + nestedTestsFile, function (err, stdo, stde) { - var lines = stdo.split("\n") - , parentDes = lines.indexOf("# parent test description") - , parentRes = lines.indexOf("ok 1 test in parent") - , childDes = lines.indexOf("# child test description") - , childRes = lines.indexOf("ok 2 test in child") - - t.notEqual(parentDes, -1, "outputs parent description") - t.notEqual(childDes, -1, "outputs child description") - - t.ok(parentDes < parentRes , "outputs parent description before parent result") - t.ok(parentRes < childDes , "outputs parent result before child description") - t.ok(childDes < childRes , "outputs child description before child result") - - fs.unlinkSync(nestedTestsFile); - t.end() - }) -}) - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/result-trap.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/result-trap.js deleted file mode 100644 index 1ac600f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/result-trap.js +++ /dev/null @@ -1,25 +0,0 @@ -var tap = require("../") - -tap.test("trap result #TODO", function (t0) { - - console.log("not ok 1 result event trapping #TODO") - return t0.end() - - t0.plan(3) - - var t1 = new(tap.Harness)(tap.Test).test() - - t1.plan(1) - - t1.on("result", function (res) { - if (res.wanted === 4) { - t0.equal(res.found, 3) - t0.equal(res.wanted, 4) - - t0.end() - t1.end() - } - }) - - t1.equal(1 + 2, 4) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/segv.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/segv.js deleted file mode 100644 index 4bb55ab..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/segv.js +++ /dev/null @@ -1,69 +0,0 @@ -var test = require('../').test -var Runner = require('../lib/tap-runner.js') -var TC = require('../lib/tap-consumer.js') - -var fs = require('fs') -var spawn = require('child_process').spawn -var segv = - 'int main (void) {\n' + - ' char *s = "hello world";\n' + - ' *s = \'H\';\n' + - '}\n' -var compiled = false - -test('setup', function (t) { - fs.writeFile('segv.c', segv, 'utf8', function (er) { - if (er) - throw er - var cp = spawn('gcc', ['segv.c', '-o', 'segv']) - cp.on('exit', function (code, sig) { - if (code !== 0) { - t.bailout('failed to compile segv program') - return - } - t.pass('compiled seg faulter') - t.end() - }) - }) -}) - -test('segv', function (t) { - var r = new Runner({argv:{remain:['./segv']}}) - var tc = new TC() - var expect = - [ 'TAP version 13' - , './segv' - , { 'id': 1, - 'ok': false, - 'name': ' ././segv', - 'exit': null, - 'timedOut': true, - 'signal': 'SIGTERM', - 'command': '"./segv"' } - , 'tests 1' - , 'fail 1' ] - r.pipe(tc) - tc.on('data', function (d) { - var e = expect.shift() - - // specific signal can be either term or bus - if (d.signal && e.signal) - e.signal = d.signal === "SIGTERM" || d.signal === "SIGBUS" ? - d.signal : e.signal - - t.same(d, e) - }) - tc.on('end', function () { - t.equal(expect.length, 0) - t.end() - }) -}) - -test('cleanup', function (t) { - fs.unlink('segv.c', function () { - fs.unlink('segv', function () { - t.pass('cleaned up') - t.end() - }) - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test-with-plan.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test-with-plan.js deleted file mode 100644 index 813c4cf..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test-with-plan.js +++ /dev/null @@ -1,16 +0,0 @@ -var tap = require("../") - , test = tap.test - , plan = tap.plan - -plan(2) - -test("trivial success", function (t) { - t.ok(true, "it works") - t.end() -}) - -test("two tests", function (t) { - t.equal(255, 0xFF, "math should work") - t.notOk(false, "false should not be ok") - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test.js deleted file mode 100644 index 64451ae..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/simple-harness-test.js +++ /dev/null @@ -1,13 +0,0 @@ -var tap = require("../") - , test = tap.test - -test("trivial success", function (t) { - t.ok(true, "it works") - t.end() -}) - -test("two tests", function (t) { - t.equal(255, 0xFF, "math should work") - t.notOk(false, "false should not be ok") - t.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/test-test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/test-test.js deleted file mode 100644 index f383941..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/test-test.js +++ /dev/null @@ -1,91 +0,0 @@ -var tap = require("../") - , test = tap.test - , Test = require("../lib/tap-test") - , Harness = require("../lib/tap-harness") - -test("testing the test object", function (t) { - - t.isa(t, Test, "test object should be instanceof Test") - t.isa(t, Harness, "test object should be instanceof Harness") - t.is(t._Test, Test, "test._Test should be the Test class") - - // now test all the methods. - ; [ "isNotDeepEqual" - , "equals" - , "inequivalent" - , "threw" - , "strictEqual" - , "emit" - , "fail" - , "strictEquals" - , "notLike" - , "dissimilar" - , "true" - , "assert" - , "is" - , "ok" - , "isEqual" - , "isDeeply" - , "deepEqual" - , "deepEquals" - , "pass" - , "length" - , "skip" - , "isNotEqual" - , "looseEquals" - , "false" - , "notDeeply" - , "ifErr" - , "hasFields" - , "isNotDeeply" - , "like" - , "similar" - , "notOk" - , "isDissimilar" - , "isEquivalent" - , "doesNotEqual" - , "isSimilar" - , "notDeepEqual" - , "type" - , "notok" - , "isInequivalent" - , "isNot" - , "same" - , "isInequal" - , "_endNice" - , "ifError" - , "iferror" - , "clear" - , "has" - , "not" - , "timeout" - , "notSimilar" - , "isUnlike" - , "notEquals" - , "unsimilar" - , "result" - , "doesNotThrow" - , "error" - , "constructor" - , "notEqual" - , "throws" - , "isLike" - , "isNotSimilar" - , "isNotEquivalent" - , "inequal" - , "notEquivalent" - , "isNotLike" - , "equivalent" - , "looseEqual" - , "equal" - , "unlike" - , "doesNotHave" - , "comment" - , "isa" - ].forEach(function (method) { - t.ok(t[method], "should have "+method+" method") - t.isa(t[method], "function", method+" method should be a function") - }) - t.end() -}) - diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/timeout.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/timeout.js deleted file mode 100644 index 4ee409c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/timeout.js +++ /dev/null @@ -1,33 +0,0 @@ -var tap = require("../") - -tap.test("timeout test with plan only", function (t) { - console.error("timeout test") - t.plan(2) - console.error("t.plan="+t._plan) - setTimeout(function () { - console.error("a assert") - t.ok(true, "a") - }, 1000) - setTimeout(function () { - console.error("b assert") - t.ok(true, "b") - }, 1000) -}) - -tap.test("timeout test with plan and end", function (t) { - console.error("timeout test") - t.plan(2) - - var tc = 2 - console.error("t.plan="+t._plan) - setTimeout(function () { - console.error("a assert") - t.ok(true, "a") - if (-- tc === 0) t.end() - }, 1000) - setTimeout(function () { - console.error("b assert") - t.ok(true, "b") - if (-- tc === 0) t.end() - }, 1000) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/trivial-success.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/trivial-success.js deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/undefined_indented.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/undefined_indented.js deleted file mode 100644 index 98abe02..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/undefined_indented.js +++ /dev/null @@ -1,27 +0,0 @@ -var tap = require("../") - -tap.test("consume yaml", function (t) { - t.plan(1) - - var s = - [ "not ok 1 beep boop" - , " ---" - , " stack:" - , " - rawr" - , " - dinosaurs" - , " ..." - ].join("\n") - , c = tap.createConsumer() - - c.on("data", function (res) { - t.same(res, { - id: 1 - , ok: false - , name: " beep boop" // <-- should perhaps .trim() this? - , stack: [ "rawr", "dinosaurs" ] - }) - t.end() - }) - c.write(s) - c.end() -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/valid-command.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/valid-command.js deleted file mode 100644 index d5b9202..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/node_modules/tap/test/valid-command.js +++ /dev/null @@ -1,30 +0,0 @@ -var test = require('../').test -var Runner = require('../lib/tap-runner.js') -var TC = require('../lib/tap-consumer.js') - -test('valid command', function (t) { - var r = new Runner({argv:{remain:['./end-exception/t.js']}}) - var tc = new TC() - var node = process.execPath - var expect = - [ 'TAP version 13' - , 't.js' - , { 'id': 1, - 'ok': false, - 'name': ' ./end-exception/t.js', - 'exit': null, - 'timedOut': true, - 'signal': 'SIGTERM', - 'command': '"' + node + ' t.js"' } - , 'tests 1' - , 'fail 1' ] - r.pipe(tc) - tc.on('data', function (d) { - var e = expect.shift() - t.same(d, e) - }) - tc.on('end', function () { - t.equal(expect.length, 0) - t.end() - }) -}) diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/nodelint.cfg b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/nodelint.cfg deleted file mode 100644 index d6a3aad..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/nodelint.cfg +++ /dev/null @@ -1,7 +0,0 @@ -//See: http://www.jslint.com/lint.html#options -var options = { - //white: false, // if false, strict whitespace rules should be enforced. - indent: 4, - onevar: false, - vars: true // allow multiple var statement per function. -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/package.json b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/package.json deleted file mode 100644 index fa5ddda..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/package.json +++ /dev/null @@ -1,103 +0,0 @@ -{ - "name": "nodeunit", - "version": "0.8.8", - "description": "Easy unit testing for node.js and the browser.", - "maintainers": [ - { - "name": "Caolan McMahon", - "url": "https://github.com/caolan" - } - ], - "contributors": [ - { - "name": "Romain Beauxis", - "url": "https://github.com/toots" - }, - { - "name": "Alex Gorbatchev", - "url": "https://github.com/alexgorbatchev" - }, - { - "name": "Alex Wolfe", - "url": "https://github.com/alexkwolfe" - }, - { - "name": "Carl Fürstenberg", - "url": "https://github.com/azatoth" - }, - { - "name": "Gerad Suyderhoud", - "url": "https://github.com/gerad" - }, - { - "name": "Kadir Pekel", - "url": "https://github.com/coffeemate" - }, - { - "name": "Oleg Efimov", - "url": "https://github.com/Sannis" - }, - { - "name": "Orlando Vazquez", - "url": "https://github.com/orlandov" - }, - { - "name": "Ryan Dahl", - "url": "https://github.com/ry" - }, - { - "name": "Sam Stephenson", - "url": "https://github.com/sstephenson" - }, - { - "name": "Thomas Mayfield", - "url": "https://github.com/thegreatape" - }, - { - "name": "Elijah Insua", - "email": "tmpvar@gmail.com", - "url": "http://tmpvar.com" - } - ], - "repository": { - "type": "git", - "url": "http://github.com/caolan/nodeunit.git" - }, - "devDependencies": { - "uglify-js": ">=1.1.0", - "should": ">=0.4.2" - }, - "bugs": { - "url": "http://github.com/caolan/nodeunit/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/caolan/nodeunit/raw/master/LICENSE" - } - ], - "directories": { - "lib": "./lib", - "doc": "./doc", - "man": "./man1" - }, - "bin": { - "nodeunit": "./bin/nodeunit" - }, - "dependencies": { - "tap": ">=0.2.3" - }, - "scripts": { - "test": "node ./bin/nodeunit test" - }, - "man": [ - "/home/mrhoz/.npm/nodeunit/0.8.8/package/man1/nodeunit.1" - ], - "readme": "Nodeunit\n========\n\nSimple syntax, powerful tools. Nodeunit provides easy async unit testing for\nnode.js and the browser.\n\n* Simple to use\n* Just export the tests from a module\n* Works with node.js and in the browser\n* Helps you avoid common pitfalls when testing asynchronous code\n* Easy to add test cases with setUp and tearDown functions if you wish\n* Flexible reporters for custom output, built-in support for HTML and jUnit XML\n* Allows the use of mocks and stubs\n\n__Contributors__\n\n* [alexgorbatchev](https://github.com/alexgorbatchev)\n* [alexkwolfe](https://github.com/alexkwolfe)\n* [azatoth](https://github.com/azatoth)\n* [kadirpekel](https://github.com/kadirpekel)\n* [lambdalisue](https://github.com/lambdalisue)\n* [luebken](https://github.com/luebken)\n* [orlandov](https://github.com/orlandov)\n* [Sannis](https://github.com/Sannis)\n* [sstephenson](https://github.com/sstephenson)\n* [thegreatape](https://github.com/thegreatape)\n* [mmalecki](https://github.com/mmalecki)\n* and thanks to [cjohansen](https://github.com/cjohansen) for input and advice\n on implementing setUp and tearDown functions. See\n [cjohansen's fork](https://github.com/cjohansen/nodeunit).\n\nAlso, check out gerad's [nodeunit-dsl](https://github.com/gerad/nodeunit-dsl)\nproject, which implements a 'pretty dsl on top of nodeunit'.\n\nMore contributor information can be found in the\n[CONTRIBUTORS.md](https://github.com/caolan/nodeunit/blob/master/CONTRIBUTORS.md)\nfile.\n\nUsage\n-----\n\nHere is an example unit test module:\n\n exports.testSomething = function(test){\n test.expect(1);\n test.ok(true, \"this assertion should pass\");\n test.done();\n };\n\n exports.testSomethingElse = function(test){\n test.ok(false, \"this assertion should fail\");\n test.done();\n };\n\nWhen run using the included test runner, this will output the following:\n\n\n\nInstallation\n------------\n\nThere are two options for installing nodeunit:\n\n1. Clone / download nodeunit from [github](https://github.com/caolan/nodeunit),\n then:\n\n make && sudo make install\n\n2. Install via npm:\n\n npm install nodeunit -g\n\nAPI Documentation\n-----------------\n\nNodeunit uses the functions available in the node.js\n[assert module](http://nodejs.org/docs/v0.4.2/api/assert.html):\n\n* __ok(value, [message])__ - Tests if value is a true value.\n* __equal(actual, expected, [message])__ - Tests shallow, coercive equality\n with the equal comparison operator ( == ).\n* __notEqual(actual, expected, [message])__ - Tests shallow, coercive\n non-equality with the not equal comparison operator ( != ).\n* __deepEqual(actual, expected, [message])__ - Tests for deep equality.\n* __notDeepEqual(actual, expected, [message])__ - Tests for any deep\n inequality.\n* __strictEqual(actual, expected, [message])__ - Tests strict equality, as\n determined by the strict equality operator ( === )\n* __notStrictEqual(actual, expected, [message])__ - Tests strict non-equality,\n as determined by the strict not equal operator ( !== )\n* __throws(block, [error], [message])__ - Expects block to throw an error.\n* __doesNotThrow(block, [error], [message])__ - Expects block not to throw an\n error.\n* __ifError(value)__ - Tests if value is not a false value, throws if it is a\n true value. Useful when testing the first argument, error in callbacks.\n\nNodeunit also provides the following functions within tests:\n\n* __expect(amount)__ - Specify how many assertions are expected to run within a\n test. Very useful for ensuring that all your callbacks and assertions are\n run.\n* __done()__ - Finish the current test function, and move on to the next. ALL\n tests should call this!\n\nNodeunit aims to be simple and easy to learn. This is achieved through using\nexisting structures (such as node.js modules) to maximum effect, and reducing\nthe API where possible, to make it easier to digest.\n\nTests are simply exported from a module, but they are still run in the order\nthey are defined.\n\n__Note:__ Users of old nodeunit versions may remember using `ok`, `equals` and \n`same` in the style of qunit, instead of the assert functions above. These \nfunctions still exist for backwards compatibility, and are simply aliases to \ntheir assert module counterparts.\n\n\nAsynchronous Testing\n--------------------\n\nWhen testing asynchronous code, there are a number of sharp edges to watch out\nfor. Thankfully, nodeunit is designed to help you avoid as many of these\npitfalls as possible. For the most part, testing asynchronous code in nodeunit\n_just works_.\n\n\n### Tests run in series\n\nWhile running tests in parallel seems like a good idea for speeding up your\ntest suite, in practice I've found it means writing much more complicated\ntests. Because of node's module cache, running tests in parallel means mocking\nand stubbing is pretty much impossible. One of the nicest things about testing\nin javascript is the ease of doing stubs:\n\n var _readFile = fs.readFile;\n fs.readFile = function(path, callback){\n // it's a stub!\n };\n // test function that uses fs.readFile\n\n // we're done\n fs.readFile = _readFile;\n\nYou cannot do this when running tests in parallel. In order to keep testing as\nsimple as possible, nodeunit avoids it. Thankfully, most unit-test suites run\nfast anyway.\n\n\n### Explicit ending of tests\n\nWhen testing async code it's important that tests end at the correct point, not\njust after a given number of assertions. Otherwise your tests can run short,\nending before all assertions have completed. It's important to detect too\nmany assertions as well as too few. Combining explicit ending of tests with\nan expected number of assertions helps to avoid false test passes, so be sure\nto use the `test.expect()` method at the start of your test functions, and\n`test.done()` when finished.\n\n\nGroups, setUp and tearDown\n--------------------------\n\nNodeunit allows the nesting of test functions:\n\n exports.test1 = function (test) {\n ...\n }\n\n exports.group = {\n test2: function (test) {\n ...\n },\n test3: function (test) {\n ...\n }\n }\n\nThis would be run as:\n\n test1\n group - test2\n group - test3\n\nUsing these groups, Nodeunit allows you to define a `setUp` function, which is\nrun before each test, and a `tearDown` function, which is run after each test\ncalls `test.done()`:\n\n module.exports = {\n setUp: function (callback) {\n this.foo = 'bar';\n callback();\n },\n tearDown: function (callback) {\n // clean up\n callback();\n },\n test1: function (test) {\n test.equals(this.foo, 'bar');\n test.done();\n }\n };\n\nIn this way, it's possible to have multiple groups of tests in a module, each\ngroup with its own setUp and tearDown functions.\n\n\nRunning Tests\n-------------\n\nNodeunit comes with a basic command-line test runner, which can be installed\nusing `sudo make install`. Example usage:\n\n nodeunit testmodule1.js testfolder [...]\n\nThe default test reporter uses color output, because I think that's more fun :) I\nintend to add a no-color option in future. To give you a feeling of the fun you'll\nbe having writing tests, lets fix the example at the start of the README:\n\n\n\nAhhh, Doesn't that feel better?\n\nWhen using the included test runner, it will exit using the failed number of\nassertions as the exit code. This means it exits with 0 when all tests pass.\n\n\n### Command-line Options\n\n* __--reporter FILE__ - you can set the test reporter to a custom module or\non of the modules in nodeunit/lib/reporters, when omitted, the default test runner\nis used.\n* __--list-reporters__ - list available built-in reporters.\n* __--config FILE__ - load config options from a JSON file, allows\nthe customisation of color schemes for the default test reporter etc. See\nbin/nodeunit.json for current available options.\n* __--version__ or __-v__ - report nodeunit version\n* __--help__ - show nodeunit help\n\n\nRunning tests in the browser\n----------------------------\n\nNodeunit tests can also be run inside the browser. For example usage, see\nthe examples/browser folder. The basic syntax is as follows:\n\n__test.html__\n\n \n \n Example Test Suite\n \n \n \n \n \n \n

Example Test Suite

\n \n \n \n\nHere, `suite1` and `suite2` are just object literals containing test functions\nor groups, as would be returned if you did `require('test-suite')` in node.js:\n\n__suite1.js__\n\n this.suite1 = {\n 'example test': function (test) {\n test.ok(true, 'everything is ok');\n test.done();\n }\n };\n\nIf you wish to use a commonjs format for your test suites (using exports), it is\nup to you to define the commonjs tools for the browser. There are a number of\nalternatives and it's important it fits with your existing code, which is\nwhy nodeunit does not currently provide this out of the box.\n\nIn the example above, the tests will run when the page is loaded.\n\nThe browser-version of nodeunit.js is created in dist/browser when you do, `make\nbrowser`. You'll need [UglifyJS](https://github.com/mishoo/UglifyJS) installed in\norder for it to automatically create nodeunit.min.js.\n\n\nAdding nodeunit to Your Projects\n--------------------------------\n\nIf you don't want people to have to install the nodeunit command-line tool,\nyou'll want to create a script that runs the tests for your project with the\ncorrect require paths set up. Here's an example test script, that assumes you\nhave nodeunit in a suitably located node_modules directory.\n\n #!/usr/bin/env node\n var reporter = require('nodeunit').reporters.default;\n reporter.run(['test']);\n\nIf you're using git, you might find it useful to include nodeunit as a\nsubmodule. Using submodules makes it easy for developers to download nodeunit\nand run your test suite, without cluttering up your repository with\nthe source code. To add nodeunit as a git submodule do the following:\n\n git submodule add git://github.com/caolan/nodeunit.git node_modules/nodeunit\n\nThis will add nodeunit to the node_modules folder of your project. Now, when\ncloning the repository, nodeunit can be downloaded by doing the following:\n\n git submodule init\n git submodule update\n\nLet's update the test script above with a helpful hint on how to get nodeunit,\nif it's missing:\n\n #!/usr/bin/env node\n try {\n var reporter = require('nodeunit').reporters.default;\n }\n catch(e) {\n console.log(\"Cannot find nodeunit module.\");\n console.log(\"You can download submodules for this project by doing:\");\n console.log(\"\");\n console.log(\" git submodule init\");\n console.log(\" git submodule update\");\n console.log(\"\");\n process.exit();\n }\n\n process.chdir(__dirname);\n reporter.run(['test']);\n\nNow if someone attempts to run your test suite without nodeunit installed they\nwill be prompted to download the submodules for your project.\n\n\nBuilt-in Test Reporters\n-----------------------\n\n* __default__ - The standard reporter seen in the nodeunit screenshots\n* __minimal__ - Pretty, minimal output, shows errors and progress only\n* __html__ - Outputs a HTML report to stdout\n* __junit__ - Creates jUnit compatible XML reports, which can be used with\n continuous integration tools such as [Hudson](http://hudson-ci.org/).\n* __machineout__ - Simple reporter for machine analysis. There is\n [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) which is useful for TDD on VIM.\n\n\nWriting a Test Reporter\n---------------------\n\nNodeunit exports runTest(fn, options), runModule(mod, options) and\nrunFiles(paths, options). You'll most likely want to run test suites from\nfiles, which can be done using the latter function. The _options_ argument can\ncontain callbacks which run during testing. Nodeunit provides the following\ncallbacks:\n\n* __moduleStart(name)__ - called before a module is tested\n* __moduleDone(name, assertions)__ - called once all test functions within the\n module have completed (see assertions object reference below)\n ALL tests within the module\n* __testStart(name)__ - called before a test function is run\n* __testReady(test)__ - called before a test function is run with the test object that will be passed to the test function\n* __testDone(name, assertions)__ - called once a test function has completed\n (by calling test.done())\n* __log(assertion)__ - called whenever an assertion is made (see assertion\n object reference below)\n* __done(assertions)__ - called after all tests/modules are complete\n\nThe __assertion__ object:\n\n* __passed()__ - did the assertion pass?\n* __failed()__ - did the assertion fail?\n* __error__ - the AssertionError if the assertion failed\n* __method__ - the nodeunit assertion method used (ok, same, equals...)\n* __message__ - the message the assertion method was called with (optional)\n\nThe __assertionList__ object:\n\n* An array-like object with the following new attributes:\n * __failures()__ - the number of assertions which failed\n * __duration__ - the time taken for the test to complete in msecs\n\nFor a reference implementation of a test reporter, see lib/reporters/default.js in\nthe nodeunit project directory.\n\n\nSandbox utility\n---------------\n\nThis is a function which evaluates JavaScript files in a sandbox and returns the\ncontext. The sandbox function can be used for testing client-side code or private\nun-exported functions within a module.\n\n var sandbox = require('nodeunit').utils.sandbox;\n var example = sandbox('example.js');\n\n__sandbox(files, sandbox)__ - Evaluates JavaScript files in a sandbox, returning\nthe context. The first argument can either be a single filename or an array of\nfilenames. If multiple filenames are given their contents are concatenated before\nevaluation. The second argument is an optional context to use for the sandbox.\n\nNote: When working with the sandbox if your script depends on outside sources\n(i.e. using `require`) then you will want to pass that into the optional\ncontext when setting up the sandbox.\n\n var sandbox = require('nodeunit').utils.sandbox;\n // pass in some node globals\n var box_globals = {\n // Passing module.exports into the sandbox will give your code access to it.\n module: {exports: exports},\n // Passing require into the sandbox will give your code access to use it AND \n // will share the cache with modules already required from outside the sandbox.\n require: require,\n // Passing console into the sandbox will give your code access to it\n console: console\n };\n var example = sandbox('example.js', box_globals);\n\n\nRunning the nodeunit Tests\n--------------------------\n\nThe tests for nodeunit are written using nodeunit itself as the test framework.\nHowever, the module test-base.js first does some basic tests using the assert\nmodule to ensure that test functions are actually run, and a basic level of\nnodeunit functionality is available.\n\nTo run the nodeunit tests do:\n\n make test\n\n__Note:__ There was a bug in node v0.2.0 causing the tests to hang, upgrading\nto v0.2.1 fixes this.\n\n\n__machineout__ reporter\n----------------------------------------------\n\nThe default reporter is readable for human but not for machine analysis. \nWhen you want to analyze the output of nodeunit, use __machineout__ reporter and you will get\n\n\n\n\nnodeunit with vim\n----------------------------------\nThere is [nodeunit.vim](https://github.com/lambdalisue/nodeunit.vim) so you can use\nnodeunit with VIM.\n\nThat compiler uses __machineout__ reporter and it is useful to use\nwith [vim-makegreen](https://github.com/reinh/vim-makegreen).\n\n \n\nContributing\n------------\n\nContributions to the project are most welcome, so feel free to fork and improve.\nWhen submitting a pull request, please run `make lint` first to ensure\nwe're following a consistent coding style.\n", - "readmeFilename": "README.md", - "homepage": "https://github.com/caolan/nodeunit", - "_id": "nodeunit@0.8.8", - "_shasum": "51e97226ba3a1f996e7ae0ee6a7a2837643aeb02", - "_from": "nodeunit@~0.8.0", - "_resolved": "https://registry.npmjs.org/nodeunit/-/nodeunit-0.8.8.tgz" -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/junit.xml.ejs b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/junit.xml.ejs deleted file mode 100644 index c1db5bb..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/junit.xml.ejs +++ /dev/null @@ -1,19 +0,0 @@ - -<% for (var i=0; i < suites.length; i++) { %> - <% var suite=suites[i]; %> - - <% for (var j=0; j < suite.testcases.length; j++) { %> - <% var testcase=suites[i].testcases[j]; %> - - <% if (testcase.failure) { %> - - <% if (testcase.failure.backtrace) { %><%= testcase.failure.backtrace %><% } %> - - <% } %> - - <% } %> - -<% } %> diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/license.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/license.js deleted file mode 100644 index f0f326f..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/license.js +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * Nodeunit - * https://github.com/caolan/nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * json2.js - * http://www.JSON.org/json2.js - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/nodeunit.css b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/nodeunit.css deleted file mode 100644 index 274434a..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/share/nodeunit.css +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * Styles taken from qunit.css - */ - -h1#nodeunit-header, h1.nodeunit-header { - padding: 15px; - font-size: large; - background-color: #06b; - color: white; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; -} - -h1#nodeunit-header a { - color: white; -} - -h2#nodeunit-banner { - height: 2em; - border-bottom: 1px solid white; - background-color: #eee; - margin: 0; - font-family: 'trebuchet ms', verdana, arial; -} -h2#nodeunit-banner.pass { - background-color: green; -} -h2#nodeunit-banner.fail { - background-color: red; -} - -h2#nodeunit-userAgent, h2.nodeunit-userAgent { - padding: 10px; - background-color: #eee; - color: black; - margin: 0; - font-size: small; - font-weight: normal; - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} - -div#nodeunit-testrunner-toolbar { - background: #eee; - border-top: 1px solid black; - padding: 10px; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; - font-size: 10pt; -} - -ol#nodeunit-tests { - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} -ol#nodeunit-tests li strong { - cursor:pointer; -} -ol#nodeunit-tests .pass { - color: green; -} -ol#nodeunit-tests .fail { - color: red; -} - -p#nodeunit-testresult { - margin-left: 1em; - font-size: 10pt; - font-family: 'trebuchet ms', verdana, arial; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/coffee/mock_coffee_module.coffee b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/coffee/mock_coffee_module.coffee deleted file mode 100644 index a1c069b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/coffee/mock_coffee_module.coffee +++ /dev/null @@ -1,4 +0,0 @@ -j = 0 -j += i for i in [0..5] - -exports.name = "mock_coffee_#{j}" diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module3.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module3.js deleted file mode 100644 index 3021776..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module3.js +++ /dev/null @@ -1 +0,0 @@ -exports.name = 'mock_module3'; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module4.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module4.js deleted file mode 100644 index 876f9ca..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/dir/mock_module4.js +++ /dev/null @@ -1 +0,0 @@ -exports.name = 'mock_module4'; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/example_test.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/example_test.js deleted file mode 100644 index 5004b98..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/example_test.js +++ /dev/null @@ -1,4 +0,0 @@ -exports['example test'] = function (test) { - test.ok(true); - test.done(); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module1.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module1.js deleted file mode 100644 index 4c093ad..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module1.js +++ /dev/null @@ -1 +0,0 @@ -exports.name = 'mock_module1'; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module2.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module2.js deleted file mode 100644 index a63d012..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/mock_module2.js +++ /dev/null @@ -1 +0,0 @@ -exports.name = 'mock_module2'; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode1.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode1.js deleted file mode 100644 index 2ef7115..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode1.js +++ /dev/null @@ -1,3 +0,0 @@ -function hello_world(arg) { - return "_" + arg + "_"; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode2.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode2.js deleted file mode 100644 index 55a764e..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode2.js +++ /dev/null @@ -1,3 +0,0 @@ -function get_a_variable() { - return typeof a_variable; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode3.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode3.js deleted file mode 100644 index 1fd1e78..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/fixtures/raw_jscode3.js +++ /dev/null @@ -1 +0,0 @@ -var t=t?t+1:1; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-base.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-base.js deleted file mode 100644 index 5335046..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-base.js +++ /dev/null @@ -1,239 +0,0 @@ -/* - * This module is not a plain nodeunit test suite, but instead uses the - * assert module to ensure a basic level of functionality is present, - * allowing the rest of the tests to be written using nodeunit itself. - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -var assert = require('assert'), // @REMOVE_LINE_FOR_BROWSER - async = require('../deps/async'), // @REMOVE_LINE_FOR_BROWSER - nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER - - -// NOT A TEST - util function to make testing faster. -// retries the assertion until it passes or the timeout is reached, -// at which point it throws the assertion error -var waitFor = function (fn, timeout, callback, start) { - start = start || new Date().getTime(); - callback = callback || function () {}; - try { - fn(); - callback(); - } - catch (e) { - if (e instanceof assert.AssertionError) { - var now = new Date().getTime(); - if (now - start >= timeout) { - throw e; - } - else { - async.nextTick(function () { - waitFor(fn, timeout, callback, start); - }); - } - } - else { - throw e; - } - } -}; - - -// TESTS: - -// Are exported tests actually run? - store completed tests in this variable -// for checking later -var tests_called = {}; - -// most basic test that should run, the tests_called object is tested -// at the end of this module to ensure the tests were actually run by nodeunit -exports.testCalled = function (test) { - tests_called.testCalled = true; - test.done(); -}; - -// generates test functions for nodeunit assertions -var makeTest = function (method, args_pass, args_fail) { - return function (test) { - var test1_called = false; - var test2_called = false; - - // test pass - nodeunit.runTest( - 'testname', - function (test) { - test[method].apply(test, args_pass); - test.done(); - }, - {testDone: function (name, assertions) { - assert.equal(assertions.length, 1); - assert.equal(assertions.failures(), 0); - }}, - function () { - test1_called = true; - } - ); - - // test failure - nodeunit.runTest( - 'testname', - function (test) { - test[method].apply(test, args_fail); - test.done(); - }, - {testDone: function (name, assertions) { - assert.equal(assertions.length, 1); - assert.equal(assertions.failures(), 1); - }}, - function () { - test2_called = true; - } - ); - - // ensure tests were run - waitFor(function () { - assert.ok(test1_called); - assert.ok(test2_called); - tests_called[method] = true; - }, 500, test.done); - }; -}; - -// ensure basic assertions are working: -exports.testOk = makeTest('ok', [true], [false]); -exports.testEquals = makeTest('equals', [1, 1], [1, 2]); -exports.testSame = makeTest('same', - [{test: 'test'}, {test: 'test'}], - [{test: 'test'}, {monkey: 'penguin'}] -); - -// from the assert module: -exports.testEqual = makeTest('equal', [1, 1], [1, 2]); -exports.testNotEqual = makeTest('notEqual', [1, 2], [1, 1]); -exports.testDeepEqual = makeTest('deepEqual', - [{one: 1}, {one: 1}], [{one: 1}, {two: 2}] -); -exports.testNotDeepEqual = makeTest('notDeepEqual', - [{one: 1}, {two: 2}], [{one: 1}, {one: 1}] -); -exports.testStrictEqual = makeTest('strictEqual', [1, 1], [1, true]); -exports.testNotStrictEqual = makeTest('notStrictEqual', [true, 1], [1, 1]); -exports.testThrows = makeTest('throws', - [function () { - throw new Error('test'); - }], - [function () { - return; - }] -); -exports.testThrowsWithReGex = makeTest('throws', - [function () { - throw new Error('test'); - }, /test/], - [function () { - throw new Error('test'); - }, /fail/] -); -exports.testThrowsWithErrorValidation = makeTest('throws', - [function () { - throw new Error('test'); - }, function(err) { - return true; - }], - [function () { - throw new Error('test'); - }, function(err) { - return false; - }] -); -exports.testDoesNotThrows = makeTest('doesNotThrow', - [function () { - return; - }], - [function () { - throw new Error('test'); - }] -); -exports.testIfError = makeTest('ifError', [false], [new Error('test')]); - - -exports.testExpect = function (test) { - var test1_called = false, - test2_called = false, - test3_called = false; - - // correct number of tests run - nodeunit.runTest( - 'testname', - function (test) { - test.expect(2); - test.ok(true); - test.ok(true); - test.done(); - }, - {testDone: function (name, assertions) { - test.equals(assertions.length, 2); - test.equals(assertions.failures(), 0); - }}, - function () { - test1_called = true; - } - ); - - // no tests run - nodeunit.runTest( - 'testname', - function (test) { - test.expect(2); - test.done(); - }, - {testDone: function (name, assertions) { - test.equals(assertions.length, 1); - test.equals(assertions.failures(), 1); - }}, - function () { - test2_called = true; - } - ); - - // incorrect number of tests run - nodeunit.runTest( - 'testname', - function (test) { - test.expect(2); - test.ok(true); - test.ok(true); - test.ok(true); - test.done(); - }, - {testDone: function (name, assertions) { - test.equals(assertions.length, 4); - test.equals(assertions.failures(), 1); - }}, - function () { - test3_called = true; - } - ); - - // ensure callbacks fired - waitFor(function () { - assert.ok(test1_called); - assert.ok(test2_called); - assert.ok(test3_called); - tests_called.expect = true; - }, 1000, test.done); -}; - - -// tests are async, so wait for them to be called -waitFor(function () { - assert.ok(tests_called.testCalled); - assert.ok(tests_called.ok); - assert.ok(tests_called.equals); - assert.ok(tests_called.same); - assert.ok(tests_called.expect); -}, 10000); diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-bettererrors.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-bettererrors.js deleted file mode 100644 index 13941c9..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-bettererrors.js +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Test utils.betterErrors. utils.betterErrors should provide sensible error messages even when the error does not - * contain expected, actual or operator. - */ -var assert = require("../lib/assert"); -var should = require("should"); -var types = require("../lib/types"); -var util = require('util'); -var utils = require("../lib/utils"); - -function betterErrorStringFromError(error) { - var assertion = types.assertion({error: error}); - var better = utils.betterErrors(assertion); - return better.error.stack.toString(); -} - -function performBasicChecks(betterErrorString) { - betterErrorString.should.include("AssertionError"); - betterErrorString.should.include("test-bettererrors"); - //betterErrorString.should.not.include("undefined"); -} - -/** - * Control test. Provide an AssertionError that contains actual, expected operator values. - * @param test the test object from nodeunit - */ -exports.testEqual = function (test) { - try { - assert.equal(true, false); - } catch (error) { - var betterErrorString = betterErrorStringFromError(error); - performBasicChecks(betterErrorString); - betterErrorString.should.include("true"); - betterErrorString.should.include("false"); - betterErrorString.should.include("=="); - test.done(); - } -}; - -/** - * Test an AssertionError that does not contain actual, expected or operator values. - * @param test the test object from nodeunit - */ -exports.testAssertThrows = function (test) { - try { - assert.throws(function () { - }); - } catch (error) { - var betterErrorString = betterErrorStringFromError(error); - performBasicChecks(betterErrorString); - test.done(); - } -}; - -/** - * Test with an error that is not an AssertionError. - * - * This function name MUST NOT include "AssertionError" because one of the - * tests it performs asserts that the returned error string does not contain - * the "AssertionError" term. If this function name does include that term, it - * will show up in the stack trace and the test will fail! - * @param test the test object from nodeunit - */ -exports.testErrorIsNotAssertion = function (test) { - try { - throw new Error("test error"); - } catch (error) { - var betterErrorString = betterErrorStringFromError(error); - betterErrorString.should.not.include("AssertionError"); - betterErrorString.should.include("Error"); - betterErrorString.should.include("test error"); - betterErrorString.should.include("test-bettererrors"); - betterErrorString.should.not.include("undefined"); - test.done(); - } -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-cli.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-cli.js deleted file mode 100644 index 8799eb8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-cli.js +++ /dev/null @@ -1,16 +0,0 @@ -var exec = require('child_process').exec, - path = require('path'); - -var bin = path.resolve(__dirname, '../bin/nodeunit'); -var testfile_fullpath = path.resolve(__dirname, './fixtures/example_test.js'); - -exports['run test suite using absolute path'] = function (test) { - exec(bin + ' ' + testfile_fullpath, function (err, stdout, stderr) { - if (err) { - return test.done(err); - } - test.ok(/example test/.test(stdout)); - test.ok(/1 assertion/.test(stdout)); - test.done(); - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-failing-callbacks.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-failing-callbacks.js deleted file mode 100644 index 08f7eb5..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-failing-callbacks.js +++ /dev/null @@ -1,114 +0,0 @@ -var nodeunit = require('../lib/nodeunit'); - - -exports.testFailingLog = function (test) { - test.expect(3); - - // this is meant to bubble to the top, and will be ignored for the purposes - // of testing: - var ignored_error = new Error('ignore this callback error'); - var err_handler = function (err) { - if (err && err.message !== ignored_error.message) { - throw err; - } - }; - process.addListener('uncaughtException', err_handler); - - // A failing callback should not affect the test outcome - var testfn = function (test) { - test.ok(true, 'test.ok'); - test.done(); - }; - nodeunit.runTest('testname', testfn, { - log: function (assertion) { - test.ok(true, 'log called'); - throw ignored_error; - }, - testDone: function (name, assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 1, 'total'); - process.removeListener('uncaughtException', err_handler); - } - }, test.done); -}; - -exports.testFailingTestDone = function (test) { - test.expect(2); - - var ignored_error = new Error('ignore this callback error'); - var err_handler = function (err) { - if (err && err.message !== ignored_error.message) { - throw err; - } - }; - process.addListener('uncaughtException', err_handler); - - // A failing callback should not affect the test outcome - var testfn = function (test) { - test.done(); - }; - nodeunit.runTest('testname', testfn, { - log: function (assertion) { - test.ok(false, 'log should not be called'); - }, - testDone: function (name, assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 0, 'total'); - process.nextTick(function () { - process.removeListener('uncaughtException', err_handler); - test.done(); - }); - throw ignored_error; - } - }, function () {}); -}; - -exports.testAssertionObj = function (test) { - test.expect(4); - var testfn = function (test) { - test.ok(true, 'ok true'); - test.done(); - }; - nodeunit.runTest('testname', testfn, { - log: function (assertion) { - test.ok(assertion.passed() === true, 'assertion.passed'); - test.ok(assertion.failed() === false, 'assertion.failed'); - }, - testDone: function (name, assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 1, 'total'); - } - }, test.done); -}; - -exports.testLogOptional = function (test) { - test.expect(2); - var testfn = function (test) { - test.ok(true, 'ok true'); - test.done(); - }; - nodeunit.runTest('testname', testfn, { - testDone: function (name, assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 1, 'total'); - } - }, test.done); -}; - -exports.testExpectWithFailure = function (test) { - test.expect(3); - var testfn = function (test) { - test.expect(1); - test.ok(false, 'test.ok'); - test.done(); - }; - nodeunit.runTest('testname', testfn, { - log: function (assertion) { - test.equals(assertion.method, 'ok', 'assertion.method'); - }, - testDone: function (name, assertions) { - test.equals(assertions.failures(), 1, 'failures'); - test.equals(assertions.length, 1, 'total'); - } - }, test.done); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-httputil.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-httputil.js deleted file mode 100644 index e5ee25c..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-httputil.js +++ /dev/null @@ -1,55 +0,0 @@ -var nodeunit = require('../lib/nodeunit'); -var httputil = require('../lib/utils').httputil; - -exports.testHttpUtilBasics = function (test) { - - test.expect(6); - - httputil(function (req, resp) { - test.equal(req.method, 'PUT'); - test.equal(req.url, '/newpair'); - test.equal(req.headers.foo, 'bar'); - - resp.writeHead(500, {'content-type': 'text/plain'}); - resp.end('failed'); - }, function (server, client) { - client.fetch('PUT', '/newpair', {'foo': 'bar'}, function (resp) { - test.equal(resp.statusCode, 500); - test.equal(resp.headers['content-type'], 'text/plain'); - test.equal(resp.body, 'failed'); - - server.close(); - test.done(); - }); - }); -}; - -exports.testHttpUtilJsonHandling = function (test) { - - test.expect(9); - - httputil(function (req, resp) { - test.equal(req.method, 'GET'); - test.equal(req.url, '/'); - test.equal(req.headers.foo, 'bar'); - - var testdata = {foo1: 'bar', foo2: 'baz'}; - - resp.writeHead(200, {'content-type': 'application/json'}); - resp.end(JSON.stringify(testdata)); - - }, function (server, client) { - client.fetch('GET', '/', {'foo': 'bar'}, function (resp) { - test.equal(resp.statusCode, 200); - test.equal(resp.headers['content-type'], 'application/json'); - - test.ok(resp.bodyAsObject); - test.equal(typeof resp.bodyAsObject, 'object'); - test.equal(resp.bodyAsObject.foo1, 'bar'); - test.equal(resp.bodyAsObject.foo2, 'baz'); - - server.close(); - test.done(); - }); - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runfiles.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runfiles.js deleted file mode 100644 index ecbdfd8..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runfiles.js +++ /dev/null @@ -1,231 +0,0 @@ -var assert = require('assert'), - fs = require('fs'), - path = require('path'), - nodeunit = require('../lib/nodeunit'); - - -var setup = function (fn) { - return function (test) { - process.chdir(__dirname); - var env = { - mock_module1: require(__dirname + '/fixtures/mock_module1'), - mock_module2: require(__dirname + '/fixtures/mock_module2'), - mock_module3: require(__dirname + '/fixtures/dir/mock_module3'), - mock_module4: require(__dirname + '/fixtures/dir/mock_module4') - }; - fn.call(env, test); - }; -}; - - -exports.testRunFiles = setup(function (test) { - test.expect(28); - var runModule_copy = nodeunit.runModule; - - var runModule_calls = []; - var modules = []; - - var opts = { - moduleStart: function () { - return 'moduleStart'; - }, - testDone: function () { - return 'testDone'; - }, - testReady: function () { - return 'testReady'; - }, - testStart: function () { - return 'testStart'; - }, - log: function () { - return 'log'; - }, - done: function (assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 4, 'length'); - test.ok(typeof assertions.duration === "number"); - - var called_with = function (name) { - return runModule_calls.some(function (m) { - return m.name === name; - }); - }; - test.ok(called_with('mock_module1'), 'mock_module1 ran'); - test.ok(called_with('mock_module2'), 'mock_module2 ran'); - test.ok(called_with('mock_module3'), 'mock_module3 ran'); - test.ok(called_with('mock_module4'), 'mock_module4 ran'); - test.equals(runModule_calls.length, 4); - - nodeunit.runModule = runModule_copy; - test.done(); - } - }; - - nodeunit.runModule = function (name, mod, options, callback) { - test.equals(options.testDone, opts.testDone); - test.equals(options.testReady, opts.testReady); - test.equals(options.testStart, opts.testStart); - test.equals(options.log, opts.log); - test.ok(typeof name === "string"); - runModule_calls.push(mod); - var m = [{failed: function () { - return false; - }}]; - modules.push(m); - callback(null, m); - }; - - nodeunit.runFiles( - [__dirname + '/fixtures/mock_module1.js', - __dirname + '/fixtures/mock_module2.js', - __dirname + '/fixtures/dir'], - opts - ); -}); - -exports.testRunFilesEmpty = function (test) { - test.expect(3); - nodeunit.runFiles([], { - moduleStart: function () { - test.ok(false, 'should not be called'); - }, - testDone: function () { - test.ok(false, 'should not be called'); - }, - testReady: function () { - test.ok(false, 'should not be called'); - }, - testStart: function () { - test.ok(false, 'should not be called'); - }, - log: function () { - test.ok(false, 'should not be called'); - }, - done: function (assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 0, 'length'); - test.ok(typeof assertions.duration === "number"); - test.done(); - } - }); -}; - - -exports.testEmptyDir = function (test) { - var dir2 = __dirname + '/fixtures/dir2'; - - // git doesn't like empty directories, so we have to create one - path.exists(dir2, function (exists) { - if (!exists) { - fs.mkdirSync(dir2, 0777); - } - - // runFiles on empty directory: - nodeunit.runFiles([dir2], { - moduleStart: function () { - test.ok(false, 'should not be called'); - }, - testDone: function () { - test.ok(false, 'should not be called'); - }, - testReady: function () { - test.ok(false, 'should not be called'); - }, - testStart: function () { - test.ok(false, 'should not be called'); - }, - log: function () { - test.ok(false, 'should not be called'); - }, - done: function (assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 0, 'length'); - test.ok(typeof assertions.duration === "number"); - test.done(); - } - }); - }); -}; - - -var CoffeeScript; -try { - CoffeeScript = require('coffee-script'); - if (CoffeeScript.register != null) { - CoffeeScript.register(); - } -} catch (e) { -} - -if (CoffeeScript) { - exports.testCoffeeScript = function (test) { - process.chdir(__dirname); - var env = { - mock_coffee_module: require(__dirname + - '/fixtures/coffee/mock_coffee_module') - }; - - test.expect(10); - var runModule_copy = nodeunit.runModule; - - var runModule_calls = []; - var modules = []; - - var opts = { - moduleStart: function () { - return 'moduleStart'; - }, - testDone: function () { - return 'testDone'; - }, - testReady: function () { - return 'testReady'; - }, - testStart: function () { - return 'testStart'; - }, - log: function () { - return 'log'; - }, - done: function (assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 1, 'length'); - test.ok(typeof assertions.duration === "number"); - - var called_with = function (name) { - return runModule_calls.some(function (m) { - return m.name === name; - }); - }; - test.ok( - called_with('mock_coffee_15'), - 'mock_coffee_module ran' - ); - test.equals(runModule_calls.length, 1); - - nodeunit.runModule = runModule_copy; - test.done(); - } - }; - - nodeunit.runModule = function (name, mod, options, callback) { - test.equals(options.testDone, opts.testDone); - test.equals(options.testReady, opts.testReady); - test.equals(options.testStart, opts.testStart); - test.equals(options.log, opts.log); - test.ok(typeof name === "string"); - runModule_calls.push(mod); - var m = [{failed: function () { - return false; - }}]; - modules.push(m); - callback(null, m); - }; - - nodeunit.runFiles( - [__dirname + '/fixtures/coffee/mock_coffee_module.coffee'], - opts - ); - }; -} diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runmodule.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runmodule.js deleted file mode 100644 index 49cfc03..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runmodule.js +++ /dev/null @@ -1,222 +0,0 @@ -/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER - - -exports.testRunModule = function (test) { - test.expect(59); - var call_order = []; - var testmodule = { - test1: function (test) { - call_order.push('test1'); - test.ok(true, 'ok true'); - test.done(); - }, - test2: function (test) { - call_order.push('test2'); - test.ok(false, 'ok false'); - test.ok(false, 'ok false'); - test.done(); - }, - test3: function (test) { - call_order.push('test3'); - test.done(); - } - }; - nodeunit.runModule('testmodule', testmodule, { - log: function (assertion) { - call_order.push('log'); - }, - testStart: function (name) { - call_order.push('testStart'); - test.ok( - name.toString() === 'test1' || - name.toString() === 'test2' || - name.toString() === 'test3', - 'testStart called with test name ' - ); - }, - testReady: function (tst) { - call_order.push('testReady'); - test.ok(tst.done, 'testReady called with non-test object'); - test.ok(tst.ok, 'testReady called with non-test object'); - test.ok(tst.same, 'testReady called with non-test object'); - test.ok(tst.expect, 'testReady called with non-test object'); - test.ok(tst._assertion_list, 'testReady called with non-test object'); - test.ok(tst.AssertionError, 'testReady called with non-test object'); - test.ok(tst.fail, 'testReady called with non-test object'); - test.ok(tst.equal, 'testReady called with non-test object'); - test.ok(tst.notEqual, 'testReady called with non-test object'); - test.ok(tst.deepEqual, 'testReady called with non-test object'); - test.ok(tst.notDeepEqual, 'testReady called with non-test object'); - test.ok(tst.strictEqual, 'testReady called with non-test object'); - test.ok(tst.notStrictEqual, 'testReady called with non-test object'); - test.ok(tst.throws, 'testReady called with non-test object'); - test.ok(tst.doesNotThrow, 'testReady called with non-test object'); - test.ok(tst.ifError, 'testReady called with non-test object'); - }, - testDone: function (name, assertions) { - call_order.push('testDone'); - test.ok( - name.toString() === 'test1' || - name.toString() === 'test2' || - name.toString() === 'test3', - 'testDone called with test name' - ); - }, - moduleDone: function (name, assertions) { - call_order.push('moduleDone'); - test.equals(assertions.length, 3); - test.equals(assertions.failures(), 2); - test.equals(name, 'testmodule'); - test.ok(typeof assertions.duration === "number"); - test.same(call_order, [ - 'testStart', 'testReady', 'test1', 'log', 'testDone', - 'testStart', 'testReady', 'test2', 'log', 'log', 'testDone', - 'testStart', 'testReady', 'test3', 'testDone', - 'moduleDone' - ]); - } - }, test.done); -}; - - -exports.testRunModuleTestSpec = function (test) { - test.expect(22); - var call_order = []; - var testmodule = { - test1: function (test) { - test.ok(true, 'ok true'); - test.done(); - }, - test2: function (test) { - call_order.push('test2'); - test.ok(false, 'ok false'); - test.ok(false, 'ok false'); - test.done(); - }, - test3: function (test) { - test.done(); - } - }; - nodeunit.runModule('testmodule', testmodule, { - testspec: "test2", - log: function (assertion) { - call_order.push('log'); - }, - testStart: function (name) { - call_order.push('testStart'); - test.equals( - name,'test2', - 'testStart called with test name ' - ); - }, - testReady: function (tst) { - call_order.push('testReady'); - test.ok(tst.done, 'testReady called with non-test object'); - test.ok(tst.ok, 'testReady called with non-test object'); - test.ok(tst.same, 'testReady called with non-test object'); - test.ok(tst.expect, 'testReady called with non-test object'); - test.ok(tst._assertion_list, 'testReady called with non-test object'); - test.ok(tst.AssertionError, 'testReady called with non-test object'); - test.ok(tst.fail, 'testReady called with non-test object'); - test.ok(tst.equal, 'testReady called with non-test object'); - test.ok(tst.notEqual, 'testReady called with non-test object'); - test.ok(tst.deepEqual, 'testReady called with non-test object'); - test.ok(tst.notDeepEqual, 'testReady called with non-test object'); - test.ok(tst.strictEqual, 'testReady called with non-test object'); - test.ok(tst.notStrictEqual, 'testReady called with non-test object'); - test.ok(tst.throws, 'testReady called with non-test object'); - test.ok(tst.doesNotThrow, 'testReady called with non-test object'); - test.ok(tst.ifError, 'testReady called with non-test object'); - }, - testDone: function (name, assertions) { - call_order.push('testDone'); - test.equal( - name, 'test2', - 'testDone called with test name' - ); - }, - moduleDone: function (name, assertions) { - call_order.push('moduleDone'); - test.equals(assertions.length, 2); - test.equals(name, 'testmodule'); - test.ok(typeof assertions.duration === "number"); - test.same(call_order, [ - 'testStart', 'testReady', 'test2', 'log', 'log', 'testDone', - 'moduleDone' - ]); - } - }, test.done); -}; - -exports.testRunModuleEmpty = function (test) { - nodeunit.runModule('module with no exports', {}, { - log: function (assertion) { - test.ok(false, 'log should not be called'); - }, - testStart: function (name) { - test.ok(false, 'testStart should not be called'); - }, - testReady: function (tst) { - test.ok(false, 'testReady should not be called'); - }, - testDone: function (name, assertions) { - test.ok(false, 'testDone should not be called'); - }, - moduleDone: function (name, assertions) { - test.equals(assertions.length, 0); - test.equals(assertions.failures(), 0); - test.equals(name, 'module with no exports'); - test.ok(typeof assertions.duration === "number"); - } - }, test.done); -}; - - -exports.testNestedTests = function (test) { - var call_order = []; - var m = { - test1: function (test) { - test.done(); - }, - suite: { - t1: function (test) { - test.done(); - }, - t2: function (test) { - test.done(); - }, - another_suite: { - t3: function (test) { - test.done(); - } - } - } - }; - nodeunit.runModule('modulename', m, { - testStart: function (name) { - call_order.push(['testStart'].concat(name)); - }, - testReady: function (tst) { - call_order.push(['testReady']); - }, - testDone: function (name, assertions) { - call_order.push(['testDone'].concat(name)); - } - }, function () { - test.same(call_order, [ - ['testStart', 'test1'], ['testReady'], ['testDone', 'test1'], - ['testStart', 'suite', 't1'], ['testReady'], ['testDone', 'suite', 't1'], - ['testStart', 'suite', 't2'], ['testReady'], ['testDone', 'suite', 't2'], - ['testStart', 'suite', 'another_suite', 't3'], - ['testReady'], - ['testDone', 'suite', 'another_suite', 't3'] - ]); - test.done(); - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runtest.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runtest.js deleted file mode 100644 index 8fc3d52..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-runtest.js +++ /dev/null @@ -1,46 +0,0 @@ -/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER - - -exports.testArgs = function (test) { - test.ok(test.expect instanceof Function, 'test.expect'); - test.ok(test.done instanceof Function, 'test.done'); - test.ok(test.ok instanceof Function, 'test.ok'); - test.ok(test.same instanceof Function, 'test.same'); - test.ok(test.equals instanceof Function, 'test.equals'); - test.done(); -}; - -exports.testDoneCallback = function (test) { - test.expect(4); - nodeunit.runTest('testname', exports.testArgs, { - testDone: function (name, assertions) { - test.equals(assertions.failures(), 0, 'failures'); - test.equals(assertions.length, 5, 'length'); - test.ok(typeof assertions.duration === "number"); - test.equals(name, 'testname'); - } - }, test.done); -}; - -exports.testThrowError = function (test) { - test.expect(3); - var err = new Error('test'); - var testfn = function (test) { - throw err; - }; - nodeunit.runTest('testname', testfn, { - log: function (assertion) { - test.same(assertion.error, err, 'assertion.error'); - }, - testDone: function (name, assertions) { - test.equals(assertions.failures(), 1); - test.equals(assertions.length, 1); - } - }, test.done); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-sandbox.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-sandbox.js deleted file mode 100644 index 1b249d7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-sandbox.js +++ /dev/null @@ -1,31 +0,0 @@ -var nodeunit = require('../lib/nodeunit'); -var sandbox = require('../lib/utils').sandbox; -var testCase = nodeunit.testCase; - -exports.testSimpleSandbox = function (test) { - var raw_jscode1 = sandbox(__dirname + '/fixtures/raw_jscode1.js'); - test.equal(raw_jscode1.hello_world('foo'), '_foo_', 'evaluation ok'); - test.done(); -}; - -exports.testSandboxContext = function (test) { - var a_variable = 42; // should not be visible in the sandbox - var raw_jscode2 = sandbox(__dirname + '/fixtures/raw_jscode2.js'); - a_variable = 42; // again for the win - test.equal( - raw_jscode2.get_a_variable(), - 'undefined', - 'the variable should not be defined' - ); - test.done(); -}; - -exports.testSandboxMultiple = function (test) { - var raw_jscode3 = sandbox([ - __dirname + '/fixtures/raw_jscode3.js', - __dirname + '/fixtures/raw_jscode3.js', - __dirname + '/fixtures/raw_jscode3.js' - ]); - test.equal(raw_jscode3.t, 3, 'two files loaded'); - test.done(); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase-legacy.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase-legacy.js deleted file mode 100644 index 1dfd9a7..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase-legacy.js +++ /dev/null @@ -1,257 +0,0 @@ -/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER -var testCase = nodeunit.testCase; - -exports.testTestCase = function (test) { - test.expect(7); - var call_order = []; - var s = testCase({ - setUp: function (callback) { - call_order.push('setUp'); - test.equals(this.one, undefined); - this.one = 1; - callback(); - }, - tearDown: function (callback) { - call_order.push('tearDown'); - test.ok(true, 'tearDown called'); - callback(); - }, - test1: function (t) { - call_order.push('test1'); - test.equals(this.one, 1); - this.one = 2; - t.done(); - }, - test2: function (t) { - call_order.push('test2'); - test.equals(this.one, 1); - t.done(); - } - }); - nodeunit.runSuite(null, s, {}, function () { - test.same(call_order, [ - 'setUp', 'test1', 'tearDown', - 'setUp', 'test2', 'tearDown' - ]); - test.done(); - }); -}; - -exports.tearDownAfterError = function (test) { - test.expect(1); - var s = testCase({ - tearDown: function (callback) { - test.ok(true, 'tearDown called'); - callback(); - }, - test: function (t) { - throw new Error('some error'); - } - }); - nodeunit.runSuite(null, s, {}, function () { - test.done(); - }); -}; - -exports.catchSetUpError = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = testCase({ - setUp: function (callback) { - throw test_error; - }, - test: function (t) { - test.ok(false, 'test function should not be called'); - t.done(); - } - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.setUpErrorCallback = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = testCase({ - setUp: function (callback) { - callback(test_error); - }, - test: function (t) { - test.ok(false, 'test function should not be called'); - t.done(); - } - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.catchTearDownError = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = testCase({ - tearDown: function (callback) { - throw test_error; - }, - test: function (t) { - t.done(); - } - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.tearDownErrorCallback = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = testCase({ - tearDown: function (callback) { - callback(test_error); - }, - test: function (t) { - t.done(); - } - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.testErrorAndtearDownError = function (test) { - test.expect(3); - var error1 = new Error('test error one'); - var error2 = new Error('test error two'); - var s = testCase({ - tearDown: function (callback) { - callback(error2); - }, - test: function (t) { - t.done(error1); - } - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 2); - test.equal(assertions[0].error, error1); - test.equal(assertions[1].error, error2); - test.done(); - }); -}; - -exports.testCaseGroups = function (test) { - var call_order = []; - var s = testCase({ - setUp: function (callback) { - call_order.push('setUp'); - callback(); - }, - tearDown: function (callback) { - call_order.push('tearDown'); - callback(); - }, - test1: function (test) { - call_order.push('test1'); - test.done(); - }, - group1: { - test2: function (test) { - call_order.push('group1.test2'); - test.done(); - } - } - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.same(call_order, [ - 'setUp', - 'test1', - 'tearDown', - 'setUp', - 'group1.test2', - 'tearDown' - ]); - test.done(); - }); -}; - -exports.nestedTestCases = function (test) { - var call_order = []; - var s = testCase({ - setUp: function (callback) { - call_order.push('setUp'); - callback(); - }, - tearDown: function (callback) { - call_order.push('tearDown'); - callback(); - }, - test1: function (test) { - call_order.push('test1'); - test.done(); - }, - group1: testCase({ - setUp: function (callback) { - call_order.push('group1.setUp'); - callback(); - }, - tearDown: function (callback) { - call_order.push('group1.tearDown'); - callback(); - }, - test2: function (test) { - call_order.push('group1.test2'); - test.done(); - } - }) - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.same(call_order, [ - 'setUp', - 'test1', - 'tearDown', - 'setUp', - 'group1.setUp', - 'group1.test2', - 'group1.tearDown', - 'tearDown' - ]); - test.done(); - }); -}; - -exports.deepNestedTestCases = function (test) { - var val = 'foo'; - var s = testCase({ - setUp: function (callback) { - val = 'bar'; - callback(); - }, - group1: testCase({ - test: testCase({ - test2: function (test) { - test.equal(val, 'bar'); - test.done(); - } - }) - }) - }); - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.ok(!assertions[0].failed()); - test.equal(assertions.length, 1); - test.done(); - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase.js b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase.js deleted file mode 100644 index 5d33b0b..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test-testcase.js +++ /dev/null @@ -1,256 +0,0 @@ -/* THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * You can use @REMOVE_LINE_FOR_BROWSER to remove code from the browser build. - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -var nodeunit = require('../lib/nodeunit'); // @REMOVE_LINE_FOR_BROWSER - -exports.testTestCase = function (test) { - test.expect(7); - var call_order = []; - var s = { - setUp: function (callback) { - call_order.push('setUp'); - test.equals(this.one, undefined, 'in setUp, this.one not set'); - this.one = 1; - callback(); - }, - tearDown: function (callback) { - call_order.push('tearDown'); - test.ok(true, 'tearDown called'); - callback(); - }, - test1: function (t) { - call_order.push('test1'); - test.equals(this.one, 1, 'in test1, this.one is 1'); - this.one = 2; - t.done(); - }, - test2: function (t) { - call_order.push('test2'); - test.equals(this.one, 1, 'in test2, this.one is still 1'); - t.done(); - } - }; - nodeunit.runSuite(null, s, {}, function () { - test.same(call_order, [ - 'setUp', 'test1', 'tearDown', - 'setUp', 'test2', 'tearDown' - ]); - test.done(); - }); -}; - -exports.tearDownAfterError = function (test) { - test.expect(1); - var s = { - tearDown: function (callback) { - test.ok(true, 'tearDown called'); - callback(); - }, - test: function (t) { - throw new Error('some error'); - } - }; - nodeunit.runSuite(null, s, {}, function () { - test.done(); - }); -}; - -exports.catchSetUpError = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = { - setUp: function (callback) { - throw test_error; - }, - test: function (t) { - test.ok(false, 'test function should not be called'); - t.done(); - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.setUpErrorCallback = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = { - setUp: function (callback) { - callback(test_error); - }, - test: function (t) { - test.ok(false, 'test function should not be called'); - t.done(); - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.catchTearDownError = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = { - tearDown: function (callback) { - throw test_error; - }, - test: function (t) { - t.done(); - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.tearDownErrorCallback = function (test) { - test.expect(2); - var test_error = new Error('test error'); - var s = { - tearDown: function (callback) { - callback(test_error); - }, - test: function (t) { - t.done(); - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 1); - test.equal(assertions[0].error, test_error); - test.done(); - }); -}; - -exports.testErrorAndtearDownError = function (test) { - test.expect(3); - var error1 = new Error('test error one'); - var error2 = new Error('test error two'); - var s = { - tearDown: function (callback) { - callback(error2); - }, - test: function (t) { - t.done(error1); - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.equal(assertions.length, 2); - test.equal(assertions[0].error, error1); - test.equal(assertions[1].error, error2); - test.done(); - }); -}; - -exports.testCaseGroups = function (test) { - var call_order = []; - var s = { - setUp: function (callback) { - call_order.push('setUp'); - callback(); - }, - tearDown: function (callback) { - call_order.push('tearDown'); - callback(); - }, - test1: function (test) { - call_order.push('test1'); - test.done(); - }, - group1: { - test2: function (test) { - call_order.push('group1.test2'); - test.done(); - } - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.same(call_order, [ - 'setUp', - 'test1', - 'tearDown', - 'setUp', - 'group1.test2', - 'tearDown' - ]); - test.done(); - }); -}; - -exports.nestedTestCases = function (test) { - var call_order = []; - var s = { - setUp: function (callback) { - call_order.push('setUp'); - callback(); - }, - tearDown: function (callback) { - call_order.push('tearDown'); - callback(); - }, - test1: function (test) { - call_order.push('test1'); - test.done(); - }, - group1: { - setUp: function (callback) { - call_order.push('group1.setUp'); - callback(); - }, - tearDown: function (callback) { - call_order.push('group1.tearDown'); - callback(); - }, - test2: function (test) { - call_order.push('group1.test2'); - test.done(); - } - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.same(call_order, [ - 'setUp', - 'test1', - 'tearDown', - 'setUp', - 'group1.setUp', - 'group1.test2', - 'group1.tearDown', - 'tearDown' - ]); - test.done(); - }); -}; - -exports.deepNestedTestCases = function (test) { - var val = 'foo'; - var s = { - setUp: function (callback) { - val = 'bar'; - callback(); - }, - group1: { - test: { - test2: function (test) { - test.equal(val, 'bar'); - test.done(); - } - } - } - }; - nodeunit.runSuite(null, s, {}, function (err, assertions) { - test.ok(!assertions[0].failed()); - test.equal(assertions.length, 1); - test.done(); - }); -}; diff --git a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test.html b/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test.html deleted file mode 100644 index e0826de..0000000 --- a/node_modules/grunt-contrib-nodeunit/node_modules/nodeunit/test/test.html +++ /dev/null @@ -1,28 +0,0 @@ - - - Nodeunit Test Suite - - - - - - - - - - -

Nodeunit Test Suite

- - - diff --git a/node_modules/grunt-contrib-nodeunit/package.json b/node_modules/grunt-contrib-nodeunit/package.json deleted file mode 100644 index d85301c..0000000 --- a/node_modules/grunt-contrib-nodeunit/package.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "name": "grunt-contrib-nodeunit", - "description": "Run Nodeunit unit tests.", - "version": "0.2.2", - "homepage": "https://github.com/gruntjs/grunt-contrib-nodeunit", - "author": { - "name": "Grunt Team", - "url": "http://gruntjs.com/" - }, - "repository": { - "type": "git", - "url": "git://github.com/gruntjs/grunt-contrib-nodeunit.git" - }, - "bugs": { - "url": "https://github.com/gruntjs/grunt-contrib-nodeunit/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://github.com/gruntjs/grunt-contrib-nodeunit/blob/master/LICENSE-MIT" - } - ], - "engines": { - "node": ">= 0.8.0" - }, - "scripts": { - "test": "grunt test" - }, - "dependencies": { - "nodeunit": "~0.8.0" - }, - "devDependencies": { - "grunt-contrib-jshint": "~0.5.4", - "grunt-contrib-internal": "~0.4.5", - "grunt": "~0.4.0" - }, - "peerDependencies": { - "grunt": "~0.4.0" - }, - "keywords": [ - "gruntplugin" - ], - "contributors": [ - { - "name": "\"Cowboy\" Ben Alman", - "url": "http://benalman.com" - }, - { - "name": "Tyler Kellen", - "url": "http://goingslowly.com" - } - ], - "readme": "# grunt-contrib-nodeunit v0.2.2 [![Build Status](https://travis-ci.org/gruntjs/grunt-contrib-nodeunit.png?branch=master)](https://travis-ci.org/gruntjs/grunt-contrib-nodeunit)\n\n> Run Nodeunit unit tests.\n\n\n\n## Getting Started\nThis plugin requires Grunt `~0.4.0`\n\nIf you haven't used [Grunt](http://gruntjs.com/) before, be sure to check out the [Getting Started](http://gruntjs.com/getting-started) guide, as it explains how to create a [Gruntfile](http://gruntjs.com/sample-gruntfile) as well as install and use Grunt plugins. Once you're familiar with that process, you may install this plugin with this command:\n\n```shell\nnpm install grunt-contrib-nodeunit --save-dev\n```\n\nOnce the plugin has been installed, it may be enabled inside your Gruntfile with this line of JavaScript:\n\n```js\ngrunt.loadNpmTasks('grunt-contrib-nodeunit');\n```\n\n\n\n\n## Nodeunit task\n_Run this task with the `grunt nodeunit` command._\n\nTask targets, files and options may be specified according to the grunt [Configuring tasks](http://gruntjs.com/configuring-tasks) guide.\n\nThis plugin provides server-side JavaScript unit testing via [nodeunit](https://github.com/caolan/nodeunit/). If you're looking to test JavaScript that uses `window` or the DOM, please use the [grunt-contrib-qunit plugin](https://github.com/gruntjs/grunt-contrib-qunit)`qunit` task.\n\n\n### Usage examples\n\n#### Wildcards\n\nIn this example, `grunt nodeunit:all` or `grunt nodeunit` will test all files ending with `_test.js` in the `test` directory.\n\n```js\n// Project configuration.\ngrunt.initConfig({\n nodeunit: {\n all: ['test/*_test.js']\n }\n});\n```\n\nWith a slight modification, `grunt nodeunit:all` will test files matching the same pattern in the `test` directory _and all subdirectories_.\n\n```js\n// Project configuration.\ngrunt.initConfig({\n nodeunit: {\n all: ['test/**/*_test.js']\n }\n});\n```\n\n## Release History\n\n * 2013-10-19   v0.2.2   Allow missing operators on error object.\n * 2013-09-24   v0.2.1   Fix error display.\n * 2013-05-23   v0.2.0   Bump nodeunit to v0.8.0\n * 2013-02-15   v0.1.2   First official release for Grunt 0.4.0.\n * 2013-01-18   v0.1.2rc6   Updating grunt/gruntplugin dependencies to rc6. Changing in-development grunt/gruntplugin dependency versions from tilde version ranges to specific versions.\n * 2013-01-09   v0.1.2rc5   Updating to work with grunt v0.4.0rc5. Switching to this.filesSrc api.\n * 2012-11-13   v0.1.1   Switch to this.file api internally.\n * 2012-11-04   v0.1.0   Work in progress, not yet officially released.\n\n---\n\nTask submitted by [\"Cowboy\" Ben Alman](http://benalman.com)\n\n*This file was generated on Sat Oct 19 2013 14:59:01.*\n", - "readmeFilename": "README.md", - "_id": "grunt-contrib-nodeunit@0.2.2", - "_from": "grunt-contrib-nodeunit@~0.2.0" -} diff --git a/node_modules/grunt-contrib-nodeunit/tasks/nodeunit.js b/node_modules/grunt-contrib-nodeunit/tasks/nodeunit.js deleted file mode 100644 index 789447d..0000000 --- a/node_modules/grunt-contrib-nodeunit/tasks/nodeunit.js +++ /dev/null @@ -1,224 +0,0 @@ -/* - * grunt-contrib-nodeunit - * http://gruntjs.com/ - * - * Copyright (c) 2013 "Cowboy" Ben Alman, contributors - * Licensed under the MIT license. - */ - -'use strict'; - -module.exports = function(grunt) { - - // Nodejs libs. - var path = require('path'); - var util = require('util'); - - // External libs. - var nodeunit = require('nodeunit'); - - // ========================================================================== - // BETTER ERROR DISPLAY - // ========================================================================== - - // Much nicer error formatting than what comes with nodeunit. - var betterErrors = function (assertion) { - var e = assertion.error; - if (!e || !('actual' in e) || !('expected' in e)) { return assertion; } - - // Temporarily override the global "inspect" property because logging - // the entire global object is just silly. - var globalInspect = global.inspect; - global.inspect = function() { return '[object global]'; }; - - e._message = e.message; - - // Pretty-formatted objects. - var actual = util.inspect(e.actual, false, 10, true); - var expected = util.inspect(e.expected, false, 10, true); - - var indent = function(str) { - return (''+str).split('\n').map(function(s) { return ' ' + s; }).join('\n'); - }; - - var stack; - var multiline = (actual + expected).indexOf('\n') !== -1; - if (multiline) { - stack = [ - 'Actual:', indent(actual), - 'Operator:', indent(e.operator), - 'Expected:', indent(expected), - ].join('\n'); - } else { - stack = e.name + ': ' + actual + ' ' + e.operator + ' ' + expected; - } - - e.stack = stack + '\n' + e.stack.split('\n').slice(1).join('\n'); - - // Restore the global "inspect" property. - global.inspect = globalInspect; - return assertion; - }; - - // Reformat stack trace to remove nodeunit scripts, fix indentation, etc. - var cleanStack = function(error) { - error._stack = error.stack; - // Show a full stack trace? - var fullStack = grunt.option('verbose') || grunt.option('stack'); - // Reformat stack trace output. - error.stack = error.stack.split('\n').map(function(line) { - if (line[0] === ' ') { - // Remove nodeunit script srcs from non-verbose stack trace. - if (!fullStack && line.indexOf(path.join('node_modules', 'nodeunit') + path.sep) !== -1) { - return ''; - } - // Remove leading spaces. - line = line.replace(/^ {4}(?=at)/, ''); - // Remove cwd. - line = line.replace('(' + process.cwd() + path.sep, '('); - } else { - line = line.replace(/Assertion(Error)/, '$1'); - } - return line + '\n'; - }).join(''); - - return error; - }; - - // ========================================================================== - // CUSTOM NODEUNIT REPORTER - // ========================================================================== - - // Keep track of the last-started module. - var currentModule; - // Keep track of the last-started test(s). - var unfinished = {}; - - // If Nodeunit explodes because a test was missing test.done(), handle it. - process.on('exit', function() { - var len = Object.keys(unfinished).length; - // If there are unfinished tests, tell the user why Nodeunit killed grunt. - if (len > 0) { - grunt.log.muted = false; - grunt.verbose.error().or.writeln('F'.red); - grunt.log.error('Incomplete tests/setups/teardowns:'); - Object.keys(unfinished).forEach(grunt.log.error, grunt.log); - grunt.fatal('A test was missing test.done(), so nodeunit exploded. Sorry!', - Math.min(99, 90 + len)); - } - }); - - // Keep track of failed assertions for pretty-printing. - var failedAssertions = []; - function logFailedAssertions() { - var assertion, stack; - // Print each assertion error + stack. - while (assertion = failedAssertions.shift()) { - betterErrors(assertion); - cleanStack(assertion.error); - grunt.verbose.or.error(assertion.testName); - if (assertion.error.name === 'AssertionError' && assertion.message) { - grunt.log.error('Message: ' + assertion.message.magenta); - } - grunt.log.error(assertion.error.stack).writeln(); - } - } - - // Define our own Nodeunit reporter. - nodeunit.reporters.grunt = { - info: 'Grunt reporter', - run: function(files, options, callback) { - var opts = { - // No idea. - testspec: undefined, - // Executed when the first test in a file is run. If no tests exist in - // the file, this doesn't execute. - moduleStart: function(name) { - // Keep track of this so that moduleDone output can be suppressed in - // cases where a test file contains no tests. - currentModule = name; - grunt.verbose.subhead('Testing ' + name).or.write('Testing ' + name); - }, - // Executed after a file is done being processed. This executes whether - // tests exist in the file or not. - moduleDone: function(name) { - // Abort if no tests actually ran. - if (name !== currentModule) { return; } - // Print assertion errors here, if verbose mode is disabled. - if (!grunt.option('verbose')) { - if (failedAssertions.length > 0) { - grunt.log.writeln(); - logFailedAssertions(); - } else { - grunt.log.ok(); - } - } - }, - // Executed before each test is run. - testStart: function(name) { - // Keep track of the current test, in case test.done() was omitted - // and Nodeunit explodes. - unfinished[name] = name; - grunt.verbose.write(name + '...'); - // Mute output, in cases where a function being tested logs through - // grunt (for testing grunt internals). - grunt.log.muted = true; - }, - // Executed after each test and all its assertions are run. - testDone: function(name, assertions) { - delete unfinished[name]; - // Un-mute output. - grunt.log.muted = false; - // Log errors if necessary, otherwise success. - if (assertions.failures()) { - assertions.forEach(function(ass) { - if (ass.failed()) { - ass.testName = name; - failedAssertions.push(ass); - } - }); - if (grunt.option('verbose')) { - grunt.log.error(); - logFailedAssertions(); - } else { - grunt.log.write('F'.red); - } - } else { - grunt.verbose.ok().or.write('.'); - } - }, - // Executed when everything is all done. - done: function (assertions) { - if (assertions.failures()) { - grunt.warn(assertions.failures() + '/' + assertions.length + - ' assertions failed (' + assertions.duration + 'ms)'); - } else if (assertions.length === 0) { - grunt.warn('0/0 assertions ran (' + assertions.duration + 'ms)'); - } else { - grunt.verbose.writeln(); - grunt.log.ok(assertions.length + ' assertions passed (' + - assertions.duration + 'ms)'); - } - // Tell the task manager we're all done. - callback(); // callback(assertions.failures() === 0); - } - }; - - // Nodeunit needs absolute paths. - var paths = files.map(function(filepath) { - return path.resolve(filepath); - }); - nodeunit.runFiles(paths, opts); - } - }; - - // ========================================================================== - // TASKS - // ========================================================================== - - grunt.registerMultiTask('nodeunit', 'Run Nodeunit unit tests.', function() { - // Run test(s). - nodeunit.reporters.grunt.run(this.filesSrc, {}, this.async()); - }); - -}; diff --git a/node_modules/grunt-contrib-nodeunit/test/fixtures/fail.js b/node_modules/grunt-contrib-nodeunit/test/fixtures/fail.js deleted file mode 100644 index 9e2db63..0000000 --- a/node_modules/grunt-contrib-nodeunit/test/fixtures/fail.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -exports.fail = { - fail: function(test) { - test.ok(undefined, 'this value should be truthy'); - test.done(); - }, - failSupertestError: function(test) { - var error = new Error('Something arbitrary'); - // Must be long enough that the inspect calls try to - // wrap the line for indentation. - error.actual = { foo: 'bar', something: 'complex', more: 'more' }; - error.expected = "No you didn't" - error.showDiff = true; - throw(error); - test.done(); - }, -}; diff --git a/node_modules/grunt-contrib-nodeunit/test/nodeunit_test.js b/node_modules/grunt-contrib-nodeunit/test/nodeunit_test.js deleted file mode 100644 index 2055ce0..0000000 --- a/node_modules/grunt-contrib-nodeunit/test/nodeunit_test.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -var grunt = require('grunt'); - -exports.nodeunit = { - please_work: function(test) { - test.expect(1); - test.ok(true, 'this had better work.'); - test.done(); - }, - fail: function(test) { - test.expect(3); - grunt.util.spawn({ - grunt: true, - args: ['test:fail', '--no-color'], - }, function(err, result) { - test.ok(result.stdout.indexOf("Operator:") !== -1, 'Operator should display for multiline.'); - test.ok(result.stdout.indexOf('Message: this value should be truthy') !== -1, 'Message should have been displayed.'); - test.ok(result.stdout.indexOf('Error: undefined == true') !== -1, 'Error should have been displayed.'); - test.done(); - }); - }, -}; diff --git a/node_modules/grunt-contrib-uglify/package.json b/node_modules/grunt-contrib-uglify/package.json index 0014ddd..119eda4 100644 --- a/node_modules/grunt-contrib-uglify/package.json +++ b/node_modules/grunt-contrib-uglify/package.json @@ -68,7 +68,7 @@ "homepage": "https://github.com/gruntjs/grunt-contrib-uglify", "_id": "grunt-contrib-uglify@0.9.1", "_shasum": "1eb8420009f15ed1a97368077479ab25ded28d1b", - "_from": "grunt-contrib-uglify@*", + "_from": "grunt-contrib-uglify@>=0.9.1 <0.10.0", "_npmVersion": "2.4.1", "_nodeVersion": "0.10.35", "_npmUser": { diff --git a/node_modules/grunt/node_modules/.bin/cake b/node_modules/grunt/node_modules/.bin/cake index d95f32a..da84bdc 120000 --- a/node_modules/grunt/node_modules/.bin/cake +++ b/node_modules/grunt/node_modules/.bin/cake @@ -1 +1,15 @@ -../coffee-script/bin/cake \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../coffee-script/bin/cake" "$@" + ret=$? +else + node "$basedir/../coffee-script/bin/cake" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/.bin/coffee b/node_modules/grunt/node_modules/.bin/coffee index b57f275..04d88bf 120000 --- a/node_modules/grunt/node_modules/.bin/coffee +++ b/node_modules/grunt/node_modules/.bin/coffee @@ -1 +1,15 @@ -../coffee-script/bin/coffee \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../coffee-script/bin/coffee" "$@" + ret=$? +else + node "$basedir/../coffee-script/bin/coffee" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/.bin/js-yaml b/node_modules/grunt/node_modules/.bin/js-yaml index 9dbd010..2dd4d29 120000 --- a/node_modules/grunt/node_modules/.bin/js-yaml +++ b/node_modules/grunt/node_modules/.bin/js-yaml @@ -1 +1,15 @@ -../js-yaml/bin/js-yaml.js \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../js-yaml/bin/js-yaml.js" "$@" + ret=$? +else + node "$basedir/../js-yaml/bin/js-yaml.js" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/.bin/nopt b/node_modules/grunt/node_modules/.bin/nopt index 6b6566e..25995f3 120000 --- a/node_modules/grunt/node_modules/.bin/nopt +++ b/node_modules/grunt/node_modules/.bin/nopt @@ -1 +1,15 @@ -../nopt/bin/nopt.js \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../nopt/bin/nopt.js" "$@" + ret=$? +else + node "$basedir/../nopt/bin/nopt.js" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/.bin/rimraf b/node_modules/grunt/node_modules/.bin/rimraf index 4cd49a4..71c3553 120000 --- a/node_modules/grunt/node_modules/.bin/rimraf +++ b/node_modules/grunt/node_modules/.bin/rimraf @@ -1 +1,15 @@ -../rimraf/bin.js \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../rimraf/bin.js" "$@" + ret=$? +else + node "$basedir/../rimraf/bin.js" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/.bin/which b/node_modules/grunt/node_modules/.bin/which index f62471c..9c7f24b 120000 --- a/node_modules/grunt/node_modules/.bin/which +++ b/node_modules/grunt/node_modules/.bin/which @@ -1 +1,15 @@ -../which/bin/which \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../which/bin/which" "$@" + ret=$? +else + node "$basedir/../which/bin/which" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/async/package.json b/node_modules/grunt/node_modules/async/package.json index 671c9dc..6457dd6 100644 --- a/node_modules/grunt/node_modules/async/package.json +++ b/node_modules/grunt/node_modules/async/package.json @@ -8,7 +8,7 @@ "version": "0.1.22", "repository": { "type": "git", - "url": "http://github.com/caolan/async.git" + "url": "git://github.com/caolan/async.git" }, "bugs": { "url": "http://github.com/caolan/async/issues" @@ -24,9 +24,34 @@ "uglify-js": "1.2.x", "nodelint": ">0.0.0" }, - "readme": "# Async.js\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [node.js](http://nodejs.org), it can also be used directly in the\nbrowser.\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (map, reduce, filter, forEach…) as well as some common patterns\nfor asynchronous control flow (parallel, series, waterfall…). All these\nfunctions assume you follow the node.js convention of providing a single\ncallback as the last argument of your async function.\n\n\n## Quick Examples\n\n async.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n });\n\n async.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n });\n\n async.parallel([\n function(){ ... },\n function(){ ... }\n ], callback);\n\n async.series([\n function(){ ... },\n function(){ ... }\n ]);\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n\n## Download\n\nReleases are available for download from\n[GitHub](http://github.com/caolan/async/downloads).\nAlternatively, you can install using Node Package Manager (npm):\n\n npm install async\n\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed\n\n__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped\n\n\n## In the Browser\n\nSo far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage:\n\n \n \n\n\n## Documentation\n\n### Collections\n\n* [forEach](#forEach)\n* [map](#map)\n* [filter](#filter)\n* [reject](#reject)\n* [reduce](#reduce)\n* [detect](#detect)\n* [sortBy](#sortBy)\n* [some](#some)\n* [every](#every)\n* [concat](#concat)\n\n### Control Flow\n\n* [series](#series)\n* [parallel](#parallel)\n* [whilst](#whilst)\n* [until](#until)\n* [waterfall](#waterfall)\n* [queue](#queue)\n* [auto](#auto)\n* [iterator](#iterator)\n* [apply](#apply)\n* [nextTick](#nextTick)\n\n### Utils\n\n* [memoize](#memoize)\n* [unmemoize](#unmemoize)\n* [log](#log)\n* [dir](#dir)\n* [noConflict](#noConflict)\n\n\n## Collections\n\n\n### forEach(arr, iterator, callback)\n\nApplies an iterator function to each item in an array, in parallel.\nThe iterator is called with an item from the list and a callback for when it\nhas finished. If the iterator passes an error to this callback, the main\ncallback for the forEach function is immediately called with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n // assuming openFiles is an array of file names and saveFile is a function\n // to save the modified contents of that file:\n\n async.forEach(openFiles, saveFile, function(err){\n // if any of the saves produced an error, err would equal that error\n });\n\n---------------------------------------\n\n\n### forEachSeries(arr, iterator, callback)\n\nThe same as forEach only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. This means the iterator functions will complete in order.\n\n\n---------------------------------------\n\n\n### forEachLimit(arr, limit, iterator, callback)\n\nThe same as forEach only the iterator is applied to batches of items in the\narray, in series. The next batch of iterators is only called once the current\none has completed processing.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* limit - How many items should be in each batch.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(err) - A callback which is called after all the iterator functions\n have finished, or an error has occurred.\n\n__Example__\n\n // Assume documents is an array of JSON objects and requestApi is a\n // function that interacts with a rate-limited REST api.\n\n async.forEachLimit(documents, 20, requestApi, function(err){\n // if any of the saves produced an error, err would equal that error\n });\n---------------------------------------\n\n\n### map(arr, iterator, callback)\n\nProduces a new array of values by mapping each value in the given array through\nthe iterator function. The iterator is called with an item from the array and a\ncallback for when it has finished processing. The callback takes 2 arguments, \nan error and the transformed item from the array. If the iterator passes an\nerror to this callback, the main callback for the map function is immediately\ncalled with the error.\n\nNote, that since this function applies the iterator to each item in parallel\nthere is no guarantee that the iterator functions will complete in order, however\nthe results array will be in the same order as the original array.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and a transformed item.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array of the\n transformed items from the original array.\n\n__Example__\n\n async.map(['file1','file2','file3'], fs.stat, function(err, results){\n // results is now an array of stats for each file\n });\n\n---------------------------------------\n\n\n### mapSeries(arr, iterator, callback)\n\nThe same as map only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n\n---------------------------------------\n\n\n### filter(arr, iterator, callback)\n\n__Alias:__ select\n\nReturns a new array of all the values which pass an async truth test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(results) - A callback which is called after all the iterator\n functions have finished.\n\n__Example__\n\n async.filter(['file1','file2','file3'], path.exists, function(results){\n // results now equals an array of the existing files\n });\n\n---------------------------------------\n\n\n### filterSeries(arr, iterator, callback)\n\n__alias:__ selectSeries\n\nThe same as filter only the iterator is applied to each item in the array in\nseries. The next iterator is only called once the current one has completed\nprocessing. The results array will be in the same order as the original.\n\n---------------------------------------\n\n\n### reject(arr, iterator, callback)\n\nThe opposite of filter. Removes values that pass an async truth test.\n\n---------------------------------------\n\n\n### rejectSeries(arr, iterator, callback)\n\nThe same as filter, only the iterator is applied to each item in the array\nin series.\n\n\n---------------------------------------\n\n\n### reduce(arr, memo, iterator, callback)\n\n__aliases:__ inject, foldl\n\nReduces a list of values into a single value using an async iterator to return\neach successive step. Memo is the initial state of the reduction. This\nfunction only operates in series. For performance reasons, it may make sense to\nsplit a call to this function into a parallel map, then use the normal\nArray.prototype.reduce on the results. This function is for situations where\neach step in the reduction needs to be async, if you can get the data before\nreducing it then its probably a good idea to do so.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* memo - The initial state of the reduction.\n* iterator(memo, item, callback) - A function applied to each item in the\n array to produce the next step in the reduction. The iterator is passed a\n callback which accepts an optional error as its first argument, and the state\n of the reduction as the second. If an error is passed to the callback, the\n reduction is stopped and the main callback is immediately called with the\n error.\n* callback(err, result) - A callback which is called after all the iterator\n functions have finished. Result is the reduced value.\n\n__Example__\n\n async.reduce([1,2,3], 0, function(memo, item, callback){\n // pointless async:\n process.nextTick(function(){\n callback(null, memo + item)\n });\n }, function(err, result){\n // result is now equal to the last value of memo, which is 6\n });\n\n---------------------------------------\n\n\n### reduceRight(arr, memo, iterator, callback)\n\n__Alias:__ foldr\n\nSame as reduce, only operates on the items in the array in reverse order.\n\n\n---------------------------------------\n\n\n### detect(arr, iterator, callback)\n\nReturns the first value in a list that passes an async truth test. The\niterator is applied in parallel, meaning the first iterator to return true will\nfire the detect callback with that result. That means the result might not be\nthe first item in the original array (in terms of order) that passes the test.\n\nIf order within the original array is important then look at detectSeries.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n the first item in the array that passes the truth test (iterator) or the\n value undefined if none passed.\n\n__Example__\n\n async.detect(['file1','file2','file3'], path.exists, function(result){\n // result now equals the first file in the list that exists\n });\n\n---------------------------------------\n\n\n### detectSeries(arr, iterator, callback)\n\nThe same as detect, only the iterator is applied to each item in the array\nin series. This means the result is always the first in the original array (in\nterms of array order) that passes the truth test.\n\n\n---------------------------------------\n\n\n### sortBy(arr, iterator, callback)\n\nSorts a list by the results of running each value through an async iterator.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and a value to use as the sort criteria.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is the items from\n the original array sorted by the values returned by the iterator calls.\n\n__Example__\n\n async.sortBy(['file1','file2','file3'], function(file, callback){\n fs.stat(file, function(err, stats){\n callback(err, stats.mtime);\n });\n }, function(err, results){\n // results is now the original array of files sorted by\n // modified date\n });\n\n\n---------------------------------------\n\n\n### some(arr, iterator, callback)\n\n__Alias:__ any\n\nReturns true if at least one element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists. Once any iterator\ncall returns true, the main callback is immediately called.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called as soon as any iterator returns\n true, or after all the iterator functions have finished. Result will be\n either true or false depending on the values of the async tests.\n\n__Example__\n\n async.some(['file1','file2','file3'], path.exists, function(result){\n // if result is true then at least one of the files exists\n });\n\n---------------------------------------\n\n\n### every(arr, iterator, callback)\n\n__Alias:__ all\n\nReturns true if every element in the array satisfies an async test.\n_The callback for each iterator call only accepts a single argument of true or\nfalse, it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like path.exists.\n\n__Arguments__\n\n* arr - An array to iterate over.\n* iterator(item, callback) - A truth test to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed.\n* callback(result) - A callback which is called after all the iterator\n functions have finished. Result will be either true or false depending on\n the values of the async tests.\n\n__Example__\n\n async.every(['file1','file2','file3'], path.exists, function(result){\n // if result is true then every file exists\n });\n\n---------------------------------------\n\n\n### concat(arr, iterator, callback)\n\nApplies an iterator to each item in a list, concatenating the results. Returns the\nconcatenated list. The iterators are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of the arguments passed to the iterator function.\n\n__Arguments__\n\n* arr - An array to iterate over\n* iterator(item, callback) - A function to apply to each item in the array.\n The iterator is passed a callback which must be called once it has completed\n with an error (which can be null) and an array of results.\n* callback(err, results) - A callback which is called after all the iterator\n functions have finished, or an error has occurred. Results is an array containing\n the concatenated results of the iterator function.\n\n__Example__\n\n async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n // files is now a list of filenames that exist in the 3 directories\n });\n\n---------------------------------------\n\n\n### concatSeries(arr, iterator, callback)\n\nSame as async.concat, but executes in series instead of parallel.\n\n\n## Control Flow\n\n\n### series(tasks, [callback])\n\nRun an array of functions in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run and the callback for the series is\nimmediately called with the value of the error. Once the tasks have completed,\nthe results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.series.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed\n a callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets an array of all the arguments passed to\n the callbacks used in the array.\n\n__Example__\n\n async.series([\n function(callback){\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback){\n // do some more stuff ...\n callback(null, 'two');\n },\n ],\n // optional callback\n function(err, results){\n // results is now equal to ['one', 'two']\n });\n\n\n // an example using an object instead of an array\n async.series({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n },\n },\n function(err, results) {\n // results is now equal to: {one: 1, two: 2}\n });\n\n\n---------------------------------------\n\n\n### parallel(tasks, [callback])\n\nRun an array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main callback is immediately called with the value of the error.\nOnce the tasks have completed, the results are passed to the final callback as an\narray.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final callback as an object\ninstead of an array. This can be a more readable way of handling results from\nasync.parallel.\n\n\n__Arguments__\n\n* tasks - An array or object containing functions to run, each function is passed a\n callback it must call on completion.\n* callback(err, results) - An optional callback to run once all the functions\n have completed. This function gets an array of all the arguments passed to\n the callbacks used in the array.\n\n__Example__\n\n async.parallel([\n function(callback){\n setTimeout(function(){\n callback(null, 'one');\n }, 200);\n },\n function(callback){\n setTimeout(function(){\n callback(null, 'two');\n }, 100);\n },\n ],\n // optional callback\n function(err, results){\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n });\n\n\n // an example using an object instead of an array\n async.parallel({\n one: function(callback){\n setTimeout(function(){\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function(){\n callback(null, 2);\n }, 100);\n },\n },\n function(err, results) {\n // results is now equals to: {one: 1, two: 2}\n });\n\n\n---------------------------------------\n\n\n### whilst(test, fn, callback)\n\nRepeatedly call fn, while test returns true. Calls the callback when stopped,\nor an error occurs.\n\n__Arguments__\n\n* test() - synchronous truth test to perform before each execution of fn.\n* fn(callback) - A function to call each time the test passes. The function is\n passed a callback which must be called once it has completed with an optional\n error as the first argument.\n* callback(err) - A callback which is called after the test fails and repeated\n execution of fn has stopped.\n\n__Example__\n\n var count = 0;\n\n async.whilst(\n function () { return count < 5; },\n function (callback) {\n count++;\n setTimeout(callback, 1000);\n },\n function (err) {\n // 5 seconds have passed\n }\n );\n\n\n---------------------------------------\n\n\n### until(test, fn, callback)\n\nRepeatedly call fn, until test returns true. Calls the callback when stopped,\nor an error occurs.\n\nThe inverse of async.whilst.\n\n\n---------------------------------------\n\n\n### waterfall(tasks, [callback])\n\nRuns an array of functions in series, each passing their results to the next in\nthe array. However, if any of the functions pass an error to the callback, the\nnext function is not executed and the main callback is immediately called with\nthe error.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n must call on completion.\n* callback(err, [results]) - An optional callback to run once all the functions\n have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n async.waterfall([\n function(callback){\n callback(null, 'one', 'two');\n },\n function(arg1, arg2, callback){\n callback(null, 'three');\n },\n function(arg1, callback){\n // arg1 now equals 'three'\n callback(null, 'done');\n }\n ], function (err, result) {\n // result now equals 'done' \n });\n\n\n---------------------------------------\n\n\n### queue(worker, concurrency)\n\nCreates a queue object with the specified concurrency. Tasks added to the\nqueue will be processed in parallel (up to the concurrency limit). If all\nworkers are in progress, the task is queued until one is available. Once\na worker has completed a task, the task's callback is called.\n\n__Arguments__\n\n* worker(task, callback) - An asynchronous function for processing a queued\n task.\n* concurrency - An integer for determining how many worker functions should be\n run in parallel.\n\n__Queue objects__\n\nThe queue object returned by this function has the following properties and\nmethods:\n\n* length() - a function returning the number of items waiting to be processed.\n* concurrency - an integer for determining how many worker functions should be\n run in parallel. This property can be changed after a queue is created to\n alter the concurrency on-the-fly.\n* push(task, [callback]) - add a new task to the queue, the callback is called\n once the worker has finished processing the task.\n instead of a single task, an array of tasks can be submitted. the respective callback is used for every task in the list.\n* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued\n* empty - a callback that is called when the last item from the queue is given to a worker\n* drain - a callback that is called when the last item from the queue has returned from the worker\n\n__Example__\n\n // create a queue object with concurrency 2\n\n var q = async.queue(function (task, callback) {\n console.log('hello ' + task.name);\n callback();\n }, 2);\n\n\n // assign a callback\n q.drain = function() {\n console.log('all items have been processed');\n }\n\n // add some items to the queue\n\n q.push({name: 'foo'}, function (err) {\n console.log('finished processing foo');\n });\n q.push({name: 'bar'}, function (err) {\n console.log('finished processing bar');\n });\n\n // add some items to the queue (batch-wise)\n\n q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n console.log('finished processing bar');\n });\n\n\n---------------------------------------\n\n\n### auto(tasks, [callback])\n\nDetermines the best order for running functions based on their requirements.\nEach function can optionally depend on other functions being completed first,\nand each function is run as soon as its requirements are satisfied. If any of\nthe functions pass an error to their callback, that function will not complete\n(so any other functions depending on it will not run) and the main callback\nwill be called immediately with the error. Functions also receive an object\ncontaining the results of functions which have completed so far.\n\n__Arguments__\n\n* tasks - An object literal containing named functions or an array of\n requirements, with the function itself the last item in the array. The key\n used for each function or array is used when specifying requirements. The\n syntax is easier to understand by looking at the example.\n* callback(err, results) - An optional callback which is called when all the\n tasks have been completed. The callback will receive an error as an argument\n if any tasks pass an error to their callback. If all tasks complete\n successfully, it will receive an object containing their results.\n\n__Example__\n\n async.auto({\n get_data: function(callback){\n // async code to get some data\n },\n make_folder: function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n },\n write_file: ['get_data', 'make_folder', function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n callback(null, filename);\n }],\n email_link: ['write_file', function(callback, results){\n // once the file is written let's email a link to it...\n // results.write_file contains the filename returned by write_file.\n }]\n });\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n async.parallel([\n function(callback){\n // async code to get some data\n },\n function(callback){\n // async code to create a directory to store a file in\n // this is run at the same time as getting the data\n }\n ],\n function(results){\n async.series([\n function(callback){\n // once there is some data and the directory exists,\n // write the data to a file in the directory\n },\n email_link: function(callback){\n // once the file is written let's email a link to it...\n }\n ]);\n });\n\nFor a complicated series of async tasks using the auto function makes adding\nnew tasks much easier and makes the code more readable.\n\n\n---------------------------------------\n\n\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the array,\nreturning a continuation to call the next one after that. Its also possible to\n'peek' the next iterator by doing iterator.next().\n\nThis function is used internally by the async module but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* tasks - An array of functions to run, each function is passed a callback it\n must call on completion.\n\n__Example__\n\n var iterator = async.iterator([\n function(){ sys.p('one'); },\n function(){ sys.p('two'); },\n function(){ sys.p('three'); }\n ]);\n\n node> var iterator2 = iterator();\n 'one'\n node> var iterator3 = iterator2();\n 'two'\n node> iterator3();\n 'three'\n node> var nextfn = iterator2.next();\n node> nextfn();\n 'three'\n\n\n---------------------------------------\n\n\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied, a useful\nshorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to automatically apply when the\n continuation is called.\n\n__Example__\n\n // using apply\n\n async.parallel([\n async.apply(fs.writeFile, 'testfile1', 'test1'),\n async.apply(fs.writeFile, 'testfile2', 'test2'),\n ]);\n\n\n // the same process without using apply\n\n async.parallel([\n function(callback){\n fs.writeFile('testfile1', 'test1', callback);\n },\n function(callback){\n fs.writeFile('testfile2', 'test2', callback);\n },\n ]);\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n node> var fn = async.apply(sys.puts, 'one');\n node> fn('two', 'three');\n one\n two\n three\n\n---------------------------------------\n\n\n### nextTick(callback)\n\nCalls the callback on a later loop around the event loop. In node.js this just\ncalls process.nextTick, in the browser it falls back to setTimeout(callback, 0),\nwhich means other higher priority events may precede the execution of the callback.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* callback - The function to call on a later loop around the event loop.\n\n__Example__\n\n var call_order = [];\n async.nextTick(function(){\n call_order.push('two');\n // call_order now equals ['one','two]\n });\n call_order.push('one')\n\n\n## Utils\n\n\n### memoize(fn, [hasher])\n\nCaches the results of an async function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\n__Arguments__\n\n* fn - the function you to proxy and cache results from.\n* hasher - an optional function for generating a custom hash for storing\n results, it has all the arguments applied to it apart from the callback, and\n must be synchronous.\n\n__Example__\n\n var slow_fn = function (name, callback) {\n // do something\n callback(null, result);\n };\n var fn = async.memoize(slow_fn);\n\n // fn can now be used as if it were slow_fn\n fn('some name', function () {\n // callback\n });\n\n\n### unmemoize(fn)\n\nUndoes a memoized function, reverting it to the original, unmemoized\nform. Comes handy in tests.\n\n__Arguments__\n\n* fn - the memoized function\n\n\n### log(function, arguments)\n\nLogs the result of an async function to the console. Only works in node.js or\nin browsers that support console.log and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.log is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n var hello = function(name, callback){\n setTimeout(function(){\n callback(null, 'hello ' + name);\n }, 1000);\n };\n\n node> async.log(hello, 'world');\n 'hello world'\n\n\n---------------------------------------\n\n\n### dir(function, arguments)\n\nLogs the result of an async function to the console using console.dir to\ndisplay the properties of the resulting object. Only works in node.js or\nin browsers that support console.dir and console.error (such as FF and Chrome).\nIf multiple arguments are returned from the async function, console.dir is\ncalled on each argument in order.\n\n__Arguments__\n\n* function - The function you want to eventually apply all arguments to.\n* arguments... - Any number of arguments to apply to the function.\n\n__Example__\n\n var hello = function(name, callback){\n setTimeout(function(){\n callback(null, {hello: name});\n }, 1000);\n };\n\n node> async.dir(hello, 'world');\n {hello: 'world'}\n\n\n---------------------------------------\n\n\n### noConflict()\n\nChanges the value of async back to its original value, returning a reference to the\nasync object.\n", - "readmeFilename": "README.md", - "homepage": "https://github.com/caolan/async", + "_npmUser": { + "name": "caolan", + "email": "caolan@caolanmcmahon.com" + }, "_id": "async@0.1.22", - "_from": "async@~0.1.22" + "dependencies": {}, + "optionalDependencies": {}, + "engines": { + "node": "*" + }, + "_engineSupported": true, + "_npmVersion": "1.1.21", + "_nodeVersion": "v0.6.18", + "_defaultsLoaded": true, + "dist": { + "shasum": "0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061", + "tarball": "http://registry.npmjs.org/async/-/async-0.1.22.tgz" + }, + "maintainers": [ + { + "name": "caolan", + "email": "caolan@caolanmcmahon.com" + } + ], + "directories": {}, + "_shasum": "0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061", + "_from": "async@>=0.1.22 <0.2.0", + "_resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/caolan/async" } diff --git a/node_modules/grunt/node_modules/coffee-script/package.json b/node_modules/grunt/node_modules/coffee-script/package.json index 56f3097..37f77ff 100644 --- a/node_modules/grunt/node_modules/coffee-script/package.json +++ b/node_modules/grunt/node_modules/coffee-script/package.json @@ -40,8 +40,29 @@ "uglify-js": ">=1.0.0", "jison": ">=0.2.0" }, - "readme": "\n {\n } } {\n { { } }\n } }{ {\n { }{ } } _____ __ __\n ( }{ }{ { ) / ____| / _|/ _|\n .- { { } { }} -. | | ___ | |_| |_ ___ ___\n ( ( } { } { } } ) | | / _ \\| _| _/ _ \\/ _ \\\n |`-..________ ..-'| | |___| (_) | | | || __/ __/\n | | \\_____\\___/|_| |_| \\___|\\___|\n | ;--.\n | (__ \\ _____ _ _\n | | ) ) / ____| (_) | |\n | |/ / | (___ ___ _ __ _ _ __ | |_\n | ( / \\___ \\ / __| '__| | '_ \\| __|\n | |/ ____) | (__| | | | |_) | |_\n | | |_____/ \\___|_| |_| .__/ \\__|\n `-.._________..-' | |\n |_|\n\n\n CoffeeScript is a little language that compiles into JavaScript.\n\n Install Node.js, and then the CoffeeScript compiler:\n sudo bin/cake install\n\n Or, if you have the Node Package Manager installed:\n npm install -g coffee-script\n (Leave off the -g if you don't wish to install globally.)\n\n Execute a script:\n coffee /path/to/script.coffee\n\n Compile a script:\n coffee -c /path/to/script.coffee\n\n For documentation, usage, and examples, see:\n http://coffeescript.org/\n\n To suggest a feature, report a bug, or general discussion:\n http://github.com/jashkenas/coffee-script/issues/\n\n If you'd like to chat, drop by #coffeescript on Freenode IRC,\n or on webchat.freenode.net.\n\n The source repository:\n git://github.com/jashkenas/coffee-script.git\n\n All contributors are listed here:\n http://github.com/jashkenas/coffee-script/contributors\n", - "readmeFilename": "README", + "_npmUser": { + "name": "jashkenas", + "email": "jashkenas@gmail.com" + }, "_id": "coffee-script@1.3.3", - "_from": "coffee-script@~1.3.3" + "dependencies": {}, + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.18", + "_nodeVersion": "v0.6.16", + "_defaultsLoaded": true, + "dist": { + "shasum": "150d6b4cb522894369efed6a2101c20bc7f4a4f4", + "tarball": "http://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" + }, + "maintainers": [ + { + "name": "jashkenas", + "email": "jashkenas@gmail.com" + } + ], + "_shasum": "150d6b4cb522894369efed6a2101c20bc7f4a4f4", + "_from": "coffee-script@>=1.3.3 <1.4.0", + "_resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/colors/package.json b/node_modules/grunt/node_modules/colors/package.json index 54dfcbe..aa0d476 100644 --- a/node_modules/grunt/node_modules/colors/package.json +++ b/node_modules/grunt/node_modules/colors/package.json @@ -16,14 +16,32 @@ ], "repository": { "type": "git", - "url": "http://github.com/Marak/colors.js.git" + "url": "git+ssh://git@github.com/Marak/colors.js.git" }, "engines": { "node": ">=0.1.90" }, "main": "colors", - "readme": "# colors.js - get color and style in your node.js console ( and browser ) like what\n\n\n\n\n## Installation\n\n npm install colors\n\n## colors and styles!\n\n- bold\n- italic\n- underline\n- inverse\n- yellow\n- cyan\n- white\n- magenta\n- green\n- red\n- grey\n- blue\n- rainbow\n- zebra\n- random\n\n## Usage\n\n``` js\nvar colors = require('./colors');\n\nconsole.log('hello'.green); // outputs green text\nconsole.log('i like cake and pies'.underline.red) // outputs red underlined text\nconsole.log('inverse the color'.inverse); // inverses the color\nconsole.log('OMG Rainbows!'.rainbow); // rainbow (ignores spaces)\n```\n\n# Creating Custom themes\n\n```js\n\nvar colors = require('colors');\n\ncolors.setTheme({\n silly: 'rainbow',\n input: 'grey',\n verbose: 'cyan',\n prompt: 'grey',\n info: 'green',\n data: 'grey',\n help: 'cyan',\n warn: 'yellow',\n debug: 'blue',\n error: 'red'\n});\n\n// outputs red text\nconsole.log(\"this is an error\".error);\n\n// outputs yellow text\nconsole.log(\"this is a warning\".warn);\n```\n\n\n### Contributors \n\nMarak (Marak Squires)\nAlexis Sellier (cloudhead)\nmmalecki (Maciej Małecki)\nnicoreed (Nico Reed)\nmorganrallen (Morgan Allen)\nJustinCampbell (Justin Campbell)\nded (Dustin Diaz)\n\n\n#### , Marak Squires , Justin Campbell, Dustin Diaz (@ded)\n", - "readmeFilename": "ReadMe.md", "_id": "colors@0.6.2", - "_from": "colors@~0.6.2" + "dist": { + "shasum": "2423fe6678ac0c5dae8852e5d0e5be08c997abcc", + "tarball": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "_from": "colors@>=0.6.2 <0.7.0", + "_npmVersion": "1.2.30", + "_npmUser": { + "name": "marak", + "email": "marak.squires@gmail.com" + }, + "maintainers": [ + { + "name": "marak", + "email": "marak.squires@gmail.com" + } + ], + "directories": {}, + "_shasum": "2423fe6678ac0c5dae8852e5d0e5be08c997abcc", + "_resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "readme": "ERROR: No README data found!", + "scripts": {} } diff --git a/node_modules/grunt/node_modules/dateformat/package.json b/node_modules/grunt/node_modules/dateformat/package.json index 921d28d..47cf725 100644 --- a/node_modules/grunt/node_modules/dateformat/package.json +++ b/node_modules/grunt/node_modules/dateformat/package.json @@ -1,7 +1,12 @@ { "name": "dateformat", "description": "A node.js package for Steven Levithan's excellent dateFormat() function.", - "maintainers": "Felix Geisendörfer ", + "maintainers": [ + { + "name": "felixge", + "email": "felix@debuggable.com" + } + ], "homepage": "https://github.com/felixge/node-dateformat", "author": { "name": "Steven Levithan" @@ -13,10 +18,25 @@ "engines": { "node": "*" }, - "readme": "# node-dateformat\n\nA node.js package for Steven Levithan's excellent [dateFormat()][dateformat] function.\n\n## Modifications\n\n* Removed the `Date.prototype.format` method. Sorry folks, but extending native prototypes is for suckers.\n* Added a `module.exports = dateFormat;` statement at the bottom\n\n## Usage\n\nAs taken from Steven's post, modified to match the Modifications listed above:\n\n var dateFormat = require('dateformat');\n var now = new Date();\n\n // Basic usage\n dateFormat(now, \"dddd, mmmm dS, yyyy, h:MM:ss TT\");\n // Saturday, June 9th, 2007, 5:46:21 PM\n\n // You can use one of several named masks\n dateFormat(now, \"isoDateTime\");\n // 2007-06-09T17:46:21\n\n // ...Or add your own\n dateFormat.masks.hammerTime = 'HH:MM! \"Can\\'t touch this!\"';\n dateFormat(now, \"hammerTime\");\n // 17:46! Can't touch this!\n\n // When using the standalone dateFormat function,\n // you can also provide the date as a string\n dateFormat(\"Jun 9 2007\", \"fullDate\");\n // Saturday, June 9, 2007\n\n // Note that if you don't include the mask argument,\n // dateFormat.masks.default is used\n dateFormat(now);\n // Sat Jun 09 2007 17:46:21\n\n // And if you don't include the date argument,\n // the current date and time is used\n dateFormat();\n // Sat Jun 09 2007 17:46:22\n\n // You can also skip the date argument (as long as your mask doesn't\n // contain any numbers), in which case the current date/time is used\n dateFormat(\"longTime\");\n // 5:46:22 PM EST\n\n // And finally, you can convert local time to UTC time. Simply pass in\n // true as an additional argument (no argument skipping allowed in this case):\n dateFormat(now, \"longTime\", true);\n // 10:46:21 PM UTC\n\n // ...Or add the prefix \"UTC:\" to your mask.\n dateFormat(now, \"UTC:h:MM:ss TT Z\");\n // 10:46:21 PM UTC\n\n // You can also get the ISO 8601 week of the year:\n dateFormat(now, \"W\");\n // 42\n## License\n\n(c) 2007-2009 Steven Levithan [stevenlevithan.com][stevenlevithan], MIT license.\n\n[dateformat]: http://blog.stevenlevithan.com/archives/date-time-format\n[stevenlevithan]: http://stevenlevithan.com/\n", - "readmeFilename": "Readme.md", + "_npmJsonOpts": { + "file": "/Users/felix/.npm/dateformat/1.0.2-1.2.3/package/package.json", + "wscript": false, + "contributors": false, + "serverjs": false + }, "_id": "dateformat@1.0.2-1.2.3", + "_engineSupported": true, + "_npmVersion": "1.0.26", + "_nodeVersion": "v0.4.10-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "b0220c02de98617433b72851cf47de3df2cdbee9", + "tarball": "http://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + }, + "scripts": {}, + "directories": {}, "_shasum": "b0220c02de98617433b72851cf47de3df2cdbee9", "_from": "dateformat@1.0.2-1.2.3", - "_resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + "_resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/eventemitter2/README.md b/node_modules/grunt/node_modules/eventemitter2/README.md index 9501fa3..e1f6edd 100644 --- a/node_modules/grunt/node_modules/eventemitter2/README.md +++ b/node_modules/grunt/node_modules/eventemitter2/README.md @@ -1,9 +1,12 @@ -# EventEmitter2 +[![build-status](https://www.codeship.io/projects/3ad58940-4c7d-0131-15d5-5a8cd3f550f8/status)](https://www.codeship.io/projects/11259) + +# SYNOPSIS EventEmitter2 is an implementation of the EventEmitter found in Node.js -## Features +# DESCRIPTION +### FEATURES - Namespaces/Wildcards. - Times To Listen (TTL), extends the `once` concept with `many`. - Browser environment compatibility. @@ -17,17 +20,33 @@ EventEmitter2 (wild) x 3,220,268 ops/sec \302\2610.44% (65 runs sampled) Fastest is EventEmitter2 ``` -## Differences (Non breaking, compatible with existing EventEmitter) +### Differences (Non breaking, compatible with existing EventEmitter) - The constructor takes a configuration object. ```javascript var EventEmitter2 = require('eventemitter2').EventEmitter2; var server = new EventEmitter2({ - wildcard: true, // should the event emitter use wildcards. - delimiter: '::', // the delimiter used to segment namespaces, defaults to `.`. - newListener: false, // if you want to emit the newListener event set to true. - maxListeners: 20, // the max number of listeners that can be assigned to an event, defaults to 10. + + // + // use wildcards. + // + wildcard: true, + + // + // the delimiter used to segment namespaces, defaults to `.`. + // + delimiter: '::', + + // + // if you want to emit the newListener event set to true. + // + newListener: false, + + // + // max listeners that can be assigned to an event, default 10. + // + maxListeners: 20 }); ``` @@ -56,7 +75,7 @@ Fastest is EventEmitter2 ``` -## API +# API When an `EventEmitter` instance experiences an error, the typical action is to emit an `error` event. Error events are treated as a special case. @@ -68,17 +87,17 @@ added. **Namespaces** with **Wildcards** -To use namespaces/wildcards, pass the `wildcard` option into the EventEmitter constructor. -When namespaces/wildcards are enabled, events can either be strings (`foo.bar`) separated -by a delimiter or arrays (`['foo', 'bar']`). The delimiter is also configurable as a -constructor option. +To use namespaces/wildcards, pass the `wildcard` option into the EventEmitter +constructor. When namespaces/wildcards are enabled, events can either be +strings (`foo.bar`) separated by a delimiter or arrays (`['foo', 'bar']`). The +delimiter is also configurable as a constructor option. -An event name passed to any event emitter method can contain a wild card (the `*` character). -If the event name is a string, a wildcard may appear as `foo.*`. If the event name is an array, -the wildcard may appear as `['foo', '*']`. +An event name passed to any event emitter method can contain a wild card (the +`*` character). If the event name is a string, a wildcard may appear as `foo.*`. +If the event name is an array, the wildcard may appear as `['foo', '*']`. -If either of the above described events were passed to the `on` method, subsequent emits such -as the following would be observed... +If either of the above described events were passed to the `on` method, +subsequent emits such as the following would be observed... ```javascript emitter.emit('foo.bazz'); @@ -86,13 +105,13 @@ as the following would be observed... ``` -#### emitter.addListener(event, listener) -#### emitter.on(event, listener) +### emitter.addListener(event, listener) +### emitter.on(event, listener) Adds a listener to the end of the listeners array for the specified event. ```javascript - server.on('data', function(value1, value2, value3 /* accepts any number of expected values... */) { + server.on('data', function(value1, value2, value3, ...) { console.log('The event was raised!'); }); ``` @@ -103,7 +122,7 @@ Adds a listener to the end of the listeners array for the specified event. }); ``` -#### emitter.onAny(listener) +### emitter.onAny(listener) Adds a listener that will be fired when any event is emitted. @@ -113,7 +132,7 @@ Adds a listener that will be fired when any event is emitted. }); ``` -#### emitter.offAny(listener) +### emitter.offAny(listener) Removes the listener that will be fired when any event is emitted. @@ -125,7 +144,8 @@ Removes the listener that will be fired when any event is emitted. #### emitter.once(event, listener) -Adds a **one time** listener for the event. The listener is invoked only the first time the event is fired, after which it is removed. +Adds a **one time** listener for the event. The listener is invoked +only the first time the event is fired, after which it is removed. ```javascript server.once('get', function (value) { @@ -133,9 +153,11 @@ Adds a **one time** listener for the event. The listener is invoked only the fir }); ``` -#### emitter.many(event, timesToListen, listener) +### emitter.many(event, timesToListen, listener) -Adds a listener that will execute **n times** for the event before being removed. The listener is invoked only the first time the event is fired, after which it is removed. +Adds a listener that will execute **n times** for the event before being +removed. The listener is invoked only the first **n times** the event is +fired, after which it is removed. ```javascript server.many('get', 4, function (value) { @@ -144,10 +166,11 @@ Adds a listener that will execute **n times** for the event before being removed ``` -#### emitter.removeListener(event, listener) -#### emitter.off(event, listener) +### emitter.removeListener(event, listener) +### emitter.off(event, listener) -Remove a listener from the listener array for the specified event. **Caution**: changes array indices in the listener array behind the listener. +Remove a listener from the listener array for the specified event. +**Caution**: changes array indices in the listener array behind the listener. ```javascript var callback = function(value) { @@ -159,54 +182,67 @@ Remove a listener from the listener array for the specified event. **Caution**: ``` -#### emitter.removeAllListeners([event]) +### emitter.removeAllListeners([event]) Removes all listeners, or those of the specified event. -#### emitter.setMaxListeners(n) +### emitter.setMaxListeners(n) -By default EventEmitters will print a warning if more than 10 listeners are added to it. This is a useful default which helps finding memory leaks. Obviously not all Emitters should be limited to 10. This function allows that to be increased. Set to zero for unlimited. +By default EventEmitters will print a warning if more than 10 listeners +are added to it. This is a useful default which helps finding memory leaks. +Obviously not all Emitters should be limited to 10. This function allows +that to be increased. Set to zero for unlimited. -#### emitter.listeners(event) +### emitter.listeners(event) -Returns an array of listeners for the specified event. This array can be manipulated, e.g. to remove listeners. +Returns an array of listeners for the specified event. This array can be +manipulated, e.g. to remove listeners. ```javascript server.on('get', function(value) { console.log('someone connected!'); }); - console.log(console.log(server.listeners('get')); // [ [Function] ] + console.log(server.listeners('get')); // [ [Function] ] ``` -#### emitter.listenersAny() +### emitter.listenersAny() -Returns an array of listeners that are listening for any event that is specified. This array can be manipulated, e.g. to remove listeners. +Returns an array of listeners that are listening for any event that is +specified. This array can be manipulated, e.g. to remove listeners. ```javascript server.onAny(function(value) { console.log('someone connected!'); }); - console.log(console.log(server.listenersAny()[0]); // [ [Function] ] // someone connected! + console.log(server.listenersAny()[0]); // [ [Function] ] ``` -#### emitter.emit(event, [arg1], [arg2], [...]) +### emitter.emit(event, [arg1], [arg2], [...]) -Execute each of the listeners that may be listening for the specified event name in order with the list of arguments. +Execute each of the listeners that may be listening for the specified event +name in order with the list of arguments. -## Test coverage - -There is a test suite that tries to cover each use case, it can be found here. - -## Licence +# LICENSE (The MIT License) Copyright (c) 2011 hij1nx -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: +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 above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE 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/grunt/node_modules/eventemitter2/lib/eventemitter2.js b/node_modules/grunt/node_modules/eventemitter2/lib/eventemitter2.js index dc9849e..bde69e8 100644 --- a/node_modules/grunt/node_modules/eventemitter2/lib/eventemitter2.js +++ b/node_modules/grunt/node_modules/eventemitter2/lib/eventemitter2.js @@ -1,4 +1,11 @@ -;!function(exports, undefined) { +/*! + * EventEmitter2 + * https://github.com/hij1nx/EventEmitter2 + * + * Copyright (c) 2013 hij1nx + * Licensed under the MIT license. + */ +;!function(undefined) { var isArray = Array.isArray ? Array.isArray : function _isArray(obj) { return Object.prototype.toString.call(obj) === "[object Array]"; @@ -331,10 +338,10 @@ this.event = type; listeners[i].apply(this, args); } - return (listeners.length > 0) || this._all; + return (listeners.length > 0) || !!this._all; } else { - return this._all; + return !!this._all; } }; @@ -397,14 +404,14 @@ EventEmitter.prototype.onAny = function(fn) { - if(!this._all) { - this._all = []; - } - if (typeof fn !== 'function') { throw new Error('onAny only accepts instances of Function'); } + if(!this._all) { + this._all = []; + } + // Add the function to the event listener collection. this._all.push(fn); return this; @@ -551,11 +558,16 @@ }; if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. define(function() { return EventEmitter; }); - } else { + } else if (typeof exports === 'object') { + // CommonJS exports.EventEmitter2 = EventEmitter; } - -}(typeof process !== 'undefined' && typeof process.title !== 'undefined' && typeof exports !== 'undefined' ? exports : window); + else { + // Browser global. + window.EventEmitter2 = EventEmitter; + } +}(); diff --git a/node_modules/grunt/node_modules/eventemitter2/package.json b/node_modules/grunt/node_modules/eventemitter2/package.json index 095287f..cb72650 100644 --- a/node_modules/grunt/node_modules/eventemitter2/package.json +++ b/node_modules/grunt/node_modules/eventemitter2/package.json @@ -1,6 +1,6 @@ { "name": "eventemitter2", - "version": "0.4.13", + "version": "0.4.14", "description": "A Node.js event emitter implementation with namespaces, wildcards, TTL and browser support.", "keywords": [ "event", @@ -51,12 +51,33 @@ "lib/eventemitter2.js", "index.js" ], - "readme": "# EventEmitter2\n\nEventEmitter2 is an implementation of the EventEmitter found in Node.js\n\n## Features\n\n - Namespaces/Wildcards.\n - Times To Listen (TTL), extends the `once` concept with `many`.\n - Browser environment compatibility.\n - Demonstrates good performance in benchmarks\n\n```\nEventEmitterHeatUp x 3,728,965 ops/sec \\302\\2610.68% (60 runs sampled)\nEventEmitter x 2,822,904 ops/sec \\302\\2610.74% (63 runs sampled)\nEventEmitter2 x 7,251,227 ops/sec \\302\\2610.55% (58 runs sampled)\nEventEmitter2 (wild) x 3,220,268 ops/sec \\302\\2610.44% (65 runs sampled)\nFastest is EventEmitter2\n```\n\n## Differences (Non breaking, compatible with existing EventEmitter)\n\n - The constructor takes a configuration object.\n \n```javascript\n var EventEmitter2 = require('eventemitter2').EventEmitter2;\n var server = new EventEmitter2({\n wildcard: true, // should the event emitter use wildcards.\n delimiter: '::', // the delimiter used to segment namespaces, defaults to `.`.\n newListener: false, // if you want to emit the newListener event set to true.\n maxListeners: 20, // the max number of listeners that can be assigned to an event, defaults to 10.\n });\n```\n\n - Getting the actual event that fired.\n\n```javascript\n server.on('foo.*', function(value1, value2) {\n console.log(this.event, value1, value2);\n });\n```\n\n - Fire an event N times and then remove it, an extension of the `once` concept.\n\n```javascript\n server.many('foo', 4, function() {\n console.log('hello');\n });\n```\n\n - Pass in a namespaced event as an array rather than a delimited string.\n\n```javascript\n server.many(['foo', 'bar', 'bazz'], function() {\n console.log('hello');\n });\n```\n\n\n## API\n\nWhen an `EventEmitter` instance experiences an error, the typical action is\nto emit an `error` event. Error events are treated as a special case.\nIf there is no listener for it, then the default action is to print a stack\ntrace and exit the program.\n\nAll EventEmitters emit the event `newListener` when new listeners are\nadded.\n\n\n**Namespaces** with **Wildcards**\nTo use namespaces/wildcards, pass the `wildcard` option into the EventEmitter constructor.\nWhen namespaces/wildcards are enabled, events can either be strings (`foo.bar`) separated\nby a delimiter or arrays (`['foo', 'bar']`). The delimiter is also configurable as a \nconstructor option.\n\nAn event name passed to any event emitter method can contain a wild card (the `*` character).\nIf the event name is a string, a wildcard may appear as `foo.*`. If the event name is an array, \nthe wildcard may appear as `['foo', '*']`.\n\nIf either of the above described events were passed to the `on` method, subsequent emits such \nas the following would be observed...\n\n```javascript\n emitter.emit('foo.bazz');\n emitter.emit(['foo', 'bar']);\n```\n\n\n#### emitter.addListener(event, listener)\n#### emitter.on(event, listener)\n\nAdds a listener to the end of the listeners array for the specified event.\n\n```javascript\n server.on('data', function(value1, value2, value3 /* accepts any number of expected values... */) {\n console.log('The event was raised!');\n });\n```\n\n```javascript\n server.on('data', function(value) {\n console.log('The event was raised!');\n });\n```\n\n#### emitter.onAny(listener)\n\nAdds a listener that will be fired when any event is emitted.\n\n```javascript\n server.onAny(function(value) {\n console.log('All events trigger this.');\n });\n```\n\n#### emitter.offAny(listener)\n\nRemoves the listener that will be fired when any event is emitted.\n\n```javascript\n server.offAny(function(value) {\n console.log('The event was raised!');\n });\n```\n\n#### emitter.once(event, listener)\n\nAdds a **one time** listener for the event. The listener is invoked only the first time the event is fired, after which it is removed.\n\n```javascript\n server.once('get', function (value) {\n console.log('Ah, we have our first value!');\n });\n```\n\n#### emitter.many(event, timesToListen, listener)\n\nAdds a listener that will execute **n times** for the event before being removed. The listener is invoked only the first time the event is fired, after which it is removed.\n\n```javascript\n server.many('get', 4, function (value) {\n console.log('This event will be listened to exactly four times.');\n });\n```\n\n\n#### emitter.removeListener(event, listener)\n#### emitter.off(event, listener)\n\nRemove a listener from the listener array for the specified event. **Caution**: changes array indices in the listener array behind the listener.\n\n```javascript\n var callback = function(value) {\n console.log('someone connected!');\n };\n server.on('get', callback);\n // ...\n server.removeListener('get', callback);\n```\n\n\n#### emitter.removeAllListeners([event])\n\nRemoves all listeners, or those of the specified event.\n\n\n#### emitter.setMaxListeners(n)\n\nBy default EventEmitters will print a warning if more than 10 listeners are added to it. This is a useful default which helps finding memory leaks. Obviously not all Emitters should be limited to 10. This function allows that to be increased. Set to zero for unlimited.\n\n\n#### emitter.listeners(event)\n\nReturns an array of listeners for the specified event. This array can be manipulated, e.g. to remove listeners.\n\n```javascript\n server.on('get', function(value) {\n console.log('someone connected!');\n });\n console.log(console.log(server.listeners('get')); // [ [Function] ]\n```\n\n#### emitter.listenersAny()\n\nReturns an array of listeners that are listening for any event that is specified. This array can be manipulated, e.g. to remove listeners.\n\n```javascript\n server.onAny(function(value) {\n console.log('someone connected!');\n });\n console.log(console.log(server.listenersAny()[0]); // [ [Function] ] // someone connected!\n```\n\n#### emitter.emit(event, [arg1], [arg2], [...])\n\nExecute each of the listeners that may be listening for the specified event name in order with the list of arguments.\n\n## Test coverage\n\nThere is a test suite that tries to cover each use case, it can be found here.\n\n## Licence\n\n(The MIT License)\n\nCopyright (c) 2011 hij1nx \n\nPermission 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:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE 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.\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/hij1nx/EventEmitter2/issues" }, "homepage": "https://github.com/hij1nx/EventEmitter2", - "_id": "eventemitter2@0.4.13", - "_from": "eventemitter2@~0.4.13" + "_id": "eventemitter2@0.4.14", + "_shasum": "8f61b75cde012b2e9eb284d4545583b5643b61ab", + "_from": "eventemitter2@>=0.4.13 <0.5.0", + "_npmVersion": "1.4.7", + "_npmUser": { + "name": "jasonkuhrt", + "email": "jasonkuhrt@me.com" + }, + "maintainers": [ + { + "name": "hij1nx", + "email": "hij1nx@me.com" + }, + { + "name": "jasonkuhrt", + "email": "jasonkuhrt@me.com" + } + ], + "dist": { + "shasum": "8f61b75cde012b2e9eb284d4545583b5643b61ab", + "tarball": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/exit/package.json b/node_modules/grunt/node_modules/exit/package.json index 9cd4007..16c9caa 100644 --- a/node_modules/grunt/node_modules/exit/package.json +++ b/node_modules/grunt/node_modules/exit/package.json @@ -47,5 +47,23 @@ "readme": "# exit [![Build Status](https://secure.travis-ci.org/cowboy/node-exit.png?branch=master)](http://travis-ci.org/cowboy/node-exit)\n\nA replacement for process.exit that ensures stdio are fully drained before exiting.\n\nTo make a long story short, if `process.exit` is called on Windows, script output is often truncated when pipe-redirecting `stdout` or `stderr`. This module attempts to work around this issue by waiting until those streams have been completely drained before actually calling `process.exit`.\n\nSee [Node.js issue #3584](https://github.com/joyent/node/issues/3584) for further reference.\n\nTested in OS X 10.8, Windows 7 on Node.js 0.8.25 and 0.10.18.\n\nBased on some code by [@vladikoff](https://github.com/vladikoff).\n\n## Getting Started\nInstall the module with: `npm install exit`\n\n```javascript\nvar exit = require('exit');\n\n// These lines should appear in the output, EVEN ON WINDOWS.\nconsole.log(\"omg\");\nconsole.error(\"yay\");\n\n// process.exit(5);\nexit(5);\n\n// These lines shouldn't appear in the output.\nconsole.log(\"wtf\");\nconsole.error(\"bro\");\n```\n\n## Don't believe me? Try it for yourself.\n\nIn Windows, clone the repo and cd to the `test\\fixtures` directory. The only difference between [log.js](test/fixtures/log.js) and [log-broken.js](test/fixtures/log-broken.js) is that the former uses `exit` while the latter calls `process.exit` directly.\n\nThis test was done using cmd.exe, but you can see the same results using `| grep \"std\"` in either PowerShell or git-bash.\n\n```\nC:\\node-exit\\test\\fixtures>node log.js 0 10 stdout stderr 2>&1 | find \"std\"\nstdout 0\nstderr 0\nstdout 1\nstderr 1\nstdout 2\nstderr 2\nstdout 3\nstderr 3\nstdout 4\nstderr 4\nstdout 5\nstderr 5\nstdout 6\nstderr 6\nstdout 7\nstderr 7\nstdout 8\nstderr 8\nstdout 9\nstderr 9\n\nC:\\node-exit\\test\\fixtures>node log-broken.js 0 10 stdout stderr 2>&1 | find \"std\"\n\nC:\\node-exit\\test\\fixtures>\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n2013-11-26 - v0.1.2 - Fixed a bug with hanging processes. \n2013-09-26 - v0.1.1 - Fixed some bugs. It seems to actually work now! \n2013-09-20 - v0.1.0 - Initial release.\n\n## License\nCopyright (c) 2013 \"Cowboy\" Ben Alman \nLicensed under the MIT license.\n", "readmeFilename": "README.md", "_id": "exit@0.1.2", - "_from": "exit@~0.1.1" + "dist": { + "shasum": "0632638f8d877cc82107d30a0fff1a17cba1cd0c", + "tarball": "http://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + }, + "_from": "exit@>=0.1.1 <0.2.0", + "_npmVersion": "1.3.11", + "_npmUser": { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + "maintainers": [ + { + "name": "cowboy", + "email": "cowboy@rj3.net" + } + ], + "directories": {}, + "_shasum": "0632638f8d877cc82107d30a0fff1a17cba1cd0c", + "_resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" } diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json index 5bf0db5..31b2e5a 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/inherits/package.json @@ -16,7 +16,7 @@ "browser": "./inherits_browser.js", "repository": { "type": "git", - "url": "git://github.com/isaacs/inherits" + "url": "git://github.com/isaacs/inherits.git" }, "license": "ISC", "scripts": { @@ -27,7 +27,25 @@ "bugs": { "url": "https://github.com/isaacs/inherits/issues" }, - "homepage": "https://github.com/isaacs/inherits", "_id": "inherits@2.0.1", - "_from": "inherits@2" + "dist": { + "shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + }, + "_from": "inherits@>=2.0.0 <3.0.0", + "_npmVersion": "1.3.8", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "homepage": "https://github.com/isaacs/inherits" } diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md index 03ee0f9..82a6dab 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md @@ -54,11 +54,12 @@ away. ## API -* `set(key, value)` +* `set(key, value, max)` * `get(key) => value` Both of these will update the "recently used"-ness of the key. - They do what you think. + They do what you think. `max` is optional and overrides the + cache `max` option if provided. * `peek(key)` @@ -95,3 +96,14 @@ away. * `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. diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js index d1d1381..d66e7a2 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js @@ -86,11 +86,13 @@ Object.defineProperty(LRUCache.prototype, "itemCount", LRUCache.prototype.forEach = function (fn, thisp) { thisp = thisp || this - var i = 0; - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var i = 0 + var itemCount = this._itemCount + + for (var k = this._mru - 1; k >= 0 && i < itemCount; k--) if (this._lruList[k]) { i++ var hit = this._lruList[k] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + if (isStale(this, hit)) { del(this, hit) if (!this._allowStale) hit = undefined } @@ -145,19 +147,24 @@ LRUCache.prototype.dumpLru = function () { return this._lruList } -LRUCache.prototype.set = function (key, value) { +LRUCache.prototype.set = function (key, value, maxAge) { + maxAge = maxAge || this._maxAge + var now = maxAge ? Date.now() : 0 + if (hOP(this._cache, key)) { // dispose of the old one before overwriting - if (this._dispose) this._dispose(key, this._cache[key].value) - if (this._maxAge) this._cache[key].now = Date.now() + if (this._dispose) + this._dispose(key, this._cache[key].value) + + this._cache[key].now = now + this._cache[key].maxAge = maxAge this._cache[key].value = value this.get(key) return true } var len = this._lengthCalculator(value) - var age = this._maxAge ? Date.now() : 0 - var hit = new Entry(key, value, this._mru++, len, age) + var hit = new Entry(key, value, this._mru++, len, now, maxAge) // oversized objects fall out of cache automatically. if (hit.length > this._max) { @@ -169,14 +176,16 @@ LRUCache.prototype.set = function (key, value) { this._lruList[hit.lu] = this._cache[key] = hit this._itemCount ++ - if (this._length > this._max) trim(this) + if (this._length > this._max) + trim(this) + return true } LRUCache.prototype.has = function (key) { if (!hOP(this._cache, key)) return false var hit = this._cache[key] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + if (isStale(this, hit)) { return false } return true @@ -203,7 +212,7 @@ LRUCache.prototype.del = function (key) { function get (self, key, doUse) { var hit = self._cache[key] if (hit) { - if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { + if (isStale(self, hit)) { del(self, hit) if (!self._allowStale) hit = undefined } else { @@ -214,6 +223,18 @@ function get (self, key, doUse) { return hit } +function isStale(self, hit) { + if (!hit || (!hit.maxAge && !self._maxAge)) return false + var stale = false; + var diff = Date.now() - hit.now + if (hit.maxAge) { + stale = diff > hit.maxAge + } else { + stale = self._maxAge && (diff > self._maxAge) + } + return stale; +} + function use (self, hit) { shiftLU(self, hit) hit.lu = self._mru ++ @@ -241,12 +262,13 @@ function del (self, hit) { } // classy, since V8 prefers predictable objects. -function Entry (key, value, lu, length, now) { +function Entry (key, value, lu, length, now, maxAge) { this.key = key this.value = value this.lu = lu this.length = length this.now = now + if (maxAge) this.maxAge = maxAge } })() diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json index 4472725..5446578 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json @@ -1,11 +1,16 @@ { "name": "lru-cache", "description": "A cache object that deletes the least-recently-used items.", - "version": "2.5.0", + "version": "2.6.2", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me" }, + "keywords": [ + "mru", + "lru", + "cache" + ], "scripts": { "test": "tap test --gc" }, @@ -15,19 +20,38 @@ "url": "git://github.com/isaacs/node-lru-cache.git" }, "devDependencies": { - "tap": "", + "tap": "^0.7.1", "weak": "" }, "license": { "type": "MIT", "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" }, - "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", - "readmeFilename": "README.md", + "gitHead": "278d05fcc714636eeedb3959bca80c20c19a61df", "bugs": { "url": "https://github.com/isaacs/node-lru-cache/issues" }, - "homepage": "https://github.com/isaacs/node-lru-cache", - "_id": "lru-cache@2.5.0", - "_from": "lru-cache@2" + "homepage": "https://github.com/isaacs/node-lru-cache#readme", + "_id": "lru-cache@2.6.2", + "_shasum": "77741638c6dc972e503dbe41dcb6bfdfba499a38", + "_from": "lru-cache@>=2.0.0 <3.0.0", + "_npmVersion": "2.8.4", + "_nodeVersion": "1.4.2", + "_npmUser": { + "name": "isaacs", + "email": "isaacs@npmjs.com" + }, + "dist": { + "shasum": "77741638c6dc972e503dbe41dcb6bfdfba499a38", + "tarball": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.6.2.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js index f72697c..949113e 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js @@ -215,7 +215,7 @@ test("drop the old items", function(t) { cache.set("c", "C") // timed out t.notOk(cache.get("a")) - }, 60) + }, 60 + 25) setTimeout(function () { t.notOk(cache.get("b")) @@ -228,6 +228,32 @@ test("drop the old items", function(t) { }, 155) }) +test("individual item can have it's own maxAge", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 50 + }) + + cache.set("a", "A", 20) + setTimeout(function () { + t.notOk(cache.get("a")) + t.end() + }, 25) +}) + +test("individual item can have it's own maxAge > cache's", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 20 + }) + + cache.set("a", "A", 50) + setTimeout(function () { + t.equal(cache.get("a"), "A") + t.end() + }, 25) +}) + test("disposal function", function(t) { var disposed = false var cache = new LRU({ diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js index eefb80d..429ebc1 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js @@ -28,6 +28,7 @@ test('forEach', function (t) { t.equal(key, j.toString()) t.equal(val, j.toString(2)) }) + t.equal(i, order.length); t.end() }) @@ -50,3 +51,71 @@ test('keys() and values()', function (t) { t.end() }) + +test('all entries are iterated over', function(t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 0 + l.forEach(function (val, key, cache) { + if (i > 0) { + cache.del(key) + } + i += 1 + }) + + t.equal(i, 5) + t.equal(l.keys().length, 1) + + t.end() +}) + +test('all stale entries are removed', function(t) { + var l = new LRU({ max: 5, maxAge: -5, stale: true }) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 0 + l.forEach(function () { + i += 1 + }) + + t.equal(i, 5) + t.equal(l.keys().length, 0) + + t.end() +}) + +test('expires', function (t) { + var l = new LRU({ + max: 10, + maxAge: 50 + }) + for (var i = 0; i < 10; i++) { + l.set(i.toString(), i.toString(2), ((i % 2) ? 25 : undefined)) + } + + var i = 0 + var order = [ 8, 6, 4, 2, 0 ] + setTimeout(function () { + l.forEach(function (val, key, cache) { + var j = order[i++] + t.equal(cache, l) + t.equal(key, j.toString()) + t.equal(val, j.toString(2)) + }) + t.equal(i, order.length); + t.end() + + setTimeout(function () { + var count = 0; + l.forEach(function (val, key, cache) { count++; }) + t.equal(0, count); + t.end() + }, 25) + + }, 26) +}) diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json index cb7e2bd..26c0d15 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json @@ -16,7 +16,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/isaacs/sigmund" + "url": "git://github.com/isaacs/sigmund.git" }, "keywords": [ "object", @@ -32,11 +32,27 @@ }, "license": "BSD", "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", - "readmeFilename": "README.md", + "_id": "sigmund@1.0.0", + "dist": { + "shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296", + "tarball": "http://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + }, + "_npmVersion": "1.1.48", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296", + "_from": "sigmund@>=1.0.0 <1.1.0", + "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "bugs": { "url": "https://github.com/isaacs/sigmund/issues" }, - "homepage": "https://github.com/isaacs/sigmund", - "_id": "sigmund@1.0.0", - "_from": "sigmund@~1.0.0" + "homepage": "https://github.com/isaacs/sigmund" } diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json index c6b2aa2..b0691e5 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/node_modules/minimatch/package.json @@ -29,14 +29,29 @@ "type": "MIT", "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" }, - "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself if this option is set. When not set, an empty list\nis returned if there are no matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/isaacs/minimatch/issues" }, "homepage": "https://github.com/isaacs/minimatch", "_id": "minimatch@0.3.0", "_shasum": "275d8edaac4f1bb3326472089e7949c8394699dd", - "_from": "minimatch@0.3", - "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" + "_from": "minimatch@>=0.3.0 <0.4.0", + "_npmVersion": "1.4.10", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "275d8edaac4f1bb3326472089e7949c8394699dd", + "tarball": "http://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/package.json b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/package.json index e0910cd..cbd0dd6 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/glob/package.json +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/glob/package.json @@ -29,14 +29,30 @@ "test-regen": "TEST_REGEN=1 node test/00-setup.js" }, "license": "BSD", - "readme": "# Glob\n\nMatch files using the patterns the shell uses, like stars and stuff.\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options])\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n* `statCache` Collection of all the stat results the glob search\n performed.\n* `cache` Convenience object. Each field has the following possible\n values:\n * `false` - Path does not exist\n * `true` - Path exists\n * `1` - Path exists, and is not a directory\n * `2` - Path exists, and is a directory\n * `[file, entries, ...]` - Path exists, is a directory, and the\n array value is the results of `fs.readdir`\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `dot` Include `.dot` files in normal matches and `globstar` matches.\n Note that an explicit dot in a portion of the pattern will always\n match dot files.\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `cache` See `cache` property above. Pass in a previously generated\n cache object to save some fs calls.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the cache or statCache objects are reused between glob\ncalls.\n\nUsers are thus advised not to use a glob result as a guarantee of\nfilesystem state in the face of rapid changes. For the vast majority\nof operations, this is never a problem.\n", - "readmeFilename": "README.md", + "gitHead": "73f57e99510582b2024b762305970ebcf9b70aa2", "bugs": { "url": "https://github.com/isaacs/node-glob/issues" }, "homepage": "https://github.com/isaacs/node-glob", "_id": "glob@3.2.11", "_shasum": "4a973f635b9190f715d10987d5c00fd2815ebe3d", - "_from": "glob@~3.2.9", - "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" + "_from": "glob@>=3.2.9 <3.3.0", + "_npmVersion": "1.4.10", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "4a973f635b9190f715d10987d5c00fd2815ebe3d", + "tarball": "http://registry.npmjs.org/glob/-/glob-3.2.11.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/README.md b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/README.md index 6f9598e..86b0636 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/README.md +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/README.md @@ -1,105 +1,34 @@ -# Lo-Dash v2.4.1 -A utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features). +# Lo-Dash v2.4.2 +A utility library delivering consistency, [customization](https://lodash.com/custom-builds), [performance](https://lodash.com/benchmarks), & [extras](https://lodash.com/#features). ## Download Check out our [wiki]([https://github.com/lodash/lodash/wiki/build-differences]) for details over the differences between builds. * Modern builds perfect for newer browsers/environments:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.js) & -[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.min.js) +[Development](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.js) & +[Production](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.min.js) * Compatibility builds for older environment support too:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.js) & -[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.min.js) +[Development](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.compat.js) & +[Production](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.compat.min.js) * Underscore builds to use as a drop-in replacement:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js) & -[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.min.js) +[Development](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.underscore.js) & +[Production](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.underscore.min.js) -CDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](http://lodash.com/custom-builds) with only the features needed. +CDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](https://lodash.com/custom-builds) with only the features needed. Love modules? We’ve got you covered with [lodash-amd](https://npmjs.org/package/lodash-amd), [lodash-es6](https://github.com/lodash/lodash-es6), [lodash-node](https://npmjs.org/package/lodash-node), & [npm packages](https://npmjs.org/browse/keyword/lodash-modularized) per method. ## Dive in -There’s plenty of **[documentation](http://lodash.com/docs)**, [unit tests](http://lodash.com/tests), & [benchmarks](http://lodash.com/benchmarks).
+There’s plenty of **[documentation](https://lodash.com/docs)**, [unit tests](https://lodash.com/tests), & [benchmarks](https://lodash.com/benchmarks).
Check out DevDocs as a fast, organized, & searchable interface for our documentation. The full changelog for this release is available on our [wiki](https://github.com/lodash/lodash/wiki/Changelog).
A list of upcoming features is available on our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap). -## Features *not* in Underscore - - * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.) - * [_(…)](http://lodash.com/docs#_) supports intuitive chaining - * [_.at](http://lodash.com/docs#at) for cherry-picking collection values - * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods - * [_.clone](http://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects - * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays & objects - * [_.constant](http://lodash.com/docs#constant) & [_.property](http://lodash.com/docs#property) function generators for composing functions - * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex` - * [_.create](http://lodash.com/docs#create) for easier object inheritance - * [_.createCallback](http://lodash.com/docs#createCallback) for extending callbacks in methods & mixins - * [_.curry](http://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions - * [_.debounce](http://lodash.com/docs#debounce) & [_.throttle](http://lodash.com/docs#throttle) accept additional `options` for more control - * [_.findIndex](http://lodash.com/docs#findIndex) & [_.findKey](http://lodash.com/docs#findKey) for finding indexes & keys - * [_.forEach](http://lodash.com/docs#forEach) is chainable & supports exiting early - * [_.forIn](http://lodash.com/docs#forIn) for iterating own & inherited properties - * [_.forOwn](http://lodash.com/docs#forOwn) for iterating own properties - * [_.isPlainObject](http://lodash.com/docs#isPlainObject) for checking if values are created by `Object` - * [_.mapValues](http://lodash.com/docs#mapValues) for [mapping](http://lodash.com/docs#map) values to an object - * [_.memoize](http://lodash.com/docs#memoize) exposes the `cache` of memoized functions - * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend) - * [_.noop](http://lodash.com/docs#noop) for function placeholders - * [_.now](http://lodash.com/docs#now) as a cross-browser `Date.now` alternative - * [_.parseInt](http://lodash.com/docs#parseInt) for consistent behavior - * [_.pull](http://lodash.com/docs#pull) & [_.remove](http://lodash.com/docs#remove) for mutating arrays - * [_.random](http://lodash.com/docs#random) supports returning floating-point numbers - * [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking - * [_.sortBy](http://lodash.com/docs#sortBy) supports sorting by multiple properties - * [_.support](http://lodash.com/docs#support) for flagging environment features - * [_.template](http://lodash.com/docs#template) supports [*“imports”*](http://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals) - * [_.transform](http://lodash.com/docs#transform) as a powerful alternative to [_.reduce](http://lodash.com/docs#reduce) for transforming objects - * [_.where](http://lodash.com/docs#where) supports deep object comparisons - * [_.xor](http://lodash.com/docs#xor) as a companion to [_.difference](http://lodash.com/docs#difference), [_.intersection](http://lodash.com/docs#intersection), & [_.union](http://lodash.com/docs#union) - * [_.zip](http://lodash.com/docs#zip) is capable of unzipping values - * [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), & - [more](http://lodash.com/docs "_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept callbacks - * [_.contains](http://lodash.com/docs#contains), [_.toArray](http://lodash.com/docs#toArray), & - [more](http://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where") accept strings - * [_.filter](http://lodash.com/docs#filter), [_.map](http://lodash.com/docs#map), & - [more](http://lodash.com/docs "_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* & *“_.where”* shorthands - * [_.findLast](http://lodash.com/docs#findLast), [_.findLastIndex](http://lodash.com/docs#findLastIndex), & - [more](http://lodash.com/docs "_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight") right-associative methods - -## Resources - - * Podcasts - - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/) - - * Posts - - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/) - - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/) - - * Videos - - [Introduction](https://vimeo.com/44154599) - - [Origins](https://vimeo.com/44154600) - - [Optimizations & builds](https://vimeo.com/44154601) - - [Native method use](https://vimeo.com/48576012) - - [Testing](https://vimeo.com/45865290) - - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk) - - A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources). - -## Support - -Tested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25~17, Safari 3-7, Node.js 0.6.21~0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5.
-Automated browser test results [are available](https://saucelabs.com/u/lodash) as well as [Travis CI](https://travis-ci.org/) builds for [lodash](https://travis-ci.org/lodash/lodash/), [lodash-cli](https://travis-ci.org/lodash/lodash-cli/), [lodash-amd](https://travis-ci.org/lodash/lodash-amd/), [lodash-node](https://travis-ci.org/lodash/lodash-node/), & [grunt-lodash](https://travis-ci.org/lodash/grunt-lodash). - -Special thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.
-[![Sauce Labs](http://lodash.com/_img/sauce.png)](https://saucelabs.com/ "Sauce Labs: Selenium Testing & More") - ## Installation & usage In browsers: @@ -148,16 +77,69 @@ require({ }); ``` -## Author +## Resources -| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") | -|---| -| [John-David Dalton](http://allyoucanleet.com/) | + * Podcasts + - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/) -## Contributors + * Posts + - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/) + - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/) -| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz "Follow @BlaineBublitz on Twitter") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---|---|---| -| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) | + * Videos + - [Introduction](https://vimeo.com/44154599) + - [Origins](https://vimeo.com/44154600) + - [Optimizations & builds](https://vimeo.com/44154601) + - [Native method use](https://vimeo.com/48576012) + - [Testing](https://vimeo.com/45865290) + - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk) -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lodash/lodash/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources). + +## Features + + * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.) + * [_(…)](https://lodash.com/docs#_) supports intuitive chaining + * [_.at](https://lodash.com/docs#at) for cherry-picking collection values + * [_.bindKey](https://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods + * [_.clone](https://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects + * [_.cloneDeep](https://lodash.com/docs#cloneDeep) for deep cloning arrays & objects + * [_.constant](https://lodash.com/docs#constant) & [_.property](https://lodash.com/docs#property) function generators for composing functions + * [_.contains](https://lodash.com/docs#contains) accepts a `fromIndex` + * [_.create](https://lodash.com/docs#create) for easier object inheritance + * [_.createCallback](https://lodash.com/docs#createCallback) for extending callbacks in methods & mixins + * [_.curry](https://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions + * [_.debounce](https://lodash.com/docs#debounce) & [_.throttle](https://lodash.com/docs#throttle) accept additional `options` for more control + * [_.findIndex](https://lodash.com/docs#findIndex) & [_.findKey](https://lodash.com/docs#findKey) for finding indexes & keys + * [_.forEach](https://lodash.com/docs#forEach) is chainable & supports exiting early + * [_.forIn](https://lodash.com/docs#forIn) for iterating own & inherited properties + * [_.forOwn](https://lodash.com/docs#forOwn) for iterating own properties + * [_.isPlainObject](https://lodash.com/docs#isPlainObject) for checking if values are created by `Object` + * [_.mapValues](https://lodash.com/docs#mapValues) for [mapping](https://lodash.com/docs#map) values to an object + * [_.memoize](https://lodash.com/docs#memoize) exposes the `cache` of memoized functions + * [_.merge](https://lodash.com/docs#merge) for a deep [_.extend](https://lodash.com/docs#extend) + * [_.noop](https://lodash.com/docs#noop) for function placeholders + * [_.now](https://lodash.com/docs#now) as a cross-browser `Date.now` alternative + * [_.parseInt](https://lodash.com/docs#parseInt) for consistent behavior + * [_.pull](https://lodash.com/docs#pull) & [_.remove](https://lodash.com/docs#remove) for mutating arrays + * [_.random](https://lodash.com/docs#random) supports returning floating-point numbers + * [_.runInContext](https://lodash.com/docs#runInContext) for easier mocking + * [_.sortBy](https://lodash.com/docs#sortBy) supports sorting by multiple properties + * [_.support](https://lodash.com/docs#support) for flagging environment features + * [_.template](https://lodash.com/docs#template) supports [*“imports”*](https://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals) + * [_.transform](https://lodash.com/docs#transform) as a powerful alternative to [_.reduce](https://lodash.com/docs#reduce) for transforming objects + * [_.where](https://lodash.com/docs#where) supports deep object comparisons + * [_.xor](https://lodash.com/docs#xor) as a companion to [_.difference](https://lodash.com/docs#difference), [_.intersection](https://lodash.com/docs#intersection), & [_.union](https://lodash.com/docs#union) + * [_.zip](https://lodash.com/docs#zip) is capable of unzipping values + * [_.omit](https://lodash.com/docs#omit), [_.pick](https://lodash.com/docs#pick), & + [more](https://lodash.com/docs "_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept callbacks + * [_.contains](https://lodash.com/docs#contains), [_.toArray](https://lodash.com/docs#toArray), & + [more](https://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where") accept strings + * [_.filter](https://lodash.com/docs#filter), [_.map](https://lodash.com/docs#map), & + [more](https://lodash.com/docs "_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* & *“_.where”* shorthands + * [_.findLast](https://lodash.com/docs#findLast), [_.findLastIndex](https://lodash.com/docs#findLastIndex), & + [more](https://lodash.com/docs "_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight") right-associative methods + +## Support + +Tested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25-17, Safari 3-7, Node.js 0.6.21-0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5. diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js index 23798ba..4d35185 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.js @@ -1,11 +1,11 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) + * Lo-Dash 2.4.2 (Custom Build) * Build: `lodash -o ./dist/lodash.compat.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -1818,6 +1818,7 @@ var setBindData = !defineProperty ? noop : function(func, value) { descriptor.value = value; defineProperty(func, '__bindData__', descriptor); + descriptor.value = null; }; /** @@ -6489,7 +6490,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -7058,7 +7059,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.min.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.min.js index d03b6ba..c0992cf 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.min.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.compat.min.js @@ -1,61 +1,92 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE + * Lo-Dash 2.4.2 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash -o ./dist/lodash.compat.js` */ -;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++ei||typeof a=="undefined")return 1;if(ae?0:e);++r=_&&a===n,f=[];if(l){var c=o(r);c?(a=t,r=c):l=false}for(;++ua(r,c)&&f.push(c);return l&&p(r),f}function ot(n,t,e,r){r=(r||0)-1; -for(var u=n?n.length:0,o=[];++r=_&&l===n,h=u||g?i():s;for(g&&(h=o(h),l=t);++al(h,y))&&((u||g)&&h.push(y),s.push(v))}return g?(c(h.k),p(h)):u&&c(h),s}function ct(n){return function(t,e,r){var u={}; -if(e=v.createCallback(e,r,3),qe(t)){r=-1;for(var o=t.length;++rk;k++)r+="n='"+e.h[k]+"';if((!(r&&x[n])&&m.call(t,n))",e.j||(r+="||(!x[n]&&t[n]!==A[n])"),r+="){"+e.g+"}"; -r+="}"}return(e.b||Le.nonEnumArgs)&&(r+="}"),r+=e.c+";return E",n("d,j,k,m,o,p,q,s,v,A,B,y,I,J,L",t+r+"}")(tt,q,ce,we,d,dt,qe,kt,Q.f,pe,X,$e,M,se,he)}function gt(n){return Ve[n]}function ht(){var t=(t=v.indexOf)===zt?n:t;return t}function vt(n){return typeof n=="function"&&ve.test(n)}function yt(n){var t,e;return!n||he.call(n)!=G||(t=n.constructor,jt(t)&&!(t instanceof t))||!Le.argsClass&&dt(n)||!Le.nodeClass&&f(n)?false:Le.ownLast?(nr(n,function(n,t,r){return e=we.call(r,t),false}),false!==e):(nr(n,function(n,t){e=t -}),typeof e=="undefined"||we.call(n,e))}function mt(n){return He[n]}function dt(n){return n&&typeof n=="object"&&typeof n.length=="number"&&he.call(n)==T||false}function bt(n,t,e){var r=We(n),u=r.length;for(t=tt(t,e,3);u--&&(e=r[u],false!==t(n[e],e,n)););return n}function _t(n){var t=[];return nr(n,function(n,e){jt(n)&&t.push(e)}),t.sort()}function wt(n){for(var t=-1,e=We(n),r=e.length,u={};++te?Be(0,o+e):e)||0,qe(n)?a=-1o&&(o=i)}}else t=null==t&&kt(n)?r:v.createCallback(t,e,3),Xe(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Rt(n,t,e,r){var u=3>arguments.length;if(t=v.createCallback(t,r,4),qe(n)){var o=-1,a=n.length;for(u&&(e=n[++o]);++oarguments.length; -return t=v.createCallback(t,r,4),Nt(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Zt(typeof e=="number"?e:0);return Dt(n,function(n){var e=lt(0,++t);r[t]=r[e],r[e]=n}),r}function $t(n,t,e){var r;if(t=v.createCallback(t,e,3),qe(n)){e=-1;for(var u=n.length;++er?Be(0,u+r):r||0}else if(r)return r=Kt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=v.createCallback(t,e,3);++u>>1,e(n[r])e?0:e);++t=h;m?(u&&(u=me(u)),c=a,o=n.apply(i,r)):u||(u=Ce(y,h))}return m&&l?l=me(l):l||t===p||(l=Ce(v,t)),e&&(m=true,o=n.apply(i,r)),!m||l||u||(r=i=null),o}}function Ht(n){return n}function Ut(n,t,e){var r=true,u=t&&_t(t);t&&(e||u.length)||(null==e&&(e=t),o=y,t=n,n=v,u=_t(t)),false===e?r=false:xt(e)&&"chain"in e&&(r=e.chain);var o=n,a=jt(o);Dt(u,function(e){var u=n[e]=t[e];a&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,a=[e];if(je.apply(a,arguments),a=u.apply(n,a),r||t){if(e===a&&xt(a))return this; -a=new o(a),a.__chain__=t}return a})})}function Qt(){}function Xt(n){return function(t){return t[n]}}function Yt(){return this.__wrapped__}e=e?ut.defaults(Z.Object(),e,ut.pick(Z,R)):Z;var Zt=e.Array,ne=e.Boolean,te=e.Date,ee=e.Function,re=e.Math,ue=e.Number,oe=e.Object,ae=e.RegExp,ie=e.String,le=e.TypeError,fe=[],ce=e.Error.prototype,pe=oe.prototype,se=ie.prototype,ge=e._,he=pe.toString,ve=ae("^"+ie(he).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),ye=re.ceil,me=e.clearTimeout,de=re.floor,be=ee.prototype.toString,_e=vt(_e=oe.getPrototypeOf)&&_e,we=pe.hasOwnProperty,je=fe.push,xe=pe.propertyIsEnumerable,Ce=e.setTimeout,ke=fe.splice,Ee=fe.unshift,Oe=function(){try{var n={},t=vt(t=oe.defineProperty)&&t,e=t(n,n,n)&&t -}catch(r){}return e}(),Se=vt(Se=oe.create)&&Se,Ae=vt(Ae=Zt.isArray)&&Ae,Ie=e.isFinite,De=e.isNaN,Ne=vt(Ne=oe.keys)&&Ne,Be=re.max,Pe=re.min,Re=e.parseInt,Fe=re.random,Te={};Te[$]=Zt,Te[L]=ne,Te[z]=te,Te[K]=ee,Te[G]=oe,Te[W]=ue,Te[J]=ae,Te[M]=ie;var $e={};$e[$]=$e[z]=$e[W]={constructor:true,toLocaleString:true,toString:true,valueOf:true},$e[L]=$e[M]={constructor:true,toString:true,valueOf:true},$e[q]=$e[K]=$e[J]={constructor:true,toString:true},$e[G]={constructor:true},function(){for(var n=F.length;n--;){var t,e=F[n]; -for(t in $e)we.call($e,t)&&!we.call($e[t],e)&&($e[t][e]=false)}}(),y.prototype=v.prototype;var Le=v.support={};!function(){var n=function(){this.x=1},t={0:1,length:1},r=[];n.prototype={valueOf:1,y:1};for(var u in new n)r.push(u);for(u in arguments);Le.argsClass=he.call(arguments)==T,Le.argsObject=arguments.constructor==oe&&!(arguments instanceof Zt),Le.enumErrorProps=xe.call(ce,"message")||xe.call(ce,"name"),Le.enumPrototypes=xe.call(n,"prototype"),Le.funcDecomp=!vt(e.WinRTError)&&B.test(g),Le.funcNames=typeof ee.name=="string",Le.nonEnumArgs=0!=u,Le.nonEnumShadows=!/valueOf/.test(r),Le.ownLast="x"!=r[0],Le.spliceObjects=(fe.splice.call(t,0,1),!t[0]),Le.unindexedChars="xx"!="x"[0]+oe("x")[0]; -try{Le.nodeClass=!(he.call(document)==G&&!({toString:0}+""))}catch(o){Le.nodeClass=true}}(1),v.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:I,variable:"",imports:{_:v}},Se||(nt=function(){function n(){}return function(t){if(xt(t)){n.prototype=t;var r=new n;n.prototype=null}return r||e.Object()}}());var ze=Oe?function(n,t){U.value=t,Oe(n,"__bindData__",U)}:Qt;Le.argsClass||(dt=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&we.call(n,"callee")&&!xe.call(n,"callee")||false -});var qe=Ae||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&he.call(n)==$||false},Ke=st({a:"z",e:"[]",i:"if(!(B[typeof z]))return E",g:"E.push(n)"}),We=Ne?function(n){return xt(n)?Le.enumPrototypes&&typeof n=="function"||Le.nonEnumArgs&&n.length&&dt(n)?Ke(n):Ne(n):[]}:Ke,Ge={a:"g,e,K",i:"e=e&&typeof K=='undefined'?e:d(e,K,3)",b:"typeof u=='number'",v:We,g:"if(e(t[n],n,g)===false)return E"},Je={a:"z,H,l",i:"var a=arguments,b=0,c=typeof l=='number'?2:a.length;while(++b":">",'"':""","'":"'"},He=wt(Ve),Ue=ae("("+We(He).join("|")+")","g"),Qe=ae("["+We(Ve).join("")+"]","g"),Xe=st(Ge),Ye=st(Je,{i:Je.i.replace(";",";if(c>3&&typeof a[c-2]=='function'){var e=d(a[--c-1],a[c--],2)}else if(c>2&&typeof a[c-1]=='function'){e=a[--c]}"),g:"E[n]=e?e(E[n],t[n]):t[n]"}),Ze=st(Je),nr=st(Ge,Me,{j:false}),tr=st(Ge,Me); -jt(/x/)&&(jt=function(n){return typeof n=="function"&&he.call(n)==K});var er=_e?function(n){if(!n||he.call(n)!=G||!Le.argsClass&&dt(n))return false;var t=n.valueOf,e=vt(t)&&(e=_e(t))&&_e(e);return e?n==e||_e(n)==e:yt(n)}:yt,rr=ct(function(n,t,e){we.call(n,e)?n[e]++:n[e]=1}),ur=ct(function(n,t,e){(we.call(n,e)?n[e]:n[e]=[]).push(t)}),or=ct(function(n,t,e){n[e]=t}),ar=Bt,ir=vt(ir=te.now)&&ir||function(){return(new te).getTime()},lr=8==Re(j+"08")?Re:function(n,t){return Re(kt(n)?n.replace(D,""):n,t||0)}; -return v.after=function(n,t){if(!jt(t))throw new le;return function(){return 1>--n?t.apply(this,arguments):void 0}},v.assign=Ye,v.at=function(n){var t=arguments,e=-1,r=ot(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Zt(t);for(Le.unindexedChars&&kt(n)&&(n=n.split(""));++e=_&&o(r?e[r]:s)))}var f=e[0],h=-1,v=f?f.length:0,y=[];n:for(;++h(m?t(m,g):l(s,g))){for(r=u,(m||s).push(g);--r;)if(m=a[r],0>(m?t(m,g):l(e[r],g)))continue n;y.push(g) -}}for(;u--;)(m=a[u])&&p(m);return c(a),c(s),y},v.invert=wt,v.invoke=function(n,t){var e=s(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,a=Zt(typeof o=="number"?o:0);return Dt(n,function(n){a[++r]=(u?t:n[t]).apply(n,e)}),a},v.keys=We,v.map=Bt,v.mapValues=function(n,t,e){var r={};return t=v.createCallback(t,e,3),tr(n,function(n,e,u){r[e]=t(n,e,u)}),r},v.max=Pt,v.memoize=function(n,t){if(!jt(n))throw new le;var e=function(){var r=e.cache,u=t?t.apply(this,arguments):b+arguments[0];return we.call(r,u)?r[u]:r[u]=n.apply(this,arguments) -};return e.cache={},e},v.merge=function(n){var t=arguments,e=2;if(!xt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3e?Be(0,r+e):Pe(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},v.mixin=Ut,v.noConflict=function(){return e._=ge,this},v.noop=Qt,v.now=ir,v.parseInt=lr,v.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Fe(),Pe(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):lt(n,t)},v.reduce=Rt,v.reduceRight=Ft,v.result=function(n,t){if(n){var e=n[t]; -return jt(e)?n[t]():e}},v.runInContext=g,v.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:We(n).length},v.some=$t,v.sortedIndex=Kt,v.template=function(n,t,e){var r=v.templateSettings;n=ie(n||""),e=Ze({},e,r);var u,o=Ze({},e.imports,r.imports),r=We(o),o=Et(o),i=0,l=e.interpolate||N,f="__p+='",l=ae((e.escape||N).source+"|"+l.source+"|"+(l===I?O:N).source+"|"+(e.evaluate||N).source+"|$","g");n.replace(l,function(t,e,r,o,l,c){return r||(r=o),f+=n.slice(i,c).replace(P,a),e&&(f+="'+__e("+e+")+'"),l&&(u=true,f+="';"+l+";\n__p+='"),r&&(f+="'+((__t=("+r+"))==null?'':__t)+'"),i=c+t.length,t -}),f+="';",l=e=e.variable,l||(e="obj",f="with("+e+"){"+f+"}"),f=(u?f.replace(x,""):f).replace(C,"$1").replace(E,"$1;"),f="function("+e+"){"+(l?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+f+"return __p}";try{var c=ee(r,"return "+f).apply(h,o)}catch(p){throw p.source=f,p}return t?c(t):(c.source=f,c)},v.unescape=function(n){return null==n?"":ie(n).replace(Ue,mt)},v.uniqueId=function(n){var t=++m;return ie(null==n?"":n)+t -},v.all=St,v.any=$t,v.detect=It,v.findWhere=It,v.foldl=Rt,v.foldr=Ft,v.include=Ot,v.inject=Rt,Ut(function(){var n={};return tr(v,function(t,e){v.prototype[e]||(n[e]=t)}),n}(),false),v.first=Lt,v.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=v.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:h;return s(n,Be(0,u-r))},v.sample=function(n,t,e){return n&&typeof n.length!="number"?n=Et(n):Le.unindexedChars&&kt(n)&&(n=n.split("")),null==t||e?n?n[lt(0,n.length-1)]:h:(n=Tt(n),n.length=Pe(Be(0,t),n.length),n) -},v.take=Lt,v.head=Lt,tr(v,function(n,t){var e="sample"!==t;v.prototype[t]||(v.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new y(o,u):o})}),v.VERSION="2.4.1",v.prototype.chain=function(){return this.__chain__=true,this},v.prototype.toString=function(){return ie(this.__wrapped__)},v.prototype.value=Yt,v.prototype.valueOf=Yt,Xe(["join","pop","shift"],function(n){var t=fe[n];v.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments); -return n?new y(e,n):e}}),Xe(["push","reverse","sort","unshift"],function(n){var t=fe[n];v.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),Xe(["concat","slice","splice"],function(n){var t=fe[n];v.prototype[n]=function(){return new y(t.apply(this.__wrapped__,arguments),this.__chain__)}}),Le.spliceObjects||Xe(["pop","shift","splice"],function(n){var t=fe[n],e="splice"==n;v.prototype[n]=function(){var n=this.__chain__,r=this.__wrapped__,u=t.apply(r,arguments);return 0===r.length&&delete r[0],n||e?new y(u,n):u -}}),v}var h,v=[],y=[],m=0,d={},b=+new Date+"",_=75,w=40,j=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",x=/\b__p\+='';/g,C=/\b(__p\+=)''\+/g,E=/(__e\(.*?\)|\b__t\))\+'';/g,O=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,S=/\w*$/,A=/^\s*function[ \n\r\t]+\w/,I=/<%=([\s\S]+?)%>/g,D=RegExp("^["+j+"]*0+(?=.$)"),N=/($^)/,B=/\bthis\b/,P=/['\n\r\t\u2028\u2029\\]/g,R="Array Boolean Date Error Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),F="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),T="[object Arguments]",$="[object Array]",L="[object Boolean]",z="[object Date]",q="[object Error]",K="[object Function]",W="[object Number]",G="[object Object]",J="[object RegExp]",M="[object String]",V={}; -V[K]=false,V[T]=V[$]=V[L]=V[z]=V[W]=V[G]=V[J]=V[M]=true;var H={leading:false,maxWait:0,trailing:false},U={configurable:false,enumerable:false,value:null,writable:false},Q={a:"",b:null,c:"",d:"",e:"",v:null,g:"",h:null,support:null,i:"",j:false},X={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},Y={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},Z=X[typeof window]&&window||this,nt=X[typeof exports]&&exports&&!exports.nodeType&&exports,tt=X[typeof module]&&module&&!module.nodeType&&module,et=tt&&tt.exports===nt&&nt,rt=X[typeof global]&&global; -!rt||rt.global!==rt&&rt.window!==rt||(Z=rt);var ut=g();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Z._=ut, define(function(){return ut})):nt&&tt?et?(tt.exports=ut)._=ut:nt._=ut:Z._=ut}).call(this); \ No newline at end of file +;(function(){function n(n,r,e){for(var t=(e||0)-1,o=n?n.length:0;++t-1?0:-1:r?0:-1}function e(n){var r=this.cache,e=typeof n;if("boolean"==e||null==n)r[n]=!0;else{"number"!=e&&"string"!=e&&(e="object");var t="number"==e?n:m+n,o=r[e]||(r[e]={});"object"==e?(o[t]||(o[t]=[])).push(n):o[t]=!0; + +}}function t(n){return n.charCodeAt(0)}function o(n,r){for(var e=n.criteria,t=r.criteria,o=-1,u=e.length;++oi||"undefined"==typeof a)return 1;if(a=_&&a===n,c=[];if(l){var f=u(t);f?(a=r,t=f):l=!1}for(;++o-1:h});return o.pop(),u.pop(),_&&(f(o),f(u)),a}function cn(n,r,e,t,o){(st(r)?or:Ct)(r,function(r,u){var a,i,l=r,c=n[u];if(r&&((i=st(r))||Pt(r))){for(var f=t.length;f--;)if(a=t[f]==r){c=o[f];break}if(!a){var s;e&&(l=e(c,r),(s="undefined"!=typeof l)&&(c=l)),s||(c=i?st(c)?c:[]:Pt(c)?c:{}),t.push(r),o.push(c),s||cn(c,r,e,t,o)}}else e&&(l=e(c,r),"undefined"==typeof l&&(l=r)),"undefined"!=typeof l&&(c=l);n[u]=c; + +})}function fn(n,r){return n+We(ut()*(r-n+1))}function sn(e,t,o){var a=-1,l=yn(),c=e?e.length:0,p=[],g=!t&&c>=_&&l===n,h=o||g?i():p;if(g){var v=u(h);l=r,h=v}for(;++a3&&"function"==typeof r[e-2])var t=en(r[--e-1],r[e--],2);else e>2&&"function"==typeof r[e-1]&&(t=r[--e]);for(var o=p(arguments,1,e),u=-1,a=i(),l=i();++u-1:"number"==typeof u?a=(zn(n)?n.indexOf(r,e):o(n,r,e))>-1:wt(n,function(n){return++tu&&(u=l)}else r=null==r&&zn(n)?t:v.createCallback(r,e,3),wt(n,function(n,e,t){var a=r(n,e,t);a>o&&(o=a,u=n)});return u}function cr(n,r,e){var o=1/0,u=o;if("function"!=typeof r&&e&&e[r]===n&&(r=null),null==r&&st(n))for(var a=-1,i=n.length;++a=_&&u(t?e[t]:p)))}var h=e[0],v=-1,y=h?h.length:0,b=[];n:for(;++v>>1;e(n[a])1?arguments:arguments[0],r=-1,e=n?lr(At(n,"length")):0,t=we(e<0?0:e);++r2?gn(n,17,p(arguments,2),null,r):gn(n,1,null,null,r)}function zr(n){for(var r=arguments.length>1?an(arguments,!0,!1,1):On(n),e=-1,t=r.length;++e2?gn(r,19,p(arguments,2),null,n):gn(r,3,null,null,n)}function Ur(){for(var n=arguments,r=n.length;r--;)if(!$n(n[r]))throw new Ie;return function(){for(var r=arguments,e=n.length;e--;)r=[n[e].apply(this,r)]; + +return r[0]}}function Mr(n,r){return r="number"==typeof r?r:+r||n.length,gn(n,4,null,null,null,r)}function Vr(n,r,e){var t,o,u,a,i,l,c,f=0,s=!1,p=!0;if(!$n(n))throw new Ie;if(r=et(0,r)||0,e===!0){var g=!0;p=!1}else Fn(e)&&(g=e.leading,s="maxWait"in e&&(et(r,e.maxWait)||0),p="trailing"in e?e.trailing:p);var v=function(){var e=r-(Lt()-a);if(e>0)l=Ve(v,e);else{o&&He(o);var s=c;o=l=c=h,s&&(f=Lt(),u=n.apply(i,t),l||o||(t=i=null))}},y=function(){l&&He(l),o=l=c=h,(p||s!==r)&&(f=Lt(),u=n.apply(i,t),l||o||(t=i=null)); + +};return function(){if(t=arguments,a=Lt(),i=this,c=p&&(l||!g),s===!1)var e=g&&!l;else{o||g||(f=a);var h=s-(a-f),b=h<=0;b?(o&&(o=He(o)),f=a,u=n.apply(i,t)):o||(o=Ve(y,h))}return b&&l?l=He(l):l||r===s||(l=Ve(v,r)),e&&(b=!0,u=n.apply(i,t)),!b||l||o||(t=i=null),u}}function Gr(n){if(!$n(n))throw new Ie;var r=p(arguments,1);return Ve(function(){n.apply(h,r)},1)}function Jr(n,r){if(!$n(n))throw new Ie;var e=p(arguments,2);return Ve(function(){n.apply(h,e)},r)}function Qr(n,r){if(!$n(n))throw new Ie;var e=function(){ +var t=e.cache,o=r?r.apply(this,arguments):m+arguments[0];return Ke.call(t,o)?t[o]:t[o]=n.apply(this,arguments)};return e.cache={},e}function Xr(n){var r,e;if(!$n(n))throw new Ie;return function(){return r?e:(r=!0,e=n.apply(this,arguments),n=null,e)}}function Yr(n){return gn(n,16,p(arguments,1))}function Zr(n){return gn(n,32,null,p(arguments,1))}function ne(n,r,e){var t=!0,o=!0;if(!$n(n))throw new Ie;return e===!1?t=!1:Fn(e)&&(t="leading"in e?e.leading:t,o="trailing"in e?e.trailing:o),J.leading=t, +J.maxWait=r,J.trailing=o,Vr(n,r,J)}function re(n,r){return gn(r,16,[n])}function ee(n){return function(){return n}}function te(n,r,e){var t=typeof n;if(null==n||"function"==t)return en(n,r,e);if("object"!=t)return ce(n);var o=gt(n),u=o[0],a=n[u];return 1!=o.length||a!==a||Fn(a)?function(r){for(var e=o.length,t=!1;e--&&(t=ln(r[o[e]],n[o[e]],null,!0)););return t}:function(n){var r=n[u];return a===r&&(0!==a||1/a==1/r)}}function oe(n){return null==n?"":Ae(n).replace(_t,vn)}function ue(n){return n}function ae(n,r,e){ +var t=!0,o=r&&On(r);r&&(e||o.length)||(null==e&&(e=r),u=y,r=n,n=v,o=On(r)),e===!1?t=!1:Fn(e)&&"chain"in e&&(t=e.chain);var u=n,a=$n(u);or(o,function(e){var o=n[e]=r[e];a&&(u.prototype[e]=function(){var r=this.__chain__,e=this.__wrapped__,a=[e];Ue.apply(a,arguments);var i=o.apply(n,a);if(t||r){if(e===i&&Fn(i))return this;i=new u(i),i.__chain__=r}return i})})}function ie(){return e._=De,this}function le(){}function ce(n){return function(r){return r[n]}}function fe(n,r,e){var t=null==n,o=null==r;if(null==e&&("boolean"==typeof n&&o?(e=n, +n=1):o||"boolean"!=typeof r||(e=r,o=!0)),t&&o&&(r=1),n=+n||0,o?(r=n,n=0):r=+r||0,e||n%1||r%1){var u=ut();return tt(n+u*(r-n+parseFloat("1e-"+((u+"").length-1))),r)}return fn(n,r)}function se(n,r){if(n){var e=n[r];return $n(e)?n[r]():e}}function pe(n,r,e){var t=v.templateSettings;n=Ae(n||""),e=jt({},e,t);var o,u=jt({},e.imports,t.imports),i=gt(u),l=Xn(u),c=0,f=e.interpolate||L,s="__p += '",p=Se((e.escape||L).source+"|"+f.source+"|"+(f===A?E:L).source+"|"+(e.evaluate||L).source+"|$","g");n.replace(p,function(r,e,t,u,i,l){ +return t||(t=u),s+=n.slice(c,l).replace(R,a),e&&(s+="' +\n__e("+e+") +\n'"),i&&(o=!0,s+="';\n"+i+";\n__p += '"),t&&(s+="' +\n((__t = ("+t+")) == null ? '' : __t) +\n'"),c=l+r.length,r}),s+="';\n";var g=e.variable,y=g;y||(g="obj",s="with ("+g+") {\n"+s+"\n}\n"),s=(o?s.replace(j,""):s).replace(C,"$1").replace(P,"$1;"),s="function("+g+") {\n"+(y?"":g+" || ("+g+" = {});\n")+"var __t, __p = '', __e = _.escape"+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+s+"return __p\n}"; + +var b="\n/*\n//# sourceURL="+(e.sourceURL||"/lodash/template/source["+$++ +"]")+"\n*/";try{var d=Ce(i,"return "+s+b).apply(h,l)}catch(m){throw m.source=s,m}return r?d(r):(d.source=s,d)}function ge(n,r,e){n=(n=+n)>-1?n:0;var t=-1,o=we(n);for(r=en(r,e,1);++t/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:A,variable:"",imports:{_:v}};var ct=function(n){var r="var index, iterable = "+n.firstArg+", result = "+n.init+";\nif (!iterable) return result;\n"+n.top+";"; + +n.array?(r+="\nvar length = iterable.length; index = -1;\nif ("+n.array+") { ",lt.unindexedChars&&(r+="\n if (isString(iterable)) {\n iterable = iterable.split('')\n } "),r+="\n while (++index < length) {\n "+n.loop+";\n }\n}\nelse { "):lt.nonEnumArgs&&(r+="\n var length = iterable.length; index = -1;\n if (length && isArguments(iterable)) {\n while (++index < length) {\n index += '';\n "+n.loop+";\n }\n } else { "),lt.enumPrototypes&&(r+="\n var skipProto = typeof iterable == 'function';\n "), +lt.enumErrorProps&&(r+="\n var skipErrorProps = iterable === errorProto || iterable instanceof Error;\n ");var e=[];if(lt.enumPrototypes&&e.push('!(skipProto && index == "prototype")'),lt.enumErrorProps&&e.push('!(skipErrorProps && (index == "message" || index == "name"))'),n.useHas&&n.keys)r+="\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n", +e.length&&(r+=" if ("+e.join(" && ")+") {\n "),r+=n.loop+"; ",e.length&&(r+="\n }"),r+="\n } ";else if(r+="\n for (index in iterable) {\n",n.useHas&&e.push("hasOwnProperty.call(iterable, index)"),e.length&&(r+=" if ("+e.join(" && ")+") {\n "),r+=n.loop+"; ",e.length&&(r+="\n }"),r+="\n } ",lt.nonEnumShadows){for(r+="\n\n if (iterable !== objectProto) {\n var ctor = iterable.constructor,\n isProto = iterable === (ctor && ctor.prototype),\n className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\n nonEnum = nonEnumProps[className];\n ", +k=0;k<7;k++)r+="\n index = '"+n.shadowedProps[k]+"';\n if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))",n.useHas||(r+=" || (!nonEnum[index] && iterable[index] !== objectProto[index])"),r+=") {\n "+n.loop+";\n } ";r+="\n } "}return(n.array||lt.nonEnumArgs)&&(r+="\n}"),r+=n.bottom+";\nreturn result"};Xe||(rn=function(){function n(){}return function(r){if(Fn(r)){n.prototype=r;var t=new n;n.prototype=null}return t||e.Object()}}());var ft=Qe?function(n,r){ +Q.value=r,Qe(n,"__bindData__",Q),Q.value=null}:le;lt.argsClass||(_n=function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&Ke.call(n,"callee")&&!Me.call(n,"callee")||!1});var st=Ye||function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&$e.call(n)==B||!1},pt=hn({args:"object",init:"[]",top:"if (!(objectTypes[typeof object])) return result",loop:"result.push(index)"}),gt=rt?function(n){return Fn(n)?lt.enumPrototypes&&"function"==typeof n||lt.nonEnumArgs&&n.length&&_n(n)?pt(n):rt(n):[]; + +}:pt,ht={args:"collection, callback, thisArg",top:"callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)",array:"typeof length == 'number'",keys:gt,loop:"if (callback(iterable[index], index, collection) === false) return result"},vt={args:"object, source, guard",top:"var args = arguments,\n argsIndex = 0,\n argsLength = typeof guard == 'number' ? 2 : args.length;\nwhile (++argsIndex < argsLength) {\n iterable = args[argsIndex];\n if (iterable && objectTypes[typeof iterable]) {", +keys:gt,loop:"if (typeof result[index] == 'undefined') result[index] = iterable[index]",bottom:" }\n}"},yt={top:"if (!objectTypes[typeof iterable]) return result;\n"+ht.top,array:!1},bt={"&":"&","<":"<",">":">",'"':""","'":"'"},dt=An(bt),mt=Se("("+gt(dt).join("|")+")","g"),_t=Se("["+gt(bt).join("")+"]","g"),wt=hn(ht),xt=hn(vt,{top:vt.top.replace(";",";\nif (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n callback = args[--argsLength];\n}"), +loop:"result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]"}),jt=hn(vt),kt=hn(ht,yt,{useHas:!1}),Ct=hn(ht,yt);$n(/x/)&&($n=function(n){return"function"==typeof n&&$e.call(n)==z});var Pt=ze?function(n){if(!n||$e.call(n)!=U||!lt.argsClass&&_n(n))return!1;var r=n.valueOf,e=bn(r)&&(e=ze(r))&&ze(e);return e?n==e||ze(n)==e:dn(n)}:dn,Et=pn(function(n,r,e){Ke.call(n,e)?n[e]++:n[e]=1}),Ot=pn(function(n,r,e){(Ke.call(n,e)?n[e]:n[e]=[]).push(r)}),St=pn(function(n,r,e){n[e]=r; + +}),At=ir,It=rr,Lt=bn(Lt=je.now)&&Lt||function(){return(new je).getTime()},Nt=8==ot(x+"08")?ot:function(n,r){return ot(zn(n)?n.replace(I,""):n,r||0)};return v.after=Wr,v.assign=xt,v.at=Yn,v.bind=qr,v.bindAll=zr,v.bindKey=Kr,v.chain=ye,v.compact=mr,v.compose=Ur,v.constant=ee,v.countBy=Et,v.create=jn,v.createCallback=te,v.curry=Mr,v.debounce=Vr,v.defaults=jt,v.defer=Gr,v.delay=Jr,v.difference=_r,v.filter=rr,v.flatten=kr,v.forEach=or,v.forEachRight=ur,v.forIn=kt,v.forInRight=Pn,v.forOwn=Ct,v.forOwnRight=En, +v.functions=On,v.groupBy=Ot,v.indexBy=St,v.initial=Pr,v.intersection=Er,v.invert=An,v.invoke=ar,v.keys=gt,v.map=ir,v.mapValues=Un,v.max=lr,v.memoize=Qr,v.merge=Mn,v.min=cr,v.omit=Vn,v.once=Xr,v.pairs=Gn,v.partial=Yr,v.partialRight=Zr,v.pick=Jn,v.pluck=At,v.property=ce,v.pull=Ar,v.range=Ir,v.reject=pr,v.remove=Lr,v.rest=Nr,v.shuffle=hr,v.sortBy=br,v.tap=be,v.throttle=ne,v.times=ge,v.toArray=dr,v.transform=Qn,v.union=Tr,v.uniq=Dr,v.values=Xn,v.where=It,v.without=$r,v.wrap=re,v.xor=Fr,v.zip=Br,v.zipObject=Hr, +v.collect=ir,v.drop=Nr,v.each=or,v.eachRight=ur,v.extend=xt,v.methods=On,v.object=Hr,v.select=rr,v.tail=Nr,v.unique=Dr,v.unzip=Br,ae(v),v.clone=wn,v.cloneDeep=xn,v.contains=Zn,v.escape=oe,v.every=nr,v.find=er,v.findIndex=wr,v.findKey=kn,v.findLast=tr,v.findLastIndex=xr,v.findLastKey=Cn,v.has=Sn,v.identity=ue,v.indexOf=Cr,v.isArguments=_n,v.isArray=st,v.isBoolean=In,v.isDate=Ln,v.isElement=Nn,v.isEmpty=Rn,v.isEqual=Tn,v.isFinite=Dn,v.isFunction=$n,v.isNaN=Bn,v.isNull=Hn,v.isNumber=Wn,v.isObject=Fn, +v.isPlainObject=Pt,v.isRegExp=qn,v.isString=zn,v.isUndefined=Kn,v.lastIndexOf=Sr,v.mixin=ae,v.noConflict=ie,v.noop=le,v.now=Lt,v.parseInt=Nt,v.random=fe,v.reduce=fr,v.reduceRight=sr,v.result=se,v.runInContext=g,v.size=vr,v.some=yr,v.sortedIndex=Rr,v.template=pe,v.unescape=he,v.uniqueId=ve,v.all=nr,v.any=yr,v.detect=er,v.findWhere=er,v.foldl=fr,v.foldr=sr,v.include=Zn,v.inject=fr,ae(function(){var n={};return Ct(v,function(r,e){v.prototype[e]||(n[e]=r)}),n}(),!1),v.first=jr,v.last=Or,v.sample=gr,v.take=jr, +v.head=jr,Ct(v,function(n,r){var e="sample"!==r;v.prototype[r]||(v.prototype[r]=function(r,t){var o=this.__chain__,u=n(this.__wrapped__,r,t);return o||null!=r&&(!t||e&&"function"==typeof r)?new y(u,o):u})}),v.VERSION="2.4.2",v.prototype.chain=de,v.prototype.toString=me,v.prototype.value=_e,v.prototype.valueOf=_e,wt(["join","pop","shift"],function(n){var r=Le[n];v.prototype[n]=function(){var n=this.__chain__,e=r.apply(this.__wrapped__,arguments);return n?new y(e,n):e}}),wt(["push","reverse","sort","unshift"],function(n){ +var r=Le[n];v.prototype[n]=function(){return r.apply(this.__wrapped__,arguments),this}}),wt(["concat","slice","splice"],function(n){var r=Le[n];v.prototype[n]=function(){return new y(r.apply(this.__wrapped__,arguments),this.__chain__)}}),lt.spliceObjects||wt(["pop","shift","splice"],function(n){var r=Le[n],e="splice"==n;v.prototype[n]=function(){var n=this.__chain__,t=this.__wrapped__,o=r.apply(t,arguments);return 0===t.length&&delete t[0],n||e?new y(o,n):o}}),v}var h,v=[],y=[],b=0,d={},m=+new Date+"",_=75,w=40,x=" \f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",j=/\b__p \+= '';/g,C=/\b(__p \+=) '' \+/g,P=/(__e\(.*?\)|\b__t\)) \+\n'';/g,E=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,O=/\w*$/,S=/^\s*function[ \n\r\t]+\w/,A=/<%=([\s\S]+?)%>/g,I=RegExp("^["+x+"]*0+(?=.$)"),L=/($^)/,N=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,T=["Array","Boolean","Date","Error","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],D=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],$=0,F="[object Arguments]",B="[object Array]",H="[object Boolean]",W="[object Date]",q="[object Error]",z="[object Function]",K="[object Number]",U="[object Object]",M="[object RegExp]",V="[object String]",G={}; + +G[z]=!1,G[F]=G[B]=G[H]=G[W]=G[K]=G[U]=G[M]=G[V]=!0;var J={leading:!1,maxWait:0,trailing:!1},Q={configurable:!1,enumerable:!1,value:null,writable:!1},X={args:"",array:null,bottom:"",firstArg:"",init:"",keys:null,loop:"",shadowedProps:null,support:null,top:"",useHas:!1},Y={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},Z={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},nn=Y[typeof window]&&window||this,rn=Y[typeof exports]&&exports&&!exports.nodeType&&exports,en=Y[typeof module]&&module&&!module.nodeType&&module,tn=en&&en.exports===rn&&rn,on=Y[typeof global]&&global; + +!on||on.global!==on&&on.window!==on||(nn=on);var un=g();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(nn._=un,define(function(){return un})):rn&&en?tn?(en.exports=un)._=un:rn._=un:nn._=un}).call(this); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.js index d653e5a..3646090 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.js @@ -1,11 +1,11 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) + * Lo-Dash 2.4.2 (Custom Build) * Build: `lodash modern -o ./dist/lodash.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -1494,6 +1494,7 @@ var setBindData = !defineProperty ? noop : function(func, value) { descriptor.value = value; defineProperty(func, '__bindData__', descriptor); + descriptor.value = null; }; /** @@ -6139,7 +6140,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -6708,7 +6709,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.min.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.min.js index 85a9626..dd1c643 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.min.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.min.js @@ -1,56 +1,87 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE + * Lo-Dash 2.4.2 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash modern -o ./dist/lodash.js` */ -;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++ea||typeof i=="undefined")return 1;if(ie?0:e);++r=b&&i===n,l=[];if(f){var p=o(r);p?(i=t,r=p):f=false}for(;++ui(r,p)&&l.push(p);return f&&c(r),l}function ut(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r=b&&f===n,h=u||v?a():s; -for(v&&(h=o(h),f=t);++if(h,y))&&((u||v)&&h.push(y),s.push(g))}return v?(l(h.k),c(h)):u&&l(h),s}function lt(n){return function(t,e,r){var u={};e=J.createCallback(e,r,3),r=-1;var o=t?t.length:0;if(typeof o=="number")for(;++re?Ie(0,o+e):e)||0,Te(n)?i=-1o&&(o=a)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Dt(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=J.createCallback(t,r,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(e=n[++o]);++oarguments.length;return t=J.createCallback(t,r,4),Et(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Xt(typeof e=="number"?e:0);return St(n,function(n){var e=at(0,++t);r[t]=r[e],r[e]=n}),r}function Ft(n,t,e){var r;t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++er?Ie(0,u+r):r||0}else if(r)return r=zt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=J.createCallback(t,e,3);++u>>1,e(n[r])e?0:e);++t=v; -m?(i&&(i=ve(i)),s=f,a=n.apply(l,o)):i||(i=_e(r,v))}return m&&c?c=ve(c):c||t===h||(c=_e(u,t)),e&&(m=true,a=n.apply(l,o)),!m||c||i||(o=l=null),a}}function Ut(n){return n}function Gt(n,t,e){var r=true,u=t&&bt(t);t&&(e||u.length)||(null==e&&(e=t),o=Q,t=n,n=J,u=bt(t)),false===e?r=false:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=dt(o);St(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(be.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this; -i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,A)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,ae=[],fe=re.prototype,le=e._,ce=fe.toString,pe=ue("^"+oe(ce).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,ve=e.clearTimeout,he=te.floor,ge=ne.prototype.toString,ye=vt(ye=re.getPrototypeOf)&&ye,me=fe.hasOwnProperty,be=ae.push,_e=e.setTimeout,de=ae.splice,we=ae.unshift,je=function(){try{var n={},t=vt(t=re.defineProperty)&&t,e=t(n,n,n)&&t -}catch(r){}return e}(),ke=vt(ke=re.create)&&ke,xe=vt(xe=Xt.isArray)&&xe,Ce=e.isFinite,Oe=e.isNaN,Ne=vt(Ne=re.keys)&&Ne,Ie=te.max,Se=te.min,Ee=e.parseInt,Re=te.random,Ae={};Ae[$]=Xt,Ae[T]=Yt,Ae[F]=Zt,Ae[B]=ne,Ae[q]=re,Ae[W]=ee,Ae[z]=ue,Ae[P]=oe,Q.prototype=J.prototype;var De=J.support={};De.funcDecomp=!vt(e.a)&&E.test(s),De.funcNames=typeof ne.name=="string",J.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N,variable:"",imports:{_:J}},ke||(nt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t; -var r=new n;n.prototype=null}return r||e.Object()}}());var $e=je?function(n,t){M.value=t,je(n,"__bindData__",M)}:Ht,Te=xe||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==$||false},Fe=Ne?function(n){return wt(n)?Ne(n):[]}:H,Be={"&":"&","<":"<",">":">",'"':""","'":"'"},We=_t(Be),qe=ue("("+Fe(We).join("|")+")","g"),ze=ue("["+Fe(Be).join("")+"]","g"),Pe=ye?function(n){if(!n||ce.call(n)!=q)return false;var t=n.valueOf,e=vt(t)&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:ht(n) -}:ht,Ke=lt(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Le=lt(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)}),Me=lt(function(n,t,e){n[e]=t}),Ve=Rt,Ue=vt(Ue=Zt.now)&&Ue||function(){return(new Zt).getTime()},Ge=8==Ee(d+"08")?Ee:function(n,t){return Ee(kt(n)?n.replace(I,""):n,t||0)};return J.after=function(n,t){if(!dt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},J.assign=U,J.at=function(n){for(var t=arguments,e=-1,r=ut(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e=b&&o(r?e[r]:s)))}var p=e[0],h=-1,g=p?p.length:0,y=[];n:for(;++h(m?t(m,v):f(s,v))){for(r=u,(m||s).push(v);--r;)if(m=i[r],0>(m?t(m,v):f(e[r],v)))continue n;y.push(v)}}for(;u--;)(m=i[u])&&c(m);return l(i),l(s),y},J.invert=_t,J.invoke=function(n,t){var e=p(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,i=Xt(typeof o=="number"?o:0);return St(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},J.keys=Fe,J.map=Rt,J.mapValues=function(n,t,e){var r={}; -return t=J.createCallback(t,e,3),h(n,function(n,e,u){r[e]=t(n,e,u)}),r},J.max=At,J.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!dt(n))throw new ie;return e.cache={},e},J.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3e?Ie(0,r+e):Se(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},J.mixin=Gt,J.noConflict=function(){return e._=le,this},J.noop=Ht,J.now=Ue,J.parseInt=Ge,J.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Re(),Se(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):at(n,t) -},J.reduce=Dt,J.reduceRight=$t,J.result=function(n,t){if(n){var e=n[t];return dt(e)?n[t]():e}},J.runInContext=s,J.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:Fe(n).length},J.some=Ft,J.sortedIndex=zt,J.template=function(n,t,e){var r=J.templateSettings;n=oe(n||""),e=_({},e,r);var u,o=_({},e.imports,r.imports),r=Fe(o),o=xt(o),a=0,f=e.interpolate||S,l="__p+='",f=ue((e.escape||S).source+"|"+f.source+"|"+(f===N?x:S).source+"|"+(e.evaluate||S).source+"|$","g");n.replace(f,function(t,e,r,o,f,c){return r||(r=o),l+=n.slice(a,c).replace(R,i),e&&(l+="'+__e("+e+")+'"),f&&(u=true,l+="';"+f+";\n__p+='"),r&&(l+="'+((__t=("+r+"))==null?'':__t)+'"),a=c+t.length,t -}),l+="';",f=e=e.variable,f||(e="obj",l="with("+e+"){"+l+"}"),l=(u?l.replace(w,""):l).replace(j,"$1").replace(k,"$1;"),l="function("+e+"){"+(f?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}";try{var c=ne(r,"return "+l).apply(v,o)}catch(p){throw p.source=l,p}return t?c(t):(c.source=l,c)},J.unescape=function(n){return null==n?"":oe(n).replace(qe,gt)},J.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t -},J.all=Ot,J.any=Ft,J.detect=It,J.findWhere=It,J.foldl=Dt,J.foldr=$t,J.include=Ct,J.inject=Dt,Gt(function(){var n={};return h(J,function(t,e){J.prototype[e]||(n[e]=t)}),n}(),false),J.first=Bt,J.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:v;return p(n,Ie(0,u-r))},J.sample=function(n,t,e){return n&&typeof n.length!="number"&&(n=xt(n)),null==t||e?n?n[at(0,n.length-1)]:v:(n=Tt(n),n.length=Se(Ie(0,t),n.length),n) -},J.take=Bt,J.head=Bt,h(J,function(n,t){var e="sample"!==t;J.prototype[t]||(J.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new Q(o,u):o})}),J.VERSION="2.4.1",J.prototype.chain=function(){return this.__chain__=true,this},J.prototype.toString=function(){return oe(this.__wrapped__)},J.prototype.value=Qt,J.prototype.valueOf=Qt,St(["join","pop","shift"],function(n){var t=ae[n];J.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments); -return n?new Q(e,n):e}}),St(["push","reverse","sort","unshift"],function(n){var t=ae[n];J.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),St(["concat","slice","splice"],function(n){var t=ae[n];J.prototype[n]=function(){return new Q(t.apply(this.__wrapped__,arguments),this.__chain__)}}),J}var v,h=[],g=[],y=0,m=+new Date+"",b=75,_=40,d=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,N=/<%=([\s\S]+?)%>/g,I=RegExp("^["+d+"]*0+(?=.$)"),S=/($^)/,E=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,A="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),D="[object Arguments]",$="[object Array]",T="[object Boolean]",F="[object Date]",B="[object Function]",W="[object Number]",q="[object Object]",z="[object RegExp]",P="[object String]",K={}; -K[B]=false,K[D]=K[$]=K[T]=K[F]=K[W]=K[q]=K[z]=K[P]=true;var L={leading:false,maxWait:0,trailing:false},M={configurable:false,enumerable:false,value:null,writable:false},V={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},U={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X); -var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G._=Y, define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this); \ No newline at end of file +;(function(){function n(n,r,t){for(var e=(t||0)-1,u=n?n.length:0;++e-1?0:-1:r?0:-1}function t(n){var r=this.cache,t=typeof n;if("boolean"==t||null==n)r[n]=!0;else{"number"!=t&&"string"!=t&&(t="object");var e="number"==t?n:m+n,u=r[t]||(r[t]={});"object"==t?(u[e]||(u[e]=[])).push(n):u[e]=!0; + +}}function e(n){return n.charCodeAt(0)}function u(n,r){for(var t=n.criteria,e=r.criteria,u=-1,o=t.length;++ui||"undefined"==typeof a)return 1;if(a=b&&a===n,l=[]; + +if(f){var p=o(e);p?(a=r,e=p):f=!1}for(;++u-1:v});return u.pop(),o.pop(),_&&(l(u),l(o)),a}function tn(n,r,t,e,u){(Yt(r)?Xn:fe)(r,function(r,o){ +var a,i,f=r,l=n[o];if(r&&((i=Yt(r))||le(r))){for(var c=e.length;c--;)if(a=e[c]==r){l=u[c];break}if(!a){var p;t&&(f=t(l,r),(p="undefined"!=typeof f)&&(l=f)),p||(l=i?Yt(l)?l:[]:le(l)?l:{}),e.push(r),u.push(l),p||tn(l,r,t,e,u)}}else t&&(f=t(l,r),"undefined"==typeof f&&(f=r)),"undefined"!=typeof f&&(l=f);n[o]=l})}function en(n,r){return n+St(Ht()*(r-n+1))}function un(t,e,u){var a=-1,f=ln(),p=t?t.length:0,s=[],v=!e&&p>=b&&f===n,h=u||v?i():s;if(v){var g=o(h);f=r,h=g}for(;++a3&&"function"==typeof r[t-2])var e=Q(r[--t-1],r[t--],2);else t>2&&"function"==typeof r[t-1]&&(e=r[--t]);for(var u=p(arguments,1,t),o=-1,a=i(),f=i();++o-1:"number"==typeof o?a=(Fn(n)?n.indexOf(r,t):u(n,r,t))>-1:fe(n,function(n){return++eo&&(o=f)}else r=null==r&&Fn(n)?e:h.createCallback(r,t,3),Xn(n,function(n,t,e){var a=r(n,t,e);a>u&&(u=a,o=n)});return o; + +}function tr(n,r,t){var u=1/0,o=u;if("function"!=typeof r&&t&&t[r]===n&&(r=null),null==r&&Yt(n))for(var a=-1,i=n.length;++a=b&&o(e?t[e]:s)))}var h=t[0],g=-1,y=h?h.length:0,m=[];n:for(;++g>>1;t(n[a])1?arguments:arguments[0],r=-1,t=n?rr(ve(n,"length")):0,e=ht(t<0?0:t);++r2?an(n,17,p(arguments,2),null,r):an(n,1,null,null,r)}function Fr(n){for(var r=arguments.length>1?nn(arguments,!0,!1,1):wn(n),t=-1,e=r.length;++t2?an(r,19,p(arguments,2),null,n):an(r,3,null,null,n); + +}function Wr(){for(var n=arguments,r=n.length;r--;)if(!In(n[r]))throw new kt;return function(){for(var r=arguments,t=n.length;t--;)r=[n[t].apply(this,r)];return r[0]}}function qr(n,r){return r="number"==typeof r?r:+r||n.length,an(n,4,null,null,null,r)}function zr(n,r,t){var e,u,o,a,i,f,l,c=0,p=!1,s=!0;if(!In(n))throw new kt;if(r=Mt(0,r)||0,t===!0){var h=!0;s=!1}else Sn(t)&&(h=t.leading,p="maxWait"in t&&(Mt(r,t.maxWait)||0),s="trailing"in t?t.trailing:s);var g=function(){var t=r-(ge()-a);if(t>0)f=Ft(g,t); +else{u&&It(u);var p=l;u=f=l=v,p&&(c=ge(),o=n.apply(i,e),f||u||(e=i=null))}},y=function(){f&&It(f),u=f=l=v,(s||p!==r)&&(c=ge(),o=n.apply(i,e),f||u||(e=i=null))};return function(){if(e=arguments,a=ge(),i=this,l=s&&(f||!h),p===!1)var t=h&&!f;else{u||h||(c=a);var v=p-(a-c),m=v<=0;m?(u&&(u=It(u)),c=a,o=n.apply(i,e)):u||(u=Ft(y,v))}return m&&f?f=It(f):f||r===p||(f=Ft(g,r)),t&&(m=!0,o=n.apply(i,e)),!m||f||u||(e=i=null),o}}function Lr(n){if(!In(n))throw new kt;var r=p(arguments,1);return Ft(function(){n.apply(v,r); + +},1)}function Pr(n,r){if(!In(n))throw new kt;var t=p(arguments,2);return Ft(function(){n.apply(v,t)},r)}function Kr(n,r){if(!In(n))throw new kt;var t=function(){var e=t.cache,u=r?r.apply(this,arguments):m+arguments[0];return Tt.call(e,u)?e[u]:e[u]=n.apply(this,arguments)};return t.cache={},t}function Ur(n){var r,t;if(!In(n))throw new kt;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}}function Mr(n){return an(n,16,p(arguments,1))}function Vr(n){return an(n,32,null,p(arguments,1)); + +}function Gr(n,r,t){var e=!0,u=!0;if(!In(n))throw new kt;return t===!1?e=!1:Sn(t)&&(e="leading"in t?t.leading:e,u="trailing"in t?t.trailing:u),U.leading=e,U.maxWait=r,U.trailing=u,zr(n,r,U)}function Hr(n,r){return an(r,16,[n])}function Jr(n){return function(){return n}}function Qr(n,r,t){var e=typeof n;if(null==n||"function"==e)return Q(n,r,t);if("object"!=e)return tt(n);var u=ne(n),o=u[0],a=n[o];return 1!=u.length||a!==a||Sn(a)?function(r){for(var t=u.length,e=!1;t--&&(e=rn(r[u[t]],n[u[t]],null,!0));); +return e}:function(n){var r=n[o];return a===r&&(0!==a||1/a==1/r)}}function Xr(n){return null==n?"":jt(n).replace(ue,fn)}function Yr(n){return n}function Zr(n,r,t){var e=!0,u=r&&wn(r);r&&(t||u.length)||(null==t&&(t=r),o=g,r=n,n=h,u=wn(r)),t===!1?e=!1:Sn(t)&&"chain"in t&&(e=t.chain);var o=n,a=In(o);Xn(u,function(t){var u=n[t]=r[t];a&&(o.prototype[t]=function(){var r=this.__chain__,t=this.__wrapped__,a=[t];$t.apply(a,arguments);var i=u.apply(n,a);if(e||r){if(t===i&&Sn(i))return this;i=new o(i),i.__chain__=r; + +}return i})})}function nt(){return t._=Ot,this}function rt(){}function tt(n){return function(r){return r[n]}}function et(n,r,t){var e=null==n,u=null==r;if(null==t&&("boolean"==typeof n&&u?(t=n,n=1):u||"boolean"!=typeof r||(t=r,u=!0)),e&&u&&(r=1),n=+n||0,u?(r=n,n=0):r=+r||0,t||n%1||r%1){var o=Ht();return Vt(n+o*(r-n+parseFloat("1e-"+((o+"").length-1))),r)}return en(n,r)}function ut(n,r){if(n){var t=n[r];return In(t)?n[r]():t}}function ot(n,r,t){var e=h.templateSettings;n=jt(n||""),t=ae({},t,e);var u,o=ae({},t.imports,e.imports),i=ne(o),f=Un(o),l=0,c=t.interpolate||E,p="__p += '",s=wt((t.escape||E).source+"|"+c.source+"|"+(c===N?x:E).source+"|"+(t.evaluate||E).source+"|$","g"); + +n.replace(s,function(r,t,e,o,i,f){return e||(e=o),p+=n.slice(l,f).replace(S,a),t&&(p+="' +\n__e("+t+") +\n'"),i&&(u=!0,p+="';\n"+i+";\n__p += '"),e&&(p+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),l=f+r.length,r}),p+="';\n";var g=t.variable,y=g;y||(g="obj",p="with ("+g+") {\n"+p+"\n}\n"),p=(u?p.replace(w,""):p).replace(j,"$1").replace(k,"$1;"),p="function("+g+") {\n"+(y?"":g+" || ("+g+" = {});\n")+"var __t, __p = '', __e = _.escape"+(u?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+p+"return __p\n}"; + +var m="\n/*\n//# sourceURL="+(t.sourceURL||"/lodash/template/source["+D++ +"]")+"\n*/";try{var b=mt(i,"return "+p+m).apply(v,f)}catch(_){throw _.source=p,_}return r?b(r):(b.source=p,b)}function at(n,r,t){n=(n=+n)>-1?n:0;var e=-1,u=ht(n);for(r=Q(r,t,1);++e/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N, +variable:"",imports:{_:h}},zt||(J=function(){function n(){}return function(r){if(Sn(r)){n.prototype=r;var e=new n;n.prototype=null}return e||t.Object()}}());var Xt=qt?function(n,r){M.value=r,qt(n,"__bindData__",M),M.value=null}:rt,Yt=Lt||function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&Nt.call(n)==$||!1},Zt=function(n){var r,t=n,e=[];if(!t)return e;if(!V[typeof n])return e;for(r in t)Tt.call(t,r)&&e.push(r);return e},ne=Ut?function(n){return Sn(n)?Ut(n):[]}:Zt,re={"&":"&", +"<":"<",">":">",'"':""","'":"'"},te=kn(re),ee=wt("("+ne(te).join("|")+")","g"),ue=wt("["+ne(re).join("")+"]","g"),oe=function(n,r,t){var e,u=n,o=u;if(!u)return o;var a=arguments,i=0,f="number"==typeof t?2:a.length;if(f>3&&"function"==typeof a[f-2])var l=Q(a[--f-1],a[f--],2);else f>2&&"function"==typeof a[f-1]&&(l=a[--f]);for(;++i/g,R=RegExp("^["+d+"]*0+(?=.$)"),E=/($^)/,I=/\bthis\b/,S=/['\n\r\t\u2028\u2029\\]/g,A=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],D=0,T="[object Arguments]",$="[object Array]",F="[object Boolean]",B="[object Date]",W="[object Function]",q="[object Number]",z="[object Object]",L="[object RegExp]",P="[object String]",K={}; + +K[W]=!1,K[T]=K[$]=K[F]=K[B]=K[q]=K[z]=K[L]=K[P]=!0;var U={leading:!1,maxWait:0,trailing:!1},M={configurable:!1,enumerable:!1,value:null,writable:!1},V={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},G={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},H=V[typeof window]&&window||this,J=V[typeof exports]&&exports&&!exports.nodeType&&exports,Q=V[typeof module]&&module&&!module.nodeType&&module,X=Q&&Q.exports===J&&J,Y=V[typeof global]&&global;!Y||Y.global!==Y&&Y.window!==Y||(H=Y); + +var Z=s();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(H._=Z,define(function(){return Z})):J&&Q?X?(Q.exports=Z)._=Z:J._=Z:H._=Z}).call(this); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.js index 0c84471..6557daf 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.js @@ -1,11 +1,11 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) + * Lo-Dash 2.4.2 (Custom Build) * Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -4458,7 +4458,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -4909,7 +4909,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.min.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.min.js index e659124..19c4ce6 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.min.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/dist/lodash.underscore.min.js @@ -1,6 +1,6 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE + * Lo-Dash 2.4.2 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js` */ ;(function(){function n(n,r,t){t=(t||0)-1;for(var e=n?n.length:0;++tf||typeof i=="undefined")return 1;if(it?0:t);++et?Mr(0,e+t):$r(t,e-1))+1);e--;)if(n[e]===r)return e; return-1},u.mixin=Z,u.noConflict=function(){return mr._=Tr,this},u.random=function(n,r){return null==n&&null==r&&(r=1),n=+n||0,null==r?(r=n,n=0):r=+r||0,n+Sr(Wr()*(r-n+1))},u.reduce=W,u.reduceRight=z,u.result=function(n,r){if(n){var t=n[r];return A(t)?n[r]():t}},u.size=function(n){var r=n?n.length:0;return typeof r=="number"?r:Ur(n).length},u.some=P,u.sortedIndex=J,u.template=function(n,r,e){var o=u,i=o.templateSettings;n=(n||"")+"",e=j({},e,i);var f=0,a="__p+='",i=e.variable;n.replace(RegExp((e.escape||or).source+"|"+(e.interpolate||or).source+"|"+(e.evaluate||or).source+"|$","g"),function(r,e,u,o,i){return a+=n.slice(f,i).replace(ir,t),e&&(a+="'+_.escape("+e+")+'"),o&&(a+="';"+o+";\n__p+='"),u&&(a+="'+((__t=("+u+"))==null?'':__t)+'"),f=i+r.length,r }),a+="';",i||(i="obj",a="with("+i+"||{}){"+a+"}"),a="function("+i+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+a+"return __p}";try{var l=Function("_","return "+a)(o)}catch(c){throw c.source=a,c}return r?l(r):(l.source=a,l)},u.unescape=function(n){return null==n?"":(n+"").replace(Hr,d)},u.uniqueId=function(n){var r=++tr+"";return n?n+r:r},u.all=B,u.any=P,u.detect=q,u.findWhere=function(n,r){return U(n,r,true)},u.foldl=W,u.foldr=z,u.include=k,u.inject=W,u.first=V,u.last=function(n,r,t){var u=0,o=n?n.length:0; -if(typeof r!="number"&&null!=r){var i=o;for(r=X(r,t,3);i--&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[o-1]:rr;return e(n,Mr(0,o-u))},u.sample=function(n,r,t){return n&&typeof n.length!="number"&&(n=R(n)),null==r||t?n?n[0+Sr(Wr()*(n.length-1-0+1))]:rr:(n=C(n),n.length=$r(Mr(0,r),n.length),n)},u.take=V,u.head=V,Z(u),u.VERSION="2.4.1",u.prototype.chain=function(){return this.__chain__=true,this},u.prototype.value=function(){return this.__wrapped__},D("pop push reverse shift sort splice unshift".split(" "),function(n){var r=jr[n]; +if(typeof r!="number"&&null!=r){var i=o;for(r=X(r,t,3);i--&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[o-1]:rr;return e(n,Mr(0,o-u))},u.sample=function(n,r,t){return n&&typeof n.length!="number"&&(n=R(n)),null==r||t?n?n[0+Sr(Wr()*(n.length-1-0+1))]:rr:(n=C(n),n.length=$r(Mr(0,r),n.length),n)},u.take=V,u.head=V,Z(u),u.VERSION="2.4.2",u.prototype.chain=function(){return this.__chain__=true,this},u.prototype.value=function(){return this.__wrapped__},D("pop push reverse shift sort splice unshift".split(" "),function(n){var r=jr[n]; u.prototype[n]=function(){var n=this.__wrapped__;return r.apply(n,arguments),zr.spliceObjects||0!==n.length||delete n[0],this}}),D(["concat","join","slice"],function(n){var r=jr[n];u.prototype[n]=function(){var n=r.apply(this.__wrapped__,arguments);return this.__chain__&&(n=new o(n),n.__chain__=true),n}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(mr._=u, define(function(){return u})):_r&&dr?br?(dr.exports=u)._=u:_r._=u:mr._=u}).call(this); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/lodash.js b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/lodash.js index 5b37903..5013f5c 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/lodash.js +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/lodash.js @@ -1,10 +1,10 @@ /** * @license - * Lo-Dash 2.4.1 + * Lo-Dash 2.4.2 * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -1835,6 +1835,7 @@ var setBindData = !defineProperty ? noop : function(func, value) { descriptor.value = value; defineProperty(func, '__bindData__', descriptor); + descriptor.value = null; }; /** @@ -6506,7 +6507,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -7075,7 +7076,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/package.json b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/package.json index 5eaef06..e4c0b2e 100644 --- a/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/package.json +++ b/node_modules/grunt/node_modules/findup-sync/node_modules/lodash/package.json @@ -1,6 +1,6 @@ { "name": "lodash", - "version": "2.4.1", + "version": "2.4.2", "description": "A utility library delivering consistency, customization, performance, & extras.", "homepage": "http://lodash.com/", "license": "MIT", @@ -46,7 +46,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/lodash/lodash.git" + "url": "git+https://github.com/lodash/lodash.git" }, "engines": [ "node", @@ -95,8 +95,43 @@ "vendor" ] }, - "readme": "# Lo-Dash v2.4.1\nA utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features).\n\n## Download\n\nCheck out our [wiki]([https://github.com/lodash/lodash/wiki/build-differences]) for details over the differences between builds.\n\n* Modern builds perfect for newer browsers/environments:
\n[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.js) &\n[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.min.js)\n\n* Compatibility builds for older environment support too:
\n[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.js) &\n[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.min.js)\n\n* Underscore builds to use as a drop-in replacement:
\n[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js) &\n[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.min.js)\n\nCDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](http://lodash.com/custom-builds) with only the features needed.\n\nLove modules? We’ve got you covered with [lodash-amd](https://npmjs.org/package/lodash-amd), [lodash-es6](https://github.com/lodash/lodash-es6), [lodash-node](https://npmjs.org/package/lodash-node), & [npm packages](https://npmjs.org/browse/keyword/lodash-modularized) per method.\n\n## Dive in\n\nThere’s plenty of **[documentation](http://lodash.com/docs)**, [unit tests](http://lodash.com/tests), & [benchmarks](http://lodash.com/benchmarks).
\nCheck out DevDocs as a fast, organized, & searchable interface for our documentation.\n\nThe full changelog for this release is available on our [wiki](https://github.com/lodash/lodash/wiki/Changelog).
\nA list of upcoming features is available on our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap).\n\n## Features *not* in Underscore\n\n * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.)\n * [_(…)](http://lodash.com/docs#_) supports intuitive chaining\n * [_.at](http://lodash.com/docs#at) for cherry-picking collection values\n * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods\n * [_.clone](http://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects\n * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays & objects\n * [_.constant](http://lodash.com/docs#constant) & [_.property](http://lodash.com/docs#property) function generators for composing functions\n * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex`\n * [_.create](http://lodash.com/docs#create) for easier object inheritance\n * [_.createCallback](http://lodash.com/docs#createCallback) for extending callbacks in methods & mixins\n * [_.curry](http://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions\n * [_.debounce](http://lodash.com/docs#debounce) & [_.throttle](http://lodash.com/docs#throttle) accept additional `options` for more control\n * [_.findIndex](http://lodash.com/docs#findIndex) & [_.findKey](http://lodash.com/docs#findKey) for finding indexes & keys\n * [_.forEach](http://lodash.com/docs#forEach) is chainable & supports exiting early\n * [_.forIn](http://lodash.com/docs#forIn) for iterating own & inherited properties\n * [_.forOwn](http://lodash.com/docs#forOwn) for iterating own properties\n * [_.isPlainObject](http://lodash.com/docs#isPlainObject) for checking if values are created by `Object`\n * [_.mapValues](http://lodash.com/docs#mapValues) for [mapping](http://lodash.com/docs#map) values to an object\n * [_.memoize](http://lodash.com/docs#memoize) exposes the `cache` of memoized functions\n * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend)\n * [_.noop](http://lodash.com/docs#noop) for function placeholders\n * [_.now](http://lodash.com/docs#now) as a cross-browser `Date.now` alternative\n * [_.parseInt](http://lodash.com/docs#parseInt) for consistent behavior\n * [_.pull](http://lodash.com/docs#pull) & [_.remove](http://lodash.com/docs#remove) for mutating arrays\n * [_.random](http://lodash.com/docs#random) supports returning floating-point numbers\n * [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking\n * [_.sortBy](http://lodash.com/docs#sortBy) supports sorting by multiple properties\n * [_.support](http://lodash.com/docs#support) for flagging environment features\n * [_.template](http://lodash.com/docs#template) supports [*“imports”*](http://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals)\n * [_.transform](http://lodash.com/docs#transform) as a powerful alternative to [_.reduce](http://lodash.com/docs#reduce) for transforming objects\n * [_.where](http://lodash.com/docs#where) supports deep object comparisons\n * [_.xor](http://lodash.com/docs#xor) as a companion to [_.difference](http://lodash.com/docs#difference), [_.intersection](http://lodash.com/docs#intersection), & [_.union](http://lodash.com/docs#union)\n * [_.zip](http://lodash.com/docs#zip) is capable of unzipping values\n * [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), &\n [more](http://lodash.com/docs \"_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest\") accept callbacks\n * [_.contains](http://lodash.com/docs#contains), [_.toArray](http://lodash.com/docs#toArray), &\n [more](http://lodash.com/docs \"_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where\") accept strings\n * [_.filter](http://lodash.com/docs#filter), [_.map](http://lodash.com/docs#map), &\n [more](http://lodash.com/docs \"_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq\") support *“_.pluck”* & *“_.where”* shorthands\n * [_.findLast](http://lodash.com/docs#findLast), [_.findLastIndex](http://lodash.com/docs#findLastIndex), &\n [more](http://lodash.com/docs \"_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight\") right-associative methods\n\n## Resources\n\n * Podcasts\n - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/)\n\n * Posts\n - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/)\n - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/)\n\n * Videos\n - [Introduction](https://vimeo.com/44154599)\n - [Origins](https://vimeo.com/44154600)\n - [Optimizations & builds](https://vimeo.com/44154601)\n - [Native method use](https://vimeo.com/48576012)\n - [Testing](https://vimeo.com/45865290)\n - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk)\n\n A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources).\n\n## Support\n\nTested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25~17, Safari 3-7, Node.js 0.6.21~0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5.
\nAutomated browser test results [are available](https://saucelabs.com/u/lodash) as well as [Travis CI](https://travis-ci.org/) builds for [lodash](https://travis-ci.org/lodash/lodash/), [lodash-cli](https://travis-ci.org/lodash/lodash-cli/), [lodash-amd](https://travis-ci.org/lodash/lodash-amd/), [lodash-node](https://travis-ci.org/lodash/lodash-node/), & [grunt-lodash](https://travis-ci.org/lodash/grunt-lodash).\n\nSpecial thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.
\n[![Sauce Labs](http://lodash.com/_img/sauce.png)](https://saucelabs.com/ \"Sauce Labs: Selenium Testing & More\")\n\n## Installation & usage\n\nIn browsers:\n\n```html\n\n```\n\nUsing [`npm`](http://npmjs.org/):\n\n```bash\nnpm i --save lodash\n\n{sudo} npm i -g lodash\nnpm ln lodash\n```\n\nIn [Node.js](http://nodejs.org/) & [Ringo](http://ringojs.org/):\n\n```js\nvar _ = require('lodash');\n// or as Underscore\nvar _ = require('lodash/dist/lodash.underscore');\n```\n\n**Notes:**\n * Don’t assign values to [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL\n * If Lo-Dash is installed globally, run [`npm ln lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory *before* requiring it\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('lodash.js');\n```\n\nIn an AMD loader:\n\n```js\nrequire({\n 'packages': [\n { 'name': 'lodash', 'location': 'path/to/lodash', 'main': 'lodash' }\n ]\n},\n['lodash'], function(_) {\n console.log(_.VERSION);\n});\n```\n\n## Author\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## Contributors\n\n| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz \"Follow @BlaineBublitz on Twitter\") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge \"Follow @kitcambridge on Twitter\") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|---|---|\n| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) |\n\n[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lodash/lodash/trend.png)](https://bitdeli.com/free \"Bitdeli Badge\")\n", - "readmeFilename": "README.md", - "_id": "lodash@2.4.1", - "_from": "lodash@~2.4.1" + "_id": "lodash@2.4.2", + "scripts": {}, + "_shasum": "fadd834b9683073da179b3eae6d9c0d15053f73e", + "_from": "lodash@>=2.4.1 <2.5.0", + "_npmVersion": "2.7.5", + "_nodeVersion": "0.12.2", + "_npmUser": { + "name": "jdalton", + "email": "john.david.dalton@gmail.com" + }, + "maintainers": [ + { + "name": "jdalton", + "email": "john.david.dalton@gmail.com" + }, + { + "name": "mathias", + "email": "mathias@qiwi.be" + }, + { + "name": "phated", + "email": "blaine@iceddev.com" + }, + { + "name": "kitcambridge", + "email": "github@kitcambridge.be" + }, + { + "name": "d10", + "email": "demoneaux@gmail.com" + } + ], + "dist": { + "shasum": "fadd834b9683073da179b3eae6d9c0d15053f73e", + "tarball": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/findup-sync/package.json b/node_modules/grunt/node_modules/findup-sync/package.json index 7664633..615dd8f 100644 --- a/node_modules/grunt/node_modules/findup-sync/package.json +++ b/node_modules/grunt/node_modules/findup-sync/package.json @@ -41,8 +41,25 @@ "glob", "file" ], - "readme": "# findup-sync [![Build Status](https://secure.travis-ci.org/cowboy/node-findup-sync.png?branch=master)](http://travis-ci.org/cowboy/node-findup-sync)\n\nFind the first file matching a given pattern in the current directory or the nearest ancestor directory.\n\n## Getting Started\nInstall the module with: `npm install findup-sync`\n\n```js\nvar findup = require('findup-sync');\n\n// Start looking in the CWD.\nvar filepath1 = findup('{a,b}*.txt');\n\n// Start looking somewhere else, and ignore case (probably a good idea).\nvar filepath2 = findup('{a,b}*.txt', {cwd: '/some/path', nocase: true});\n```\n\n## Usage\n\n```js\nfindup(patternOrPatterns [, minimatchOptions])\n```\n\n### patternOrPatterns\nType: `String` or `Array` \nDefault: none\n\nOne or more wildcard glob patterns. Or just filenames.\n\n### minimatchOptions\nType: `Object` \nDefault: `{}`\n\nOptions to be passed to [minimatch](https://github.com/isaacs/minimatch).\n\nNote that if you want to start in a different directory than the current working directory, specify a `cwd` property here.\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n2014-03-14 - v0.1.3 - Updated dependencies. \n2013-03-08 - v0.1.2 - Updated dependencies. Fixed a Node 0.9.x bug. Updated unit tests to work cross-platform. \n2012-11-15 - v0.1.1 - Now works without an options object. \n2012-11-01 - v0.1.0 - Initial release.\n", - "readmeFilename": "README.md", "_id": "findup-sync@0.1.3", - "_from": "findup-sync@~0.1.2" + "dist": { + "shasum": "7f3e7a97b82392c653bf06589bd85190e93c3683", + "tarball": "http://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz" + }, + "_from": "findup-sync@>=0.1.2 <0.2.0", + "_npmVersion": "1.4.4", + "_npmUser": { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + "maintainers": [ + { + "name": "cowboy", + "email": "cowboy@rj3.net" + } + ], + "directories": {}, + "_shasum": "7f3e7a97b82392c653bf06589bd85190e93c3683", + "_resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/getobject/package.json b/node_modules/grunt/node_modules/getobject/package.json index b62bea6..262f75b 100644 --- a/node_modules/grunt/node_modules/getobject/package.json +++ b/node_modules/grunt/node_modules/getobject/package.json @@ -44,5 +44,23 @@ "readme": "# getobject [![Build Status](https://secure.travis-ci.org/cowboy/node-getobject.png?branch=master)](http://travis-ci.org/cowboy/node-getobject)\n\nget.and.set.deep.objects.easily = true;\n\n## Getting Started\nInstall the module with: `npm install getobject`\n\n```javascript\nvar getobject = require('getobject');\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [Grunt](http://gruntjs.com/).\n\n## Release History\n_(Nothing yet)_\n\n## License\nCopyright (c) 2013 \"Cowboy\" Ben Alman\nLicensed under the MIT license.", "readmeFilename": "README.md", "_id": "getobject@0.1.0", - "_from": "getobject@~0.1.0" + "dist": { + "shasum": "047a449789fa160d018f5486ed91320b6ec7885c", + "tarball": "http://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + }, + "_from": "getobject@>=0.1.0 <0.2.0", + "_npmVersion": "1.3.11", + "_npmUser": { + "name": "tkellen", + "email": "tyler@sleekcode.net" + }, + "maintainers": [ + { + "name": "tkellen", + "email": "tyler@sleekcode.net" + } + ], + "directories": {}, + "_shasum": "047a449789fa160d018f5486ed91320b6ec7885c", + "_resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" } diff --git a/node_modules/grunt/node_modules/glob/node_modules/graceful-fs/package.json b/node_modules/grunt/node_modules/glob/node_modules/graceful-fs/package.json index 05d8742..853fb1c 100644 --- a/node_modules/grunt/node_modules/glob/node_modules/graceful-fs/package.json +++ b/node_modules/grunt/node_modules/glob/node_modules/graceful-fs/package.json @@ -38,12 +38,28 @@ "EACCESS" ], "license": "BSD", - "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over fs module\n\ngraceful-fs:\n\n* keeps track of how many file descriptors are open, and by default\n limits this to 1024. Any further requests to open a file are put in a\n queue until new slots become available. If 1024 turns out to be too\n much, it decreases the limit further.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n\n## Configuration\n\nThe maximum number of open file descriptors that graceful-fs manages may\nbe adjusted by setting `fs.MAX_OPEN` to a different number. The default\nis 1024.\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/isaacs/node-graceful-fs/issues" }, - "homepage": "https://github.com/isaacs/node-graceful-fs", "_id": "graceful-fs@1.2.3", - "_from": "graceful-fs@~1.2.0" + "dist": { + "shasum": "15a4806a57547cb2d2dbf27f42e89a8c3451b364", + "tarball": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "_from": "graceful-fs@>=1.2.0 <1.3.0", + "_npmVersion": "1.3.2", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_shasum": "15a4806a57547cb2d2dbf27f42e89a8c3451b364", + "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/isaacs/node-graceful-fs" } diff --git a/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json b/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json index 1e78e5b..dd46ebc 100644 --- a/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json +++ b/node_modules/grunt/node_modules/glob/node_modules/inherits/package.json @@ -12,20 +12,35 @@ "main": "./inherits.js", "repository": { "type": "git", - "url": "https://github.com/isaacs/inherits" + "url": "git://github.com/isaacs/inherits.git" }, "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/" }, - "readme": "A dead simple way to do inheritance in JS.\n\n var inherits = require(\"inherits\")\n\n function Animal () {\n this.alive = true\n }\n Animal.prototype.say = function (what) {\n console.log(what)\n }\n\n inherits(Dog, Animal)\n function Dog () {\n Dog.super.apply(this)\n }\n Dog.prototype.sniff = function () {\n this.say(\"sniff sniff\")\n }\n Dog.prototype.bark = function () {\n this.say(\"woof woof\")\n }\n\n inherits(Chihuahua, Dog)\n function Chihuahua () {\n Chihuahua.super.apply(this)\n }\n Chihuahua.prototype.bark = function () {\n this.say(\"yip yip\")\n }\n\n // also works\n function Cat () {\n Cat.super.apply(this)\n }\n Cat.prototype.hiss = function () {\n this.say(\"CHSKKSS!!\")\n }\n inherits(Cat, Animal, {\n meow: function () { this.say(\"miao miao\") }\n })\n Cat.prototype.purr = function () {\n this.say(\"purr purr\")\n }\n\n\n var c = new Chihuahua\n assert(c instanceof Chihuahua)\n assert(c instanceof Dog)\n assert(c instanceof Animal)\n\nThe actual function is laughably small. 10-lines small.\n", - "readmeFilename": "README.md", + "dependencies": {}, + "devDependencies": {}, + "_id": "inherits@1.0.0", + "engines": { + "node": "*" + }, + "_engineSupported": true, + "_npmVersion": "1.0.1rc6", + "_nodeVersion": "v0.5.0-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "38e1975285bf1f7ba9c84da102bb12771322ac48", + "tarball": "http://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz" + }, + "directories": {}, + "_shasum": "38e1975285bf1f7ba9c84da102bb12771322ac48", + "_from": "inherits@>=1.0.0 <2.0.0", + "_resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.0.tgz", "bugs": { "url": "https://github.com/isaacs/inherits/issues" }, + "readme": "ERROR: No README data found!", "homepage": "https://github.com/isaacs/inherits", - "_id": "inherits@1.0.0", - "_from": "inherits@1", "scripts": {} } diff --git a/node_modules/grunt/node_modules/glob/package.json b/node_modules/grunt/node_modules/glob/package.json index fd3bd2e..a9f57b6 100644 --- a/node_modules/grunt/node_modules/glob/package.json +++ b/node_modules/grunt/node_modules/glob/package.json @@ -29,12 +29,29 @@ "test": "tap test/*.js" }, "license": "BSD", - "readme": "# Glob\n\nThis is a glob implementation in JavaScript. It uses the `minimatch`\nlibrary to do its matching.\n\n## Attention: node-glob users!\n\nThe API has changed dramatically between 2.x and 3.x. This library is\nnow 100% JavaScript, and the integer flags have been replaced with an\noptions object.\n\nAlso, there's an event emitter class, proper tests, and all the other\nthings you've come to expect from node modules.\n\nAnd best of all, no compilation!\n\n## Usage\n\n```javascript\nvar glob = require(\"glob\")\n\n// options is optional\nglob(\"**/*.js\", options, function (er, files) {\n // files is an array of filenames.\n // If the `nonull` option is set, and nothing\n // was found, then files is [\"**/*.js\"]\n // er is an error object or null.\n})\n```\n\n## Features\n\nPlease see the [minimatch\ndocumentation](https://github.com/isaacs/minimatch) for more details.\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n* [minimatch documentation](https://github.com/isaacs/minimatch)\n\n## glob(pattern, [options], cb)\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* `cb` {Function}\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nPerform an asynchronous glob search.\n\n## glob.sync(pattern, [options]\n\n* `pattern` {String} Pattern to be matched\n* `options` {Object}\n* return: {Array} filenames found matching the pattern\n\nPerform a synchronous glob search.\n\n## Class: glob.Glob\n\nCreate a Glob object by instanting the `glob.Glob` class.\n\n```javascript\nvar Glob = require(\"glob\").Glob\nvar mg = new Glob(pattern, options, cb)\n```\n\nIt's an EventEmitter, and starts walking the filesystem to find matches\nimmediately.\n\n### new glob.Glob(pattern, [options], [cb])\n\n* `pattern` {String} pattern to search for\n* `options` {Object}\n* `cb` {Function} Called when an error occurs, or matches are found\n * `err` {Error | null}\n * `matches` {Array} filenames found matching the pattern\n\nNote that if the `sync` flag is set in the options, then matches will\nbe immediately available on the `g.found` member.\n\n### Properties\n\n* `minimatch` The minimatch object that the glob uses.\n* `options` The options object passed in.\n* `error` The error encountered. When an error is encountered, the\n glob object is in an undefined state, and should be discarded.\n* `aborted` Boolean which is set to true when calling `abort()`. There\n is no way at this time to continue a glob search after aborting, but\n you can re-use the statCache to avoid having to duplicate syscalls.\n\n### Events\n\n* `end` When the matching is finished, this is emitted with all the\n matches found. If the `nonull` option is set, and no match was found,\n then the `matches` list contains the original pattern. The matches\n are sorted, unless the `nosort` flag is set.\n* `match` Every time a match is found, this is emitted with the matched.\n* `error` Emitted when an unexpected error is encountered, or whenever\n any fs error occurs if `options.strict` is set.\n* `abort` When `abort()` is called, this event is raised.\n\n### Methods\n\n* `abort` Stop the search.\n\n### Options\n\nAll the options that can be passed to Minimatch can also be passed to\nGlob to change pattern matching behavior. Also, some have been added,\nor have glob-specific ramifications.\n\nAll options are false by default, unless otherwise noted.\n\nAll options are added to the glob object, as well.\n\n* `cwd` The current working directory in which to search. Defaults\n to `process.cwd()`.\n* `root` The place where patterns starting with `/` will be mounted\n onto. Defaults to `path.resolve(options.cwd, \"/\")` (`/` on Unix\n systems, and `C:\\` or some such on Windows.)\n* `nomount` By default, a pattern starting with a forward-slash will be\n \"mounted\" onto the root setting, so that a valid filesystem path is\n returned. Set this flag to disable that behavior.\n* `mark` Add a `/` character to directory matches. Note that this\n requires additional stat calls.\n* `nosort` Don't sort the results.\n* `stat` Set to true to stat *all* results. This reduces performance\n somewhat, and is completely unnecessary, unless `readdir` is presumed\n to be an untrustworthy indicator of file existence. It will cause\n ELOOP to be triggered one level sooner in the case of cyclical\n symbolic links.\n* `silent` When an unusual error is encountered\n when attempting to read a directory, a warning will be printed to\n stderr. Set the `silent` option to true to suppress these warnings.\n* `strict` When an unusual error is encountered\n when attempting to read a directory, the process will just continue on\n in search of other matches. Set the `strict` option to raise an error\n in these cases.\n* `statCache` A cache of results of filesystem information, to prevent\n unnecessary stat calls. While it should not normally be necessary to\n set this, you may pass the statCache from one glob() call to the\n options object of another, if you know that the filesystem will not\n change between calls. (See \"Race Conditions\" below.)\n* `sync` Perform a synchronous glob search.\n* `nounique` In some cases, brace-expanded patterns can result in the\n same file showing up multiple times in the result set. By default,\n this implementation prevents duplicates in the result set.\n Set this flag to disable that behavior.\n* `nonull` Set to never return an empty set, instead returning a set\n containing the pattern itself. This is the default in glob(3).\n* `nocase` Perform a case-insensitive match. Note that case-insensitive\n filesystems will sometimes result in glob returning results that are\n case-insensitively matched anyway, since readdir and stat will not\n raise an error.\n* `debug` Set to enable debug logging in minimatch and glob.\n* `globDebug` Set to enable debug logging in glob, but not minimatch.\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between node-glob and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not. **Note that this is different from the way that `**` is\nhandled by ruby's `Dir` class.**\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen glob returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`glob.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n\n## Windows\n\n**Please only use forward-slashes in glob expressions.**\n\nThough windows uses either `/` or `\\` as its path separator, only `/`\ncharacters are used by this glob implementation. You must use\nforward-slashes **only** in glob expressions. Back-slashes will always\nbe interpreted as escape characters, not path separators.\n\nResults from absolute patterns such as `/foo/*` are mounted onto the\nroot setting using `path.join`. On windows, this will by default result\nin `/foo/*` matching `C:\\foo\\bar.txt`.\n\n## Race Conditions\n\nGlob searching, by its very nature, is susceptible to race conditions,\nsince it relies on directory walking and such.\n\nAs a result, it is possible that a file that exists when glob looks for\nit may have been deleted or modified by the time it returns the result.\n\nAs part of its internal implementation, this program caches all stat\nand readdir calls that it makes, in order to cut down on system\noverhead. However, this also makes it even more susceptible to races,\nespecially if the statCache object is reused between glob calls.\n\nUsers are thus advised not to use a glob result as a\nguarantee of filesystem state in the face of rapid changes.\nFor the vast majority of operations, this is never a problem.\n", - "readmeFilename": "README.md", + "_id": "glob@3.1.21", + "dist": { + "shasum": "d29e0a055dea5138f4d07ed40e8982e83c2066cd", + "tarball": "http://registry.npmjs.org/glob/-/glob-3.1.21.tgz" + }, + "_from": "glob@>=3.1.21 <3.2.0", + "_npmVersion": "1.2.12", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "d29e0a055dea5138f4d07ed40e8982e83c2066cd", + "_resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "bugs": { "url": "https://github.com/isaacs/node-glob/issues" }, - "homepage": "https://github.com/isaacs/node-glob", - "_id": "glob@3.1.21", - "_from": "glob@~3.1.21" + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/isaacs/node-glob" } diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/README.md b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/README.md index 6f9598e..86b0636 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/README.md +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/README.md @@ -1,105 +1,34 @@ -# Lo-Dash v2.4.1 -A utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features). +# Lo-Dash v2.4.2 +A utility library delivering consistency, [customization](https://lodash.com/custom-builds), [performance](https://lodash.com/benchmarks), & [extras](https://lodash.com/#features). ## Download Check out our [wiki]([https://github.com/lodash/lodash/wiki/build-differences]) for details over the differences between builds. * Modern builds perfect for newer browsers/environments:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.js) & -[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.min.js) +[Development](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.js) & +[Production](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.min.js) * Compatibility builds for older environment support too:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.js) & -[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.min.js) +[Development](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.compat.js) & +[Production](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.compat.min.js) * Underscore builds to use as a drop-in replacement:
-[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js) & -[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.min.js) +[Development](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.underscore.js) & +[Production](https://raw.github.com/lodash/lodash/2.4.2/dist/lodash.underscore.min.js) -CDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](http://lodash.com/custom-builds) with only the features needed. +CDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](https://lodash.com/custom-builds) with only the features needed. Love modules? We’ve got you covered with [lodash-amd](https://npmjs.org/package/lodash-amd), [lodash-es6](https://github.com/lodash/lodash-es6), [lodash-node](https://npmjs.org/package/lodash-node), & [npm packages](https://npmjs.org/browse/keyword/lodash-modularized) per method. ## Dive in -There’s plenty of **[documentation](http://lodash.com/docs)**, [unit tests](http://lodash.com/tests), & [benchmarks](http://lodash.com/benchmarks).
+There’s plenty of **[documentation](https://lodash.com/docs)**, [unit tests](https://lodash.com/tests), & [benchmarks](https://lodash.com/benchmarks).
Check out DevDocs as a fast, organized, & searchable interface for our documentation. The full changelog for this release is available on our [wiki](https://github.com/lodash/lodash/wiki/Changelog).
A list of upcoming features is available on our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap). -## Features *not* in Underscore - - * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.) - * [_(…)](http://lodash.com/docs#_) supports intuitive chaining - * [_.at](http://lodash.com/docs#at) for cherry-picking collection values - * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods - * [_.clone](http://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects - * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays & objects - * [_.constant](http://lodash.com/docs#constant) & [_.property](http://lodash.com/docs#property) function generators for composing functions - * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex` - * [_.create](http://lodash.com/docs#create) for easier object inheritance - * [_.createCallback](http://lodash.com/docs#createCallback) for extending callbacks in methods & mixins - * [_.curry](http://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions - * [_.debounce](http://lodash.com/docs#debounce) & [_.throttle](http://lodash.com/docs#throttle) accept additional `options` for more control - * [_.findIndex](http://lodash.com/docs#findIndex) & [_.findKey](http://lodash.com/docs#findKey) for finding indexes & keys - * [_.forEach](http://lodash.com/docs#forEach) is chainable & supports exiting early - * [_.forIn](http://lodash.com/docs#forIn) for iterating own & inherited properties - * [_.forOwn](http://lodash.com/docs#forOwn) for iterating own properties - * [_.isPlainObject](http://lodash.com/docs#isPlainObject) for checking if values are created by `Object` - * [_.mapValues](http://lodash.com/docs#mapValues) for [mapping](http://lodash.com/docs#map) values to an object - * [_.memoize](http://lodash.com/docs#memoize) exposes the `cache` of memoized functions - * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend) - * [_.noop](http://lodash.com/docs#noop) for function placeholders - * [_.now](http://lodash.com/docs#now) as a cross-browser `Date.now` alternative - * [_.parseInt](http://lodash.com/docs#parseInt) for consistent behavior - * [_.pull](http://lodash.com/docs#pull) & [_.remove](http://lodash.com/docs#remove) for mutating arrays - * [_.random](http://lodash.com/docs#random) supports returning floating-point numbers - * [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking - * [_.sortBy](http://lodash.com/docs#sortBy) supports sorting by multiple properties - * [_.support](http://lodash.com/docs#support) for flagging environment features - * [_.template](http://lodash.com/docs#template) supports [*“imports”*](http://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals) - * [_.transform](http://lodash.com/docs#transform) as a powerful alternative to [_.reduce](http://lodash.com/docs#reduce) for transforming objects - * [_.where](http://lodash.com/docs#where) supports deep object comparisons - * [_.xor](http://lodash.com/docs#xor) as a companion to [_.difference](http://lodash.com/docs#difference), [_.intersection](http://lodash.com/docs#intersection), & [_.union](http://lodash.com/docs#union) - * [_.zip](http://lodash.com/docs#zip) is capable of unzipping values - * [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), & - [more](http://lodash.com/docs "_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept callbacks - * [_.contains](http://lodash.com/docs#contains), [_.toArray](http://lodash.com/docs#toArray), & - [more](http://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where") accept strings - * [_.filter](http://lodash.com/docs#filter), [_.map](http://lodash.com/docs#map), & - [more](http://lodash.com/docs "_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* & *“_.where”* shorthands - * [_.findLast](http://lodash.com/docs#findLast), [_.findLastIndex](http://lodash.com/docs#findLastIndex), & - [more](http://lodash.com/docs "_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight") right-associative methods - -## Resources - - * Podcasts - - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/) - - * Posts - - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/) - - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/) - - * Videos - - [Introduction](https://vimeo.com/44154599) - - [Origins](https://vimeo.com/44154600) - - [Optimizations & builds](https://vimeo.com/44154601) - - [Native method use](https://vimeo.com/48576012) - - [Testing](https://vimeo.com/45865290) - - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk) - - A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources). - -## Support - -Tested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25~17, Safari 3-7, Node.js 0.6.21~0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5.
-Automated browser test results [are available](https://saucelabs.com/u/lodash) as well as [Travis CI](https://travis-ci.org/) builds for [lodash](https://travis-ci.org/lodash/lodash/), [lodash-cli](https://travis-ci.org/lodash/lodash-cli/), [lodash-amd](https://travis-ci.org/lodash/lodash-amd/), [lodash-node](https://travis-ci.org/lodash/lodash-node/), & [grunt-lodash](https://travis-ci.org/lodash/grunt-lodash). - -Special thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.
-[![Sauce Labs](http://lodash.com/_img/sauce.png)](https://saucelabs.com/ "Sauce Labs: Selenium Testing & More") - ## Installation & usage In browsers: @@ -148,16 +77,69 @@ require({ }); ``` -## Author +## Resources -| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter") | -|---| -| [John-David Dalton](http://allyoucanleet.com/) | + * Podcasts + - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/) -## Contributors + * Posts + - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/) + - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/) -| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz "Follow @BlaineBublitz on Twitter") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---|---|---| -| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) | + * Videos + - [Introduction](https://vimeo.com/44154599) + - [Origins](https://vimeo.com/44154600) + - [Optimizations & builds](https://vimeo.com/44154601) + - [Native method use](https://vimeo.com/48576012) + - [Testing](https://vimeo.com/45865290) + - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk) -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lodash/lodash/trend.png)](https://bitdeli.com/free "Bitdeli Badge") + A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources). + +## Features + + * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.) + * [_(…)](https://lodash.com/docs#_) supports intuitive chaining + * [_.at](https://lodash.com/docs#at) for cherry-picking collection values + * [_.bindKey](https://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods + * [_.clone](https://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects + * [_.cloneDeep](https://lodash.com/docs#cloneDeep) for deep cloning arrays & objects + * [_.constant](https://lodash.com/docs#constant) & [_.property](https://lodash.com/docs#property) function generators for composing functions + * [_.contains](https://lodash.com/docs#contains) accepts a `fromIndex` + * [_.create](https://lodash.com/docs#create) for easier object inheritance + * [_.createCallback](https://lodash.com/docs#createCallback) for extending callbacks in methods & mixins + * [_.curry](https://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions + * [_.debounce](https://lodash.com/docs#debounce) & [_.throttle](https://lodash.com/docs#throttle) accept additional `options` for more control + * [_.findIndex](https://lodash.com/docs#findIndex) & [_.findKey](https://lodash.com/docs#findKey) for finding indexes & keys + * [_.forEach](https://lodash.com/docs#forEach) is chainable & supports exiting early + * [_.forIn](https://lodash.com/docs#forIn) for iterating own & inherited properties + * [_.forOwn](https://lodash.com/docs#forOwn) for iterating own properties + * [_.isPlainObject](https://lodash.com/docs#isPlainObject) for checking if values are created by `Object` + * [_.mapValues](https://lodash.com/docs#mapValues) for [mapping](https://lodash.com/docs#map) values to an object + * [_.memoize](https://lodash.com/docs#memoize) exposes the `cache` of memoized functions + * [_.merge](https://lodash.com/docs#merge) for a deep [_.extend](https://lodash.com/docs#extend) + * [_.noop](https://lodash.com/docs#noop) for function placeholders + * [_.now](https://lodash.com/docs#now) as a cross-browser `Date.now` alternative + * [_.parseInt](https://lodash.com/docs#parseInt) for consistent behavior + * [_.pull](https://lodash.com/docs#pull) & [_.remove](https://lodash.com/docs#remove) for mutating arrays + * [_.random](https://lodash.com/docs#random) supports returning floating-point numbers + * [_.runInContext](https://lodash.com/docs#runInContext) for easier mocking + * [_.sortBy](https://lodash.com/docs#sortBy) supports sorting by multiple properties + * [_.support](https://lodash.com/docs#support) for flagging environment features + * [_.template](https://lodash.com/docs#template) supports [*“imports”*](https://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals) + * [_.transform](https://lodash.com/docs#transform) as a powerful alternative to [_.reduce](https://lodash.com/docs#reduce) for transforming objects + * [_.where](https://lodash.com/docs#where) supports deep object comparisons + * [_.xor](https://lodash.com/docs#xor) as a companion to [_.difference](https://lodash.com/docs#difference), [_.intersection](https://lodash.com/docs#intersection), & [_.union](https://lodash.com/docs#union) + * [_.zip](https://lodash.com/docs#zip) is capable of unzipping values + * [_.omit](https://lodash.com/docs#omit), [_.pick](https://lodash.com/docs#pick), & + [more](https://lodash.com/docs "_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest") accept callbacks + * [_.contains](https://lodash.com/docs#contains), [_.toArray](https://lodash.com/docs#toArray), & + [more](https://lodash.com/docs "_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where") accept strings + * [_.filter](https://lodash.com/docs#filter), [_.map](https://lodash.com/docs#map), & + [more](https://lodash.com/docs "_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq") support *“_.pluck”* & *“_.where”* shorthands + * [_.findLast](https://lodash.com/docs#findLast), [_.findLastIndex](https://lodash.com/docs#findLastIndex), & + [more](https://lodash.com/docs "_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight") right-associative methods + +## Support + +Tested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25-17, Safari 3-7, Node.js 0.6.21-0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5. diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.js index 23798ba..4d35185 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.js @@ -1,11 +1,11 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) + * Lo-Dash 2.4.2 (Custom Build) * Build: `lodash -o ./dist/lodash.compat.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -1818,6 +1818,7 @@ var setBindData = !defineProperty ? noop : function(func, value) { descriptor.value = value; defineProperty(func, '__bindData__', descriptor); + descriptor.value = null; }; /** @@ -6489,7 +6490,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -7058,7 +7059,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.min.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.min.js index d03b6ba..c0992cf 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.min.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.compat.min.js @@ -1,61 +1,92 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE + * Lo-Dash 2.4.2 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash -o ./dist/lodash.compat.js` */ -;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++ei||typeof a=="undefined")return 1;if(ae?0:e);++r=_&&a===n,f=[];if(l){var c=o(r);c?(a=t,r=c):l=false}for(;++ua(r,c)&&f.push(c);return l&&p(r),f}function ot(n,t,e,r){r=(r||0)-1; -for(var u=n?n.length:0,o=[];++r=_&&l===n,h=u||g?i():s;for(g&&(h=o(h),l=t);++al(h,y))&&((u||g)&&h.push(y),s.push(v))}return g?(c(h.k),p(h)):u&&c(h),s}function ct(n){return function(t,e,r){var u={}; -if(e=v.createCallback(e,r,3),qe(t)){r=-1;for(var o=t.length;++rk;k++)r+="n='"+e.h[k]+"';if((!(r&&x[n])&&m.call(t,n))",e.j||(r+="||(!x[n]&&t[n]!==A[n])"),r+="){"+e.g+"}"; -r+="}"}return(e.b||Le.nonEnumArgs)&&(r+="}"),r+=e.c+";return E",n("d,j,k,m,o,p,q,s,v,A,B,y,I,J,L",t+r+"}")(tt,q,ce,we,d,dt,qe,kt,Q.f,pe,X,$e,M,se,he)}function gt(n){return Ve[n]}function ht(){var t=(t=v.indexOf)===zt?n:t;return t}function vt(n){return typeof n=="function"&&ve.test(n)}function yt(n){var t,e;return!n||he.call(n)!=G||(t=n.constructor,jt(t)&&!(t instanceof t))||!Le.argsClass&&dt(n)||!Le.nodeClass&&f(n)?false:Le.ownLast?(nr(n,function(n,t,r){return e=we.call(r,t),false}),false!==e):(nr(n,function(n,t){e=t -}),typeof e=="undefined"||we.call(n,e))}function mt(n){return He[n]}function dt(n){return n&&typeof n=="object"&&typeof n.length=="number"&&he.call(n)==T||false}function bt(n,t,e){var r=We(n),u=r.length;for(t=tt(t,e,3);u--&&(e=r[u],false!==t(n[e],e,n)););return n}function _t(n){var t=[];return nr(n,function(n,e){jt(n)&&t.push(e)}),t.sort()}function wt(n){for(var t=-1,e=We(n),r=e.length,u={};++te?Be(0,o+e):e)||0,qe(n)?a=-1o&&(o=i)}}else t=null==t&&kt(n)?r:v.createCallback(t,e,3),Xe(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Rt(n,t,e,r){var u=3>arguments.length;if(t=v.createCallback(t,r,4),qe(n)){var o=-1,a=n.length;for(u&&(e=n[++o]);++oarguments.length; -return t=v.createCallback(t,r,4),Nt(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Zt(typeof e=="number"?e:0);return Dt(n,function(n){var e=lt(0,++t);r[t]=r[e],r[e]=n}),r}function $t(n,t,e){var r;if(t=v.createCallback(t,e,3),qe(n)){e=-1;for(var u=n.length;++er?Be(0,u+r):r||0}else if(r)return r=Kt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=v.createCallback(t,e,3);++u>>1,e(n[r])e?0:e);++t=h;m?(u&&(u=me(u)),c=a,o=n.apply(i,r)):u||(u=Ce(y,h))}return m&&l?l=me(l):l||t===p||(l=Ce(v,t)),e&&(m=true,o=n.apply(i,r)),!m||l||u||(r=i=null),o}}function Ht(n){return n}function Ut(n,t,e){var r=true,u=t&&_t(t);t&&(e||u.length)||(null==e&&(e=t),o=y,t=n,n=v,u=_t(t)),false===e?r=false:xt(e)&&"chain"in e&&(r=e.chain);var o=n,a=jt(o);Dt(u,function(e){var u=n[e]=t[e];a&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,a=[e];if(je.apply(a,arguments),a=u.apply(n,a),r||t){if(e===a&&xt(a))return this; -a=new o(a),a.__chain__=t}return a})})}function Qt(){}function Xt(n){return function(t){return t[n]}}function Yt(){return this.__wrapped__}e=e?ut.defaults(Z.Object(),e,ut.pick(Z,R)):Z;var Zt=e.Array,ne=e.Boolean,te=e.Date,ee=e.Function,re=e.Math,ue=e.Number,oe=e.Object,ae=e.RegExp,ie=e.String,le=e.TypeError,fe=[],ce=e.Error.prototype,pe=oe.prototype,se=ie.prototype,ge=e._,he=pe.toString,ve=ae("^"+ie(he).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),ye=re.ceil,me=e.clearTimeout,de=re.floor,be=ee.prototype.toString,_e=vt(_e=oe.getPrototypeOf)&&_e,we=pe.hasOwnProperty,je=fe.push,xe=pe.propertyIsEnumerable,Ce=e.setTimeout,ke=fe.splice,Ee=fe.unshift,Oe=function(){try{var n={},t=vt(t=oe.defineProperty)&&t,e=t(n,n,n)&&t -}catch(r){}return e}(),Se=vt(Se=oe.create)&&Se,Ae=vt(Ae=Zt.isArray)&&Ae,Ie=e.isFinite,De=e.isNaN,Ne=vt(Ne=oe.keys)&&Ne,Be=re.max,Pe=re.min,Re=e.parseInt,Fe=re.random,Te={};Te[$]=Zt,Te[L]=ne,Te[z]=te,Te[K]=ee,Te[G]=oe,Te[W]=ue,Te[J]=ae,Te[M]=ie;var $e={};$e[$]=$e[z]=$e[W]={constructor:true,toLocaleString:true,toString:true,valueOf:true},$e[L]=$e[M]={constructor:true,toString:true,valueOf:true},$e[q]=$e[K]=$e[J]={constructor:true,toString:true},$e[G]={constructor:true},function(){for(var n=F.length;n--;){var t,e=F[n]; -for(t in $e)we.call($e,t)&&!we.call($e[t],e)&&($e[t][e]=false)}}(),y.prototype=v.prototype;var Le=v.support={};!function(){var n=function(){this.x=1},t={0:1,length:1},r=[];n.prototype={valueOf:1,y:1};for(var u in new n)r.push(u);for(u in arguments);Le.argsClass=he.call(arguments)==T,Le.argsObject=arguments.constructor==oe&&!(arguments instanceof Zt),Le.enumErrorProps=xe.call(ce,"message")||xe.call(ce,"name"),Le.enumPrototypes=xe.call(n,"prototype"),Le.funcDecomp=!vt(e.WinRTError)&&B.test(g),Le.funcNames=typeof ee.name=="string",Le.nonEnumArgs=0!=u,Le.nonEnumShadows=!/valueOf/.test(r),Le.ownLast="x"!=r[0],Le.spliceObjects=(fe.splice.call(t,0,1),!t[0]),Le.unindexedChars="xx"!="x"[0]+oe("x")[0]; -try{Le.nodeClass=!(he.call(document)==G&&!({toString:0}+""))}catch(o){Le.nodeClass=true}}(1),v.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:I,variable:"",imports:{_:v}},Se||(nt=function(){function n(){}return function(t){if(xt(t)){n.prototype=t;var r=new n;n.prototype=null}return r||e.Object()}}());var ze=Oe?function(n,t){U.value=t,Oe(n,"__bindData__",U)}:Qt;Le.argsClass||(dt=function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&we.call(n,"callee")&&!xe.call(n,"callee")||false -});var qe=Ae||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&he.call(n)==$||false},Ke=st({a:"z",e:"[]",i:"if(!(B[typeof z]))return E",g:"E.push(n)"}),We=Ne?function(n){return xt(n)?Le.enumPrototypes&&typeof n=="function"||Le.nonEnumArgs&&n.length&&dt(n)?Ke(n):Ne(n):[]}:Ke,Ge={a:"g,e,K",i:"e=e&&typeof K=='undefined'?e:d(e,K,3)",b:"typeof u=='number'",v:We,g:"if(e(t[n],n,g)===false)return E"},Je={a:"z,H,l",i:"var a=arguments,b=0,c=typeof l=='number'?2:a.length;while(++b":">",'"':""","'":"'"},He=wt(Ve),Ue=ae("("+We(He).join("|")+")","g"),Qe=ae("["+We(Ve).join("")+"]","g"),Xe=st(Ge),Ye=st(Je,{i:Je.i.replace(";",";if(c>3&&typeof a[c-2]=='function'){var e=d(a[--c-1],a[c--],2)}else if(c>2&&typeof a[c-1]=='function'){e=a[--c]}"),g:"E[n]=e?e(E[n],t[n]):t[n]"}),Ze=st(Je),nr=st(Ge,Me,{j:false}),tr=st(Ge,Me); -jt(/x/)&&(jt=function(n){return typeof n=="function"&&he.call(n)==K});var er=_e?function(n){if(!n||he.call(n)!=G||!Le.argsClass&&dt(n))return false;var t=n.valueOf,e=vt(t)&&(e=_e(t))&&_e(e);return e?n==e||_e(n)==e:yt(n)}:yt,rr=ct(function(n,t,e){we.call(n,e)?n[e]++:n[e]=1}),ur=ct(function(n,t,e){(we.call(n,e)?n[e]:n[e]=[]).push(t)}),or=ct(function(n,t,e){n[e]=t}),ar=Bt,ir=vt(ir=te.now)&&ir||function(){return(new te).getTime()},lr=8==Re(j+"08")?Re:function(n,t){return Re(kt(n)?n.replace(D,""):n,t||0)}; -return v.after=function(n,t){if(!jt(t))throw new le;return function(){return 1>--n?t.apply(this,arguments):void 0}},v.assign=Ye,v.at=function(n){var t=arguments,e=-1,r=ot(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Zt(t);for(Le.unindexedChars&&kt(n)&&(n=n.split(""));++e=_&&o(r?e[r]:s)))}var f=e[0],h=-1,v=f?f.length:0,y=[];n:for(;++h(m?t(m,g):l(s,g))){for(r=u,(m||s).push(g);--r;)if(m=a[r],0>(m?t(m,g):l(e[r],g)))continue n;y.push(g) -}}for(;u--;)(m=a[u])&&p(m);return c(a),c(s),y},v.invert=wt,v.invoke=function(n,t){var e=s(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,a=Zt(typeof o=="number"?o:0);return Dt(n,function(n){a[++r]=(u?t:n[t]).apply(n,e)}),a},v.keys=We,v.map=Bt,v.mapValues=function(n,t,e){var r={};return t=v.createCallback(t,e,3),tr(n,function(n,e,u){r[e]=t(n,e,u)}),r},v.max=Pt,v.memoize=function(n,t){if(!jt(n))throw new le;var e=function(){var r=e.cache,u=t?t.apply(this,arguments):b+arguments[0];return we.call(r,u)?r[u]:r[u]=n.apply(this,arguments) -};return e.cache={},e},v.merge=function(n){var t=arguments,e=2;if(!xt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3e?Be(0,r+e):Pe(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},v.mixin=Ut,v.noConflict=function(){return e._=ge,this},v.noop=Qt,v.now=ir,v.parseInt=lr,v.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Fe(),Pe(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):lt(n,t)},v.reduce=Rt,v.reduceRight=Ft,v.result=function(n,t){if(n){var e=n[t]; -return jt(e)?n[t]():e}},v.runInContext=g,v.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:We(n).length},v.some=$t,v.sortedIndex=Kt,v.template=function(n,t,e){var r=v.templateSettings;n=ie(n||""),e=Ze({},e,r);var u,o=Ze({},e.imports,r.imports),r=We(o),o=Et(o),i=0,l=e.interpolate||N,f="__p+='",l=ae((e.escape||N).source+"|"+l.source+"|"+(l===I?O:N).source+"|"+(e.evaluate||N).source+"|$","g");n.replace(l,function(t,e,r,o,l,c){return r||(r=o),f+=n.slice(i,c).replace(P,a),e&&(f+="'+__e("+e+")+'"),l&&(u=true,f+="';"+l+";\n__p+='"),r&&(f+="'+((__t=("+r+"))==null?'':__t)+'"),i=c+t.length,t -}),f+="';",l=e=e.variable,l||(e="obj",f="with("+e+"){"+f+"}"),f=(u?f.replace(x,""):f).replace(C,"$1").replace(E,"$1;"),f="function("+e+"){"+(l?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+f+"return __p}";try{var c=ee(r,"return "+f).apply(h,o)}catch(p){throw p.source=f,p}return t?c(t):(c.source=f,c)},v.unescape=function(n){return null==n?"":ie(n).replace(Ue,mt)},v.uniqueId=function(n){var t=++m;return ie(null==n?"":n)+t -},v.all=St,v.any=$t,v.detect=It,v.findWhere=It,v.foldl=Rt,v.foldr=Ft,v.include=Ot,v.inject=Rt,Ut(function(){var n={};return tr(v,function(t,e){v.prototype[e]||(n[e]=t)}),n}(),false),v.first=Lt,v.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=v.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:h;return s(n,Be(0,u-r))},v.sample=function(n,t,e){return n&&typeof n.length!="number"?n=Et(n):Le.unindexedChars&&kt(n)&&(n=n.split("")),null==t||e?n?n[lt(0,n.length-1)]:h:(n=Tt(n),n.length=Pe(Be(0,t),n.length),n) -},v.take=Lt,v.head=Lt,tr(v,function(n,t){var e="sample"!==t;v.prototype[t]||(v.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new y(o,u):o})}),v.VERSION="2.4.1",v.prototype.chain=function(){return this.__chain__=true,this},v.prototype.toString=function(){return ie(this.__wrapped__)},v.prototype.value=Yt,v.prototype.valueOf=Yt,Xe(["join","pop","shift"],function(n){var t=fe[n];v.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments); -return n?new y(e,n):e}}),Xe(["push","reverse","sort","unshift"],function(n){var t=fe[n];v.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),Xe(["concat","slice","splice"],function(n){var t=fe[n];v.prototype[n]=function(){return new y(t.apply(this.__wrapped__,arguments),this.__chain__)}}),Le.spliceObjects||Xe(["pop","shift","splice"],function(n){var t=fe[n],e="splice"==n;v.prototype[n]=function(){var n=this.__chain__,r=this.__wrapped__,u=t.apply(r,arguments);return 0===r.length&&delete r[0],n||e?new y(u,n):u -}}),v}var h,v=[],y=[],m=0,d={},b=+new Date+"",_=75,w=40,j=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",x=/\b__p\+='';/g,C=/\b(__p\+=)''\+/g,E=/(__e\(.*?\)|\b__t\))\+'';/g,O=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,S=/\w*$/,A=/^\s*function[ \n\r\t]+\w/,I=/<%=([\s\S]+?)%>/g,D=RegExp("^["+j+"]*0+(?=.$)"),N=/($^)/,B=/\bthis\b/,P=/['\n\r\t\u2028\u2029\\]/g,R="Array Boolean Date Error Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),F="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),T="[object Arguments]",$="[object Array]",L="[object Boolean]",z="[object Date]",q="[object Error]",K="[object Function]",W="[object Number]",G="[object Object]",J="[object RegExp]",M="[object String]",V={}; -V[K]=false,V[T]=V[$]=V[L]=V[z]=V[W]=V[G]=V[J]=V[M]=true;var H={leading:false,maxWait:0,trailing:false},U={configurable:false,enumerable:false,value:null,writable:false},Q={a:"",b:null,c:"",d:"",e:"",v:null,g:"",h:null,support:null,i:"",j:false},X={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},Y={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},Z=X[typeof window]&&window||this,nt=X[typeof exports]&&exports&&!exports.nodeType&&exports,tt=X[typeof module]&&module&&!module.nodeType&&module,et=tt&&tt.exports===nt&&nt,rt=X[typeof global]&&global; -!rt||rt.global!==rt&&rt.window!==rt||(Z=rt);var ut=g();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(Z._=ut, define(function(){return ut})):nt&&tt?et?(tt.exports=ut)._=ut:nt._=ut:Z._=ut}).call(this); \ No newline at end of file +;(function(){function n(n,r,e){for(var t=(e||0)-1,o=n?n.length:0;++t-1?0:-1:r?0:-1}function e(n){var r=this.cache,e=typeof n;if("boolean"==e||null==n)r[n]=!0;else{"number"!=e&&"string"!=e&&(e="object");var t="number"==e?n:m+n,o=r[e]||(r[e]={});"object"==e?(o[t]||(o[t]=[])).push(n):o[t]=!0; + +}}function t(n){return n.charCodeAt(0)}function o(n,r){for(var e=n.criteria,t=r.criteria,o=-1,u=e.length;++oi||"undefined"==typeof a)return 1;if(a=_&&a===n,c=[];if(l){var f=u(t);f?(a=r,t=f):l=!1}for(;++o-1:h});return o.pop(),u.pop(),_&&(f(o),f(u)),a}function cn(n,r,e,t,o){(st(r)?or:Ct)(r,function(r,u){var a,i,l=r,c=n[u];if(r&&((i=st(r))||Pt(r))){for(var f=t.length;f--;)if(a=t[f]==r){c=o[f];break}if(!a){var s;e&&(l=e(c,r),(s="undefined"!=typeof l)&&(c=l)),s||(c=i?st(c)?c:[]:Pt(c)?c:{}),t.push(r),o.push(c),s||cn(c,r,e,t,o)}}else e&&(l=e(c,r),"undefined"==typeof l&&(l=r)),"undefined"!=typeof l&&(c=l);n[u]=c; + +})}function fn(n,r){return n+We(ut()*(r-n+1))}function sn(e,t,o){var a=-1,l=yn(),c=e?e.length:0,p=[],g=!t&&c>=_&&l===n,h=o||g?i():p;if(g){var v=u(h);l=r,h=v}for(;++a3&&"function"==typeof r[e-2])var t=en(r[--e-1],r[e--],2);else e>2&&"function"==typeof r[e-1]&&(t=r[--e]);for(var o=p(arguments,1,e),u=-1,a=i(),l=i();++u-1:"number"==typeof u?a=(zn(n)?n.indexOf(r,e):o(n,r,e))>-1:wt(n,function(n){return++tu&&(u=l)}else r=null==r&&zn(n)?t:v.createCallback(r,e,3),wt(n,function(n,e,t){var a=r(n,e,t);a>o&&(o=a,u=n)});return u}function cr(n,r,e){var o=1/0,u=o;if("function"!=typeof r&&e&&e[r]===n&&(r=null),null==r&&st(n))for(var a=-1,i=n.length;++a=_&&u(t?e[t]:p)))}var h=e[0],v=-1,y=h?h.length:0,b=[];n:for(;++v>>1;e(n[a])1?arguments:arguments[0],r=-1,e=n?lr(At(n,"length")):0,t=we(e<0?0:e);++r2?gn(n,17,p(arguments,2),null,r):gn(n,1,null,null,r)}function zr(n){for(var r=arguments.length>1?an(arguments,!0,!1,1):On(n),e=-1,t=r.length;++e2?gn(r,19,p(arguments,2),null,n):gn(r,3,null,null,n)}function Ur(){for(var n=arguments,r=n.length;r--;)if(!$n(n[r]))throw new Ie;return function(){for(var r=arguments,e=n.length;e--;)r=[n[e].apply(this,r)]; + +return r[0]}}function Mr(n,r){return r="number"==typeof r?r:+r||n.length,gn(n,4,null,null,null,r)}function Vr(n,r,e){var t,o,u,a,i,l,c,f=0,s=!1,p=!0;if(!$n(n))throw new Ie;if(r=et(0,r)||0,e===!0){var g=!0;p=!1}else Fn(e)&&(g=e.leading,s="maxWait"in e&&(et(r,e.maxWait)||0),p="trailing"in e?e.trailing:p);var v=function(){var e=r-(Lt()-a);if(e>0)l=Ve(v,e);else{o&&He(o);var s=c;o=l=c=h,s&&(f=Lt(),u=n.apply(i,t),l||o||(t=i=null))}},y=function(){l&&He(l),o=l=c=h,(p||s!==r)&&(f=Lt(),u=n.apply(i,t),l||o||(t=i=null)); + +};return function(){if(t=arguments,a=Lt(),i=this,c=p&&(l||!g),s===!1)var e=g&&!l;else{o||g||(f=a);var h=s-(a-f),b=h<=0;b?(o&&(o=He(o)),f=a,u=n.apply(i,t)):o||(o=Ve(y,h))}return b&&l?l=He(l):l||r===s||(l=Ve(v,r)),e&&(b=!0,u=n.apply(i,t)),!b||l||o||(t=i=null),u}}function Gr(n){if(!$n(n))throw new Ie;var r=p(arguments,1);return Ve(function(){n.apply(h,r)},1)}function Jr(n,r){if(!$n(n))throw new Ie;var e=p(arguments,2);return Ve(function(){n.apply(h,e)},r)}function Qr(n,r){if(!$n(n))throw new Ie;var e=function(){ +var t=e.cache,o=r?r.apply(this,arguments):m+arguments[0];return Ke.call(t,o)?t[o]:t[o]=n.apply(this,arguments)};return e.cache={},e}function Xr(n){var r,e;if(!$n(n))throw new Ie;return function(){return r?e:(r=!0,e=n.apply(this,arguments),n=null,e)}}function Yr(n){return gn(n,16,p(arguments,1))}function Zr(n){return gn(n,32,null,p(arguments,1))}function ne(n,r,e){var t=!0,o=!0;if(!$n(n))throw new Ie;return e===!1?t=!1:Fn(e)&&(t="leading"in e?e.leading:t,o="trailing"in e?e.trailing:o),J.leading=t, +J.maxWait=r,J.trailing=o,Vr(n,r,J)}function re(n,r){return gn(r,16,[n])}function ee(n){return function(){return n}}function te(n,r,e){var t=typeof n;if(null==n||"function"==t)return en(n,r,e);if("object"!=t)return ce(n);var o=gt(n),u=o[0],a=n[u];return 1!=o.length||a!==a||Fn(a)?function(r){for(var e=o.length,t=!1;e--&&(t=ln(r[o[e]],n[o[e]],null,!0)););return t}:function(n){var r=n[u];return a===r&&(0!==a||1/a==1/r)}}function oe(n){return null==n?"":Ae(n).replace(_t,vn)}function ue(n){return n}function ae(n,r,e){ +var t=!0,o=r&&On(r);r&&(e||o.length)||(null==e&&(e=r),u=y,r=n,n=v,o=On(r)),e===!1?t=!1:Fn(e)&&"chain"in e&&(t=e.chain);var u=n,a=$n(u);or(o,function(e){var o=n[e]=r[e];a&&(u.prototype[e]=function(){var r=this.__chain__,e=this.__wrapped__,a=[e];Ue.apply(a,arguments);var i=o.apply(n,a);if(t||r){if(e===i&&Fn(i))return this;i=new u(i),i.__chain__=r}return i})})}function ie(){return e._=De,this}function le(){}function ce(n){return function(r){return r[n]}}function fe(n,r,e){var t=null==n,o=null==r;if(null==e&&("boolean"==typeof n&&o?(e=n, +n=1):o||"boolean"!=typeof r||(e=r,o=!0)),t&&o&&(r=1),n=+n||0,o?(r=n,n=0):r=+r||0,e||n%1||r%1){var u=ut();return tt(n+u*(r-n+parseFloat("1e-"+((u+"").length-1))),r)}return fn(n,r)}function se(n,r){if(n){var e=n[r];return $n(e)?n[r]():e}}function pe(n,r,e){var t=v.templateSettings;n=Ae(n||""),e=jt({},e,t);var o,u=jt({},e.imports,t.imports),i=gt(u),l=Xn(u),c=0,f=e.interpolate||L,s="__p += '",p=Se((e.escape||L).source+"|"+f.source+"|"+(f===A?E:L).source+"|"+(e.evaluate||L).source+"|$","g");n.replace(p,function(r,e,t,u,i,l){ +return t||(t=u),s+=n.slice(c,l).replace(R,a),e&&(s+="' +\n__e("+e+") +\n'"),i&&(o=!0,s+="';\n"+i+";\n__p += '"),t&&(s+="' +\n((__t = ("+t+")) == null ? '' : __t) +\n'"),c=l+r.length,r}),s+="';\n";var g=e.variable,y=g;y||(g="obj",s="with ("+g+") {\n"+s+"\n}\n"),s=(o?s.replace(j,""):s).replace(C,"$1").replace(P,"$1;"),s="function("+g+") {\n"+(y?"":g+" || ("+g+" = {});\n")+"var __t, __p = '', __e = _.escape"+(o?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+s+"return __p\n}"; + +var b="\n/*\n//# sourceURL="+(e.sourceURL||"/lodash/template/source["+$++ +"]")+"\n*/";try{var d=Ce(i,"return "+s+b).apply(h,l)}catch(m){throw m.source=s,m}return r?d(r):(d.source=s,d)}function ge(n,r,e){n=(n=+n)>-1?n:0;var t=-1,o=we(n);for(r=en(r,e,1);++t/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:A,variable:"",imports:{_:v}};var ct=function(n){var r="var index, iterable = "+n.firstArg+", result = "+n.init+";\nif (!iterable) return result;\n"+n.top+";"; + +n.array?(r+="\nvar length = iterable.length; index = -1;\nif ("+n.array+") { ",lt.unindexedChars&&(r+="\n if (isString(iterable)) {\n iterable = iterable.split('')\n } "),r+="\n while (++index < length) {\n "+n.loop+";\n }\n}\nelse { "):lt.nonEnumArgs&&(r+="\n var length = iterable.length; index = -1;\n if (length && isArguments(iterable)) {\n while (++index < length) {\n index += '';\n "+n.loop+";\n }\n } else { "),lt.enumPrototypes&&(r+="\n var skipProto = typeof iterable == 'function';\n "), +lt.enumErrorProps&&(r+="\n var skipErrorProps = iterable === errorProto || iterable instanceof Error;\n ");var e=[];if(lt.enumPrototypes&&e.push('!(skipProto && index == "prototype")'),lt.enumErrorProps&&e.push('!(skipErrorProps && (index == "message" || index == "name"))'),n.useHas&&n.keys)r+="\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n", +e.length&&(r+=" if ("+e.join(" && ")+") {\n "),r+=n.loop+"; ",e.length&&(r+="\n }"),r+="\n } ";else if(r+="\n for (index in iterable) {\n",n.useHas&&e.push("hasOwnProperty.call(iterable, index)"),e.length&&(r+=" if ("+e.join(" && ")+") {\n "),r+=n.loop+"; ",e.length&&(r+="\n }"),r+="\n } ",lt.nonEnumShadows){for(r+="\n\n if (iterable !== objectProto) {\n var ctor = iterable.constructor,\n isProto = iterable === (ctor && ctor.prototype),\n className = iterable === stringProto ? stringClass : iterable === errorProto ? errorClass : toString.call(iterable),\n nonEnum = nonEnumProps[className];\n ", +k=0;k<7;k++)r+="\n index = '"+n.shadowedProps[k]+"';\n if ((!(isProto && nonEnum[index]) && hasOwnProperty.call(iterable, index))",n.useHas||(r+=" || (!nonEnum[index] && iterable[index] !== objectProto[index])"),r+=") {\n "+n.loop+";\n } ";r+="\n } "}return(n.array||lt.nonEnumArgs)&&(r+="\n}"),r+=n.bottom+";\nreturn result"};Xe||(rn=function(){function n(){}return function(r){if(Fn(r)){n.prototype=r;var t=new n;n.prototype=null}return t||e.Object()}}());var ft=Qe?function(n,r){ +Q.value=r,Qe(n,"__bindData__",Q),Q.value=null}:le;lt.argsClass||(_n=function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&Ke.call(n,"callee")&&!Me.call(n,"callee")||!1});var st=Ye||function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&$e.call(n)==B||!1},pt=hn({args:"object",init:"[]",top:"if (!(objectTypes[typeof object])) return result",loop:"result.push(index)"}),gt=rt?function(n){return Fn(n)?lt.enumPrototypes&&"function"==typeof n||lt.nonEnumArgs&&n.length&&_n(n)?pt(n):rt(n):[]; + +}:pt,ht={args:"collection, callback, thisArg",top:"callback = callback && typeof thisArg == 'undefined' ? callback : baseCreateCallback(callback, thisArg, 3)",array:"typeof length == 'number'",keys:gt,loop:"if (callback(iterable[index], index, collection) === false) return result"},vt={args:"object, source, guard",top:"var args = arguments,\n argsIndex = 0,\n argsLength = typeof guard == 'number' ? 2 : args.length;\nwhile (++argsIndex < argsLength) {\n iterable = args[argsIndex];\n if (iterable && objectTypes[typeof iterable]) {", +keys:gt,loop:"if (typeof result[index] == 'undefined') result[index] = iterable[index]",bottom:" }\n}"},yt={top:"if (!objectTypes[typeof iterable]) return result;\n"+ht.top,array:!1},bt={"&":"&","<":"<",">":">",'"':""","'":"'"},dt=An(bt),mt=Se("("+gt(dt).join("|")+")","g"),_t=Se("["+gt(bt).join("")+"]","g"),wt=hn(ht),xt=hn(vt,{top:vt.top.replace(";",";\nif (argsLength > 3 && typeof args[argsLength - 2] == 'function') {\n var callback = baseCreateCallback(args[--argsLength - 1], args[argsLength--], 2);\n} else if (argsLength > 2 && typeof args[argsLength - 1] == 'function') {\n callback = args[--argsLength];\n}"), +loop:"result[index] = callback ? callback(result[index], iterable[index]) : iterable[index]"}),jt=hn(vt),kt=hn(ht,yt,{useHas:!1}),Ct=hn(ht,yt);$n(/x/)&&($n=function(n){return"function"==typeof n&&$e.call(n)==z});var Pt=ze?function(n){if(!n||$e.call(n)!=U||!lt.argsClass&&_n(n))return!1;var r=n.valueOf,e=bn(r)&&(e=ze(r))&&ze(e);return e?n==e||ze(n)==e:dn(n)}:dn,Et=pn(function(n,r,e){Ke.call(n,e)?n[e]++:n[e]=1}),Ot=pn(function(n,r,e){(Ke.call(n,e)?n[e]:n[e]=[]).push(r)}),St=pn(function(n,r,e){n[e]=r; + +}),At=ir,It=rr,Lt=bn(Lt=je.now)&&Lt||function(){return(new je).getTime()},Nt=8==ot(x+"08")?ot:function(n,r){return ot(zn(n)?n.replace(I,""):n,r||0)};return v.after=Wr,v.assign=xt,v.at=Yn,v.bind=qr,v.bindAll=zr,v.bindKey=Kr,v.chain=ye,v.compact=mr,v.compose=Ur,v.constant=ee,v.countBy=Et,v.create=jn,v.createCallback=te,v.curry=Mr,v.debounce=Vr,v.defaults=jt,v.defer=Gr,v.delay=Jr,v.difference=_r,v.filter=rr,v.flatten=kr,v.forEach=or,v.forEachRight=ur,v.forIn=kt,v.forInRight=Pn,v.forOwn=Ct,v.forOwnRight=En, +v.functions=On,v.groupBy=Ot,v.indexBy=St,v.initial=Pr,v.intersection=Er,v.invert=An,v.invoke=ar,v.keys=gt,v.map=ir,v.mapValues=Un,v.max=lr,v.memoize=Qr,v.merge=Mn,v.min=cr,v.omit=Vn,v.once=Xr,v.pairs=Gn,v.partial=Yr,v.partialRight=Zr,v.pick=Jn,v.pluck=At,v.property=ce,v.pull=Ar,v.range=Ir,v.reject=pr,v.remove=Lr,v.rest=Nr,v.shuffle=hr,v.sortBy=br,v.tap=be,v.throttle=ne,v.times=ge,v.toArray=dr,v.transform=Qn,v.union=Tr,v.uniq=Dr,v.values=Xn,v.where=It,v.without=$r,v.wrap=re,v.xor=Fr,v.zip=Br,v.zipObject=Hr, +v.collect=ir,v.drop=Nr,v.each=or,v.eachRight=ur,v.extend=xt,v.methods=On,v.object=Hr,v.select=rr,v.tail=Nr,v.unique=Dr,v.unzip=Br,ae(v),v.clone=wn,v.cloneDeep=xn,v.contains=Zn,v.escape=oe,v.every=nr,v.find=er,v.findIndex=wr,v.findKey=kn,v.findLast=tr,v.findLastIndex=xr,v.findLastKey=Cn,v.has=Sn,v.identity=ue,v.indexOf=Cr,v.isArguments=_n,v.isArray=st,v.isBoolean=In,v.isDate=Ln,v.isElement=Nn,v.isEmpty=Rn,v.isEqual=Tn,v.isFinite=Dn,v.isFunction=$n,v.isNaN=Bn,v.isNull=Hn,v.isNumber=Wn,v.isObject=Fn, +v.isPlainObject=Pt,v.isRegExp=qn,v.isString=zn,v.isUndefined=Kn,v.lastIndexOf=Sr,v.mixin=ae,v.noConflict=ie,v.noop=le,v.now=Lt,v.parseInt=Nt,v.random=fe,v.reduce=fr,v.reduceRight=sr,v.result=se,v.runInContext=g,v.size=vr,v.some=yr,v.sortedIndex=Rr,v.template=pe,v.unescape=he,v.uniqueId=ve,v.all=nr,v.any=yr,v.detect=er,v.findWhere=er,v.foldl=fr,v.foldr=sr,v.include=Zn,v.inject=fr,ae(function(){var n={};return Ct(v,function(r,e){v.prototype[e]||(n[e]=r)}),n}(),!1),v.first=jr,v.last=Or,v.sample=gr,v.take=jr, +v.head=jr,Ct(v,function(n,r){var e="sample"!==r;v.prototype[r]||(v.prototype[r]=function(r,t){var o=this.__chain__,u=n(this.__wrapped__,r,t);return o||null!=r&&(!t||e&&"function"==typeof r)?new y(u,o):u})}),v.VERSION="2.4.2",v.prototype.chain=de,v.prototype.toString=me,v.prototype.value=_e,v.prototype.valueOf=_e,wt(["join","pop","shift"],function(n){var r=Le[n];v.prototype[n]=function(){var n=this.__chain__,e=r.apply(this.__wrapped__,arguments);return n?new y(e,n):e}}),wt(["push","reverse","sort","unshift"],function(n){ +var r=Le[n];v.prototype[n]=function(){return r.apply(this.__wrapped__,arguments),this}}),wt(["concat","slice","splice"],function(n){var r=Le[n];v.prototype[n]=function(){return new y(r.apply(this.__wrapped__,arguments),this.__chain__)}}),lt.spliceObjects||wt(["pop","shift","splice"],function(n){var r=Le[n],e="splice"==n;v.prototype[n]=function(){var n=this.__chain__,t=this.__wrapped__,o=r.apply(t,arguments);return 0===t.length&&delete t[0],n||e?new y(o,n):o}}),v}var h,v=[],y=[],b=0,d={},m=+new Date+"",_=75,w=40,x=" \f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",j=/\b__p \+= '';/g,C=/\b(__p \+=) '' \+/g,P=/(__e\(.*?\)|\b__t\)) \+\n'';/g,E=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,O=/\w*$/,S=/^\s*function[ \n\r\t]+\w/,A=/<%=([\s\S]+?)%>/g,I=RegExp("^["+x+"]*0+(?=.$)"),L=/($^)/,N=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,T=["Array","Boolean","Date","Error","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],D=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],$=0,F="[object Arguments]",B="[object Array]",H="[object Boolean]",W="[object Date]",q="[object Error]",z="[object Function]",K="[object Number]",U="[object Object]",M="[object RegExp]",V="[object String]",G={}; + +G[z]=!1,G[F]=G[B]=G[H]=G[W]=G[K]=G[U]=G[M]=G[V]=!0;var J={leading:!1,maxWait:0,trailing:!1},Q={configurable:!1,enumerable:!1,value:null,writable:!1},X={args:"",array:null,bottom:"",firstArg:"",init:"",keys:null,loop:"",shadowedProps:null,support:null,top:"",useHas:!1},Y={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},Z={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},nn=Y[typeof window]&&window||this,rn=Y[typeof exports]&&exports&&!exports.nodeType&&exports,en=Y[typeof module]&&module&&!module.nodeType&&module,tn=en&&en.exports===rn&&rn,on=Y[typeof global]&&global; + +!on||on.global!==on&&on.window!==on||(nn=on);var un=g();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(nn._=un,define(function(){return un})):rn&&en?tn?(en.exports=un)._=un:rn._=un:nn._=un}).call(this); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.js index d653e5a..3646090 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.js @@ -1,11 +1,11 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) + * Lo-Dash 2.4.2 (Custom Build) * Build: `lodash modern -o ./dist/lodash.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -1494,6 +1494,7 @@ var setBindData = !defineProperty ? noop : function(func, value) { descriptor.value = value; defineProperty(func, '__bindData__', descriptor); + descriptor.value = null; }; /** @@ -6139,7 +6140,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -6708,7 +6709,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.min.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.min.js index 85a9626..dd1c643 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.min.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.min.js @@ -1,56 +1,87 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE + * Lo-Dash 2.4.2 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash modern -o ./dist/lodash.js` */ -;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++ea||typeof i=="undefined")return 1;if(ie?0:e);++r=b&&i===n,l=[];if(f){var p=o(r);p?(i=t,r=p):f=false}for(;++ui(r,p)&&l.push(p);return f&&c(r),l}function ut(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r=b&&f===n,h=u||v?a():s; -for(v&&(h=o(h),f=t);++if(h,y))&&((u||v)&&h.push(y),s.push(g))}return v?(l(h.k),c(h)):u&&l(h),s}function lt(n){return function(t,e,r){var u={};e=J.createCallback(e,r,3),r=-1;var o=t?t.length:0;if(typeof o=="number")for(;++re?Ie(0,o+e):e)||0,Te(n)?i=-1o&&(o=a)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Dt(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=J.createCallback(t,r,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(e=n[++o]);++oarguments.length;return t=J.createCallback(t,r,4),Et(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Xt(typeof e=="number"?e:0);return St(n,function(n){var e=at(0,++t);r[t]=r[e],r[e]=n}),r}function Ft(n,t,e){var r;t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++er?Ie(0,u+r):r||0}else if(r)return r=zt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=J.createCallback(t,e,3);++u>>1,e(n[r])e?0:e);++t=v; -m?(i&&(i=ve(i)),s=f,a=n.apply(l,o)):i||(i=_e(r,v))}return m&&c?c=ve(c):c||t===h||(c=_e(u,t)),e&&(m=true,a=n.apply(l,o)),!m||c||i||(o=l=null),a}}function Ut(n){return n}function Gt(n,t,e){var r=true,u=t&&bt(t);t&&(e||u.length)||(null==e&&(e=t),o=Q,t=n,n=J,u=bt(t)),false===e?r=false:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=dt(o);St(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(be.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this; -i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,A)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,ae=[],fe=re.prototype,le=e._,ce=fe.toString,pe=ue("^"+oe(ce).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,ve=e.clearTimeout,he=te.floor,ge=ne.prototype.toString,ye=vt(ye=re.getPrototypeOf)&&ye,me=fe.hasOwnProperty,be=ae.push,_e=e.setTimeout,de=ae.splice,we=ae.unshift,je=function(){try{var n={},t=vt(t=re.defineProperty)&&t,e=t(n,n,n)&&t -}catch(r){}return e}(),ke=vt(ke=re.create)&&ke,xe=vt(xe=Xt.isArray)&&xe,Ce=e.isFinite,Oe=e.isNaN,Ne=vt(Ne=re.keys)&&Ne,Ie=te.max,Se=te.min,Ee=e.parseInt,Re=te.random,Ae={};Ae[$]=Xt,Ae[T]=Yt,Ae[F]=Zt,Ae[B]=ne,Ae[q]=re,Ae[W]=ee,Ae[z]=ue,Ae[P]=oe,Q.prototype=J.prototype;var De=J.support={};De.funcDecomp=!vt(e.a)&&E.test(s),De.funcNames=typeof ne.name=="string",J.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N,variable:"",imports:{_:J}},ke||(nt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t; -var r=new n;n.prototype=null}return r||e.Object()}}());var $e=je?function(n,t){M.value=t,je(n,"__bindData__",M)}:Ht,Te=xe||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==$||false},Fe=Ne?function(n){return wt(n)?Ne(n):[]}:H,Be={"&":"&","<":"<",">":">",'"':""","'":"'"},We=_t(Be),qe=ue("("+Fe(We).join("|")+")","g"),ze=ue("["+Fe(Be).join("")+"]","g"),Pe=ye?function(n){if(!n||ce.call(n)!=q)return false;var t=n.valueOf,e=vt(t)&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:ht(n) -}:ht,Ke=lt(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Le=lt(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)}),Me=lt(function(n,t,e){n[e]=t}),Ve=Rt,Ue=vt(Ue=Zt.now)&&Ue||function(){return(new Zt).getTime()},Ge=8==Ee(d+"08")?Ee:function(n,t){return Ee(kt(n)?n.replace(I,""):n,t||0)};return J.after=function(n,t){if(!dt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},J.assign=U,J.at=function(n){for(var t=arguments,e=-1,r=ut(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e=b&&o(r?e[r]:s)))}var p=e[0],h=-1,g=p?p.length:0,y=[];n:for(;++h(m?t(m,v):f(s,v))){for(r=u,(m||s).push(v);--r;)if(m=i[r],0>(m?t(m,v):f(e[r],v)))continue n;y.push(v)}}for(;u--;)(m=i[u])&&c(m);return l(i),l(s),y},J.invert=_t,J.invoke=function(n,t){var e=p(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,i=Xt(typeof o=="number"?o:0);return St(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},J.keys=Fe,J.map=Rt,J.mapValues=function(n,t,e){var r={}; -return t=J.createCallback(t,e,3),h(n,function(n,e,u){r[e]=t(n,e,u)}),r},J.max=At,J.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!dt(n))throw new ie;return e.cache={},e},J.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3e?Ie(0,r+e):Se(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},J.mixin=Gt,J.noConflict=function(){return e._=le,this},J.noop=Ht,J.now=Ue,J.parseInt=Ge,J.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Re(),Se(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):at(n,t) -},J.reduce=Dt,J.reduceRight=$t,J.result=function(n,t){if(n){var e=n[t];return dt(e)?n[t]():e}},J.runInContext=s,J.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:Fe(n).length},J.some=Ft,J.sortedIndex=zt,J.template=function(n,t,e){var r=J.templateSettings;n=oe(n||""),e=_({},e,r);var u,o=_({},e.imports,r.imports),r=Fe(o),o=xt(o),a=0,f=e.interpolate||S,l="__p+='",f=ue((e.escape||S).source+"|"+f.source+"|"+(f===N?x:S).source+"|"+(e.evaluate||S).source+"|$","g");n.replace(f,function(t,e,r,o,f,c){return r||(r=o),l+=n.slice(a,c).replace(R,i),e&&(l+="'+__e("+e+")+'"),f&&(u=true,l+="';"+f+";\n__p+='"),r&&(l+="'+((__t=("+r+"))==null?'':__t)+'"),a=c+t.length,t -}),l+="';",f=e=e.variable,f||(e="obj",l="with("+e+"){"+l+"}"),l=(u?l.replace(w,""):l).replace(j,"$1").replace(k,"$1;"),l="function("+e+"){"+(f?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}";try{var c=ne(r,"return "+l).apply(v,o)}catch(p){throw p.source=l,p}return t?c(t):(c.source=l,c)},J.unescape=function(n){return null==n?"":oe(n).replace(qe,gt)},J.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t -},J.all=Ot,J.any=Ft,J.detect=It,J.findWhere=It,J.foldl=Dt,J.foldr=$t,J.include=Ct,J.inject=Dt,Gt(function(){var n={};return h(J,function(t,e){J.prototype[e]||(n[e]=t)}),n}(),false),J.first=Bt,J.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:v;return p(n,Ie(0,u-r))},J.sample=function(n,t,e){return n&&typeof n.length!="number"&&(n=xt(n)),null==t||e?n?n[at(0,n.length-1)]:v:(n=Tt(n),n.length=Se(Ie(0,t),n.length),n) -},J.take=Bt,J.head=Bt,h(J,function(n,t){var e="sample"!==t;J.prototype[t]||(J.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new Q(o,u):o})}),J.VERSION="2.4.1",J.prototype.chain=function(){return this.__chain__=true,this},J.prototype.toString=function(){return oe(this.__wrapped__)},J.prototype.value=Qt,J.prototype.valueOf=Qt,St(["join","pop","shift"],function(n){var t=ae[n];J.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments); -return n?new Q(e,n):e}}),St(["push","reverse","sort","unshift"],function(n){var t=ae[n];J.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),St(["concat","slice","splice"],function(n){var t=ae[n];J.prototype[n]=function(){return new Q(t.apply(this.__wrapped__,arguments),this.__chain__)}}),J}var v,h=[],g=[],y=0,m=+new Date+"",b=75,_=40,d=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,N=/<%=([\s\S]+?)%>/g,I=RegExp("^["+d+"]*0+(?=.$)"),S=/($^)/,E=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,A="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),D="[object Arguments]",$="[object Array]",T="[object Boolean]",F="[object Date]",B="[object Function]",W="[object Number]",q="[object Object]",z="[object RegExp]",P="[object String]",K={}; -K[B]=false,K[D]=K[$]=K[T]=K[F]=K[W]=K[q]=K[z]=K[P]=true;var L={leading:false,maxWait:0,trailing:false},M={configurable:false,enumerable:false,value:null,writable:false},V={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},U={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X); -var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G._=Y, define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this); \ No newline at end of file +;(function(){function n(n,r,t){for(var e=(t||0)-1,u=n?n.length:0;++e-1?0:-1:r?0:-1}function t(n){var r=this.cache,t=typeof n;if("boolean"==t||null==n)r[n]=!0;else{"number"!=t&&"string"!=t&&(t="object");var e="number"==t?n:m+n,u=r[t]||(r[t]={});"object"==t?(u[e]||(u[e]=[])).push(n):u[e]=!0; + +}}function e(n){return n.charCodeAt(0)}function u(n,r){for(var t=n.criteria,e=r.criteria,u=-1,o=t.length;++ui||"undefined"==typeof a)return 1;if(a=b&&a===n,l=[]; + +if(f){var p=o(e);p?(a=r,e=p):f=!1}for(;++u-1:v});return u.pop(),o.pop(),_&&(l(u),l(o)),a}function tn(n,r,t,e,u){(Yt(r)?Xn:fe)(r,function(r,o){ +var a,i,f=r,l=n[o];if(r&&((i=Yt(r))||le(r))){for(var c=e.length;c--;)if(a=e[c]==r){l=u[c];break}if(!a){var p;t&&(f=t(l,r),(p="undefined"!=typeof f)&&(l=f)),p||(l=i?Yt(l)?l:[]:le(l)?l:{}),e.push(r),u.push(l),p||tn(l,r,t,e,u)}}else t&&(f=t(l,r),"undefined"==typeof f&&(f=r)),"undefined"!=typeof f&&(l=f);n[o]=l})}function en(n,r){return n+St(Ht()*(r-n+1))}function un(t,e,u){var a=-1,f=ln(),p=t?t.length:0,s=[],v=!e&&p>=b&&f===n,h=u||v?i():s;if(v){var g=o(h);f=r,h=g}for(;++a3&&"function"==typeof r[t-2])var e=Q(r[--t-1],r[t--],2);else t>2&&"function"==typeof r[t-1]&&(e=r[--t]);for(var u=p(arguments,1,t),o=-1,a=i(),f=i();++o-1:"number"==typeof o?a=(Fn(n)?n.indexOf(r,t):u(n,r,t))>-1:fe(n,function(n){return++eo&&(o=f)}else r=null==r&&Fn(n)?e:h.createCallback(r,t,3),Xn(n,function(n,t,e){var a=r(n,t,e);a>u&&(u=a,o=n)});return o; + +}function tr(n,r,t){var u=1/0,o=u;if("function"!=typeof r&&t&&t[r]===n&&(r=null),null==r&&Yt(n))for(var a=-1,i=n.length;++a=b&&o(e?t[e]:s)))}var h=t[0],g=-1,y=h?h.length:0,m=[];n:for(;++g>>1;t(n[a])1?arguments:arguments[0],r=-1,t=n?rr(ve(n,"length")):0,e=ht(t<0?0:t);++r2?an(n,17,p(arguments,2),null,r):an(n,1,null,null,r)}function Fr(n){for(var r=arguments.length>1?nn(arguments,!0,!1,1):wn(n),t=-1,e=r.length;++t2?an(r,19,p(arguments,2),null,n):an(r,3,null,null,n); + +}function Wr(){for(var n=arguments,r=n.length;r--;)if(!In(n[r]))throw new kt;return function(){for(var r=arguments,t=n.length;t--;)r=[n[t].apply(this,r)];return r[0]}}function qr(n,r){return r="number"==typeof r?r:+r||n.length,an(n,4,null,null,null,r)}function zr(n,r,t){var e,u,o,a,i,f,l,c=0,p=!1,s=!0;if(!In(n))throw new kt;if(r=Mt(0,r)||0,t===!0){var h=!0;s=!1}else Sn(t)&&(h=t.leading,p="maxWait"in t&&(Mt(r,t.maxWait)||0),s="trailing"in t?t.trailing:s);var g=function(){var t=r-(ge()-a);if(t>0)f=Ft(g,t); +else{u&&It(u);var p=l;u=f=l=v,p&&(c=ge(),o=n.apply(i,e),f||u||(e=i=null))}},y=function(){f&&It(f),u=f=l=v,(s||p!==r)&&(c=ge(),o=n.apply(i,e),f||u||(e=i=null))};return function(){if(e=arguments,a=ge(),i=this,l=s&&(f||!h),p===!1)var t=h&&!f;else{u||h||(c=a);var v=p-(a-c),m=v<=0;m?(u&&(u=It(u)),c=a,o=n.apply(i,e)):u||(u=Ft(y,v))}return m&&f?f=It(f):f||r===p||(f=Ft(g,r)),t&&(m=!0,o=n.apply(i,e)),!m||f||u||(e=i=null),o}}function Lr(n){if(!In(n))throw new kt;var r=p(arguments,1);return Ft(function(){n.apply(v,r); + +},1)}function Pr(n,r){if(!In(n))throw new kt;var t=p(arguments,2);return Ft(function(){n.apply(v,t)},r)}function Kr(n,r){if(!In(n))throw new kt;var t=function(){var e=t.cache,u=r?r.apply(this,arguments):m+arguments[0];return Tt.call(e,u)?e[u]:e[u]=n.apply(this,arguments)};return t.cache={},t}function Ur(n){var r,t;if(!In(n))throw new kt;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}}function Mr(n){return an(n,16,p(arguments,1))}function Vr(n){return an(n,32,null,p(arguments,1)); + +}function Gr(n,r,t){var e=!0,u=!0;if(!In(n))throw new kt;return t===!1?e=!1:Sn(t)&&(e="leading"in t?t.leading:e,u="trailing"in t?t.trailing:u),U.leading=e,U.maxWait=r,U.trailing=u,zr(n,r,U)}function Hr(n,r){return an(r,16,[n])}function Jr(n){return function(){return n}}function Qr(n,r,t){var e=typeof n;if(null==n||"function"==e)return Q(n,r,t);if("object"!=e)return tt(n);var u=ne(n),o=u[0],a=n[o];return 1!=u.length||a!==a||Sn(a)?function(r){for(var t=u.length,e=!1;t--&&(e=rn(r[u[t]],n[u[t]],null,!0));); +return e}:function(n){var r=n[o];return a===r&&(0!==a||1/a==1/r)}}function Xr(n){return null==n?"":jt(n).replace(ue,fn)}function Yr(n){return n}function Zr(n,r,t){var e=!0,u=r&&wn(r);r&&(t||u.length)||(null==t&&(t=r),o=g,r=n,n=h,u=wn(r)),t===!1?e=!1:Sn(t)&&"chain"in t&&(e=t.chain);var o=n,a=In(o);Xn(u,function(t){var u=n[t]=r[t];a&&(o.prototype[t]=function(){var r=this.__chain__,t=this.__wrapped__,a=[t];$t.apply(a,arguments);var i=u.apply(n,a);if(e||r){if(t===i&&Sn(i))return this;i=new o(i),i.__chain__=r; + +}return i})})}function nt(){return t._=Ot,this}function rt(){}function tt(n){return function(r){return r[n]}}function et(n,r,t){var e=null==n,u=null==r;if(null==t&&("boolean"==typeof n&&u?(t=n,n=1):u||"boolean"!=typeof r||(t=r,u=!0)),e&&u&&(r=1),n=+n||0,u?(r=n,n=0):r=+r||0,t||n%1||r%1){var o=Ht();return Vt(n+o*(r-n+parseFloat("1e-"+((o+"").length-1))),r)}return en(n,r)}function ut(n,r){if(n){var t=n[r];return In(t)?n[r]():t}}function ot(n,r,t){var e=h.templateSettings;n=jt(n||""),t=ae({},t,e);var u,o=ae({},t.imports,e.imports),i=ne(o),f=Un(o),l=0,c=t.interpolate||E,p="__p += '",s=wt((t.escape||E).source+"|"+c.source+"|"+(c===N?x:E).source+"|"+(t.evaluate||E).source+"|$","g"); + +n.replace(s,function(r,t,e,o,i,f){return e||(e=o),p+=n.slice(l,f).replace(S,a),t&&(p+="' +\n__e("+t+") +\n'"),i&&(u=!0,p+="';\n"+i+";\n__p += '"),e&&(p+="' +\n((__t = ("+e+")) == null ? '' : __t) +\n'"),l=f+r.length,r}),p+="';\n";var g=t.variable,y=g;y||(g="obj",p="with ("+g+") {\n"+p+"\n}\n"),p=(u?p.replace(w,""):p).replace(j,"$1").replace(k,"$1;"),p="function("+g+") {\n"+(y?"":g+" || ("+g+" = {});\n")+"var __t, __p = '', __e = _.escape"+(u?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+p+"return __p\n}"; + +var m="\n/*\n//# sourceURL="+(t.sourceURL||"/lodash/template/source["+D++ +"]")+"\n*/";try{var b=mt(i,"return "+p+m).apply(v,f)}catch(_){throw _.source=p,_}return r?b(r):(b.source=p,b)}function at(n,r,t){n=(n=+n)>-1?n:0;var e=-1,u=ht(n);for(r=Q(r,t,1);++e/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N, +variable:"",imports:{_:h}},zt||(J=function(){function n(){}return function(r){if(Sn(r)){n.prototype=r;var e=new n;n.prototype=null}return e||t.Object()}}());var Xt=qt?function(n,r){M.value=r,qt(n,"__bindData__",M),M.value=null}:rt,Yt=Lt||function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&Nt.call(n)==$||!1},Zt=function(n){var r,t=n,e=[];if(!t)return e;if(!V[typeof n])return e;for(r in t)Tt.call(t,r)&&e.push(r);return e},ne=Ut?function(n){return Sn(n)?Ut(n):[]}:Zt,re={"&":"&", +"<":"<",">":">",'"':""","'":"'"},te=kn(re),ee=wt("("+ne(te).join("|")+")","g"),ue=wt("["+ne(re).join("")+"]","g"),oe=function(n,r,t){var e,u=n,o=u;if(!u)return o;var a=arguments,i=0,f="number"==typeof t?2:a.length;if(f>3&&"function"==typeof a[f-2])var l=Q(a[--f-1],a[f--],2);else f>2&&"function"==typeof a[f-1]&&(l=a[--f]);for(;++i/g,R=RegExp("^["+d+"]*0+(?=.$)"),E=/($^)/,I=/\bthis\b/,S=/['\n\r\t\u2028\u2029\\]/g,A=["Array","Boolean","Date","Function","Math","Number","Object","RegExp","String","_","attachEvent","clearTimeout","isFinite","isNaN","parseInt","setTimeout"],D=0,T="[object Arguments]",$="[object Array]",F="[object Boolean]",B="[object Date]",W="[object Function]",q="[object Number]",z="[object Object]",L="[object RegExp]",P="[object String]",K={}; + +K[W]=!1,K[T]=K[$]=K[F]=K[B]=K[q]=K[z]=K[L]=K[P]=!0;var U={leading:!1,maxWait:0,trailing:!1},M={configurable:!1,enumerable:!1,value:null,writable:!1},V={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},G={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},H=V[typeof window]&&window||this,J=V[typeof exports]&&exports&&!exports.nodeType&&exports,Q=V[typeof module]&&module&&!module.nodeType&&module,X=Q&&Q.exports===J&&J,Y=V[typeof global]&&global;!Y||Y.global!==Y&&Y.window!==Y||(H=Y); + +var Z=s();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(H._=Z,define(function(){return Z})):J&&Q?X?(Q.exports=Z)._=Z:J._=Z:H._=Z}).call(this); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.js index 0c84471..6557daf 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.js @@ -1,11 +1,11 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) + * Lo-Dash 2.4.2 (Custom Build) * Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js` * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -4458,7 +4458,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -4909,7 +4909,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.min.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.min.js index e659124..19c4ce6 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.min.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/dist/lodash.underscore.min.js @@ -1,6 +1,6 @@ /** * @license - * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE + * Lo-Dash 2.4.2 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE * Build: `lodash underscore exports="amd,commonjs,global,node" -o ./dist/lodash.underscore.js` */ ;(function(){function n(n,r,t){t=(t||0)-1;for(var e=n?n.length:0;++tf||typeof i=="undefined")return 1;if(it?0:t);++et?Mr(0,e+t):$r(t,e-1))+1);e--;)if(n[e]===r)return e; return-1},u.mixin=Z,u.noConflict=function(){return mr._=Tr,this},u.random=function(n,r){return null==n&&null==r&&(r=1),n=+n||0,null==r?(r=n,n=0):r=+r||0,n+Sr(Wr()*(r-n+1))},u.reduce=W,u.reduceRight=z,u.result=function(n,r){if(n){var t=n[r];return A(t)?n[r]():t}},u.size=function(n){var r=n?n.length:0;return typeof r=="number"?r:Ur(n).length},u.some=P,u.sortedIndex=J,u.template=function(n,r,e){var o=u,i=o.templateSettings;n=(n||"")+"",e=j({},e,i);var f=0,a="__p+='",i=e.variable;n.replace(RegExp((e.escape||or).source+"|"+(e.interpolate||or).source+"|"+(e.evaluate||or).source+"|$","g"),function(r,e,u,o,i){return a+=n.slice(f,i).replace(ir,t),e&&(a+="'+_.escape("+e+")+'"),o&&(a+="';"+o+";\n__p+='"),u&&(a+="'+((__t=("+u+"))==null?'':__t)+'"),f=i+r.length,r }),a+="';",i||(i="obj",a="with("+i+"||{}){"+a+"}"),a="function("+i+"){var __t,__p='',__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}"+a+"return __p}";try{var l=Function("_","return "+a)(o)}catch(c){throw c.source=a,c}return r?l(r):(l.source=a,l)},u.unescape=function(n){return null==n?"":(n+"").replace(Hr,d)},u.uniqueId=function(n){var r=++tr+"";return n?n+r:r},u.all=B,u.any=P,u.detect=q,u.findWhere=function(n,r){return U(n,r,true)},u.foldl=W,u.foldr=z,u.include=k,u.inject=W,u.first=V,u.last=function(n,r,t){var u=0,o=n?n.length:0; -if(typeof r!="number"&&null!=r){var i=o;for(r=X(r,t,3);i--&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[o-1]:rr;return e(n,Mr(0,o-u))},u.sample=function(n,r,t){return n&&typeof n.length!="number"&&(n=R(n)),null==r||t?n?n[0+Sr(Wr()*(n.length-1-0+1))]:rr:(n=C(n),n.length=$r(Mr(0,r),n.length),n)},u.take=V,u.head=V,Z(u),u.VERSION="2.4.1",u.prototype.chain=function(){return this.__chain__=true,this},u.prototype.value=function(){return this.__wrapped__},D("pop push reverse shift sort splice unshift".split(" "),function(n){var r=jr[n]; +if(typeof r!="number"&&null!=r){var i=o;for(r=X(r,t,3);i--&&r(n[i],i,n);)u++}else if(u=r,null==u||t)return n?n[o-1]:rr;return e(n,Mr(0,o-u))},u.sample=function(n,r,t){return n&&typeof n.length!="number"&&(n=R(n)),null==r||t?n?n[0+Sr(Wr()*(n.length-1-0+1))]:rr:(n=C(n),n.length=$r(Mr(0,r),n.length),n)},u.take=V,u.head=V,Z(u),u.VERSION="2.4.2",u.prototype.chain=function(){return this.__chain__=true,this},u.prototype.value=function(){return this.__wrapped__},D("pop push reverse shift sort splice unshift".split(" "),function(n){var r=jr[n]; u.prototype[n]=function(){var n=this.__wrapped__;return r.apply(n,arguments),zr.spliceObjects||0!==n.length||delete n[0],this}}),D(["concat","join","slice"],function(n){var r=jr[n];u.prototype[n]=function(){var n=r.apply(this.__wrapped__,arguments);return this.__chain__&&(n=new o(n),n.__chain__=true),n}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(mr._=u, define(function(){return u})):_r&&dr?br?(dr.exports=u)._=u:_r._=u:mr._=u}).call(this); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/lodash.js b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/lodash.js index 5b37903..5013f5c 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/lodash.js +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/lodash.js @@ -1,10 +1,10 @@ /** * @license - * Lo-Dash 2.4.1 + * Lo-Dash 2.4.2 * Copyright 2012-2013 The Dojo Foundation * Based on Underscore.js 1.5.2 * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - * Available under MIT license + * Available under MIT license */ ;(function() { @@ -1835,6 +1835,7 @@ var setBindData = !defineProperty ? noop : function(func, value) { descriptor.value = value; defineProperty(func, '__bindData__', descriptor); + descriptor.value = null; }; /** @@ -6506,7 +6507,7 @@ * debugging. See http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl * * For more information on precompiling templates see: - * http://lodash.com/custom-builds + * https://lodash.com/custom-builds * * For more information on Chrome extension sandboxes see: * http://developer.chrome.com/stable/extensions/sandboxingEval.html @@ -7075,7 +7076,7 @@ * @memberOf _ * @type string */ - lodash.VERSION = '2.4.1'; + lodash.VERSION = '2.4.2'; // add "Chaining" functions to the wrapper lodash.prototype.chain = wrapperChain; diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/package.json b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/package.json index 5eaef06..e4c0b2e 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/package.json +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/lodash/package.json @@ -1,6 +1,6 @@ { "name": "lodash", - "version": "2.4.1", + "version": "2.4.2", "description": "A utility library delivering consistency, customization, performance, & extras.", "homepage": "http://lodash.com/", "license": "MIT", @@ -46,7 +46,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/lodash/lodash.git" + "url": "git+https://github.com/lodash/lodash.git" }, "engines": [ "node", @@ -95,8 +95,43 @@ "vendor" ] }, - "readme": "# Lo-Dash v2.4.1\nA utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features).\n\n## Download\n\nCheck out our [wiki]([https://github.com/lodash/lodash/wiki/build-differences]) for details over the differences between builds.\n\n* Modern builds perfect for newer browsers/environments:
\n[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.js) &\n[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.min.js)\n\n* Compatibility builds for older environment support too:
\n[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.js) &\n[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.compat.min.js)\n\n* Underscore builds to use as a drop-in replacement:
\n[Development](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js) &\n[Production](https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.min.js)\n\nCDN copies are available on [cdnjs](http://cdnjs.com/libraries/lodash.js/) & [jsDelivr](http://www.jsdelivr.com/#!lodash). For smaller file sizes, create [custom builds](http://lodash.com/custom-builds) with only the features needed.\n\nLove modules? We’ve got you covered with [lodash-amd](https://npmjs.org/package/lodash-amd), [lodash-es6](https://github.com/lodash/lodash-es6), [lodash-node](https://npmjs.org/package/lodash-node), & [npm packages](https://npmjs.org/browse/keyword/lodash-modularized) per method.\n\n## Dive in\n\nThere’s plenty of **[documentation](http://lodash.com/docs)**, [unit tests](http://lodash.com/tests), & [benchmarks](http://lodash.com/benchmarks).
\nCheck out DevDocs as a fast, organized, & searchable interface for our documentation.\n\nThe full changelog for this release is available on our [wiki](https://github.com/lodash/lodash/wiki/Changelog).
\nA list of upcoming features is available on our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap).\n\n## Features *not* in Underscore\n\n * AMD loader support ([curl](https://github.com/cujojs/curl), [dojo](http://dojotoolkit.org/), [requirejs](http://requirejs.org/), etc.)\n * [_(…)](http://lodash.com/docs#_) supports intuitive chaining\n * [_.at](http://lodash.com/docs#at) for cherry-picking collection values\n * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”*](http://michaux.ca/articles/lazy-function-definition-pattern) defined methods\n * [_.clone](http://lodash.com/docs#clone) supports shallow cloning of `Date` & `RegExp` objects\n * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays & objects\n * [_.constant](http://lodash.com/docs#constant) & [_.property](http://lodash.com/docs#property) function generators for composing functions\n * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex`\n * [_.create](http://lodash.com/docs#create) for easier object inheritance\n * [_.createCallback](http://lodash.com/docs#createCallback) for extending callbacks in methods & mixins\n * [_.curry](http://lodash.com/docs#curry) for creating [curried](http://hughfdjackson.com/javascript/2013/07/06/why-curry-helps/) functions\n * [_.debounce](http://lodash.com/docs#debounce) & [_.throttle](http://lodash.com/docs#throttle) accept additional `options` for more control\n * [_.findIndex](http://lodash.com/docs#findIndex) & [_.findKey](http://lodash.com/docs#findKey) for finding indexes & keys\n * [_.forEach](http://lodash.com/docs#forEach) is chainable & supports exiting early\n * [_.forIn](http://lodash.com/docs#forIn) for iterating own & inherited properties\n * [_.forOwn](http://lodash.com/docs#forOwn) for iterating own properties\n * [_.isPlainObject](http://lodash.com/docs#isPlainObject) for checking if values are created by `Object`\n * [_.mapValues](http://lodash.com/docs#mapValues) for [mapping](http://lodash.com/docs#map) values to an object\n * [_.memoize](http://lodash.com/docs#memoize) exposes the `cache` of memoized functions\n * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend)\n * [_.noop](http://lodash.com/docs#noop) for function placeholders\n * [_.now](http://lodash.com/docs#now) as a cross-browser `Date.now` alternative\n * [_.parseInt](http://lodash.com/docs#parseInt) for consistent behavior\n * [_.pull](http://lodash.com/docs#pull) & [_.remove](http://lodash.com/docs#remove) for mutating arrays\n * [_.random](http://lodash.com/docs#random) supports returning floating-point numbers\n * [_.runInContext](http://lodash.com/docs#runInContext) for easier mocking\n * [_.sortBy](http://lodash.com/docs#sortBy) supports sorting by multiple properties\n * [_.support](http://lodash.com/docs#support) for flagging environment features\n * [_.template](http://lodash.com/docs#template) supports [*“imports”*](http://lodash.com/docs#templateSettings_imports) options & [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-literals-string-literals)\n * [_.transform](http://lodash.com/docs#transform) as a powerful alternative to [_.reduce](http://lodash.com/docs#reduce) for transforming objects\n * [_.where](http://lodash.com/docs#where) supports deep object comparisons\n * [_.xor](http://lodash.com/docs#xor) as a companion to [_.difference](http://lodash.com/docs#difference), [_.intersection](http://lodash.com/docs#intersection), & [_.union](http://lodash.com/docs#union)\n * [_.zip](http://lodash.com/docs#zip) is capable of unzipping values\n * [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick), &\n [more](http://lodash.com/docs \"_.assign, _.clone, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest\") accept callbacks\n * [_.contains](http://lodash.com/docs#contains), [_.toArray](http://lodash.com/docs#toArray), &\n [more](http://lodash.com/docs \"_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.forEachRight, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.size, _.some, _.sortBy, _.where\") accept strings\n * [_.filter](http://lodash.com/docs#filter), [_.map](http://lodash.com/docs#map), &\n [more](http://lodash.com/docs \"_.countBy, _.every, _.find, _.findKey, _.findLast, _.findLastIndex, _.findLastKey, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq\") support *“_.pluck”* & *“_.where”* shorthands\n * [_.findLast](http://lodash.com/docs#findLast), [_.findLastIndex](http://lodash.com/docs#findLastIndex), &\n [more](http://lodash.com/docs \"_.findLastKey, _.forEachRight, _.forInRight, _.forOwnRight, _.partialRight\") right-associative methods\n\n## Resources\n\n * Podcasts\n - [JavaScript Jabber](http://javascriptjabber.com/079-jsj-lo-dash-with-john-david-dalton/)\n\n * Posts\n - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/)\n - [Custom builds in Lo-Dash 2.0](http://kitcambridge.be/blog/custom-builds-in-lo-dash-2-dot-0/)\n\n * Videos\n - [Introduction](https://vimeo.com/44154599)\n - [Origins](https://vimeo.com/44154600)\n - [Optimizations & builds](https://vimeo.com/44154601)\n - [Native method use](https://vimeo.com/48576012)\n - [Testing](https://vimeo.com/45865290)\n - [CascadiaJS ’12](http://www.youtube.com/watch?v=dpPy4f_SeEk)\n\n A list of other community created podcasts, posts, & videos is available on our [wiki](https://github.com/lodash/lodash/wiki/Resources).\n\n## Support\n\nTested in Chrome 5~31, Firefox 2~25, IE 6-11, Opera 9.25~17, Safari 3-7, Node.js 0.6.21~0.10.22, Narwhal 0.3.2, PhantomJS 1.9.2, RingoJS 0.9, & Rhino 1.7RC5.
\nAutomated browser test results [are available](https://saucelabs.com/u/lodash) as well as [Travis CI](https://travis-ci.org/) builds for [lodash](https://travis-ci.org/lodash/lodash/), [lodash-cli](https://travis-ci.org/lodash/lodash-cli/), [lodash-amd](https://travis-ci.org/lodash/lodash-amd/), [lodash-node](https://travis-ci.org/lodash/lodash-node/), & [grunt-lodash](https://travis-ci.org/lodash/grunt-lodash).\n\nSpecial thanks to [Sauce Labs](https://saucelabs.com/) for providing automated browser testing.
\n[![Sauce Labs](http://lodash.com/_img/sauce.png)](https://saucelabs.com/ \"Sauce Labs: Selenium Testing & More\")\n\n## Installation & usage\n\nIn browsers:\n\n```html\n\n```\n\nUsing [`npm`](http://npmjs.org/):\n\n```bash\nnpm i --save lodash\n\n{sudo} npm i -g lodash\nnpm ln lodash\n```\n\nIn [Node.js](http://nodejs.org/) & [Ringo](http://ringojs.org/):\n\n```js\nvar _ = require('lodash');\n// or as Underscore\nvar _ = require('lodash/dist/lodash.underscore');\n```\n\n**Notes:**\n * Don’t assign values to [special variable](http://nodejs.org/api/repl.html#repl_repl_features) `_` when in the REPL\n * If Lo-Dash is installed globally, run [`npm ln lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory *before* requiring it\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('lodash.js');\n```\n\nIn an AMD loader:\n\n```js\nrequire({\n 'packages': [\n { 'name': 'lodash', 'location': 'path/to/lodash', 'main': 'lodash' }\n ]\n},\n['lodash'], function(_) {\n console.log(_.VERSION);\n});\n```\n\n## Author\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## Contributors\n\n| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](https://twitter.com/blainebublitz \"Follow @BlaineBublitz on Twitter\") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge \"Follow @kitcambridge on Twitter\") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|---|---|\n| [Blaine Bublitz](http://www.iceddev.com/) | [Kit Cambridge](http://kitcambridge.be/) | [Mathias Bynens](http://mathiasbynens.be/) |\n\n[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/lodash/lodash/trend.png)](https://bitdeli.com/free \"Bitdeli Badge\")\n", - "readmeFilename": "README.md", - "_id": "lodash@2.4.1", - "_from": "lodash@~2.4.1" + "_id": "lodash@2.4.2", + "scripts": {}, + "_shasum": "fadd834b9683073da179b3eae6d9c0d15053f73e", + "_from": "lodash@>=2.4.1 <2.5.0", + "_npmVersion": "2.7.5", + "_nodeVersion": "0.12.2", + "_npmUser": { + "name": "jdalton", + "email": "john.david.dalton@gmail.com" + }, + "maintainers": [ + { + "name": "jdalton", + "email": "john.david.dalton@gmail.com" + }, + { + "name": "mathias", + "email": "mathias@qiwi.be" + }, + { + "name": "phated", + "email": "blaine@iceddev.com" + }, + { + "name": "kitcambridge", + "email": "github@kitcambridge.be" + }, + { + "name": "d10", + "email": "demoneaux@gmail.com" + } + ], + "dist": { + "shasum": "fadd834b9683073da179b3eae6d9c0d15053f73e", + "tarball": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/underscore.string/package.json b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/underscore.string/package.json index aa07712..70f29bf 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/underscore.string/package.json +++ b/node_modules/grunt/node_modules/grunt-legacy-log/node_modules/underscore.string/package.json @@ -56,7 +56,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/epeli/underscore.string.git" + "url": "git+https://github.com/epeli/underscore.string.git" }, "bugs": { "url": "https://github.com/epeli/underscore.string/issues" @@ -66,8 +66,33 @@ "type": "MIT" } ], - "readme": "# Underscore.string [![Build Status](https://secure.travis-ci.org/epeli/underscore.string.png?branch=master)](http://travis-ci.org/epeli/underscore.string) #\n\n\n\nJavascript lacks complete string manipulation operations.\nThis an attempt to fill that gap. List of build-in methods can be found\nfor example from [Dive Into JavaScript][d].\n\n[d]: http://www.diveintojavascript.com/core-javascript-reference/the-string-object\n\n\nAs name states this an extension for [Underscore.js][u], but it can be used\nindependently from **_s**-global variable. But with Underscore.js you can\nuse Object-Oriented style and chaining:\n\n[u]: http://documentcloud.github.com/underscore/\n\n```javascript\n_(\" epeli \").chain().trim().capitalize().value()\n=> \"Epeli\"\n```\n\n## Download ##\n\n * [Development version](https://raw.github.com/epeli/underscore.string/master/lib/underscore.string.js) *Uncompressed with Comments 18kb*\n * [Production version](https://github.com/epeli/underscore.string/raw/master/dist/underscore.string.min.js) *Minified 7kb*\n\n\n## Node.js installation ##\n\n**npm package**\n\n npm install underscore.string\n\n**Standalone usage**:\n\n```javascript\nvar _s = require('underscore.string');\n```\n\n**Integrate with Underscore.js**:\n\n```javascript\nvar _ = require('underscore');\n\n// Import Underscore.string to separate object, because there are conflict functions (include, reverse, contains)\n_.str = require('underscore.string');\n\n// Mix in non-conflict functions to Underscore namespace if you want\n_.mixin(_.str.exports());\n\n// All functions, include conflict, will be available through _.str object\n_.str.include('Underscore.string', 'string'); // => true\n```\n\n**Or Integrate with Underscore.js without module loading**\n\nRun the following expression after Underscore.js and Underscore.string are loaded\n```javascript\n// _.str becomes a global variable if no module loading is detected\n// Mix in non-conflict functions to Underscore namespace\n_.mixin(_.str.exports());\n```\n\n## String Functions ##\n\nFor availability of functions in this way you need to mix in Underscore.string functions:\n\n```javascript\n_.mixin(_.string.exports());\n```\n\notherwise functions from examples will be available through _.string or _.str objects:\n\n```javascript\n_.str.capitalize('epeli')\n=> \"Epeli\"\n```\n\n**numberFormat** _.numberFormat(number, [ decimals=0, decimalSeparator='.', orderSeparator=','])\n\nFormats the numbers.\n\n```javascript\n_.numberFormat(1000, 2)\n=> \"1,000.00\"\n\n_.numberFormat(123456789.123, 5, '.', ',')\n=> \"123,456,789.12300\"\n```\n\n\n**levenshtein** _.levenshtein(string1, string2)\n\nCalculates [Levenshtein distance][ld] between two strings.\n[ld]: http://en.wikipedia.org/wiki/Levenshtein_distance\n\n```javascript\n_.levenshtein('kitten', 'kittah')\n=> 2\n```\n\n**capitalize** _.capitalize(string)\n\nConverts first letter of the string to uppercase.\n\n```javascript\n_.capitalize(\"foo Bar\")\n=> \"Foo Bar\"\n```\n\n**chop** _.chop(string, step)\n\n```javascript\n_.chop('whitespace', 3)\n=> ['whi','tes','pac','e']\n```\n\n**clean** _.clean(str)\n\nCompress some whitespaces to one.\n\n```javascript\n_.clean(\" foo bar \")\n=> 'foo bar'\n```\n\n**chars** _.chars(str)\n\n```javascript\n_.chars('Hello')\n=> ['H','e','l','l','o']\n```\n\n**swapCase** _.swapCase(str)\n\nReturns a copy of the string in which all the case-based characters have had their case swapped.\n\n```javascript\n_.swapCase('hELLO')\n=> 'Hello'\n```\n\n**include** available only through _.str object, because Underscore has function with the same name.\n\n```javascript\n_.str.include(\"foobar\", \"ob\")\n=> true\n```\n\n(removed) **includes** _.includes(string, substring)\n\nTests if string contains a substring.\n\n```javascript\n_.includes(\"foobar\", \"ob\")\n=> true\n```\n\n**includes** function was removed\n\nBut you can create it in this way, for compatibility with previous versions:\n\n```javascript\n_.includes = _.str.include\n```\n\n**count** _.count(string, substring)\n\n```javascript\n_('Hello world').count('l')\n=> 3\n```\n\n**escapeHTML** _.escapeHTML(string)\n\nConverts HTML special characters to their entity equivalents.\n\n```javascript\n_('
Blah blah blah
').escapeHTML();\n=> '<div>Blah blah blah</div>'\n```\n\n**unescapeHTML** _.unescapeHTML(string)\n\nConverts entity characters to HTML equivalents.\n\n```javascript\n_('<div>Blah blah blah</div>').unescapeHTML();\n=> '
Blah blah blah
'\n```\n\n**insert** _.insert(string, index, substing)\n\n```javascript\n_('Hello ').insert(6, 'world')\n=> 'Hello world'\n```\n\n**isBlank** _.isBlank(string)\n\n```javascript\n_('').isBlank(); // => true\n_('\\n').isBlank(); // => true\n_(' ').isBlank(); // => true\n_('a').isBlank(); // => false\n```\n\n**join** _.join(separator, *strings)\n\nJoins strings together with given separator\n\n```javascript\n_.join(\" \", \"foo\", \"bar\")\n=> \"foo bar\"\n```\n\n**lines** _.lines(str)\n\n```javascript\n_.lines(\"Hello\\nWorld\")\n=> [\"Hello\", \"World\"]\n```\n\n**reverse** available only through _.str object, because Underscore has function with the same name.\n\nReturn reversed string:\n\n```javascript\n_.str.reverse(\"foobar\")\n=> 'raboof'\n```\n\n**splice** _.splice(string, index, howmany, substring)\n\nLike a array splice.\n\n```javascript\n_('https://edtsech@bitbucket.org/edtsech/underscore.strings').splice(30, 7, 'epeli')\n=> 'https://edtsech@bitbucket.org/epeli/underscore.strings'\n```\n\n**startsWith** _.startsWith(string, starts)\n\nThis method checks whether string starts with starts.\n\n```javascript\n_(\"image.gif\").startsWith(\"image\")\n=> true\n```\n\n**endsWith** _.endsWith(string, ends)\n\nThis method checks whether string ends with ends.\n\n```javascript\n_(\"image.gif\").endsWith(\"gif\")\n=> true\n```\n\n**succ** _.succ(str)\n\nReturns the successor to str.\n\n```javascript\n_('a').succ()\n=> 'b'\n\n_('A').succ()\n=> 'B'\n```\n\n**supplant**\n\nSupplant function was removed, use Underscore.js [template function][p].\n\n[p]: http://documentcloud.github.com/underscore/#template\n\n**strip** alias for *trim*\n\n**lstrip** alias for *ltrim*\n\n**rstrip** alias for *rtrim*\n\n**titleize** _.titleize(string)\n\n```javascript\n_('my name is epeli').titleize()\n=> 'My Name Is Epeli'\n```\n\n**camelize** _.camelize(string)\n\nConverts underscored or dasherized string to a camelized one\n\n```javascript\n_('-moz-transform').camelize()\n=> 'MozTransform'\n```\n\n**classify** _.classify(string)\n\nConverts string to camelized class name\n\n```javascript\n_('some_class_name').classify()\n=> 'SomeClassName'\n```\n\n**underscored** _.underscored(string)\n\nConverts a camelized or dasherized string into an underscored one\n\n```javascript\n_('MozTransform').underscored()\n=> 'moz_transform'\n```\n\n**dasherize** _.dasherize(string)\n\nConverts a underscored or camelized string into an dasherized one\n\n```javascript\n_('MozTransform').dasherize()\n=> '-moz-transform'\n```\n\n**humanize** _.humanize(string)\n\nConverts an underscored, camelized, or dasherized string into a humanized one.\nAlso removes beginning and ending whitespace, and removes the postfix '_id'.\n\n```javascript\n_(' capitalize dash-CamelCase_underscore trim ').humanize()\n=> 'Capitalize dash camel case underscore trim'\n```\n\n**trim** _.trim(string, [characters])\n\ntrims defined characters from begining and ending of the string.\nDefaults to whitespace characters.\n\n```javascript\n_.trim(\" foobar \")\n=> \"foobar\"\n\n_.trim(\"_-foobar-_\", \"_-\")\n=> \"foobar\"\n```\n\n\n**ltrim** _.ltrim(string, [characters])\n\nLeft trim. Similar to trim, but only for left side.\n\n\n**rtrim** _.rtrim(string, [characters])\n\nRight trim. Similar to trim, but only for right side.\n\n**truncate** _.truncate(string, length, truncateString)\n\n```javascript\n_('Hello world').truncate(5)\n=> 'Hello...'\n\n_('Hello').truncate(10)\n=> 'Hello'\n```\n\n**prune** _.prune(string, length, pruneString)\n\nElegant version of truncate.\nMakes sure the pruned string does not exceed the original length.\nAvoid half-chopped words when truncating.\n\n```javascript\n_('Hello, world').prune(5)\n=> 'Hello...'\n\n_('Hello, world').prune(8)\n=> 'Hello...'\n\n_('Hello, world').prune(5, ' (read a lot more)')\n=> 'Hello, world' (as adding \"(read a lot more)\" would be longer than the original string)\n\n_('Hello, cruel world').prune(15)\n=> 'Hello, cruel...'\n\n_('Hello').prune(10)\n=> 'Hello'\n```\n\n**words** _.words(str, delimiter=/\\s+/)\n\nSplit string by delimiter (String or RegExp), /\\s+/ by default.\n\n```javascript\n_.words(\" I love you \")\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\"I_love_you\", \"_\")\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\"I-love-you\", /-/)\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\" \")\n=> []\n```\n\n**sprintf** _.sprintf(string format, *arguments)\n\nC like string formatting.\nCredits goes to [Alexandru Marasteanu][o].\nFor more detailed documentation, see the [original page][o].\n\n[o]: http://www.diveintojavascript.com/projects/sprintf-for-javascript\n\n```javascript\n_.sprintf(\"%.1f\", 1.17)\n\"1.2\"\n```\n\n**pad** _.pad(str, length, [padStr, type])\n\npads the `str` with characters until the total string length is equal to the passed `length` parameter. By default, pads on the **left** with the space char (`\" \"`). `padStr` is truncated to a single character if necessary.\n\n```javascript\n_.pad(\"1\", 8)\n-> \" 1\";\n\n_.pad(\"1\", 8, '0')\n-> \"00000001\";\n\n_.pad(\"1\", 8, '0', 'right')\n-> \"10000000\";\n\n_.pad(\"1\", 8, '0', 'both')\n-> \"00001000\";\n\n_.pad(\"1\", 8, 'bleepblorp', 'both')\n-> \"bbbb1bbb\";\n```\n\n**lpad** _.lpad(str, length, [padStr])\n\nleft-pad a string. Alias for `pad(str, length, padStr, 'left')`\n\n```javascript\n_.lpad(\"1\", 8, '0')\n-> \"00000001\";\n```\n\n**rpad** _.rpad(str, length, [padStr])\n\nright-pad a string. Alias for `pad(str, length, padStr, 'right')`\n\n```javascript\n_.rpad(\"1\", 8, '0')\n-> \"10000000\";\n```\n\n**lrpad** _.lrpad(str, length, [padStr])\n\nleft/right-pad a string. Alias for `pad(str, length, padStr, 'both')`\n\n```javascript\n_.lrpad(\"1\", 8, '0')\n-> \"00001000\";\n```\n\n**center** alias for **lrpad**\n\n**ljust** alias for *rpad*\n\n**rjust** alias for *lpad*\n\n**toNumber** _.toNumber(string, [decimals])\n\nParse string to number. Returns NaN if string can't be parsed to number.\n\n```javascript\n_('2.556').toNumber()\n=> 3\n\n_('2.556').toNumber(1)\n=> 2.6\n```\n\n**strRight** _.strRight(string, pattern)\n\nSearches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strRight('_')\n=> \"is_a_test_string\";\n```\n\n**strRightBack** _.strRightBack(string, pattern)\n\nSearches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strRightBack('_')\n=> \"string\";\n```\n\n**strLeft** _.strLeft(string, pattern)\n\nSearches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strLeft('_')\n=> \"This\";\n```\n\n**strLeftBack** _.strLeftBack(string, pattern)\n\nSearches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strLeftBack('_')\n=> \"This_is_a_test\";\n```\n\n**stripTags**\n\nRemoves all html tags from string.\n\n```javascript\n_('a link').stripTags()\n=> 'a link'\n\n_('a link').stripTags()\n=> 'a linkalert(\"hello world!\")'\n```\n\n**toSentence** _.toSentence(array, [delimiter, lastDelimiter])\n\nJoin an array into a human readable sentence.\n\n```javascript\n_.toSentence(['jQuery', 'Mootools', 'Prototype'])\n=> 'jQuery, Mootools and Prototype';\n\n_.toSentence(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ')\n=> 'jQuery, Mootools unt Prototype';\n```\n\n**toSentenceSerial** _.toSentenceSerial(array, [delimiter, lastDelimiter])\n\nThe same as `toSentence`, but adjusts delimeters to use [Serial comma](http://en.wikipedia.org/wiki/Serial_comma).\n\n```javascript\n_.toSentenceSerial(['jQuery', 'Mootools'])\n=> 'jQuery and Mootools';\n\n_.toSentenceSerial(['jQuery', 'Mootools', 'Prototype'])\n=> 'jQuery, Mootools, and Prototype'\n\n_.toSentenceSerial(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ');\n=> 'jQuery, Mootools, unt Prototype';\n```\n\n**repeat** _.repeat(string, count, [separator])\n\nRepeats a string count times.\n\n```javascript\n_.repeat(\"foo\", 3)\n=> 'foofoofoo';\n\n_.repeat(\"foo\", 3, \"bar\")\n=> 'foobarfoobarfoo'\n```\n\n**surround** _.surround(string, wrap)\n\nSurround a string with another string.\n\n```javascript\n_.surround(\"foo\", \"ab\")\n=> 'abfooab';\n```\n\n**quote** _.quote(string, quoteChar) or _.q(string, quoteChar)\n\nQuotes a string. `quoteChar` defaults to `\"`.\n\n```javascript\n_.quote('foo', quoteChar)\n=> '\"foo\"';\n```\n**unquote** _.unquote(string, quoteChar)\n\nUnquotes a string. `quoteChar` defaults to `\"`.\n\n```javascript\n_.unquote('\"foo\"')\n=> 'foo';\n_.unquote(\"'foo'\", \"'\")\n=> 'foo';\n```\n\n\n**slugify** _.slugify(string)\n\nTransform text into a URL slug. Replaces whitespaces, accentuated, and special characters with a dash.\n\n```javascript\n_.slugify(\"Un éléphant à l'orée du bois\")\n=> 'un-elephant-a-loree-du-bois';\n```\n\n***Caution: this function is charset dependent***\n\n**naturalCmp** array.sort(_.naturalCmp)\n\nNaturally sort strings like humans would do.\n\n```javascript\n['foo20', 'foo5'].sort(_.naturalCmp)\n=> [ 'foo5', 'foo20' ]\n```\n\n**toBoolean** _.toBoolean(string) or _.toBool(string)\n\nTurn strings that can be commonly considered as booleas to real booleans. Such as \"true\", \"false\", \"1\" and \"0\". This function is case insensitive.\n\n```javascript\n_.toBoolean(\"true\")\n=> true\n_.toBoolean(\"FALSE\")\n=> false\n_.toBoolean(\"random\")\n=> undefined\n```\n\nIt can be customized by giving arrays of truth and falsy value matcher as parameters. Matchers can be also RegExp objects.\n\n```javascript\n_.toBoolean(\"truthy\", [\"truthy\"], [\"falsy\"])\n=> true\n_.toBoolean(\"true only at start\", [/^true/])\n=> true\n```\n\n## Roadmap ##\n\nAny suggestions or bug reports are welcome. Just email me or more preferably open an issue.\n\n#### Problems\n\nWe lose two things for `include` and `reverse` methods from `_.string`:\n\n* Calls like `_('foobar').include('bar')` aren't available;\n* Chaining isn't available too.\n\nBut if you need this functionality you can create aliases for conflict functions which will be convenient for you:\n\n```javascript\n_.mixin({\n includeString: _.str.include,\n reverseString: _.str.reverse\n})\n\n// Now wrapper calls and chaining are available.\n_('foobar').chain().reverseString().includeString('rab').value()\n```\n\n#### Standalone Usage\n\nIf you are using Underscore.string without Underscore. You also have `_.string` namespace for it and `_.str` alias\nBut of course you can just reassign `_` variable with `_.string`\n\n```javascript\n_ = _.string\n```\n\n## Changelog ##\n\n### 2.3.3 ###\n\n* Add `toBoolean`\n* Add `unquote`\n* Add quote char option to `quote`\n* Support dash-separated words in `titleize`\n\n### 2.3.2 ###\n\n* Add `naturalCmp`\n* Bug fix to `camelize`\n* Add ă, ș, ț and ś to `slugify`\n* Doc updates\n* Add support for [component](http://component.io/)\n* [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.1...v2.3.2)\n\n### 2.3.1 ###\n\n* Bug fixes to `escapeHTML`, `classify`, `substr`\n* Faster `count`\n* Documentation fixes\n* [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.0...v2.3.1)\n\n### 2.3.0 ###\n\n* Added `numberformat` method\n* Added `levenshtein` method (Levenshtein distance calculation)\n* Added `swapCase` method\n* Changed default behavior of `words` method\n* Added `toSentenceSerial` method\n* Added `surround` and `quote` methods\n\n### 2.2.1 ###\n\n* Same as 2.2.0 (2.2.0rc on npm) to fix some npm drama\n\n### 2.2.0 ###\n\n* Capitalize method behavior changed\n* Various perfomance tweaks\n\n### 2.1.1###\n\n* Fixed words method bug\n* Added classify method\n\n### 2.1.0 ###\n\n* AMD support\n* Added toSentence method\n* Added slugify method\n* Lots of speed optimizations\n\n### 2.0.0 ###\n\n* Added prune, humanize functions\n* Added _.string (_.str) namespace for Underscore.string library\n* Removed includes function\n\nFor upgrading to this version you need to mix in Underscore.string library to Underscore object:\n\n```javascript\n_.mixin(_.string.exports());\n```\n\nand all non-conflict Underscore.string functions will be available through Underscore object.\nAlso function `includes` has been removed, you should replace this function by `_.str.include`\nor create alias `_.includes = _.str.include` and all your code will work fine.\n\n### 1.1.6 ###\n\n* Fixed reverse and truncate\n* Added isBlank, stripTags, inlude(alias for includes)\n* Added uglifier compression\n\n### 1.1.5 ###\n\n* Added strRight, strRightBack, strLeft, strLeftBack\n\n### 1.1.4 ###\n\n* Added pad, lpad, rpad, lrpad methods and aliases center, ljust, rjust\n* Integration with Underscore 1.1.6\n\n### 1.1.3 ###\n\n* Added methods: underscored, camelize, dasherize\n* Support newer version of npm\n\n### 1.1.2 ###\n\n* Created functions: lines, chars, words functions\n\n### 1.0.2 ###\n\n* Created integration test suite with underscore.js 1.1.4 (now it's absolutely compatible)\n* Removed 'reverse' function, because this function override underscore.js 'reverse'\n\n## Contribute ##\n\n* Fork & pull request. Don't forget about tests.\n* If you planning add some feature please create issue before.\n\nOtherwise changes will be rejected.\n\n## Contributors list ##\n[Can be found here](https://github.com/epeli/underscore.string/graphs/contributors).\n\n\n## Licence ##\n\nThe MIT License\n\nCopyright (c) 2011 Esa-Matti Suuronen esa-matti@suuronen.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n", - "readmeFilename": "README.markdown", "_id": "underscore.string@2.3.3", - "_from": "underscore.string@~2.3.3" + "dist": { + "shasum": "71c08bf6b428b1133f37e78fa3a21c82f7329b0d", + "tarball": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + }, + "_from": "underscore.string@>=2.3.3 <2.4.0", + "_npmVersion": "1.2.32", + "_npmUser": { + "name": "epeli", + "email": "esa-matti@suuronen.org" + }, + "maintainers": [ + { + "name": "edtsech", + "email": "edtsech@gmail.com" + }, + { + "name": "rwz", + "email": "rwz@duckroll.ru" + }, + { + "name": "epeli", + "email": "esa-matti@suuronen.org" + } + ], + "_shasum": "71c08bf6b428b1133f37e78fa3a21c82f7329b0d", + "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "readme": "ERROR: No README data found!", + "scripts": {} } diff --git a/node_modules/grunt/node_modules/grunt-legacy-log/package.json b/node_modules/grunt/node_modules/grunt-legacy-log/package.json index 282e2b8..d0281fb 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-log/package.json +++ b/node_modules/grunt/node_modules/grunt-legacy-log/package.json @@ -44,10 +44,33 @@ "grunt-contrib-watch": "~0.6.1", "hooker": "~0.2.3" }, - "readme": "# grunt-legacy-log\n> The Grunt 0.4.x logger.\n\n[![Build Status](https://secure.travis-ci.org/gruntjs/grunt-legacy-log.png?branch=master)](http://travis-ci.org/gruntjs/grunt-legacy-log)\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n", - "readmeFilename": "README.md", "_id": "grunt-legacy-log@0.1.1", + "dist": { + "shasum": "d41f1a6abc9b0b1256a2b5ff02f4c3298dfcd57a", + "tarball": "http://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.1.tgz" + }, + "_from": "grunt-legacy-log@>=0.1.0 <0.2.0", + "_npmVersion": "1.4.4", + "_npmUser": { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + "maintainers": [ + { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + { + "name": "tkellen", + "email": "tyler@sleekcode.net" + }, + { + "name": "vladikoff", + "email": "vlad@vladikoff.com" + } + ], + "directories": {}, "_shasum": "d41f1a6abc9b0b1256a2b5ff02f4c3298dfcd57a", - "_from": "grunt-legacy-log@~0.1.0", - "_resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.1.tgz" + "_resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/grunt-legacy-util/package.json b/node_modules/grunt/node_modules/grunt-legacy-util/package.json index d0d6302..7919302 100644 --- a/node_modules/grunt/node_modules/grunt-legacy-util/package.json +++ b/node_modules/grunt/node_modules/grunt-legacy-util/package.json @@ -47,10 +47,29 @@ "temporary": "0.0.8", "grunt-contrib-watch": "~0.6.1" }, - "readme": "# grunt-legacy-util\n> deprecated utilities from grunt\n\n[![Build Status](https://secure.travis-ci.org/gruntjs/grunt-legacy-util.png?branch=master)](http://travis-ci.org/gruntjs/grunt-legacy-util)\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n\nWith the next major release of Grunt, we will no longer support these APIs. Where possible, please use the recommended modules in their place. If you would like to support or improve any of these APIs, please notify us when you have published a backwards compatible npm module—we will then recommend its usage here.\n\n`grunt.util.namespace` use [getobject] \n`grunt.util.hooker` use [hooker] \n`grunt.util.async` use [async] \n`grunt.util._` use [lodash] \n`grunt.util.exit` use [exit] \n`grunt.util.callbackify` \n`grunt.util.error` \n`grunt.util.linefeed` \n`grunt.util.normalizelf` \n`grunt.util.kindOf` use [lodash] \n`grunt.util.toArray`\n`grunt.util.repeat` \n`grunt.util.pluralize` \n`grunt.util.recurse` use [traverse] \n`grunt.util.spawn` \n\n[getobject]: https://www.npmjs.org/package/getobject\n[hooker]: https://www.npmjs.org/package/hooker\n[async]: https://www.npmjs.org/package/async\n[lodash]: https://www.npmjs.org/package/lodash\n[exit]: https://www.npmjs.org/package/exit\n[traverse]: https://www.npmjs.org/package/traverse\n", - "readmeFilename": "README.md", "_id": "grunt-legacy-util@0.2.0", + "dist": { + "shasum": "93324884dbf7e37a9ff7c026dff451d94a9e554b", + "tarball": "http://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz" + }, + "_from": "grunt-legacy-util@>=0.2.0 <0.3.0", + "_npmVersion": "1.4.4", + "_npmUser": { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + "maintainers": [ + { + "name": "tkellen", + "email": "tyler@sleekcode.net" + }, + { + "name": "cowboy", + "email": "cowboy@rj3.net" + } + ], + "directories": {}, "_shasum": "93324884dbf7e37a9ff7c026dff451d94a9e554b", - "_from": "grunt-legacy-util@~0.2.0", - "_resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz" + "_resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/hooker/package.json b/node_modules/grunt/node_modules/hooker/package.json index 97e7761..667903c 100644 --- a/node_modules/grunt/node_modules/hooker/package.json +++ b/node_modules/grunt/node_modules/hooker/package.json @@ -38,8 +38,29 @@ "scripts": { "test": "grunt test" }, - "readme": "# JavaScript Hooker\n\nMonkey-patch (hook) functions for debugging and stuff.\n\n## Getting Started\n\nThis code should work just fine in Node.js:\n\nFirst, install the module with: `npm install hooker`\n\n```javascript\nvar hooker = require('hooker');\nhooker.hook(Math, \"max\", function() {\n console.log(arguments.length + \" arguments passed\");\n});\nMath.max(5, 6, 7) // logs: \"3 arguments passed\", returns 7\n```\n\nOr in the browser:\n\n```html\n\n\n```\n\nIn the browser, you can attach Hooker's methods to any object.\n\n```html\n\n\n\n```\n\n## Documentation\n\n### hooker.hook\nMonkey-patch (hook) one or more methods of an object.\n#### Signature:\n`hooker.hook(object, [ props, ] [options | prehookFunction])`\n#### `props`\nThe optional `props` argument can be a method name, array of method names or null. If null (or omitted), all enumerable methods of `object` will be hooked.\n#### `options`\n* `pre` - (Function) a pre-hook function to be executed before the original function. Arguments passed into the method will be passed into the pre-hook function as well.\n* `post` - (Function) a post-hook function to be executed after the original function. The original function's result is passed into the post-hook function as its first argument, followed by the method arguments.\n* `once` - (Boolean) if true, auto-unhook the function after the first execution.\n* `passName` - (Boolean) if true, pass the name of the method into the pre-hook function as its first arg (preceding all other arguments), and into the post-hook function as the second arg (after result but preceding all other arguments).\n\n#### Returns:\nAn array of hooked method names.\n\n### hooker.unhook\nUn-monkey-patch (unhook) one or more methods of an object.\n#### Signature:\n`hooker.unhook(object [, props ])`\n#### `props`\nThe optional `props` argument can be a method name, array of method names or null. If null (or omitted), all methods of `object` will be unhooked.\n#### Returns:\nAn array of unhooked method names.\n\n### hooker.orig\nGet a reference to the original method from a hooked function.\n#### Signature:\n`hooker.orig(object, props)`\n\n### hooker.override\nWhen a pre- or post-hook returns the result of this function, the value\npassed will be used in place of the original function's return value. Any\npost-hook override value will take precedence over a pre-hook override value.\n#### Signature:\n`hooker.override(value)`\n\n### hooker.preempt\nWhen a pre-hook returns the result of this function, the value passed will\nbe used in place of the original function's return value, and the original\nfunction will NOT be executed.\n#### Signature:\n`hooker.preempt(value)`\n\n### hooker.filter\nWhen a pre-hook returns the result of this function, the context and\narguments passed will be applied into the original function.\n#### Signature:\n`hooker.filter(context, arguments)`\n\n\n## Examples\nSee the unit tests for more examples.\n\n```javascript\nvar hooker = require('hooker');\n// Simple logging.\nhooker.hook(Math, \"max\", function() {\n console.log(arguments.length + \" arguments passed\");\n});\nMath.max(5, 6, 7) // logs: \"3 arguments passed\", returns 7\n\nhooker.unhook(Math, \"max\"); // (This is assumed between all further examples)\nMath.max(5, 6, 7) // 7\n\n// Returning hooker.override(value) overrides the original value.\nhooker.hook(Math, \"max\", function() {\n if (arguments.length === 0) {\n return hooker.override(9000);\n }\n});\nMath.max(5, 6, 7) // 7\nMath.max() // 9000\n\n// Auto-unhook after one execution.\nhooker.hook(Math, \"max\", {\n once: true,\n pre: function() {\n console.log(\"Init something here\");\n }\n});\nMath.max(5, 6, 7) // logs: \"Init something here\", returns 7\nMath.max(5, 6, 7) // 7\n\n// Filter `this` and arguments through a pre-hook function.\nhooker.hook(Math, \"max\", {\n pre: function() {\n var args = [].map.call(arguments, function(num) {\n return num * 2;\n });\n return hooker.filter(this, args); // thisValue, arguments\n }\n});\nMath.max(5, 6, 7) // 14\n\n// Modify the original function's result with a post-hook function.\nhooker.hook(Math, \"max\", {\n post: function(result) {\n return hooker.override(result * 100);\n }\n});\nMath.max(5, 6, 7) // 700\n\n// Hook every Math method. Note: if Math's methods were enumerable, the second\n// argument could be omitted. Since they aren't, an array of properties to hook\n// must be explicitly passed. Non-method properties will be skipped.\n// See a more generic example here: http://bit.ly/vvJlrS\nhooker.hook(Math, Object.getOwnPropertyNames(Math), {\n passName: true,\n pre: function(name) {\n console.log(\"=> Math.\" + name, [].slice.call(arguments, 1));\n },\n post: function(result, name) {\n console.log(\"<= Math.\" + name, result);\n }\n});\n\nvar result = Math.max(5, 6, 7);\n// => Math.max [ 5, 6, 7 ]\n// <= Math.max 7\nresult // 7\n\nresult = Math.ceil(3.456);\n// => Math.ceil [ 3.456 ]\n// <= Math.ceil 4\nresult // 4\n```\n\n## Contributing\nIn lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using [grunt](https://github.com/cowboy/grunt).\n\n_Also, please don't edit files in the \"dist\" subdirectory as they are generated via grunt. You'll find source code in the \"lib\" subdirectory!_\n\n## Release History\n2012/01/09 - v0.2.3 - First official release.\n\n## License\nCopyright (c) 2012 \"Cowboy\" Ben Alman \nLicensed under the MIT license. \n\n", - "readmeFilename": "README.md", + "_npmUser": { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, "_id": "hooker@0.2.3", - "_from": "hooker@~0.2.3" + "optionalDependencies": {}, + "_engineSupported": true, + "_npmVersion": "1.1.0-2", + "_nodeVersion": "v0.6.8", + "_defaultsLoaded": true, + "dist": { + "shasum": "b834f723cc4a242aa65963459df6d984c5d3d959", + "tarball": "http://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + }, + "maintainers": [ + { + "name": "cowboy", + "email": "cowboy@rj3.net" + } + ], + "directories": {}, + "_shasum": "b834f723cc4a242aa65963459df6d984c5d3d959", + "_from": "hooker@>=0.2.3 <0.3.0", + "_resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/iconv-lite/package.json b/node_modules/grunt/node_modules/iconv-lite/package.json index 098d1f3..9a4c66a 100644 --- a/node_modules/grunt/node_modules/iconv-lite/package.json +++ b/node_modules/grunt/node_modules/iconv-lite/package.json @@ -70,11 +70,28 @@ "vows": "", "iconv": ">=1.1" }, - "readme": "iconv-lite - pure javascript character encoding conversion\n======================================================================\n\n[![Build Status](https://secure.travis-ci.org/ashtuchkin/iconv-lite.png?branch=master)](http://travis-ci.org/ashtuchkin/iconv-lite)\n\n## Features\n\n* Pure javascript. Doesn't need native code compilation.\n* Easy API.\n* Works on Windows and in sandboxed environments like [Cloud9](http://c9.io).\n* Encoding is much faster than node-iconv (see below for performance comparison).\n\n## Usage\n\n var iconv = require('iconv-lite');\n \n // Convert from an encoded buffer to string.\n str = iconv.decode(buf, 'win1251');\n \n // Convert from string to an encoded buffer.\n buf = iconv.encode(\"Sample input string\", 'win1251');\n\n // Check if encoding is supported\n iconv.encodingExists(\"us-ascii\")\n\n\n## Supported encodings\n\n* All node.js native encodings: 'utf8', 'ucs2', 'ascii', 'binary', 'base64'\n* All widespread single byte encodings: Windows 125x family, ISO-8859 family, \n IBM/DOS codepages, Macintosh family, KOI8 family. \n Aliases like 'latin1', 'us-ascii' also supported.\n* Multibyte encodings: 'gbk', 'gb2313', 'Big5', 'cp950'.\n\nOthers are easy to add, see the source. Please, participate.\nMost encodings are generated from node-iconv. Thank you Ben Noordhuis and iconv authors!\n\nNot supported yet: EUC family, Shift_JIS.\n\n\n## Encoding/decoding speed\n\nComparison with node-iconv module (1000x256kb, on Ubuntu 12.04, Core i5/2.5 GHz, Node v0.8.7). \nNote: your results may vary, so please always check on your hardware.\n\n operation iconv@1.2.4 iconv-lite@0.2.4 \n ----------------------------------------------------------\n encode('win1251') ~115 Mb/s ~230 Mb/s\n decode('win1251') ~95 Mb/s ~130 Mb/s\n\n\n## Notes\n\nWhen decoding, a 'binary'-encoded string can be used as a source buffer. \nUntranslatable characters are set to � or ?. No transliteration is currently supported, pull requests are welcome.\n\n## Testing\n\n git clone git@github.com:ashtuchkin/iconv-lite.git\n cd iconv-lite\n npm install\n npm test\n \n # To view performance:\n node test/performance.js\n\n## TODO\n\n* Support streaming character conversion, something like util.pipe(req, iconv.fromEncodingStream('latin1')).\n* Add more encodings.\n* Add transliteration (best fit char).\n* Add tests and correct support of variable-byte encodings (currently work is delegated to node).\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/ashtuchkin/iconv-lite/issues" }, "_id": "iconv-lite@0.2.11", - "_from": "iconv-lite@~0.2.11" + "dist": { + "shasum": "1ce60a3a57864a292d1321ff4609ca4bb965adc8", + "tarball": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + }, + "_from": "iconv-lite@>=0.2.11 <0.3.0", + "_npmVersion": "1.3.2", + "_npmUser": { + "name": "ashtuchkin", + "email": "ashtuchkin@gmail.com" + }, + "maintainers": [ + { + "name": "ashtuchkin", + "email": "ashtuchkin@gmail.com" + } + ], + "directories": {}, + "_shasum": "1ce60a3a57864a292d1321ff4609ca4bb965adc8", + "_resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esparse b/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esparse index 7423b18..2b5398f 120000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esparse +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esparse @@ -1 +1,15 @@ -../esprima/bin/esparse.js \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../esprima/bin/esparse.js" "$@" + ret=$? +else + node "$basedir/../esprima/bin/esparse.js" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esvalidate b/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esvalidate index 16069ef..6d6df8a 120000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esvalidate +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/.bin/esvalidate @@ -1 +1,15 @@ -../esprima/bin/esvalidate.js \ No newline at end of file +#!/bin/sh +basedir=`dirname "$0"` + +case `uname` in + *CYGWIN*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../esprima/bin/esvalidate.js" "$@" + ret=$? +else + node "$basedir/../esprima/bin/esvalidate.js" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/HISTORY.md b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/HISTORY.md index 102f82b..bb97617 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/HISTORY.md +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/HISTORY.md @@ -1,3 +1,9 @@ +0.1.16 / 2013-12-01 +------------------- + +* Maintenance release. Updated dependencies and docs. + + 0.1.15 / 2013-05-13 ------------------- diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/README.md b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/README.md index f20e0c1..b7e8473 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/README.md +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/README.md @@ -80,12 +80,12 @@ Creates a new ArgumentParser object. - ```description``` - Text to display before the argument help. - ```epilog``` - Text to display after the argument help. -- ```addHelp``` - Add a -h/–help option to the parser. (default: True) -- ```argumentDefault``` - Set the global default value for arguments. (default: None) +- ```addHelp``` - Add a -h/–help option to the parser. (default: true) +- ```argumentDefault``` - Set the global default value for arguments. (default: null) - ```parents``` - A list of ArgumentParser objects whose arguments should also be included. - ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘) - ```formatterClass``` - A class for customizing the help output. -- ```prog``` - The name of the program (default: sys.argv[0]) +- ```prog``` - The name of the program (default: `path.basename(process.argv[1])`) - ```usage``` - The string describing the program usage (default: generated) - ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals. diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js index 97cf098..103c337 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js @@ -33,7 +33,7 @@ var Namespace = require('./namespace'); * Create a new ArgumentParser object. * * ##### Options: - * - `prog` The name of the program (default: sys.argv[0]) + * - `prog` The name of the program (default: Path.basename(process.argv[1])) * - `usage` A usage message (default: auto-generated from arguments) * - `description` A description of what the program does * - `epilog` Text following the argument descriptions @@ -311,13 +311,15 @@ ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) { // of two different mutually exclusive groups. function actionHash(action) { - // some sort of hashable key for this action - // action itself cannot be a key in actionConflicts - // I think getName() (join of optionStrings) is unique enough - return action.getName(); - } + // some sort of hashable key for this action + // action itself cannot be a key in actionConflicts + // I think getName() (join of optionStrings) is unique enough + return action.getName(); + } + var conflicts, key; var actionConflicts = {}; + this._mutuallyExclusiveGroups.forEach(function (mutexGroup) { mutexGroup._groupActions.forEach(function (mutexAction, i, groupActions) { key = actionHash(mutexAction); @@ -513,11 +515,10 @@ ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) { var position; var maxOptionStringIndex = -1; - if (!!optionStringIndices) { - for (position in optionStringIndices) { - maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10)); - } - } + + Object.keys(optionStringIndices).forEach(function (position) { + maxOptionStringIndex = Math.max(maxOptionStringIndex, parseInt(position, 10)); + }); var positionalsEndIndex, nextOptionStringIndex; @@ -525,6 +526,8 @@ ArgumentParser.prototype._parseKnownArgs = function (argStrings, namespace) { // consume any Positionals preceding the next option nextOptionStringIndex = null; for (position in optionStringIndices) { + if (!optionStringIndices.hasOwnProperty(position)) { continue; } + position = parseInt(position, 10); if (position >= startIndex) { if (nextOptionStringIndex !== null) { @@ -688,10 +691,10 @@ ArgumentParser.prototype._matchArgumentsPartial = function (actions, regexpArgSt return string.length; }; - for (i = actions.length; i > 0; i -= 1) { + for (i = actions.length; i > 0; i--) { pattern = ''; actionSlice = actions.slice(0, i); - for (j in actionSlice) { + for (j = 0; j < actionSlice.length; j++) { pattern += self._getNargsPattern(actionSlice[j]); } diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js index 541d918..89319b9 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js @@ -722,20 +722,15 @@ HelpFormatter.prototype._formatArgs = function (action, metavarDefault) { }; HelpFormatter.prototype._expandHelp = function (action) { - var actionProperty; - var actionValue; + var params = { prog: this._prog }; - var params = {prog: this._prog}; + Object.keys(action).forEach(function (actionProperty) { + var actionValue = action[actionProperty]; - for (actionProperty in action) { - if (action.hasOwnProperty(actionProperty)) { - actionValue = action[actionProperty]; - - if (actionValue !== $$.SUPPRESS) { - params[actionProperty] = actionValue; - } + if (actionValue !== $$.SUPPRESS) { + params[actionProperty] = actionValue; } - } + }); if (!!params.choices) { if (_.isString(params.choices)) { diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml index ab27b29..b4ae6a7 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml @@ -1,8 +1,8 @@ -language: ruby -rvm: - - 1.9.3 +language: node_js +node_js: + - "0.11" before_script: - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" - - sleep 2 \ No newline at end of file + - sleep 2 diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile deleted file mode 100644 index aed29c3..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -source "https://rubygems.org" - -gem 'uglifier' -gem 'rake' diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile.lock b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile.lock deleted file mode 100644 index 2c52be4..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Gemfile.lock +++ /dev/null @@ -1,17 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - execjs (1.4.0) - multi_json (~> 1.0) - multi_json (1.3.6) - rake (0.9.2.2) - uglifier (1.3.0) - execjs (>= 0.3.0) - multi_json (~> 1.0, >= 1.0.2) - -PLATFORMS - ruby - -DEPENDENCIES - rake - uglifier diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown index 1a39ad9..4e58be4 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown @@ -9,11 +9,11 @@ for example from [Dive Into JavaScript][d]. [d]: http://www.diveintojavascript.com/core-javascript-reference/the-string-object -As name states this an extension for [Underscore.js][u], but it can be used +As name states this an extension for [Underscore.js][u] (and [Lo-Dash](http://lodash.com/)), but it can be used independently from **_s**-global variable. But with Underscore.js you can use Object-Oriented style and chaining: -[u]: http://documentcloud.github.com/underscore/ +[u]: http://underscorejs.org/ ```javascript _(" epeli ").chain().trim().capitalize().value() @@ -291,16 +291,19 @@ _('my name is epeli').titleize() **camelize** _.camelize(string) -Converts underscored or dasherized string to a camelized one +Converts underscored or dasherized string to a camelized one. Begins with +a lower case letter unless it starts with an underscore or string ```javascript +_('moz-transform').camelize() +=> 'mozTransform' _('-moz-transform').camelize() => 'MozTransform' ``` **classify** _.classify(string) -Converts string to camelized class name +Converts string to camelized class name. First letter is always upper case ```javascript _('some_class_name').classify() @@ -415,7 +418,7 @@ C like string formatting. Credits goes to [Alexandru Marasteanu][o]. For more detailed documentation, see the [original page][o]. -[o]: http://www.diveintojavascript.com/projects/sprintf-for-javascript +[o]: http://www.diveintojavascript.com/projects/javascript-sprintf ```javascript _.sprintf("%.1f", 1.17) @@ -680,12 +683,20 @@ _ = _.string ## Changelog ## +### 2.4.0 ### + +* Move from rake to gulp +* Add support form classify camelcase strings +* Fix bower.json +* [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.3...2.4.0) + ### 2.3.3 ### * Add `toBoolean` * Add `unquote` * Add quote char option to `quote` * Support dash-separated words in `titleize` +* [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.2...2.3.3) ### 2.3.2 ### diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Rakefile b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Rakefile deleted file mode 100644 index 2cd9eed..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/Rakefile +++ /dev/null @@ -1,23 +0,0 @@ -# encoding: utf-8 -task default: :test - -desc 'Use UglifyJS to compress Underscore.string' -task :build do - require 'uglifier' - source = File.read('lib/underscore.string.js', :encoding => 'utf-8') - compressed = Uglifier.compile(source, copyright: false) - File.open('dist/underscore.string.min.js', 'w'){ |f| f.write compressed } - compression_rate = compressed.length.to_f/source.length - puts "compressed dist/underscore.string.min.js: #{compressed.length}/#{source.length} #{(compression_rate * 100).round}%" -end - -desc 'Run tests' -task :test do - puts "Running underscore.string test suite." - result1 = system %{phantomjs ./test/run-qunit.js "test/test.html"} - - puts "Running Underscore test suite." - result2 = system %{phantomjs ./test/run-qunit.js "test/test_underscore/index.html"} - - exit(result1 && result2 ? 0 : 1) -end diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json index ae91b65..96e23d3 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json @@ -2,7 +2,7 @@ "name": "underscore.string", "repo": "epeli/underscore.string", "description": "String manipulation extensions for Underscore.js javascript library", - "version": "2.3.3", + "version": "2.4.0", "keywords": ["underscore", "string"], "dependencies": {}, "development": {}, diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/dist/underscore.string.min.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/dist/underscore.string.min.js deleted file mode 100644 index 4f6b2b9..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/dist/underscore.string.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,n){"use strict";function r(e,n){var r,t,u=e.toLowerCase();for(n=[].concat(n),r=0;n.length>r;r+=1)if(t=n[r]){if(t.test&&t.test(e))return!0;if(t.toLowerCase()===u)return!0}}var t=n.prototype.trim,u=n.prototype.trimRight,i=n.prototype.trimLeft,l=function(e){return 1*e||0},o=function(e,n){if(1>n)return"";for(var r="";n>0;)1&n&&(r+=e),n>>=1,e+=e;return r},a=[].slice,c=function(e){return null==e?"\\s":e.source?e.source:"["+g.escapeRegExp(e)+"]"},s={lt:"<",gt:">",quot:'"',amp:"&",apos:"'"},f={};for(var p in s)f[s[p]]=p;f["'"]="#39";var h=function(){function e(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}var r=o,t=function(){return t.cache.hasOwnProperty(arguments[0])||(t.cache[arguments[0]]=t.parse(arguments[0])),t.format.call(null,t.cache[arguments[0]],arguments)};return t.format=function(t,u){var i,l,o,a,c,s,f,p=1,g=t.length,d="",m=[];for(l=0;g>l;l++)if(d=e(t[l]),"string"===d)m.push(t[l]);else if("array"===d){if(a=t[l],a[2])for(i=u[p],o=0;a[2].length>o;o++){if(!i.hasOwnProperty(a[2][o]))throw new Error(h('[_.sprintf] property "%s" does not exist',a[2][o]));i=i[a[2][o]]}else i=a[1]?u[a[1]]:u[p++];if(/[^s]/.test(a[8])&&"number"!=e(i))throw new Error(h("[_.sprintf] expecting number but found %s",e(i)));switch(a[8]){case"b":i=i.toString(2);break;case"c":i=n.fromCharCode(i);break;case"d":i=parseInt(i,10);break;case"e":i=a[7]?i.toExponential(a[7]):i.toExponential();break;case"f":i=a[7]?parseFloat(i).toFixed(a[7]):parseFloat(i);break;case"o":i=i.toString(8);break;case"s":i=(i=n(i))&&a[7]?i.substring(0,a[7]):i;break;case"u":i=Math.abs(i);break;case"x":i=i.toString(16);break;case"X":i=i.toString(16).toUpperCase()}i=/[def]/.test(a[8])&&a[3]&&i>=0?"+"+i:i,s=a[4]?"0"==a[4]?"0":a[4].charAt(1):" ",f=a[6]-n(i).length,c=a[6]?r(s,f):"",m.push(a[5]?i+c:c+i)}return m.join("")},t.cache={},t.parse=function(e){for(var n=e,r=[],t=[],u=0;n;){if(null!==(r=/^[^\x25]+/.exec(n)))t.push(r[0]);else if(null!==(r=/^\x25{2}/.exec(n)))t.push("%");else{if(null===(r=/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(n)))throw new Error("[_.sprintf] huh?");if(r[2]){u|=1;var i=[],l=r[2],o=[];if(null===(o=/^([a-z_][a-z_\d]*)/i.exec(l)))throw new Error("[_.sprintf] huh?");for(i.push(o[1]);""!==(l=l.substring(o[0].length));)if(null!==(o=/^\.([a-z_][a-z_\d]*)/i.exec(l)))i.push(o[1]);else{if(null===(o=/^\[(\d+)\]/.exec(l)))throw new Error("[_.sprintf] huh?");i.push(o[1])}r[2]=i}else u|=2;if(3===u)throw new Error("[_.sprintf] mixing positional and named placeholders is not (yet) supported");t.push(r)}n=n.substring(r[0].length)}return t},t}(),g={VERSION:"2.3.0",isBlank:function(e){return null==e&&(e=""),/^\s*$/.test(e)},stripTags:function(e){return null==e?"":n(e).replace(/<\/?[^>]+>/g,"")},capitalize:function(e){return e=null==e?"":n(e),e.charAt(0).toUpperCase()+e.slice(1)},chop:function(e,r){return null==e?[]:(e=n(e),r=~~r,r>0?e.match(new RegExp(".{1,"+r+"}","g")):[e])},clean:function(e){return g.strip(e).replace(/\s+/g," ")},count:function(e,r){if(null==e||null==r)return 0;e=n(e),r=n(r);for(var t=0,u=0,i=r.length;;){if(u=e.indexOf(r,u),-1===u)break;t++,u+=i}return t},chars:function(e){return null==e?[]:n(e).split("")},swapCase:function(e){return null==e?"":n(e).replace(/\S/g,function(e){return e===e.toUpperCase()?e.toLowerCase():e.toUpperCase()})},escapeHTML:function(e){return null==e?"":n(e).replace(/[&<>"']/g,function(e){return"&"+f[e]+";"})},unescapeHTML:function(e){return null==e?"":n(e).replace(/\&([^;]+);/g,function(e,r){var t;return r in s?s[r]:(t=r.match(/^#x([\da-fA-F]+)$/))?n.fromCharCode(parseInt(t[1],16)):(t=r.match(/^#(\d+)$/))?n.fromCharCode(~~t[1]):e})},escapeRegExp:function(e){return null==e?"":n(e).replace(/([.*+?^=!:${}()|[\]\/\\])/g,"\\$1")},splice:function(e,n,r,t){var u=g.chars(e);return u.splice(~~n,~~r,t),u.join("")},insert:function(e,n,r){return g.splice(e,n,0,r)},include:function(e,r){return""===r?!0:null==e?!1:-1!==n(e).indexOf(r)},join:function(){var e=a.call(arguments),n=e.shift();return null==n&&(n=""),e.join(n)},lines:function(e){return null==e?[]:n(e).split("\n")},reverse:function(e){return g.chars(e).reverse().join("")},startsWith:function(e,r){return""===r?!0:null==e||null==r?!1:(e=n(e),r=n(r),e.length>=r.length&&e.slice(0,r.length)===r)},endsWith:function(e,r){return""===r?!0:null==e||null==r?!1:(e=n(e),r=n(r),e.length>=r.length&&e.slice(e.length-r.length)===r)},succ:function(e){return null==e?"":(e=n(e),e.slice(0,-1)+n.fromCharCode(e.charCodeAt(e.length-1)+1))},titleize:function(e){return null==e?"":(e=n(e).toLowerCase(),e.replace(/(?:^|\s|-)\S/g,function(e){return e.toUpperCase()}))},camelize:function(e){return g.trim(e).replace(/[-_\s]+(.)?/g,function(e,n){return n?n.toUpperCase():""})},underscored:function(e){return g.trim(e).replace(/([a-z\d])([A-Z]+)/g,"$1_$2").replace(/[-\s]+/g,"_").toLowerCase()},dasherize:function(e){return g.trim(e).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},classify:function(e){return g.titleize(n(e).replace(/[\W_]/g," ")).replace(/\s/g,"")},humanize:function(e){return g.capitalize(g.underscored(e).replace(/_id$/,"").replace(/_/g," "))},trim:function(e,r){return null==e?"":!r&&t?t.call(e):(r=c(r),n(e).replace(new RegExp("^"+r+"+|"+r+"+$","g"),""))},ltrim:function(e,r){return null==e?"":!r&&i?i.call(e):(r=c(r),n(e).replace(new RegExp("^"+r+"+"),""))},rtrim:function(e,r){return null==e?"":!r&&u?u.call(e):(r=c(r),n(e).replace(new RegExp(r+"+$"),""))},truncate:function(e,r,t){return null==e?"":(e=n(e),t=t||"...",r=~~r,e.length>r?e.slice(0,r)+t:e)},prune:function(e,r,t){if(null==e)return"";if(e=n(e),r=~~r,t=null!=t?n(t):"...",r>=e.length)return e;var u=function(e){return e.toUpperCase()!==e.toLowerCase()?"A":" "},i=e.slice(0,r+1).replace(/.(?=\W*\w*$)/g,u);return i=i.slice(i.length-2).match(/\w\w/)?i.replace(/\s*\S+$/,""):g.rtrim(i.slice(0,i.length-1)),(i+t).length>e.length?e:e.slice(0,i.length)+t},words:function(e,n){return g.isBlank(e)?[]:g.trim(e,n).split(n||/\s+/)},pad:function(e,r,t,u){e=null==e?"":n(e),r=~~r;var i=0;switch(t?t.length>1&&(t=t.charAt(0)):t=" ",u){case"right":return i=r-e.length,e+o(t,i);case"both":return i=r-e.length,o(t,Math.ceil(i/2))+e+o(t,Math.floor(i/2));default:return i=r-e.length,o(t,i)+e}},lpad:function(e,n,r){return g.pad(e,n,r)},rpad:function(e,n,r){return g.pad(e,n,r,"right")},lrpad:function(e,n,r){return g.pad(e,n,r,"both")},sprintf:h,vsprintf:function(e,n){return n.unshift(e),h.apply(null,n)},toNumber:function(e,n){return e?(e=g.trim(e),e.match(/^-?\d+(?:\.\d+)?$/)?l(l(e).toFixed(~~n)):0/0):0},numberFormat:function(e,n,r,t){if(isNaN(e)||null==e)return"";e=e.toFixed(~~n),t="string"==typeof t?t:",";var u=e.split("."),i=u[0],l=u[1]?(r||".")+u[1]:"";return i.replace(/(\d)(?=(?:\d{3})+$)/g,"$1"+t)+l},strRight:function(e,r){if(null==e)return"";e=n(e),r=null!=r?n(r):r;var t=r?e.indexOf(r):-1;return~t?e.slice(t+r.length,e.length):e},strRightBack:function(e,r){if(null==e)return"";e=n(e),r=null!=r?n(r):r;var t=r?e.lastIndexOf(r):-1;return~t?e.slice(t+r.length,e.length):e},strLeft:function(e,r){if(null==e)return"";e=n(e),r=null!=r?n(r):r;var t=r?e.indexOf(r):-1;return~t?e.slice(0,t):e},strLeftBack:function(e,n){if(null==e)return"";e+="",n=null!=n?""+n:n;var r=e.lastIndexOf(n);return~r?e.slice(0,r):e},toSentence:function(e,n,r,t){n=n||", ",r=r||" and ";var u=e.slice(),i=u.pop();return e.length>2&&t&&(r=g.rtrim(n)+r),u.length?u.join(n)+r+i:i},toSentenceSerial:function(){var e=a.call(arguments);return e[3]=!0,g.toSentence.apply(g,e)},slugify:function(e){if(null==e)return"";var r="ąàáäâãåæăćęèéëêìíïîłńòóöôõøśșțùúüûñçżź",t="aaaaaaaaaceeeeeiiiilnoooooosstuuuunczz",u=new RegExp(c(r),"g");return e=n(e).toLowerCase().replace(u,function(e){var n=r.indexOf(e);return t.charAt(n)||"-"}),g.dasherize(e.replace(/[^\w\s-]/g,""))},surround:function(e,n){return[n,e,n].join("")},quote:function(e,n){return g.surround(e,n||'"')},unquote:function(e,n){return n=n||'"',e[0]===n&&e[e.length-1]===n?e.slice(1,e.length-1):e},exports:function(){var e={};for(var n in this)this.hasOwnProperty(n)&&!n.match(/^(?:include|contains|reverse)$/)&&(e[n]=this[n]);return e},repeat:function(e,r,t){if(null==e)return"";if(r=~~r,null==t)return o(n(e),r);for(var u=[];r>0;u[--r]=e);return u.join(t)},naturalCmp:function(e,r){if(e==r)return 0;if(!e)return-1;if(!r)return 1;for(var t=/(\.\d+)|(\d+)|(\D+)/g,u=n(e).toLowerCase().match(t),i=n(r).toLowerCase().match(t),l=Math.min(u.length,i.length),o=0;l>o;o++){var a=u[o],c=i[o];if(a!==c){var s=parseInt(a,10);if(!isNaN(s)){var f=parseInt(c,10);if(!isNaN(f)&&s-f)return s-f}return c>a?-1:1}}return u.length===i.length?u.length-i.length:r>e?-1:1},levenshtein:function(e,r){if(null==e&&null==r)return 0;if(null==e)return n(r).length;if(null==r)return n(e).length;e=n(e),r=n(r);for(var t,u,i=[],l=0;r.length>=l;l++)for(var o=0;e.length>=o;o++)u=l&&o?e.charAt(o-1)===r.charAt(l-1)?t:Math.min(i[o],i[o-1],t)+1:l+o,t=i[o],i[o]=u;return i.pop()},toBoolean:function(e,n,t){return"number"==typeof e&&(e=""+e),"string"!=typeof e?!!e:(e=g.trim(e),r(e,n||["true","1"])?!0:r(e,t||["false","0"])?!1:void 0)}};g.strip=g.trim,g.lstrip=g.ltrim,g.rstrip=g.rtrim,g.center=g.lrpad,g.rjust=g.lpad,g.ljust=g.rpad,g.contains=g.include,g.q=g.quote,g.toBool=g.toBoolean,"undefined"!=typeof exports&&("undefined"!=typeof module&&module.exports&&(module.exports=g),exports._s=g),"function"==typeof define&&define.amd&&define("underscore.string",[],function(){return g}),e._=e._||{},e._.string=e._.str=g}(this,String); \ No newline at end of file diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js index 8761117..c9c8d47 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js @@ -3,7 +3,7 @@ // Underscore.string is freely distributable under the terms of the MIT license. // Documentation: https://github.com/epeli/underscore.string // Some code is borrowed from MooTools and Alexandru Marasteanu. -// Version '2.3.2' +// Version '2.4.0' !function(root, String){ 'use strict'; @@ -189,7 +189,7 @@ var _s = { - VERSION: '2.3.0', + VERSION: '2.4.0', isBlank: function(str){ if (str == null) str = ''; @@ -349,7 +349,7 @@ }, classify: function(str){ - return _s.titleize(String(str).replace(/[\W_]/g, ' ')).replace(/\s/g, ''); + return _s.capitalize(_s.camelize(String(str).replace(/[\W_]/g, ' ')).replace(/\s/g, '')); }, humanize: function(str){ @@ -360,7 +360,7 @@ if (str == null) return ''; if (!characters && nativeTrim) return nativeTrim.call(str); characters = defaultToWhiteSpace(characters); - return String(str).replace(new RegExp('\^' + characters + '+|' + characters + '+$', 'g'), ''); + return String(str).replace(new RegExp('^' + characters + '+|' + characters + '+$', 'g'), ''); }, ltrim: function(str, characters){ diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json index 4b47216..877cc71 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json @@ -1,6 +1,6 @@ { "name": "underscore.string", - "version": "2.3.3", + "version": "2.4.0", "description": "String manipulation extensions for Underscore.js javascript library.", "homepage": "http://epeli.github.com/underscore.string/", "contributors": [ @@ -47,7 +47,7 @@ "underscore", "string" ], - "main": "./lib/underscore.string", + "main": "./lib/underscore.string.js", "directories": { "lib": "./lib" }, @@ -56,7 +56,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/epeli/underscore.string.git" + "url": "git+https://github.com/epeli/underscore.string.git" }, "bugs": { "url": "https://github.com/epeli/underscore.string/issues" @@ -66,8 +66,42 @@ "type": "MIT" } ], - "readme": "# Underscore.string [![Build Status](https://secure.travis-ci.org/epeli/underscore.string.png?branch=master)](http://travis-ci.org/epeli/underscore.string) #\n\n\n\nJavascript lacks complete string manipulation operations.\nThis an attempt to fill that gap. List of build-in methods can be found\nfor example from [Dive Into JavaScript][d].\n\n[d]: http://www.diveintojavascript.com/core-javascript-reference/the-string-object\n\n\nAs name states this an extension for [Underscore.js][u], but it can be used\nindependently from **_s**-global variable. But with Underscore.js you can\nuse Object-Oriented style and chaining:\n\n[u]: http://documentcloud.github.com/underscore/\n\n```javascript\n_(\" epeli \").chain().trim().capitalize().value()\n=> \"Epeli\"\n```\n\n## Download ##\n\n * [Development version](https://raw.github.com/epeli/underscore.string/master/lib/underscore.string.js) *Uncompressed with Comments 18kb*\n * [Production version](https://github.com/epeli/underscore.string/raw/master/dist/underscore.string.min.js) *Minified 7kb*\n\n\n## Node.js installation ##\n\n**npm package**\n\n npm install underscore.string\n\n**Standalone usage**:\n\n```javascript\nvar _s = require('underscore.string');\n```\n\n**Integrate with Underscore.js**:\n\n```javascript\nvar _ = require('underscore');\n\n// Import Underscore.string to separate object, because there are conflict functions (include, reverse, contains)\n_.str = require('underscore.string');\n\n// Mix in non-conflict functions to Underscore namespace if you want\n_.mixin(_.str.exports());\n\n// All functions, include conflict, will be available through _.str object\n_.str.include('Underscore.string', 'string'); // => true\n```\n\n**Or Integrate with Underscore.js without module loading**\n\nRun the following expression after Underscore.js and Underscore.string are loaded\n```javascript\n// _.str becomes a global variable if no module loading is detected\n// Mix in non-conflict functions to Underscore namespace\n_.mixin(_.str.exports());\n```\n\n## String Functions ##\n\nFor availability of functions in this way you need to mix in Underscore.string functions:\n\n```javascript\n_.mixin(_.string.exports());\n```\n\notherwise functions from examples will be available through _.string or _.str objects:\n\n```javascript\n_.str.capitalize('epeli')\n=> \"Epeli\"\n```\n\n**numberFormat** _.numberFormat(number, [ decimals=0, decimalSeparator='.', orderSeparator=','])\n\nFormats the numbers.\n\n```javascript\n_.numberFormat(1000, 2)\n=> \"1,000.00\"\n\n_.numberFormat(123456789.123, 5, '.', ',')\n=> \"123,456,789.12300\"\n```\n\n\n**levenshtein** _.levenshtein(string1, string2)\n\nCalculates [Levenshtein distance][ld] between two strings.\n[ld]: http://en.wikipedia.org/wiki/Levenshtein_distance\n\n```javascript\n_.levenshtein('kitten', 'kittah')\n=> 2\n```\n\n**capitalize** _.capitalize(string)\n\nConverts first letter of the string to uppercase.\n\n```javascript\n_.capitalize(\"foo Bar\")\n=> \"Foo Bar\"\n```\n\n**chop** _.chop(string, step)\n\n```javascript\n_.chop('whitespace', 3)\n=> ['whi','tes','pac','e']\n```\n\n**clean** _.clean(str)\n\nCompress some whitespaces to one.\n\n```javascript\n_.clean(\" foo bar \")\n=> 'foo bar'\n```\n\n**chars** _.chars(str)\n\n```javascript\n_.chars('Hello')\n=> ['H','e','l','l','o']\n```\n\n**swapCase** _.swapCase(str)\n\nReturns a copy of the string in which all the case-based characters have had their case swapped.\n\n```javascript\n_.swapCase('hELLO')\n=> 'Hello'\n```\n\n**include** available only through _.str object, because Underscore has function with the same name.\n\n```javascript\n_.str.include(\"foobar\", \"ob\")\n=> true\n```\n\n(removed) **includes** _.includes(string, substring)\n\nTests if string contains a substring.\n\n```javascript\n_.includes(\"foobar\", \"ob\")\n=> true\n```\n\n**includes** function was removed\n\nBut you can create it in this way, for compatibility with previous versions:\n\n```javascript\n_.includes = _.str.include\n```\n\n**count** _.count(string, substring)\n\n```javascript\n_('Hello world').count('l')\n=> 3\n```\n\n**escapeHTML** _.escapeHTML(string)\n\nConverts HTML special characters to their entity equivalents.\n\n```javascript\n_('
Blah blah blah
').escapeHTML();\n=> '<div>Blah blah blah</div>'\n```\n\n**unescapeHTML** _.unescapeHTML(string)\n\nConverts entity characters to HTML equivalents.\n\n```javascript\n_('<div>Blah blah blah</div>').unescapeHTML();\n=> '
Blah blah blah
'\n```\n\n**insert** _.insert(string, index, substing)\n\n```javascript\n_('Hello ').insert(6, 'world')\n=> 'Hello world'\n```\n\n**isBlank** _.isBlank(string)\n\n```javascript\n_('').isBlank(); // => true\n_('\\n').isBlank(); // => true\n_(' ').isBlank(); // => true\n_('a').isBlank(); // => false\n```\n\n**join** _.join(separator, *strings)\n\nJoins strings together with given separator\n\n```javascript\n_.join(\" \", \"foo\", \"bar\")\n=> \"foo bar\"\n```\n\n**lines** _.lines(str)\n\n```javascript\n_.lines(\"Hello\\nWorld\")\n=> [\"Hello\", \"World\"]\n```\n\n**reverse** available only through _.str object, because Underscore has function with the same name.\n\nReturn reversed string:\n\n```javascript\n_.str.reverse(\"foobar\")\n=> 'raboof'\n```\n\n**splice** _.splice(string, index, howmany, substring)\n\nLike a array splice.\n\n```javascript\n_('https://edtsech@bitbucket.org/edtsech/underscore.strings').splice(30, 7, 'epeli')\n=> 'https://edtsech@bitbucket.org/epeli/underscore.strings'\n```\n\n**startsWith** _.startsWith(string, starts)\n\nThis method checks whether string starts with starts.\n\n```javascript\n_(\"image.gif\").startsWith(\"image\")\n=> true\n```\n\n**endsWith** _.endsWith(string, ends)\n\nThis method checks whether string ends with ends.\n\n```javascript\n_(\"image.gif\").endsWith(\"gif\")\n=> true\n```\n\n**succ** _.succ(str)\n\nReturns the successor to str.\n\n```javascript\n_('a').succ()\n=> 'b'\n\n_('A').succ()\n=> 'B'\n```\n\n**supplant**\n\nSupplant function was removed, use Underscore.js [template function][p].\n\n[p]: http://documentcloud.github.com/underscore/#template\n\n**strip** alias for *trim*\n\n**lstrip** alias for *ltrim*\n\n**rstrip** alias for *rtrim*\n\n**titleize** _.titleize(string)\n\n```javascript\n_('my name is epeli').titleize()\n=> 'My Name Is Epeli'\n```\n\n**camelize** _.camelize(string)\n\nConverts underscored or dasherized string to a camelized one\n\n```javascript\n_('-moz-transform').camelize()\n=> 'MozTransform'\n```\n\n**classify** _.classify(string)\n\nConverts string to camelized class name\n\n```javascript\n_('some_class_name').classify()\n=> 'SomeClassName'\n```\n\n**underscored** _.underscored(string)\n\nConverts a camelized or dasherized string into an underscored one\n\n```javascript\n_('MozTransform').underscored()\n=> 'moz_transform'\n```\n\n**dasherize** _.dasherize(string)\n\nConverts a underscored or camelized string into an dasherized one\n\n```javascript\n_('MozTransform').dasherize()\n=> '-moz-transform'\n```\n\n**humanize** _.humanize(string)\n\nConverts an underscored, camelized, or dasherized string into a humanized one.\nAlso removes beginning and ending whitespace, and removes the postfix '_id'.\n\n```javascript\n_(' capitalize dash-CamelCase_underscore trim ').humanize()\n=> 'Capitalize dash camel case underscore trim'\n```\n\n**trim** _.trim(string, [characters])\n\ntrims defined characters from begining and ending of the string.\nDefaults to whitespace characters.\n\n```javascript\n_.trim(\" foobar \")\n=> \"foobar\"\n\n_.trim(\"_-foobar-_\", \"_-\")\n=> \"foobar\"\n```\n\n\n**ltrim** _.ltrim(string, [characters])\n\nLeft trim. Similar to trim, but only for left side.\n\n\n**rtrim** _.rtrim(string, [characters])\n\nRight trim. Similar to trim, but only for right side.\n\n**truncate** _.truncate(string, length, truncateString)\n\n```javascript\n_('Hello world').truncate(5)\n=> 'Hello...'\n\n_('Hello').truncate(10)\n=> 'Hello'\n```\n\n**prune** _.prune(string, length, pruneString)\n\nElegant version of truncate.\nMakes sure the pruned string does not exceed the original length.\nAvoid half-chopped words when truncating.\n\n```javascript\n_('Hello, world').prune(5)\n=> 'Hello...'\n\n_('Hello, world').prune(8)\n=> 'Hello...'\n\n_('Hello, world').prune(5, ' (read a lot more)')\n=> 'Hello, world' (as adding \"(read a lot more)\" would be longer than the original string)\n\n_('Hello, cruel world').prune(15)\n=> 'Hello, cruel...'\n\n_('Hello').prune(10)\n=> 'Hello'\n```\n\n**words** _.words(str, delimiter=/\\s+/)\n\nSplit string by delimiter (String or RegExp), /\\s+/ by default.\n\n```javascript\n_.words(\" I love you \")\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\"I_love_you\", \"_\")\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\"I-love-you\", /-/)\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\" \")\n=> []\n```\n\n**sprintf** _.sprintf(string format, *arguments)\n\nC like string formatting.\nCredits goes to [Alexandru Marasteanu][o].\nFor more detailed documentation, see the [original page][o].\n\n[o]: http://www.diveintojavascript.com/projects/sprintf-for-javascript\n\n```javascript\n_.sprintf(\"%.1f\", 1.17)\n\"1.2\"\n```\n\n**pad** _.pad(str, length, [padStr, type])\n\npads the `str` with characters until the total string length is equal to the passed `length` parameter. By default, pads on the **left** with the space char (`\" \"`). `padStr` is truncated to a single character if necessary.\n\n```javascript\n_.pad(\"1\", 8)\n-> \" 1\";\n\n_.pad(\"1\", 8, '0')\n-> \"00000001\";\n\n_.pad(\"1\", 8, '0', 'right')\n-> \"10000000\";\n\n_.pad(\"1\", 8, '0', 'both')\n-> \"00001000\";\n\n_.pad(\"1\", 8, 'bleepblorp', 'both')\n-> \"bbbb1bbb\";\n```\n\n**lpad** _.lpad(str, length, [padStr])\n\nleft-pad a string. Alias for `pad(str, length, padStr, 'left')`\n\n```javascript\n_.lpad(\"1\", 8, '0')\n-> \"00000001\";\n```\n\n**rpad** _.rpad(str, length, [padStr])\n\nright-pad a string. Alias for `pad(str, length, padStr, 'right')`\n\n```javascript\n_.rpad(\"1\", 8, '0')\n-> \"10000000\";\n```\n\n**lrpad** _.lrpad(str, length, [padStr])\n\nleft/right-pad a string. Alias for `pad(str, length, padStr, 'both')`\n\n```javascript\n_.lrpad(\"1\", 8, '0')\n-> \"00001000\";\n```\n\n**center** alias for **lrpad**\n\n**ljust** alias for *rpad*\n\n**rjust** alias for *lpad*\n\n**toNumber** _.toNumber(string, [decimals])\n\nParse string to number. Returns NaN if string can't be parsed to number.\n\n```javascript\n_('2.556').toNumber()\n=> 3\n\n_('2.556').toNumber(1)\n=> 2.6\n```\n\n**strRight** _.strRight(string, pattern)\n\nSearches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strRight('_')\n=> \"is_a_test_string\";\n```\n\n**strRightBack** _.strRightBack(string, pattern)\n\nSearches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strRightBack('_')\n=> \"string\";\n```\n\n**strLeft** _.strLeft(string, pattern)\n\nSearches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strLeft('_')\n=> \"This\";\n```\n\n**strLeftBack** _.strLeftBack(string, pattern)\n\nSearches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strLeftBack('_')\n=> \"This_is_a_test\";\n```\n\n**stripTags**\n\nRemoves all html tags from string.\n\n```javascript\n_('a link').stripTags()\n=> 'a link'\n\n_('a link').stripTags()\n=> 'a linkalert(\"hello world!\")'\n```\n\n**toSentence** _.toSentence(array, [delimiter, lastDelimiter])\n\nJoin an array into a human readable sentence.\n\n```javascript\n_.toSentence(['jQuery', 'Mootools', 'Prototype'])\n=> 'jQuery, Mootools and Prototype';\n\n_.toSentence(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ')\n=> 'jQuery, Mootools unt Prototype';\n```\n\n**toSentenceSerial** _.toSentenceSerial(array, [delimiter, lastDelimiter])\n\nThe same as `toSentence`, but adjusts delimeters to use [Serial comma](http://en.wikipedia.org/wiki/Serial_comma).\n\n```javascript\n_.toSentenceSerial(['jQuery', 'Mootools'])\n=> 'jQuery and Mootools';\n\n_.toSentenceSerial(['jQuery', 'Mootools', 'Prototype'])\n=> 'jQuery, Mootools, and Prototype'\n\n_.toSentenceSerial(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ');\n=> 'jQuery, Mootools, unt Prototype';\n```\n\n**repeat** _.repeat(string, count, [separator])\n\nRepeats a string count times.\n\n```javascript\n_.repeat(\"foo\", 3)\n=> 'foofoofoo';\n\n_.repeat(\"foo\", 3, \"bar\")\n=> 'foobarfoobarfoo'\n```\n\n**surround** _.surround(string, wrap)\n\nSurround a string with another string.\n\n```javascript\n_.surround(\"foo\", \"ab\")\n=> 'abfooab';\n```\n\n**quote** _.quote(string, quoteChar) or _.q(string, quoteChar)\n\nQuotes a string. `quoteChar` defaults to `\"`.\n\n```javascript\n_.quote('foo', quoteChar)\n=> '\"foo\"';\n```\n**unquote** _.unquote(string, quoteChar)\n\nUnquotes a string. `quoteChar` defaults to `\"`.\n\n```javascript\n_.unquote('\"foo\"')\n=> 'foo';\n_.unquote(\"'foo'\", \"'\")\n=> 'foo';\n```\n\n\n**slugify** _.slugify(string)\n\nTransform text into a URL slug. Replaces whitespaces, accentuated, and special characters with a dash.\n\n```javascript\n_.slugify(\"Un éléphant à l'orée du bois\")\n=> 'un-elephant-a-loree-du-bois';\n```\n\n***Caution: this function is charset dependent***\n\n**naturalCmp** array.sort(_.naturalCmp)\n\nNaturally sort strings like humans would do.\n\n```javascript\n['foo20', 'foo5'].sort(_.naturalCmp)\n=> [ 'foo5', 'foo20' ]\n```\n\n**toBoolean** _.toBoolean(string) or _.toBool(string)\n\nTurn strings that can be commonly considered as booleas to real booleans. Such as \"true\", \"false\", \"1\" and \"0\". This function is case insensitive.\n\n```javascript\n_.toBoolean(\"true\")\n=> true\n_.toBoolean(\"FALSE\")\n=> false\n_.toBoolean(\"random\")\n=> undefined\n```\n\nIt can be customized by giving arrays of truth and falsy value matcher as parameters. Matchers can be also RegExp objects.\n\n```javascript\n_.toBoolean(\"truthy\", [\"truthy\"], [\"falsy\"])\n=> true\n_.toBoolean(\"true only at start\", [/^true/])\n=> true\n```\n\n## Roadmap ##\n\nAny suggestions or bug reports are welcome. Just email me or more preferably open an issue.\n\n#### Problems\n\nWe lose two things for `include` and `reverse` methods from `_.string`:\n\n* Calls like `_('foobar').include('bar')` aren't available;\n* Chaining isn't available too.\n\nBut if you need this functionality you can create aliases for conflict functions which will be convenient for you:\n\n```javascript\n_.mixin({\n includeString: _.str.include,\n reverseString: _.str.reverse\n})\n\n// Now wrapper calls and chaining are available.\n_('foobar').chain().reverseString().includeString('rab').value()\n```\n\n#### Standalone Usage\n\nIf you are using Underscore.string without Underscore. You also have `_.string` namespace for it and `_.str` alias\nBut of course you can just reassign `_` variable with `_.string`\n\n```javascript\n_ = _.string\n```\n\n## Changelog ##\n\n### 2.3.3 ###\n\n* Add `toBoolean`\n* Add `unquote`\n* Add quote char option to `quote`\n* Support dash-separated words in `titleize`\n\n### 2.3.2 ###\n\n* Add `naturalCmp`\n* Bug fix to `camelize`\n* Add ă, ș, ț and ś to `slugify`\n* Doc updates\n* Add support for [component](http://component.io/)\n* [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.1...v2.3.2)\n\n### 2.3.1 ###\n\n* Bug fixes to `escapeHTML`, `classify`, `substr`\n* Faster `count`\n* Documentation fixes\n* [Full changelog](https://github.com/epeli/underscore.string/compare/v2.3.0...v2.3.1)\n\n### 2.3.0 ###\n\n* Added `numberformat` method\n* Added `levenshtein` method (Levenshtein distance calculation)\n* Added `swapCase` method\n* Changed default behavior of `words` method\n* Added `toSentenceSerial` method\n* Added `surround` and `quote` methods\n\n### 2.2.1 ###\n\n* Same as 2.2.0 (2.2.0rc on npm) to fix some npm drama\n\n### 2.2.0 ###\n\n* Capitalize method behavior changed\n* Various perfomance tweaks\n\n### 2.1.1###\n\n* Fixed words method bug\n* Added classify method\n\n### 2.1.0 ###\n\n* AMD support\n* Added toSentence method\n* Added slugify method\n* Lots of speed optimizations\n\n### 2.0.0 ###\n\n* Added prune, humanize functions\n* Added _.string (_.str) namespace for Underscore.string library\n* Removed includes function\n\nFor upgrading to this version you need to mix in Underscore.string library to Underscore object:\n\n```javascript\n_.mixin(_.string.exports());\n```\n\nand all non-conflict Underscore.string functions will be available through Underscore object.\nAlso function `includes` has been removed, you should replace this function by `_.str.include`\nor create alias `_.includes = _.str.include` and all your code will work fine.\n\n### 1.1.6 ###\n\n* Fixed reverse and truncate\n* Added isBlank, stripTags, inlude(alias for includes)\n* Added uglifier compression\n\n### 1.1.5 ###\n\n* Added strRight, strRightBack, strLeft, strLeftBack\n\n### 1.1.4 ###\n\n* Added pad, lpad, rpad, lrpad methods and aliases center, ljust, rjust\n* Integration with Underscore 1.1.6\n\n### 1.1.3 ###\n\n* Added methods: underscored, camelize, dasherize\n* Support newer version of npm\n\n### 1.1.2 ###\n\n* Created functions: lines, chars, words functions\n\n### 1.0.2 ###\n\n* Created integration test suite with underscore.js 1.1.4 (now it's absolutely compatible)\n* Removed 'reverse' function, because this function override underscore.js 'reverse'\n\n## Contribute ##\n\n* Fork & pull request. Don't forget about tests.\n* If you planning add some feature please create issue before.\n\nOtherwise changes will be rejected.\n\n## Contributors list ##\n[Can be found here](https://github.com/epeli/underscore.string/graphs/contributors).\n\n\n## Licence ##\n\nThe MIT License\n\nCopyright (c) 2011 Esa-Matti Suuronen esa-matti@suuronen.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n", - "readmeFilename": "README.markdown", - "_id": "underscore.string@2.3.3", - "_from": "underscore.string@~2.3.1" + "scripts": { + "test": "gulp test" + }, + "devDependencies": { + "gulp": "~3.8.10", + "gulp-uglify": "~1.0.1", + "gulp-qunit": "~1.0.0", + "gulp-clean": "~0.3.1", + "gulp-rename": "~1.2.0" + }, + "_id": "underscore.string@2.4.0", + "dist": { + "shasum": "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b", + "tarball": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" + }, + "_from": "underscore.string@>=2.4.0 <2.5.0", + "_npmVersion": "1.3.24", + "_npmUser": { + "name": "epeli", + "email": "esa-matti@suuronen.org" + }, + "maintainers": [ + { + "name": "edtsech", + "email": "edtsech@gmail.com" + }, + { + "name": "rwz", + "email": "rwz@duckroll.ru" + }, + { + "name": "epeli", + "email": "esa-matti@suuronen.org" + } + ], + "_shasum": "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b", + "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/run-qunit.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/run-qunit.js deleted file mode 100644 index 44a2167..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/run-qunit.js +++ /dev/null @@ -1,45 +0,0 @@ -function waitFor(test, complete, timeout) { - var result, start = new Date().getTime() - setInterval(function interval() { - if ((new Date().getTime() - start < timeout) && !result) { - result = test() - } else { - if (!result) { - phantom.exit(1) - } else { - complete() - clearInterval(interval) - } - } - }, 100) -} - - -var fs = require('fs'), page = require('webpage').create(); -var url = 'file://localhost' + fs.workingDirectory + '/' + phantom.args[0]; - -page.onConsoleMessage = function(msg) { - console.log(msg) -} - -page.open(url, function(status) { - waitFor(function() { - return page.evaluate(function(){ - var el = document.getElementById('qunit-testresult') - return el && el.innerText.match('completed') - }) - }, function() { - var failures = page.evaluate(function() { - var el = document.getElementById('qunit-testresult'), - fails = document.getElementsByClassName('fail') - - for (var i = 0; i < fails.length; i++) - console.log(fails[i].innerText) - - console.log(el.innerText) - - return parseInt(el.getElementsByClassName('failed')[0].innerHTML) - }) - phantom.exit(failures > 0 ? 1 : 0) - }, 10000) -}) \ No newline at end of file diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/speed.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/speed.js deleted file mode 100644 index 9ceeea7..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/speed.js +++ /dev/null @@ -1,148 +0,0 @@ -(function() { - - JSLitmus.test('levenshtein', function() { - return [ - _.levenshtein('pineapple', 'potato'), - _.levenshtein('seven', 'eight'), - _.levenshtein('the very same string', 'the very same string'), - _.levenshtein('very very very long string', 'something completely different') - ]; - }); - - - JSLitmus.test('trimNoNative', function() { - return _.trim(" foobar ", " "); - }); - - JSLitmus.test('trim', function() { - return _.trim(" foobar "); - }); - - JSLitmus.test('trim object-oriented', function() { - return _(" foobar ").trim(); - }); - - JSLitmus.test('trim jQuery', function() { - return jQuery.trim(" foobar "); - }); - - JSLitmus.test('ltrimp', function() { - return _.ltrim(" foobar ", " "); - }); - - JSLitmus.test('rtrimp', function() { - return _.rtrim(" foobar ", " "); - }); - - JSLitmus.test('startsWith', function() { - return _.startsWith("foobar", "foo"); - }); - - JSLitmus.test('endsWith', function() { - return _.endsWith("foobar", "xx"); - }); - - JSLitmus.test('chop', function(){ - return _('whitespace').chop(2); - }); - - JSLitmus.test('count', function(){ - return _('Hello worls').count('l'); - }); - - JSLitmus.test('insert', function() { - return _('Hello ').insert(6, 'world'); - }); - - JSLitmus.test('splice', function() { - return _('https://edtsech@bitbucket.org/edtsech/underscore.strings').splice(30, 7, 'epeli'); - }); - - JSLitmus.test('succ', function(){ - var let = 'a', alphabet = []; - - for (var i=0; i < 26; i++) { - alphabet.push(let); - let = _(let).succ(); - } - - return alphabet; - }); - - JSLitmus.test('titleize', function(){ - return _('the titleize string method').titleize(); - }); - - JSLitmus.test('truncate', function(){ - return _('Hello world').truncate(5); - }); - - JSLitmus.test('prune', function(){ - return _('Hello world').prune(5); - }); - - JSLitmus.test('isBlank', function(){ - return _('').isBlank(); - }); - - JSLitmus.test('escapeHTML', function(){ - _('
Blah blah blah
').escapeHTML(); - }); - - JSLitmus.test('unescapeHTML', function(){ - _('<div>Blah blah blah</div>').unescapeHTML(); - }); - - JSLitmus.test('reverse', function(){ - _('Hello World').reverse(); - }); - - JSLitmus.test('pad default', function(){ - _('foo').pad(12); - }); - - JSLitmus.test('pad hash left', function(){ - _('foo').pad(12, '#'); - }); - - JSLitmus.test('pad hash right', function(){ - _('foo').pad(12, '#', 'right'); - }); - - JSLitmus.test('pad hash both', function(){ - _('foo').pad(12, '#', 'both'); - }); - - JSLitmus.test('pad hash both longPad', function(){ - _('foo').pad(12, 'f00f00f00', 'both'); - }); - - JSLitmus.test('toNumber', function(){ - _('10.232323').toNumber(2); - }); - - JSLitmus.test('strRight', function(){ - _('aaa_bbb_ccc').strRight('_'); - }); - - JSLitmus.test('strRightBack', function(){ - _('aaa_bbb_ccc').strRightBack('_'); - }); - - JSLitmus.test('strLeft', function(){ - _('aaa_bbb_ccc').strLeft('_'); - }); - - JSLitmus.test('strLeftBack', function(){ - _('aaa_bbb_ccc').strLeftBack('_'); - }); - - JSLitmus.test('join', function(){ - _('separator').join(1, 2, 3, 4, 5, 6, 7, 8, 'foo', 'bar', 'lol', 'wut'); - }); - - JSLitmus.test('slugify', function(){ - _("Un éléphant à l'orée du bois").slugify(); - }); - -})(); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/strings.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/strings.js deleted file mode 100644 index 77364f2..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/strings.js +++ /dev/null @@ -1,685 +0,0 @@ -$(document).ready(function() { - - // Include Underscore.string methods to Underscore namespace - _.mixin(_.str.exports()); - - module('String extensions'); - - test('Strings: naturalSort', function() { - var arr = ['foo2', 'foo1', 'foo10', 'foo30', 'foo100', 'foo10bar'], - sorted = ['foo1', 'foo2', 'foo10', 'foo10bar', 'foo30', 'foo100']; - deepEqual(arr.sort(_.naturalCmp), sorted); - }); - - test('Strings: trim', function() { - equal(_.trim(123), '123', 'Non string'); - equal(_(' foo').trim(), 'foo'); - equal(_('foo ').trim(), 'foo'); - equal(_(' foo ').trim(), 'foo'); - equal(_(' foo ').trim(), 'foo'); - equal(_(' foo ').trim(' '), 'foo', 'Manually set whitespace'); - equal(_('\t foo \t ').trim(/\s/), 'foo', 'Manually set RegExp /\\s+/'); - - equal(_('ffoo').trim('f'), 'oo'); - equal(_('ooff').trim('f'), 'oo'); - equal(_('ffooff').trim('f'), 'oo'); - - - equal(_('_-foobar-_').trim('_-'), 'foobar'); - - equal(_('http://foo/').trim('/'), 'http://foo'); - equal(_('c:\\').trim('\\'), 'c:'); - - equal(_(123).trim(), '123'); - equal(_(123).trim(3), '12'); - equal(_('').trim(), '', 'Trim empty string should return empty string'); - equal(_(null).trim(), '', 'Trim null should return empty string'); - equal(_(undefined).trim(), '', 'Trim undefined should return empty string'); - }); - - test('String: levenshtein', function() { - equal(_.levenshtein('Godfather', 'Godfather'), 0); - equal(_.levenshtein('Godfather', 'Godfathe'), 1); - equal(_.levenshtein('Godfather', 'odfather'), 1); - equal(_.levenshtein('Godfather', 'Gdfthr'), 3); - equal(_.levenshtein('seven', 'eight'), 5); - equal(_.levenshtein('123', 123), 0); - equal(_.levenshtein(321, '321'), 0); - equal(_.levenshtein('lol', null), 3); - equal(_.levenshtein('lol'), 3); - equal(_.levenshtein(null, 'lol'), 3); - equal(_.levenshtein(undefined, 'lol'), 3); - equal(_.levenshtein(), 0); - }); - - test('Strings: ltrim', function() { - equal(_(' foo').ltrim(), 'foo'); - equal(_(' foo').ltrim(), 'foo'); - equal(_('foo ').ltrim(), 'foo '); - equal(_(' foo ').ltrim(), 'foo '); - equal(_('').ltrim(), '', 'ltrim empty string should return empty string'); - equal(_(null).ltrim(), '', 'ltrim null should return empty string'); - equal(_(undefined).ltrim(), '', 'ltrim undefined should return empty string'); - - equal(_('ffoo').ltrim('f'), 'oo'); - equal(_('ooff').ltrim('f'), 'ooff'); - equal(_('ffooff').ltrim('f'), 'ooff'); - - equal(_('_-foobar-_').ltrim('_-'), 'foobar-_'); - - equal(_(123).ltrim(1), '23'); - }); - - test('Strings: rtrim', function() { - equal(_('http://foo/').rtrim('/'), 'http://foo', 'clean trailing slash'); - equal(_(' foo').rtrim(), ' foo'); - equal(_('foo ').rtrim(), 'foo'); - equal(_('foo ').rtrim(), 'foo'); - equal(_('foo bar ').rtrim(), 'foo bar'); - equal(_(' foo ').rtrim(), ' foo'); - - equal(_('ffoo').rtrim('f'), 'ffoo'); - equal(_('ooff').rtrim('f'), 'oo'); - equal(_('ffooff').rtrim('f'), 'ffoo'); - - equal(_('_-foobar-_').rtrim('_-'), '_-foobar'); - - equal(_(123).rtrim(3), '12'); - equal(_('').rtrim(), '', 'rtrim empty string should return empty string'); - equal(_(null).rtrim(), '', 'rtrim null should return empty string'); - }); - - test('Strings: capitalize', function() { - equal(_('fabio').capitalize(), 'Fabio', 'First letter is upper case'); - equal(_.capitalize('fabio'), 'Fabio', 'First letter is upper case'); - equal(_.capitalize('FOO'), 'FOO', 'Other letters unchanged'); - equal(_(123).capitalize(), '123', 'Non string'); - equal(_.capitalize(''), '', 'Capitalizing empty string returns empty string'); - equal(_.capitalize(null), '', 'Capitalizing null returns empty string'); - equal(_.capitalize(undefined), '', 'Capitalizing undefined returns empty string'); - }); - - test('Strings: join', function() { - equal(_.join('', 'foo', 'bar'), 'foobar', 'basic join'); - equal(_.join('', 1, 'foo', 2), '1foo2', 'join numbers and strings'); - equal(_.join(' ','foo', 'bar'), 'foo bar', 'join with spaces'); - equal(_.join('1', '2', '2'), '212', 'join number strings'); - equal(_.join(1, 2, 2), '212', 'join numbers'); - equal(_.join('','foo', null), 'foo', 'join null with string returns string'); - equal(_.join(null,'foo', 'bar'), 'foobar', 'join strings with null returns string'); - equal(_(' ').join('foo', 'bar'), 'foo bar', 'join object oriented'); - }); - - test('Strings: reverse', function() { - equal(_.str.reverse('foo'), 'oof' ); - equal(_.str.reverse('foobar'), 'raboof' ); - equal(_.str.reverse('foo bar'), 'rab oof' ); - equal(_.str.reverse('saippuakauppias'), 'saippuakauppias' ); - equal(_.str.reverse(123), '321', 'Non string'); - equal(_.str.reverse(123.45), '54.321', 'Non string'); - equal(_.str.reverse(''), '', 'reversing empty string returns empty string' ); - equal(_.str.reverse(null), '', 'reversing null returns empty string' ); - equal(_.str.reverse(undefined), '', 'reversing undefined returns empty string' ); - }); - - test('Strings: clean', function() { - equal(_(' foo bar ').clean(), 'foo bar'); - equal(_(123).clean(), '123'); - equal(_('').clean(), '', 'claning empty string returns empty string'); - equal(_(null).clean(), '', 'claning null returns empty string'); - equal(_(undefined).clean(), '', 'claning undefined returns empty string'); - }); - - test('Strings: sprintf', function() { - // Should be very tested function already. Thanks to - // http://www.diveintojavascript.com/projects/sprintf-for-javascript - equal(_.sprintf('Hello %s', 'me'), 'Hello me', 'basic'); - equal(_('Hello %s').sprintf('me'), 'Hello me', 'object'); - equal(_('hello %s').chain().sprintf('me').capitalize().value(), 'Hello me', 'Chaining works'); - equal(_.sprintf('%.1f', 1.22222), '1.2', 'round'); - equal(_.sprintf('%.1f', 1.17), '1.2', 'round 2'); - equal(_.sprintf('%(id)d - %(name)s', {id: 824, name: 'Hello World'}), '824 - Hello World', 'Named replacements work'); - equal(_.sprintf('%(args[0].id)d - %(args[1].name)s', {args: [{id: 824}, {name: 'Hello World'}]}), '824 - Hello World', 'Named replacements with arrays work'); - }); - - - test('Strings: vsprintf', function() { - equal(_.vsprintf('Hello %s', ['me']), 'Hello me', 'basic'); - equal(_('Hello %s').vsprintf(['me']), 'Hello me', 'object'); - equal(_('hello %s').chain().vsprintf(['me']).capitalize().value(), 'Hello me', 'Chaining works'); - equal(_.vsprintf('%.1f', [1.22222]), '1.2', 'round'); - equal(_.vsprintf('%.1f', [1.17]), '1.2', 'round 2'); - equal(_.vsprintf('%(id)d - %(name)s', [{id: 824, name: 'Hello World'}]), '824 - Hello World', 'Named replacement works'); - equal(_.vsprintf('%(args[0].id)d - %(args[1].name)s', [{args: [{id: 824}, {name: 'Hello World'}]}]), '824 - Hello World', 'Named replacement with arrays works'); - }); - - test('Strings: startsWith', function() { - ok(_('foobar').startsWith('foo'), 'foobar starts with foo'); - ok(!_('oobar').startsWith('foo'), 'oobar does not start with foo'); - ok(_(12345).startsWith(123), '12345 starts with 123'); - ok(!_(2345).startsWith(123), '2345 does not start with 123'); - ok(_('').startsWith(''), 'empty string starts with empty string'); - ok(_(null).startsWith(''), 'null starts with empty string'); - ok(!_(null).startsWith('foo'), 'null starts with foo'); - }); - - test('Strings: endsWith', function() { - ok(_('foobar').endsWith('bar'), 'foobar ends with bar'); - ok(_.endsWith('foobar', 'bar'), 'foobar ends with bar'); - ok(_.endsWith('00018-0000062.Plone.sdh264.1a7264e6912a91aa4a81b64dc5517df7b8875994.mp4', 'mp4'), 'endsWith .mp4'); - ok(!_('fooba').endsWith('bar'), 'fooba does not end with bar'); - ok(_.endsWith(12345, 45), '12345 ends with 45'); - ok(!_.endsWith(12345, 6), '12345 does not end with 6'); - ok(_('').endsWith(''), 'empty string ends with empty string'); - ok(_(null).endsWith(''), 'null ends with empty string'); - ok(!_(null).endsWith('foo'), 'null ends with foo'); - }); - - test('Strings: include', function() { - ok(_.str.include('foobar', 'bar'), 'foobar includes bar'); - ok(!_.str.include('foobar', 'buzz'), 'foobar does not includes buzz'); - ok(_.str.include(12345, 34), '12345 includes 34'); - ok(!_.str.contains(12345, 6), '12345 does not includes 6'); - ok(!_.str.include('', 34), 'empty string includes 34'); - ok(!_.str.include(null, 34), 'null includes 34'); - ok(_.str.include(null, ''), 'null includes empty string'); - }); - - test('String: chop', function(){ - ok(_('whitespace').chop(2).length === 5, 'output [wh, it, es, pa, ce]'); - ok(_('whitespace').chop(3).length === 4, 'output [whi, tes, pac, e]'); - ok(_('whitespace').chop()[0].length === 10, 'output [whitespace]'); - ok(_(12345).chop(1).length === 5, 'output [1, 2, 3, 4, 5]'); - }); - - test('String: clean', function(){ - equal(_.clean(' foo bar '), 'foo bar'); - equal(_.clean(''), ''); - equal(_.clean(null), ''); - equal(_.clean(1), '1'); - }); - - test('String: count', function(){ - equal(_('Hello world').count('l'), 3); - equal(_('Hello world').count('Hello'), 1); - equal(_('Hello world').count('foo'), 0); - equal(_('x.xx....x.x').count('x'), 5); - equal(_('').count('x'), 0); - equal(_(null).count('x'), 0); - equal(_(undefined).count('x'), 0); - equal(_(12345).count(1), 1); - equal(_(11345).count(1), 2); - }); - - test('String: insert', function(){ - equal(_('Hello ').insert(6, 'Jessy'), 'Hello Jessy'); - equal(_('Hello ').insert(100, 'Jessy'), 'Hello Jessy'); - equal(_('').insert(100, 'Jessy'), 'Jessy'); - equal(_(null).insert(100, 'Jessy'), 'Jessy'); - equal(_(undefined).insert(100, 'Jessy'), 'Jessy'); - equal(_(12345).insert(6, 'Jessy'), '12345Jessy'); - }); - - test('String: splice', function(){ - equal(_('https://edtsech@bitbucket.org/edtsech/underscore.strings').splice(30, 7, 'epeli'), - 'https://edtsech@bitbucket.org/epeli/underscore.strings'); - equal(_.splice(12345, 1, 2, 321), '132145', 'Non strings'); - }); - - test('String: succ', function(){ - equal(_('a').succ(), 'b'); - equal(_('A').succ(), 'B'); - equal(_('+').succ(), ','); - equal(_(1).succ(), '2'); - }); - - test('String: titleize', function(){ - equal(_('the titleize string method').titleize(), 'The Titleize String Method'); - equal(_('the titleize string method').titleize(), 'The Titleize String Method'); - equal(_('').titleize(), '', 'Titleize empty string returns empty string'); - equal(_(null).titleize(), '', 'Titleize null returns empty string'); - equal(_(undefined).titleize(), '', 'Titleize undefined returns empty string'); - equal(_('let\'s have some fun').titleize(), 'Let\'s Have Some Fun'); - equal(_('a-dash-separated-string').titleize(), 'A-Dash-Separated-String'); - equal(_('A-DASH-SEPARATED-STRING').titleize(), 'A-Dash-Separated-String'); - equal(_(123).titleize(), '123'); - }); - - test('String: camelize', function(){ - equal(_('the_camelize_string_method').camelize(), 'theCamelizeStringMethod'); - equal(_('-the-camelize-string-method').camelize(), 'TheCamelizeStringMethod'); - equal(_('the camelize string method').camelize(), 'theCamelizeStringMethod'); - equal(_(' the camelize string method').camelize(), 'theCamelizeStringMethod'); - equal(_('the camelize string method').camelize(), 'theCamelizeStringMethod'); - equal(_('').camelize(), '', 'Camelize empty string returns empty string'); - equal(_(null).camelize(), '', 'Camelize null returns empty string'); - equal(_(undefined).camelize(), '', 'Camelize undefined returns empty string'); - equal(_(123).camelize(), '123'); - }); - - test('String: underscored', function(){ - equal(_('the-underscored-string-method').underscored(), 'the_underscored_string_method'); - equal(_('theUnderscoredStringMethod').underscored(), 'the_underscored_string_method'); - equal(_('TheUnderscoredStringMethod').underscored(), 'the_underscored_string_method'); - equal(_(' the underscored string method').underscored(), 'the_underscored_string_method'); - equal(_('').underscored(), ''); - equal(_(null).underscored(), ''); - equal(_(undefined).underscored(), ''); - equal(_(123).underscored(), '123'); - }); - - test('String: dasherize', function(){ - equal(_('the_dasherize_string_method').dasherize(), 'the-dasherize-string-method'); - equal(_('TheDasherizeStringMethod').dasherize(), '-the-dasherize-string-method'); - equal(_('thisIsATest').dasherize(), 'this-is-a-test'); - equal(_('this Is A Test').dasherize(), 'this-is-a-test'); - equal(_('thisIsATest123').dasherize(), 'this-is-a-test123'); - equal(_('123thisIsATest').dasherize(), '123this-is-a-test'); - equal(_('the dasherize string method').dasherize(), 'the-dasherize-string-method'); - equal(_('the dasherize string method ').dasherize(), 'the-dasherize-string-method'); - equal(_('téléphone').dasherize(), 'téléphone'); - equal(_('foo$bar').dasherize(), 'foo$bar'); - equal(_('').dasherize(), ''); - equal(_(null).dasherize(), ''); - equal(_(undefined).dasherize(), ''); - equal(_(123).dasherize(), '123'); - }); - - test('String: camelize', function(){ - equal(_.camelize('-moz-transform'), 'MozTransform'); - equal(_.camelize('webkit-transform'), 'webkitTransform'); - equal(_.camelize('under_scored'), 'underScored'); - equal(_.camelize(' with spaces'), 'withSpaces'); - equal(_('').camelize(), ''); - equal(_(null).camelize(), ''); - equal(_(undefined).camelize(), ''); - equal(_("_som eWeird---name-").camelize(), 'SomEWeirdName'); - }); - - test('String: join', function(){ - equal(_.join(1, 2, 3, 4), '21314'); - equal(_.join('|', 'foo', 'bar', 'baz'), 'foo|bar|baz'); - equal(_.join('',2,3,null), '23'); - equal(_.join(null,2,3), '23'); - }); - - test('String: classify', function(){ - equal(_.classify(1), '1'); - equal(_('some_class_name').classify(), 'SomeClassName'); - equal(_('my wonderfull class_name').classify(), 'MyWonderfullClassName'); - equal(_('my wonderfull.class.name').classify(), 'MyWonderfullClassName'); - }); - - test('String: humanize', function(){ - equal(_('the_humanize_string_method').humanize(), 'The humanize string method'); - equal(_('ThehumanizeStringMethod').humanize(), 'Thehumanize string method'); - equal(_('the humanize string method').humanize(), 'The humanize string method'); - equal(_('the humanize_id string method_id').humanize(), 'The humanize id string method'); - equal(_('the humanize string method ').humanize(), 'The humanize string method'); - equal(_(' capitalize dash-CamelCase_underscore trim ').humanize(), 'Capitalize dash camel case underscore trim'); - equal(_(123).humanize(), '123'); - equal(_('').humanize(), ''); - equal(_(null).humanize(), ''); - equal(_(undefined).humanize(), ''); - }); - - test('String: truncate', function(){ - equal(_('Hello world').truncate(6, 'read more'), 'Hello read more'); - equal(_('Hello world').truncate(5), 'Hello...'); - equal(_('Hello').truncate(10), 'Hello'); - equal(_('').truncate(10), ''); - equal(_(null).truncate(10), ''); - equal(_(undefined).truncate(10), ''); - equal(_(1234567890).truncate(5), '12345...'); - }); - - test('String: prune', function(){ - equal(_('Hello, cruel world').prune(6, ' read more'), 'Hello read more'); - equal(_('Hello, world').prune(5, 'read a lot more'), 'Hello, world'); - equal(_('Hello, world').prune(5), 'Hello...'); - equal(_('Hello, world').prune(8), 'Hello...'); - equal(_('Hello, cruel world').prune(15), 'Hello, cruel...'); - equal(_('Hello world').prune(22), 'Hello world'); - equal(_('Привет, жестокий мир').prune(6, ' read more'), 'Привет read more'); - equal(_('Привет, мир').prune(6, 'read a lot more'), 'Привет, мир'); - equal(_('Привет, мир').prune(6), 'Привет...'); - equal(_('Привет, мир').prune(8), 'Привет...'); - equal(_('Привет, жестокий мир').prune(16), 'Привет, жестокий...'); - equal(_('Привет, мир').prune(22), 'Привет, мир'); - equal(_('alksjd!!!!!!....').prune(100, ''), 'alksjd!!!!!!....'); - equal(_(123).prune(10), '123'); - equal(_(123).prune(1, 321), '321'); - equal(_('').prune(5), ''); - equal(_(null).prune(5), ''); - equal(_(undefined).prune(5), ''); - }); - - test('String: isBlank', function(){ - ok(_('').isBlank()); - ok(_(' ').isBlank()); - ok(_('\n').isBlank()); - ok(!_('a').isBlank()); - ok(!_('0').isBlank()); - ok(!_(0).isBlank()); - ok(_('').isBlank()); - ok(_(null).isBlank()); - ok(_(undefined).isBlank()); - }); - - test('String: escapeRegExp', function(){ - equal(_.escapeRegExp(/hello(?=\sworld)/.source), 'hello\\(\\?\\=\\\\sworld\\)', 'with lookahead'); - equal(_.escapeRegExp(/hello(?!\shell)/.source), 'hello\\(\\?\\!\\\\shell\\)', 'with negative lookahead'); - }); - - test('String: escapeHTML', function(){ - equal(_('
Blah & "blah" & \'blah\'
').escapeHTML(), - '<div>Blah & "blah" & 'blah'</div>'); - equal(_('<').escapeHTML(), '&lt;'); - equal(_(5).escapeHTML(), '5'); - equal(_('').escapeHTML(), ''); - equal(_(null).escapeHTML(), ''); - equal(_(undefined).escapeHTML(), ''); - }); - - test('String: unescapeHTML', function(){ - equal(_('<div>Blah & "blah" & 'blah'</div>').unescapeHTML(), - '
Blah & "blah" & \'blah\'
'); - equal(_('&lt;').unescapeHTML(), '<'); - equal(_(''').unescapeHTML(), '\''); - equal(_(''').unescapeHTML(), '\''); - equal(_(''').unescapeHTML(), '\''); - equal(_('J').unescapeHTML(), 'J'); - equal(_('J').unescapeHTML(), 'J'); - equal(_('J').unescapeHTML(), 'J'); - equal(_('&_#39;').unescapeHTML(), '&_#39;'); - equal(_(''_;').unescapeHTML(), ''_;'); - equal(_('&#38;').unescapeHTML(), '&'); - equal(_('&amp;').unescapeHTML(), '&'); - equal(_('').unescapeHTML(), ''); - equal(_(null).unescapeHTML(), ''); - equal(_(undefined).unescapeHTML(), ''); - equal(_(5).unescapeHTML(), '5'); - // equal(_(undefined).unescapeHTML(), ''); - }); - - test('String: words', function() { - deepEqual(_('I love you!').words(), ['I', 'love', 'you!']); - deepEqual(_(' I love you! ').words(), ['I', 'love', 'you!']); - deepEqual(_('I_love_you!').words('_'), ['I', 'love', 'you!']); - deepEqual(_('I-love-you!').words(/-/), ['I', 'love', 'you!']); - deepEqual(_(123).words(), ['123'], '123 number has one word "123".'); - deepEqual(_(0).words(), ['0'], 'Zero number has one word "0".'); - deepEqual(_('').words(), [], 'Empty strings has no words.'); - deepEqual(_(' ').words(), [], 'Blank strings has no words.'); - deepEqual(_(null).words(), [], 'null has no words.'); - deepEqual(_(undefined).words(), [], 'undefined has no words.'); - }); - - test('String: chars', function() { - equal(_('Hello').chars().length, 5); - equal(_(123).chars().length, 3); - equal(_('').chars().length, 0); - equal(_(null).chars().length, 0); - equal(_(undefined).chars().length, 0); - }); - - test('String: swapCase', function(){ - equal(_('AaBbCcDdEe').swapCase(), 'aAbBcCdDeE'); - equal(_('Hello World').swapCase(), 'hELLO wORLD'); - equal(_('').swapCase(), ''); - equal(_(null).swapCase(), ''); - equal(_(undefined).swapCase(), ''); - }); - - test('String: lines', function() { - equal(_('Hello\nWorld').lines().length, 2); - equal(_('Hello World').lines().length, 1); - equal(_(123).lines().length, 1); - equal(_('').lines().length, 1); - equal(_(null).lines().length, 0); - equal(_(undefined).lines().length, 0); - }); - - test('String: pad', function() { - equal(_('1').pad(8), ' 1'); - equal(_(1).pad(8), ' 1'); - equal(_('1').pad(8, '0'), '00000001'); - equal(_('1').pad(8, '0', 'left'), '00000001'); - equal(_('1').pad(8, '0', 'right'), '10000000'); - equal(_('1').pad(8, '0', 'both'), '00001000'); - equal(_('foo').pad(8, '0', 'both'), '000foo00'); - equal(_('foo').pad(7, '0', 'both'), '00foo00'); - equal(_('foo').pad(7, '!@$%dofjrofj', 'both'), '!!foo!!'); - equal(_('').pad(2), ' '); - equal(_(null).pad(2), ' '); - equal(_(undefined).pad(2), ' '); - }); - - test('String: lpad', function() { - equal(_('1').lpad(8), ' 1'); - equal(_(1).lpad(8), ' 1'); - equal(_('1').lpad(8, '0'), '00000001'); - equal(_('1').lpad(8, '0', 'left'), '00000001'); - equal(_('').lpad(2), ' '); - equal(_(null).lpad(2), ' '); - equal(_(undefined).lpad(2), ' '); - }); - - test('String: rpad', function() { - equal(_('1').rpad(8), '1 '); - equal(_(1).lpad(8), ' 1'); - equal(_('1').rpad(8, '0'), '10000000'); - equal(_('foo').rpad(8, '0'), 'foo00000'); - equal(_('foo').rpad(7, '0'), 'foo0000'); - equal(_('').rpad(2), ' '); - equal(_(null).rpad(2), ' '); - equal(_(undefined).rpad(2), ' '); - }); - - test('String: lrpad', function() { - equal(_('1').lrpad(8), ' 1 '); - equal(_(1).lrpad(8), ' 1 '); - equal(_('1').lrpad(8, '0'), '00001000'); - equal(_('foo').lrpad(8, '0'), '000foo00'); - equal(_('foo').lrpad(7, '0'), '00foo00'); - equal(_('foo').lrpad(7, '!@$%dofjrofj'), '!!foo!!'); - equal(_('').lrpad(2), ' '); - equal(_(null).lrpad(2), ' '); - equal(_(undefined).lrpad(2), ' '); - }); - - test('String: toNumber', function() { - deepEqual(_('not a number').toNumber(), NaN); - equal(_(0).toNumber(), 0); - equal(_('0').toNumber(), 0); - equal(_('0.0').toNumber(), 0); - equal(_('0.1').toNumber(), 0); - equal(_('0.1').toNumber(1), 0.1); - equal(_(' 0.1 ').toNumber(1), 0.1); - equal(_('0000').toNumber(), 0); - equal(_('2.345').toNumber(), 2); - equal(_('2.345').toNumber(NaN), 2); - equal(_('2.345').toNumber(2), 2.35); - equal(_('2.344').toNumber(2), 2.34); - equal(_('2').toNumber(2), 2.00); - equal(_(2).toNumber(2), 2.00); - equal(_(-2).toNumber(), -2); - equal(_('-2').toNumber(), -2); - equal(_('').toNumber(), 0); - equal(_(null).toNumber(), 0); - equal(_(undefined).toNumber(), 0); - }); - - test('String: numberFormat', function() { - equal(_.numberFormat(9000), '9,000'); - equal(_.numberFormat(9000, 0), '9,000'); - equal(_.numberFormat(9000, 0, '', ''), '9000'); - equal(_.numberFormat(90000, 2), '90,000.00'); - equal(_.numberFormat(1000.754), '1,001'); - equal(_.numberFormat(1000.754, 2), '1,000.75'); - equal(_.numberFormat(1000.754, 0, ',', '.'), '1.001'); - equal(_.numberFormat(1000.754, 2, ',', '.'), '1.000,75'); - equal(_.numberFormat(1000000.754, 2, ',', '.'), '1.000.000,75'); - equal(_.numberFormat(1000000000), '1,000,000,000'); - equal(_.numberFormat(100000000), '100,000,000'); - equal(_.numberFormat('not number'), ''); - equal(_.numberFormat(), ''); - equal(_.numberFormat(null, '.', ','), ''); - equal(_.numberFormat(undefined, '.', ','), ''); - equal(_.numberFormat(new Number(5000)), '5,000'); - }); - - test('String: strRight', function() { - equal(_('This_is_a_test_string').strRight('_'), 'is_a_test_string'); - equal(_('This_is_a_test_string').strRight('string'), ''); - equal(_('This_is_a_test_string').strRight(), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strRight(''), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strRight('-'), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strRight(''), 'This_is_a_test_string'); - equal(_('').strRight('foo'), ''); - equal(_(null).strRight('foo'), ''); - equal(_(undefined).strRight('foo'), ''); - equal(_(12345).strRight(2), '345'); - }); - - test('String: strRightBack', function() { - equal(_('This_is_a_test_string').strRightBack('_'), 'string'); - equal(_('This_is_a_test_string').strRightBack('string'), ''); - equal(_('This_is_a_test_string').strRightBack(), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strRightBack(''), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strRightBack('-'), 'This_is_a_test_string'); - equal(_('').strRightBack('foo'), ''); - equal(_(null).strRightBack('foo'), ''); - equal(_(undefined).strRightBack('foo'), ''); - equal(_(12345).strRightBack(2), '345'); - }); - - test('String: strLeft', function() { - equal(_('This_is_a_test_string').strLeft('_'), 'This'); - equal(_('This_is_a_test_string').strLeft('This'), ''); - equal(_('This_is_a_test_string').strLeft(), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strLeft(''), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strLeft('-'), 'This_is_a_test_string'); - equal(_('').strLeft('foo'), ''); - equal(_(null).strLeft('foo'), ''); - equal(_(undefined).strLeft('foo'), ''); - equal(_(123454321).strLeft(3), '12'); - }); - - test('String: strLeftBack', function() { - equal(_('This_is_a_test_string').strLeftBack('_'), 'This_is_a_test'); - equal(_('This_is_a_test_string').strLeftBack('This'), ''); - equal(_('This_is_a_test_string').strLeftBack(), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strLeftBack(''), 'This_is_a_test_string'); - equal(_('This_is_a_test_string').strLeftBack('-'), 'This_is_a_test_string'); - equal(_('').strLeftBack('foo'), ''); - equal(_(null).strLeftBack('foo'), ''); - equal(_(undefined).strLeftBack('foo'), ''); - equal(_(123454321).strLeftBack(3), '123454'); - }); - - test('Strings: stripTags', function() { - equal(_('a link').stripTags(), 'a link'); - equal(_('a link - - - - - - - - -

Underscore.string Test Suite

-

-

-
    -
    -

    Underscore.string Speed Suite

    - -
    - - diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_standalone.html b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_standalone.html deleted file mode 100644 index 9854c17..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_standalone.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - Underscore.strings Test Suite - - - - - - - - -

    Underscore.string Test Suite

    -

    -

    -
      - - diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/arrays.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/arrays.js deleted file mode 100644 index 32252a3..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/arrays.js +++ /dev/null @@ -1,200 +0,0 @@ -$(document).ready(function() { - - module("Arrays"); - - test("first", function() { - equal(_.first([1,2,3]), 1, 'can pull out the first element of an array'); - equal(_([1, 2, 3]).first(), 1, 'can perform OO-style "first()"'); - equal(_.first([1,2,3], 0).join(', '), "", 'can pass an index to first'); - equal(_.first([1,2,3], 2).join(', '), '1, 2', 'can pass an index to first'); - equal(_.first([1,2,3], 5).join(', '), '1, 2, 3', 'can pass an index to first'); - var result = (function(){ return _.first(arguments); })(4, 3, 2, 1); - equal(result, 4, 'works on an arguments object.'); - result = _.map([[1,2,3],[1,2,3]], _.first); - equal(result.join(','), '1,1', 'works well with _.map'); - result = (function() { return _.take([1,2,3], 2); })(); - equal(result.join(','), '1,2', 'aliased as take'); - - equal(_.first(null), undefined, 'handles nulls'); - }); - - test("rest", function() { - var numbers = [1, 2, 3, 4]; - equal(_.rest(numbers).join(", "), "2, 3, 4", 'working rest()'); - equal(_.rest(numbers, 0).join(", "), "1, 2, 3, 4", 'working rest(0)'); - equal(_.rest(numbers, 2).join(', '), '3, 4', 'rest can take an index'); - var result = (function(){ return _(arguments).tail(); })(1, 2, 3, 4); - equal(result.join(', '), '2, 3, 4', 'aliased as tail and works on arguments object'); - result = _.map([[1,2,3],[1,2,3]], _.rest); - equal(_.flatten(result).join(','), '2,3,2,3', 'works well with _.map'); - result = (function(){ return _(arguments).drop(); })(1, 2, 3, 4); - equal(result.join(', '), '2, 3, 4', 'aliased as drop and works on arguments object'); - }); - - test("initial", function() { - equal(_.initial([1,2,3,4,5]).join(", "), "1, 2, 3, 4", 'working initial()'); - equal(_.initial([1,2,3,4],2).join(", "), "1, 2", 'initial can take an index'); - var result = (function(){ return _(arguments).initial(); })(1, 2, 3, 4); - equal(result.join(", "), "1, 2, 3", 'initial works on arguments object'); - result = _.map([[1,2,3],[1,2,3]], _.initial); - equal(_.flatten(result).join(','), '1,2,1,2', 'initial works with _.map'); - }); - - test("last", function() { - equal(_.last([1,2,3]), 3, 'can pull out the last element of an array'); - equal(_.last([1,2,3], 0).join(', '), "", 'can pass an index to last'); - equal(_.last([1,2,3], 2).join(', '), '2, 3', 'can pass an index to last'); - equal(_.last([1,2,3], 5).join(', '), '1, 2, 3', 'can pass an index to last'); - var result = (function(){ return _(arguments).last(); })(1, 2, 3, 4); - equal(result, 4, 'works on an arguments object'); - result = _.map([[1,2,3],[1,2,3]], _.last); - equal(result.join(','), '3,3', 'works well with _.map'); - - equal(_.last(null), undefined, 'handles nulls'); - }); - - test("compact", function() { - equal(_.compact([0, 1, false, 2, false, 3]).length, 3, 'can trim out all falsy values'); - var result = (function(){ return _(arguments).compact().length; })(0, 1, false, 2, false, 3); - equal(result, 3, 'works on an arguments object'); - }); - - test("flatten", function() { - if (window.JSON) { - var list = [1, [2], [3, [[[4]]]]]; - equal(JSON.stringify(_.flatten(list)), '[1,2,3,4]', 'can flatten nested arrays'); - equal(JSON.stringify(_.flatten(list, true)), '[1,2,3,[[[4]]]]', 'can shallowly flatten nested arrays'); - var result = (function(){ return _.flatten(arguments); })(1, [2], [3, [[[4]]]]); - equal(JSON.stringify(result), '[1,2,3,4]', 'works on an arguments object'); - } - }); - - test("without", function() { - var list = [1, 2, 1, 0, 3, 1, 4]; - equal(_.without(list, 0, 1).join(', '), '2, 3, 4', 'can remove all instances of an object'); - var result = (function(){ return _.without(arguments, 0, 1); })(1, 2, 1, 0, 3, 1, 4); - equal(result.join(', '), '2, 3, 4', 'works on an arguments object'); - - var list = [{one : 1}, {two : 2}]; - ok(_.without(list, {one : 1}).length == 2, 'uses real object identity for comparisons.'); - ok(_.without(list, list[0]).length == 1, 'ditto.'); - }); - - test("uniq", function() { - var list = [1, 2, 1, 3, 1, 4]; - equal(_.uniq(list).join(', '), '1, 2, 3, 4', 'can find the unique values of an unsorted array'); - - var list = [1, 1, 1, 2, 2, 3]; - equal(_.uniq(list, true).join(', '), '1, 2, 3', 'can find the unique values of a sorted array faster'); - - var list = [{name:'moe'}, {name:'curly'}, {name:'larry'}, {name:'curly'}]; - var iterator = function(value) { return value.name; }; - equal(_.map(_.uniq(list, false, iterator), iterator).join(', '), 'moe, curly, larry', 'can find the unique values of an array using a custom iterator'); - - var iterator = function(value) { return value +1; }; - var list = [1, 2, 2, 3, 4, 4]; - equal(_.uniq(list, true, iterator).join(', '), '1, 2, 3, 4', 'iterator works with sorted array'); - - var result = (function(){ return _.uniq(arguments); })(1, 2, 1, 3, 1, 4); - equal(result.join(', '), '1, 2, 3, 4', 'works on an arguments object'); - }); - - test("intersection", function() { - var stooges = ['moe', 'curly', 'larry'], leaders = ['moe', 'groucho']; - equal(_.intersection(stooges, leaders).join(''), 'moe', 'can take the set intersection of two arrays'); - equal(_(stooges).intersection(leaders).join(''), 'moe', 'can perform an OO-style intersection'); - var result = (function(){ return _.intersection(arguments, leaders); })('moe', 'curly', 'larry'); - equal(result.join(''), 'moe', 'works on an arguments object'); - }); - - test("union", function() { - var result = _.union([1, 2, 3], [2, 30, 1], [1, 40]); - equal(result.join(' '), '1 2 3 30 40', 'takes the union of a list of arrays'); - - var result = _.union([1, 2, 3], [2, 30, 1], [1, 40, [1]]); - equal(result.join(' '), '1 2 3 30 40 1', 'takes the union of a list of nested arrays'); - }); - - test("difference", function() { - var result = _.difference([1, 2, 3], [2, 30, 40]); - equal(result.join(' '), '1 3', 'takes the difference of two arrays'); - - var result = _.difference([1, 2, 3, 4], [2, 30, 40], [1, 11, 111]); - equal(result.join(' '), '3 4', 'takes the difference of three arrays'); - }); - - test('zip', function() { - var names = ['moe', 'larry', 'curly'], ages = [30, 40, 50], leaders = [true]; - var stooges = _.zip(names, ages, leaders); - equal(String(stooges), 'moe,30,true,larry,40,,curly,50,', 'zipped together arrays of different lengths'); - }); - - test('object', function() { - var result = _.object(['moe', 'larry', 'curly'], [30, 40, 50]); - var shouldBe = {moe: 30, larry: 40, curly: 50}; - ok(_.isEqual(result, shouldBe), 'two arrays zipped together into an object'); - - result = _.object([['one', 1], ['two', 2], ['three', 3]]); - shouldBe = {one: 1, two: 2, three: 3}; - ok(_.isEqual(result, shouldBe), 'an array of pairs zipped together into an object'); - - var stooges = {moe: 30, larry: 40, curly: 50}; - ok(_.isEqual(_.object(_.pairs(stooges)), stooges), 'an object converted to pairs and back to an object'); - - ok(_.isEqual(_.object(null), {}), 'handles nulls'); - }); - - test("indexOf", function() { - var numbers = [1, 2, 3]; - numbers.indexOf = null; - equal(_.indexOf(numbers, 2), 1, 'can compute indexOf, even without the native function'); - var result = (function(){ return _.indexOf(arguments, 2); })(1, 2, 3); - equal(result, 1, 'works on an arguments object'); - equal(_.indexOf(null, 2), -1, 'handles nulls properly'); - - var numbers = [10, 20, 30, 40, 50], num = 35; - var index = _.indexOf(numbers, num, true); - equal(index, -1, '35 is not in the list'); - - numbers = [10, 20, 30, 40, 50]; num = 40; - index = _.indexOf(numbers, num, true); - equal(index, 3, '40 is in the list'); - - numbers = [1, 40, 40, 40, 40, 40, 40, 40, 50, 60, 70]; num = 40; - index = _.indexOf(numbers, num, true); - equal(index, 1, '40 is in the list'); - - numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3]; - index = _.indexOf(numbers, 2, 5); - equal(index, 7, 'supports the fromIndex argument'); - }); - - test("lastIndexOf", function() { - var numbers = [1, 0, 1]; - equal(_.lastIndexOf(numbers, 1), 2); - - numbers = [1, 0, 1, 0, 0, 1, 0, 0, 0]; - numbers.lastIndexOf = null; - equal(_.lastIndexOf(numbers, 1), 5, 'can compute lastIndexOf, even without the native function'); - equal(_.lastIndexOf(numbers, 0), 8, 'lastIndexOf the other element'); - var result = (function(){ return _.lastIndexOf(arguments, 1); })(1, 0, 1, 0, 0, 1, 0, 0, 0); - equal(result, 5, 'works on an arguments object'); - equal(_.indexOf(null, 2), -1, 'handles nulls properly'); - - numbers = [1, 2, 3, 1, 2, 3, 1, 2, 3]; - index = _.lastIndexOf(numbers, 2, 2); - equal(index, 1, 'supports the fromIndex argument'); - }); - - test("range", function() { - equal(_.range(0).join(''), '', 'range with 0 as a first argument generates an empty array'); - equal(_.range(4).join(' '), '0 1 2 3', 'range with a single positive argument generates an array of elements 0,1,2,...,n-1'); - equal(_.range(5, 8).join(' '), '5 6 7', 'range with two arguments a & b, a<b generates an array of elements a,a+1,a+2,...,b-2,b-1'); - equal(_.range(8, 5).join(''), '', 'range with two arguments a & b, b<a generates an empty array'); - equal(_.range(3, 10, 3).join(' '), '3 6 9', 'range with three arguments a & b & c, c < b-a, a < b generates an array of elements a,a+c,a+2c,...,b - (multiplier of a) < c'); - equal(_.range(3, 10, 15).join(''), '3', 'range with three arguments a & b & c, c > b-a, a < b generates an array with a single element, equal to a'); - equal(_.range(12, 7, -2).join(' '), '12 10 8', 'range with three arguments a & b & c, a > b, c < 0 generates an array of elements a,a-c,a-2c and ends with the number not less than b'); - equal(_.range(0, -10, -1).join(' '), '0 -1 -2 -3 -4 -5 -6 -7 -8 -9', 'final example in the Python docs'); - }); - -}); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/chaining.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/chaining.js deleted file mode 100644 index 16cf7bf..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/chaining.js +++ /dev/null @@ -1,59 +0,0 @@ -$(document).ready(function() { - - module("Chaining"); - - test("map/flatten/reduce", function() { - var lyrics = [ - "I'm a lumberjack and I'm okay", - "I sleep all night and I work all day", - "He's a lumberjack and he's okay", - "He sleeps all night and he works all day" - ]; - var counts = _(lyrics).chain() - .map(function(line) { return line.split(''); }) - .flatten() - .reduce(function(hash, l) { - hash[l] = hash[l] || 0; - hash[l]++; - return hash; - }, {}).value(); - ok(counts['a'] == 16 && counts['e'] == 10, 'counted all the letters in the song'); - }); - - test("select/reject/sortBy", function() { - var numbers = [1,2,3,4,5,6,7,8,9,10]; - numbers = _(numbers).chain().select(function(n) { - return n % 2 == 0; - }).reject(function(n) { - return n % 4 == 0; - }).sortBy(function(n) { - return -n; - }).value(); - equal(numbers.join(', '), "10, 6, 2", "filtered and reversed the numbers"); - }); - - test("select/reject/sortBy in functional style", function() { - var numbers = [1,2,3,4,5,6,7,8,9,10]; - numbers = _.chain(numbers).select(function(n) { - return n % 2 == 0; - }).reject(function(n) { - return n % 4 == 0; - }).sortBy(function(n) { - return -n; - }).value(); - equal(numbers.join(', '), "10, 6, 2", "filtered and reversed the numbers"); - }); - - test("reverse/concat/unshift/pop/map", function() { - var numbers = [1,2,3,4,5]; - numbers = _(numbers).chain() - .reverse() - .concat([5, 5, 5]) - .unshift(17) - .pop() - .map(function(n){ return n * 2; }) - .value(); - equal(numbers.join(', '), "34, 10, 8, 6, 4, 2, 10, 10", 'can chain together array functions.'); - }); - -}); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/collections.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/collections.js deleted file mode 100644 index e089626..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/collections.js +++ /dev/null @@ -1,426 +0,0 @@ -$(document).ready(function() { - - module("Collections"); - - test("each", function() { - _.each([1, 2, 3], function(num, i) { - equal(num, i + 1, 'each iterators provide value and iteration count'); - }); - - var answers = []; - _.each([1, 2, 3], function(num){ answers.push(num * this.multiplier);}, {multiplier : 5}); - equal(answers.join(', '), '5, 10, 15', 'context object property accessed'); - - answers = []; - _.forEach([1, 2, 3], function(num){ answers.push(num); }); - equal(answers.join(', '), '1, 2, 3', 'aliased as "forEach"'); - - answers = []; - var obj = {one : 1, two : 2, three : 3}; - obj.constructor.prototype.four = 4; - _.each(obj, function(value, key){ answers.push(key); }); - equal(answers.join(", "), 'one, two, three', 'iterating over objects works, and ignores the object prototype.'); - delete obj.constructor.prototype.four; - - answer = null; - _.each([1, 2, 3], function(num, index, arr){ if (_.include(arr, num)) answer = true; }); - ok(answer, 'can reference the original collection from inside the iterator'); - - answers = 0; - _.each(null, function(){ ++answers; }); - equal(answers, 0, 'handles a null properly'); - }); - - test('map', function() { - var doubled = _.map([1, 2, 3], function(num){ return num * 2; }); - equal(doubled.join(', '), '2, 4, 6', 'doubled numbers'); - - doubled = _.collect([1, 2, 3], function(num){ return num * 2; }); - equal(doubled.join(', '), '2, 4, 6', 'aliased as "collect"'); - - var tripled = _.map([1, 2, 3], function(num){ return num * this.multiplier; }, {multiplier : 3}); - equal(tripled.join(', '), '3, 6, 9', 'tripled numbers with context'); - - var doubled = _([1, 2, 3]).map(function(num){ return num * 2; }); - equal(doubled.join(', '), '2, 4, 6', 'OO-style doubled numbers'); - - if (document.querySelectorAll) { - var ids = _.map(document.querySelectorAll('#map-test *'), function(n){ return n.id; }); - deepEqual(ids, ['id1', 'id2'], 'Can use collection methods on NodeLists.'); - } - - var ids = _.map($('#map-test').children(), function(n){ return n.id; }); - deepEqual(ids, ['id1', 'id2'], 'Can use collection methods on jQuery Array-likes.'); - - var ids = _.map(document.images, function(n){ return n.id; }); - ok(ids[0] == 'chart_image', 'can use collection methods on HTMLCollections'); - - var ifnull = _.map(null, function(){}); - ok(_.isArray(ifnull) && ifnull.length === 0, 'handles a null properly'); - }); - - test('reduce', function() { - var sum = _.reduce([1, 2, 3], function(sum, num){ return sum + num; }, 0); - equal(sum, 6, 'can sum up an array'); - - var context = {multiplier : 3}; - sum = _.reduce([1, 2, 3], function(sum, num){ return sum + num * this.multiplier; }, 0, context); - equal(sum, 18, 'can reduce with a context object'); - - sum = _.inject([1, 2, 3], function(sum, num){ return sum + num; }, 0); - equal(sum, 6, 'aliased as "inject"'); - - sum = _([1, 2, 3]).reduce(function(sum, num){ return sum + num; }, 0); - equal(sum, 6, 'OO-style reduce'); - - var sum = _.reduce([1, 2, 3], function(sum, num){ return sum + num; }); - equal(sum, 6, 'default initial value'); - - var ifnull; - try { - _.reduce(null, function(){}); - } catch (ex) { - ifnull = ex; - } - ok(ifnull instanceof TypeError, 'handles a null (without inital value) properly'); - - ok(_.reduce(null, function(){}, 138) === 138, 'handles a null (with initial value) properly'); - equal(_.reduce([], function(){}, undefined), undefined, 'undefined can be passed as a special case'); - raises(function() { _.reduce([], function(){}); }, TypeError, 'throws an error for empty arrays with no initial value'); - }); - - test('reduceRight', function() { - var list = _.reduceRight(["foo", "bar", "baz"], function(memo, str){ return memo + str; }, ''); - equal(list, 'bazbarfoo', 'can perform right folds'); - - var list = _.foldr(["foo", "bar", "baz"], function(memo, str){ return memo + str; }, ''); - equal(list, 'bazbarfoo', 'aliased as "foldr"'); - - var list = _.foldr(["foo", "bar", "baz"], function(memo, str){ return memo + str; }); - equal(list, 'bazbarfoo', 'default initial value'); - - var ifnull; - try { - _.reduceRight(null, function(){}); - } catch (ex) { - ifnull = ex; - } - ok(ifnull instanceof TypeError, 'handles a null (without inital value) properly'); - - var sum = _.reduceRight({a: 1, b: 2, c: 3}, function(sum, num){ return sum + num; }); - equal(sum, 6, 'default initial value on object'); - - ok(_.reduceRight(null, function(){}, 138) === 138, 'handles a null (with initial value) properly'); - - equal(_.reduceRight([], function(){}, undefined), undefined, 'undefined can be passed as a special case'); - raises(function() { _.reduceRight([], function(){}); }, TypeError, 'throws an error for empty arrays with no initial value'); - - // Assert that the correct arguments are being passed. - - var args, - memo = {}, - object = {a: 1, b: 2}, - lastKey = _.keys(object).pop(); - - var expected = lastKey == 'a' - ? [memo, 1, 'a', object] - : [memo, 2, 'b', object]; - - _.reduceRight(object, function() { - args || (args = _.toArray(arguments)); - }, memo); - - deepEqual(args, expected); - - // And again, with numeric keys. - - object = {'2': 'a', '1': 'b'}; - lastKey = _.keys(object).pop(); - args = null; - - expected = lastKey == '2' - ? [memo, 'a', '2', object] - : [memo, 'b', '1', object]; - - _.reduceRight(object, function() { - args || (args = _.toArray(arguments)); - }, memo); - - deepEqual(args, expected); - }); - - test('find', function() { - var array = [1, 2, 3, 4]; - strictEqual(_.find(array, function(n) { return n > 2; }), 3, 'should return first found `value`'); - strictEqual(_.find(array, function() { return false; }), void 0, 'should return `undefined` if `value` is not found'); - }); - - test('detect', function() { - var result = _.detect([1, 2, 3], function(num){ return num * 2 == 4; }); - equal(result, 2, 'found the first "2" and broke the loop'); - }); - - test('select', function() { - var evens = _.select([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); - equal(evens.join(', '), '2, 4, 6', 'selected each even number'); - - evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); - equal(evens.join(', '), '2, 4, 6', 'aliased as "filter"'); - }); - - test('reject', function() { - var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; }); - equal(odds.join(', '), '1, 3, 5', 'rejected each even number'); - - var context = "obj"; - - var evens = _.reject([1, 2, 3, 4, 5, 6], function(num){ - equal(context, "obj"); - return num % 2 != 0; - }, context); - equal(evens.join(', '), '2, 4, 6', 'rejected each odd number'); - }); - - test('all', function() { - ok(_.all([], _.identity), 'the empty set'); - ok(_.all([true, true, true], _.identity), 'all true values'); - ok(!_.all([true, false, true], _.identity), 'one false value'); - ok(_.all([0, 10, 28], function(num){ return num % 2 == 0; }), 'even numbers'); - ok(!_.all([0, 11, 28], function(num){ return num % 2 == 0; }), 'an odd number'); - ok(_.all([1], _.identity) === true, 'cast to boolean - true'); - ok(_.all([0], _.identity) === false, 'cast to boolean - false'); - ok(_.every([true, true, true], _.identity), 'aliased as "every"'); - ok(!_.all([undefined, undefined, undefined], _.identity), 'works with arrays of undefined'); - }); - - test('any', function() { - var nativeSome = Array.prototype.some; - Array.prototype.some = null; - ok(!_.any([]), 'the empty set'); - ok(!_.any([false, false, false]), 'all false values'); - ok(_.any([false, false, true]), 'one true value'); - ok(_.any([null, 0, 'yes', false]), 'a string'); - ok(!_.any([null, 0, '', false]), 'falsy values'); - ok(!_.any([1, 11, 29], function(num){ return num % 2 == 0; }), 'all odd numbers'); - ok(_.any([1, 10, 29], function(num){ return num % 2 == 0; }), 'an even number'); - ok(_.any([1], _.identity) === true, 'cast to boolean - true'); - ok(_.any([0], _.identity) === false, 'cast to boolean - false'); - ok(_.some([false, false, true]), 'aliased as "some"'); - Array.prototype.some = nativeSome; - }); - - test('include', function() { - ok(_.include([1,2,3], 2), 'two is in the array'); - ok(!_.include([1,3,9], 2), 'two is not in the array'); - ok(_.contains({moe:1, larry:3, curly:9}, 3) === true, '_.include on objects checks their values'); - ok(_([1,2,3]).include(2), 'OO-style include'); - }); - - test('invoke', function() { - var list = [[5, 1, 7], [3, 2, 1]]; - var result = _.invoke(list, 'sort'); - equal(result[0].join(', '), '1, 5, 7', 'first array sorted'); - equal(result[1].join(', '), '1, 2, 3', 'second array sorted'); - }); - - test('invoke w/ function reference', function() { - var list = [[5, 1, 7], [3, 2, 1]]; - var result = _.invoke(list, Array.prototype.sort); - equal(result[0].join(', '), '1, 5, 7', 'first array sorted'); - equal(result[1].join(', '), '1, 2, 3', 'second array sorted'); - }); - - // Relevant when using ClojureScript - test('invoke when strings have a call method', function() { - String.prototype.call = function() { - return 42; - }; - var list = [[5, 1, 7], [3, 2, 1]]; - var s = "foo"; - equal(s.call(), 42, "call function exists"); - var result = _.invoke(list, 'sort'); - equal(result[0].join(', '), '1, 5, 7', 'first array sorted'); - equal(result[1].join(', '), '1, 2, 3', 'second array sorted'); - delete String.prototype.call; - equal(s.call, undefined, "call function removed"); - }); - - test('pluck', function() { - var people = [{name : 'moe', age : 30}, {name : 'curly', age : 50}]; - equal(_.pluck(people, 'name').join(', '), 'moe, curly', 'pulls names out of objects'); - }); - - test('where', function() { - var list = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 1, b: 3}, {a: 1, b: 4}]; - var result = _.where(list, {a: 1}); - equal(result.length, 3); - equal(result[result.length - 1].b, 4); - result = _.where(list, {b: 2}); - equal(result.length, 2); - equal(result[0].a, 1); - }); - - test('max', function() { - equal(3, _.max([1, 2, 3]), 'can perform a regular Math.max'); - - var neg = _.max([1, 2, 3], function(num){ return -num; }); - equal(neg, 1, 'can perform a computation-based max'); - - equal(-Infinity, _.max({}), 'Maximum value of an empty object'); - equal(-Infinity, _.max([]), 'Maximum value of an empty array'); - - equal(299999, _.max(_.range(1,300000)), "Maximum value of a too-big array"); - }); - - test('min', function() { - equal(1, _.min([1, 2, 3]), 'can perform a regular Math.min'); - - var neg = _.min([1, 2, 3], function(num){ return -num; }); - equal(neg, 3, 'can perform a computation-based min'); - - equal(Infinity, _.min({}), 'Minimum value of an empty object'); - equal(Infinity, _.min([]), 'Minimum value of an empty array'); - - var now = new Date(9999999999); - var then = new Date(0); - equal(_.min([now, then]), then); - - equal(1, _.min(_.range(1,300000)), "Minimum value of a too-big array"); - }); - - test('sortBy', function() { - var people = [{name : 'curly', age : 50}, {name : 'moe', age : 30}]; - people = _.sortBy(people, function(person){ return person.age; }); - equal(_.pluck(people, 'name').join(', '), 'moe, curly', 'stooges sorted by age'); - - var list = [undefined, 4, 1, undefined, 3, 2]; - equal(_.sortBy(list, _.identity).join(','), '1,2,3,4,,', 'sortBy with undefined values'); - - var list = ["one", "two", "three", "four", "five"]; - var sorted = _.sortBy(list, 'length'); - equal(sorted.join(' '), 'one two four five three', 'sorted by length'); - - function Pair(x, y) { - this.x = x; - this.y = y; - } - - var collection = [ - new Pair(1, 1), new Pair(1, 2), - new Pair(1, 3), new Pair(1, 4), - new Pair(1, 5), new Pair(1, 6), - new Pair(2, 1), new Pair(2, 2), - new Pair(2, 3), new Pair(2, 4), - new Pair(2, 5), new Pair(2, 6), - new Pair(undefined, 1), new Pair(undefined, 2), - new Pair(undefined, 3), new Pair(undefined, 4), - new Pair(undefined, 5), new Pair(undefined, 6) - ]; - - var actual = _.sortBy(collection, function(pair) { - return pair.x; - }); - - deepEqual(actual, collection, 'sortBy should be stable'); - }); - - test('groupBy', function() { - var parity = _.groupBy([1, 2, 3, 4, 5, 6], function(num){ return num % 2; }); - ok('0' in parity && '1' in parity, 'created a group for each value'); - equal(parity[0].join(', '), '2, 4, 6', 'put each even number in the right group'); - - var list = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]; - var grouped = _.groupBy(list, 'length'); - equal(grouped['3'].join(' '), 'one two six ten'); - equal(grouped['4'].join(' '), 'four five nine'); - equal(grouped['5'].join(' '), 'three seven eight'); - - var context = {}; - _.groupBy([{}], function(){ ok(this === context); }, context); - - grouped = _.groupBy([4.2, 6.1, 6.4], function(num) { - return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor'; - }); - equal(grouped.constructor.length, 1); - equal(grouped.hasOwnProperty.length, 2); - - var array = [{}]; - _.groupBy(array, function(value, index, obj){ ok(obj === array); }); - }); - - test('countBy', function() { - var parity = _.countBy([1, 2, 3, 4, 5], function(num){ return num % 2 == 0; }); - equal(parity['true'], 2); - equal(parity['false'], 3); - - var list = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"]; - var grouped = _.countBy(list, 'length'); - equal(grouped['3'], 4); - equal(grouped['4'], 3); - equal(grouped['5'], 3); - - var context = {}; - _.countBy([{}], function(){ ok(this === context); }, context); - - grouped = _.countBy([4.2, 6.1, 6.4], function(num) { - return Math.floor(num) > 4 ? 'hasOwnProperty' : 'constructor'; - }); - equal(grouped.constructor, 1); - equal(grouped.hasOwnProperty, 2); - - var array = [{}]; - _.countBy(array, function(value, index, obj){ ok(obj === array); }); - }); - - test('sortedIndex', function() { - var numbers = [10, 20, 30, 40, 50], num = 35; - var indexForNum = _.sortedIndex(numbers, num); - equal(indexForNum, 3, '35 should be inserted at index 3'); - - var indexFor30 = _.sortedIndex(numbers, 30); - equal(indexFor30, 2, '30 should be inserted at index 2'); - - var objects = [{x: 10}, {x: 20}, {x: 30}, {x: 40}]; - var iterator = function(obj){ return obj.x; }; - strictEqual(_.sortedIndex(objects, {x: 25}, iterator), 2); - strictEqual(_.sortedIndex(objects, {x: 35}, 'x'), 3); - - var context = {1: 2, 2: 3, 3: 4}; - iterator = function(obj){ return this[obj]; }; - strictEqual(_.sortedIndex([1, 3], 2, iterator, context), 1); - }); - - test('shuffle', function() { - var numbers = _.range(10); - var shuffled = _.shuffle(numbers).sort(); - notStrictEqual(numbers, shuffled, 'original object is unmodified'); - equal(shuffled.join(','), numbers.join(','), 'contains the same members before and after shuffle'); - }); - - test('toArray', function() { - ok(!_.isArray(arguments), 'arguments object is not an array'); - ok(_.isArray(_.toArray(arguments)), 'arguments object converted into array'); - var a = [1,2,3]; - ok(_.toArray(a) !== a, 'array is cloned'); - equal(_.toArray(a).join(', '), '1, 2, 3', 'cloned array contains same elements'); - - var numbers = _.toArray({one : 1, two : 2, three : 3}); - equal(numbers.join(', '), '1, 2, 3', 'object flattened into array'); - }); - - test('size', function() { - equal(_.size({one : 1, two : 2, three : 3}), 3, 'can compute the size of an object'); - equal(_.size([1, 2, 3]), 3, 'can compute the size of an array'); - - var func = function() { - return _.size(arguments); - }; - - equal(func(1, 2, 3, 4), 4, 'can test the size of the arguments object'); - - equal(_.size('hello'), 5, 'can compute the size of a string'); - - equal(_.size(null), 0, 'handles nulls'); - }); - -}); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/functions.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/functions.js deleted file mode 100644 index a529658..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/functions.js +++ /dev/null @@ -1,259 +0,0 @@ -$(document).ready(function() { - - module("Functions"); - - test("bind", function() { - var context = {name : 'moe'}; - var func = function(arg) { return "name: " + (this.name || arg); }; - var bound = _.bind(func, context); - equal(bound(), 'name: moe', 'can bind a function to a context'); - - bound = _(func).bind(context); - equal(bound(), 'name: moe', 'can do OO-style binding'); - - bound = _.bind(func, null, 'curly'); - equal(bound(), 'name: curly', 'can bind without specifying a context'); - - func = function(salutation, name) { return salutation + ': ' + name; }; - func = _.bind(func, this, 'hello'); - equal(func('moe'), 'hello: moe', 'the function was partially applied in advance'); - - var func = _.bind(func, this, 'curly'); - equal(func(), 'hello: curly', 'the function was completely applied in advance'); - - var func = function(salutation, firstname, lastname) { return salutation + ': ' + firstname + ' ' + lastname; }; - func = _.bind(func, this, 'hello', 'moe', 'curly'); - equal(func(), 'hello: moe curly', 'the function was partially applied in advance and can accept multiple arguments'); - - func = function(context, message) { equal(this, context, message); }; - _.bind(func, 0, 0, 'can bind a function to `0`')(); - _.bind(func, '', '', 'can bind a function to an empty string')(); - _.bind(func, false, false, 'can bind a function to `false`')(); - - // These tests are only meaningful when using a browser without a native bind function - // To test this with a modern browser, set underscore's nativeBind to undefined - var F = function () { return this; }; - var Boundf = _.bind(F, {hello: "moe curly"}); - equal(new Boundf().hello, undefined, "function should not be bound to the context, to comply with ECMAScript 5"); - equal(Boundf().hello, "moe curly", "When called without the new operator, it's OK to be bound to the context"); - }); - - test("bindAll", function() { - var curly = {name : 'curly'}, moe = { - name : 'moe', - getName : function() { return 'name: ' + this.name; }, - sayHi : function() { return 'hi: ' + this.name; } - }; - curly.getName = moe.getName; - _.bindAll(moe, 'getName', 'sayHi'); - curly.sayHi = moe.sayHi; - equal(curly.getName(), 'name: curly', 'unbound function is bound to current object'); - equal(curly.sayHi(), 'hi: moe', 'bound function is still bound to original object'); - - curly = {name : 'curly'}; - moe = { - name : 'moe', - getName : function() { return 'name: ' + this.name; }, - sayHi : function() { return 'hi: ' + this.name; } - }; - _.bindAll(moe); - curly.sayHi = moe.sayHi; - equal(curly.sayHi(), 'hi: moe', 'calling bindAll with no arguments binds all functions to the object'); - }); - - test("memoize", function() { - var fib = function(n) { - return n < 2 ? n : fib(n - 1) + fib(n - 2); - }; - var fastFib = _.memoize(fib); - equal(fib(10), 55, 'a memoized version of fibonacci produces identical results'); - equal(fastFib(10), 55, 'a memoized version of fibonacci produces identical results'); - - var o = function(str) { - return str; - }; - var fastO = _.memoize(o); - equal(o('toString'), 'toString', 'checks hasOwnProperty'); - equal(fastO('toString'), 'toString', 'checks hasOwnProperty'); - }); - - asyncTest("delay", 2, function() { - var delayed = false; - _.delay(function(){ delayed = true; }, 100); - setTimeout(function(){ ok(!delayed, "didn't delay the function quite yet"); }, 50); - setTimeout(function(){ ok(delayed, 'delayed the function'); start(); }, 150); - }); - - asyncTest("defer", 1, function() { - var deferred = false; - _.defer(function(bool){ deferred = bool; }, true); - _.delay(function(){ ok(deferred, "deferred the function"); start(); }, 50); - }); - - asyncTest("throttle", 2, function() { - var counter = 0; - var incr = function(){ counter++; }; - var throttledIncr = _.throttle(incr, 100); - throttledIncr(); throttledIncr(); throttledIncr(); - setTimeout(throttledIncr, 70); - setTimeout(throttledIncr, 120); - setTimeout(throttledIncr, 140); - setTimeout(throttledIncr, 190); - setTimeout(throttledIncr, 220); - setTimeout(throttledIncr, 240); - _.delay(function(){ equal(counter, 1, "incr was called immediately"); }, 30); - _.delay(function(){ equal(counter, 4, "incr was throttled"); start(); }, 400); - }); - - asyncTest("throttle arguments", 2, function() { - var value = 0; - var update = function(val){ value = val; }; - var throttledUpdate = _.throttle(update, 100); - throttledUpdate(1); throttledUpdate(2); throttledUpdate(3); - setTimeout(function(){ throttledUpdate(4); }, 120); - setTimeout(function(){ throttledUpdate(5); }, 140); - setTimeout(function(){ throttledUpdate(6); }, 250); - _.delay(function(){ equal(value, 1, "updated to latest value"); }, 40); - _.delay(function(){ equal(value, 6, "updated to latest value"); start(); }, 400); - }); - - asyncTest("throttle once", 2, function() { - var counter = 0; - var incr = function(){ return ++counter; }; - var throttledIncr = _.throttle(incr, 100); - var result = throttledIncr(); - _.delay(function(){ - equal(result, 1, "throttled functions return their value"); - equal(counter, 1, "incr was called once"); start(); - }, 220); - }); - - asyncTest("throttle twice", 1, function() { - var counter = 0; - var incr = function(){ counter++; }; - var throttledIncr = _.throttle(incr, 100); - throttledIncr(); throttledIncr(); - _.delay(function(){ equal(counter, 2, "incr was called twice"); start(); }, 220); - }); - - asyncTest("throttle repeatedly with results", 9, function() { - var counter = 0; - var incr = function(){ return ++counter; }; - var throttledIncr = _.throttle(incr, 100); - var results = []; - var saveResult = function() { results.push(throttledIncr()); }; - saveResult(); saveResult(); saveResult(); - setTimeout(saveResult, 70); - setTimeout(saveResult, 120); - setTimeout(saveResult, 140); - setTimeout(saveResult, 190); - setTimeout(saveResult, 240); - setTimeout(saveResult, 260); - _.delay(function() { - equal(results[0], 1, "incr was called once"); - equal(results[1], 1, "incr was throttled"); - equal(results[2], 1, "incr was throttled"); - equal(results[3], 1, "incr was throttled"); - equal(results[4], 2, "incr was called twice"); - equal(results[5], 2, "incr was throttled"); - equal(results[6], 2, "incr was throttled"); - equal(results[7], 3, "incr was called thrice"); - equal(results[8], 3, "incr was throttled"); - start(); - }, 400); - }); - - asyncTest("debounce", 1, function() { - var counter = 0; - var incr = function(){ counter++; }; - var debouncedIncr = _.debounce(incr, 50); - debouncedIncr(); debouncedIncr(); debouncedIncr(); - setTimeout(debouncedIncr, 30); - setTimeout(debouncedIncr, 60); - setTimeout(debouncedIncr, 90); - setTimeout(debouncedIncr, 120); - setTimeout(debouncedIncr, 150); - _.delay(function(){ equal(counter, 1, "incr was debounced"); start(); }, 220); - }); - - asyncTest("debounce asap", 5, function() { - var a, b, c; - var counter = 0; - var incr = function(){ return ++counter; }; - var debouncedIncr = _.debounce(incr, 50, true); - a = debouncedIncr(); - b = debouncedIncr(); - c = debouncedIncr(); - equal(a, 1); - equal(b, 1); - equal(c, 1); - equal(counter, 1, 'incr was called immediately'); - setTimeout(debouncedIncr, 30); - setTimeout(debouncedIncr, 60); - setTimeout(debouncedIncr, 90); - setTimeout(debouncedIncr, 120); - setTimeout(debouncedIncr, 150); - _.delay(function(){ equal(counter, 1, "incr was debounced"); start(); }, 220); - }); - - asyncTest("debounce asap recursively", 2, function() { - var counter = 0; - var debouncedIncr = _.debounce(function(){ - counter++; - if (counter < 5) debouncedIncr(); - }, 50, true); - debouncedIncr(); - equal(counter, 1, 'incr was called immediately'); - _.delay(function(){ equal(counter, 1, "incr was debounced"); start(); }, 70); - }); - - test("once", function() { - var num = 0; - var increment = _.once(function(){ num++; }); - increment(); - increment(); - equal(num, 1); - }); - - test("wrap", function() { - var greet = function(name){ return "hi: " + name; }; - var backwards = _.wrap(greet, function(func, name){ return func(name) + ' ' + name.split('').reverse().join(''); }); - equal(backwards('moe'), 'hi: moe eom', 'wrapped the saluation function'); - - var inner = function(){ return "Hello "; }; - var obj = {name : "Moe"}; - obj.hi = _.wrap(inner, function(fn){ return fn() + this.name; }); - equal(obj.hi(), "Hello Moe"); - - var noop = function(){}; - var wrapped = _.wrap(noop, function(fn){ return Array.prototype.slice.call(arguments, 0); }); - var ret = wrapped(['whats', 'your'], 'vector', 'victor'); - deepEqual(ret, [noop, ['whats', 'your'], 'vector', 'victor']); - }); - - test("compose", function() { - var greet = function(name){ return "hi: " + name; }; - var exclaim = function(sentence){ return sentence + '!'; }; - var composed = _.compose(exclaim, greet); - equal(composed('moe'), 'hi: moe!', 'can compose a function that takes another'); - - composed = _.compose(greet, exclaim); - equal(composed('moe'), 'hi: moe!', 'in this case, the functions are also commutative'); - }); - - test("after", function() { - var testAfter = function(afterAmount, timesCalled) { - var afterCalled = 0; - var after = _.after(afterAmount, function() { - afterCalled++; - }); - while (timesCalled--) after(); - return afterCalled; - }; - - equal(testAfter(5, 5), 1, "after(N) should fire after being called N times"); - equal(testAfter(5, 4), 0, "after(N) should not fire unless called N times"); - equal(testAfter(0, 0), 1, "after(0) should fire immediately"); - }); - -}); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/index.html b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/index.html deleted file mode 100644 index 064fa98..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - Underscore Test Suite - - - - - - - - - - - - - - - - -
      -
      -
      -
      -
      -
      -
      -
      -

      Underscore Speed Suite

      -

      - A representative sample of the functions are benchmarked here, to provide - a sense of how fast they might run in different browsers. - Each iteration runs on an array of 1000 elements.

      - For example, the 'intersection' test measures the number of times you can - find the intersection of two thousand-element arrays in one second. -

      -
      - - - diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/objects.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/objects.js deleted file mode 100644 index 22949c3..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/objects.js +++ /dev/null @@ -1,548 +0,0 @@ -$(document).ready(function() { - - module("Objects"); - - test("keys", function() { - equal(_.keys({one : 1, two : 2}).join(', '), 'one, two', 'can extract the keys from an object'); - // the test above is not safe because it relies on for-in enumeration order - var a = []; a[1] = 0; - equal(_.keys(a).join(', '), '1', 'is not fooled by sparse arrays; see issue #95'); - raises(function() { _.keys(null); }, TypeError, 'throws an error for `null` values'); - raises(function() { _.keys(void 0); }, TypeError, 'throws an error for `undefined` values'); - raises(function() { _.keys(1); }, TypeError, 'throws an error for number primitives'); - raises(function() { _.keys('a'); }, TypeError, 'throws an error for string primitives'); - raises(function() { _.keys(true); }, TypeError, 'throws an error for boolean primitives'); - }); - - test("values", function() { - equal(_.values({one: 1, two: 2}).join(', '), '1, 2', 'can extract the values from an object'); - equal(_.values({one: 1, two: 2, length: 3}).join(', '), '1, 2, 3', '... even when one of them is "length"'); - }); - - test("pairs", function() { - deepEqual(_.pairs({one: 1, two: 2}), [['one', 1], ['two', 2]], 'can convert an object into pairs'); - deepEqual(_.pairs({one: 1, two: 2, length: 3}), [['one', 1], ['two', 2], ['length', 3]], '... even when one of them is "length"'); - }); - - test("invert", function() { - var obj = {first: 'Moe', second: 'Larry', third: 'Curly'}; - equal(_.keys(_.invert(obj)).join(' '), 'Moe Larry Curly', 'can invert an object'); - ok(_.isEqual(_.invert(_.invert(obj)), obj), 'two inverts gets you back where you started'); - - var obj = {length: 3}; - ok(_.invert(obj)['3'] == 'length', 'can invert an object with "length"') - }); - - test("functions", function() { - var obj = {a : 'dash', b : _.map, c : (/yo/), d : _.reduce}; - ok(_.isEqual(['b', 'd'], _.functions(obj)), 'can grab the function names of any passed-in object'); - - var Animal = function(){}; - Animal.prototype.run = function(){}; - equal(_.functions(new Animal).join(''), 'run', 'also looks up functions on the prototype'); - }); - - test("extend", function() { - var result; - equal(_.extend({}, {a:'b'}).a, 'b', 'can extend an object with the attributes of another'); - equal(_.extend({a:'x'}, {a:'b'}).a, 'b', 'properties in source override destination'); - equal(_.extend({x:'x'}, {a:'b'}).x, 'x', 'properties not in source dont get overriden'); - result = _.extend({x:'x'}, {a:'a'}, {b:'b'}); - ok(_.isEqual(result, {x:'x', a:'a', b:'b'}), 'can extend from multiple source objects'); - result = _.extend({x:'x'}, {a:'a', x:2}, {a:'b'}); - ok(_.isEqual(result, {x:2, a:'b'}), 'extending from multiple source objects last property trumps'); - result = _.extend({}, {a: void 0, b: null}); - equal(_.keys(result).join(''), 'ab', 'extend does not copy undefined values'); - }); - - test("pick", function() { - var result; - result = _.pick({a:1, b:2, c:3}, 'a', 'c'); - ok(_.isEqual(result, {a:1, c:3}), 'can restrict properties to those named'); - result = _.pick({a:1, b:2, c:3}, ['b', 'c']); - ok(_.isEqual(result, {b:2, c:3}), 'can restrict properties to those named in an array'); - result = _.pick({a:1, b:2, c:3}, ['a'], 'b'); - ok(_.isEqual(result, {a:1, b:2}), 'can restrict properties to those named in mixed args'); - - var Obj = function(){}; - Obj.prototype = {a: 1, b: 2, c: 3}; - ok(_.isEqual(_.pick(new Obj, 'a', 'c'), {a:1, c: 3}), 'include prototype props'); - }); - - test("omit", function() { - var result; - result = _.omit({a:1, b:2, c:3}, 'b'); - ok(_.isEqual(result, {a:1, c:3}), 'can omit a single named property'); - result = _.omit({a:1, b:2, c:3}, 'a', 'c'); - ok(_.isEqual(result, {b:2}), 'can omit several named properties'); - result = _.omit({a:1, b:2, c:3}, ['b', 'c']); - ok(_.isEqual(result, {a:1}), 'can omit properties named in an array'); - - var Obj = function(){}; - Obj.prototype = {a: 1, b: 2, c: 3}; - ok(_.isEqual(_.omit(new Obj, 'b'), {a:1, c: 3}), 'include prototype props'); - }); - - test("defaults", function() { - var result; - var options = {zero: 0, one: 1, empty: "", nan: NaN, string: "string"}; - - _.defaults(options, {zero: 1, one: 10, twenty: 20}); - equal(options.zero, 0, 'value exists'); - equal(options.one, 1, 'value exists'); - equal(options.twenty, 20, 'default applied'); - - _.defaults(options, {empty: "full"}, {nan: "nan"}, {word: "word"}, {word: "dog"}); - equal(options.empty, "", 'value exists'); - ok(_.isNaN(options.nan), "NaN isn't overridden"); - equal(options.word, "word", 'new value is added, first one wins'); - }); - - test("clone", function() { - var moe = {name : 'moe', lucky : [13, 27, 34]}; - var clone = _.clone(moe); - equal(clone.name, 'moe', 'the clone as the attributes of the original'); - - clone.name = 'curly'; - ok(clone.name == 'curly' && moe.name == 'moe', 'clones can change shallow attributes without affecting the original'); - - clone.lucky.push(101); - equal(_.last(moe.lucky), 101, 'changes to deep attributes are shared with the original'); - - equal(_.clone(undefined), void 0, 'non objects should not be changed by clone'); - equal(_.clone(1), 1, 'non objects should not be changed by clone'); - equal(_.clone(null), null, 'non objects should not be changed by clone'); - }); - - test("isEqual", function() { - function First() { - this.value = 1; - } - First.prototype.value = 1; - function Second() { - this.value = 1; - } - Second.prototype.value = 2; - - // Basic equality and identity comparisons. - ok(_.isEqual(null, null), "`null` is equal to `null`"); - ok(_.isEqual(), "`undefined` is equal to `undefined`"); - - ok(!_.isEqual(0, -0), "`0` is not equal to `-0`"); - ok(!_.isEqual(-0, 0), "Commutative equality is implemented for `0` and `-0`"); - ok(!_.isEqual(null, undefined), "`null` is not equal to `undefined`"); - ok(!_.isEqual(undefined, null), "Commutative equality is implemented for `null` and `undefined`"); - - // String object and primitive comparisons. - ok(_.isEqual("Curly", "Curly"), "Identical string primitives are equal"); - ok(_.isEqual(new String("Curly"), new String("Curly")), "String objects with identical primitive values are equal"); - ok(_.isEqual(new String("Curly"), "Curly"), "String primitives and their corresponding object wrappers are equal"); - ok(_.isEqual("Curly", new String("Curly")), "Commutative equality is implemented for string objects and primitives"); - - ok(!_.isEqual("Curly", "Larry"), "String primitives with different values are not equal"); - ok(!_.isEqual(new String("Curly"), new String("Larry")), "String objects with different primitive values are not equal"); - ok(!_.isEqual(new String("Curly"), {toString: function(){ return "Curly"; }}), "String objects and objects with a custom `toString` method are not equal"); - - // Number object and primitive comparisons. - ok(_.isEqual(75, 75), "Identical number primitives are equal"); - ok(_.isEqual(new Number(75), new Number(75)), "Number objects with identical primitive values are equal"); - ok(_.isEqual(75, new Number(75)), "Number primitives and their corresponding object wrappers are equal"); - ok(_.isEqual(new Number(75), 75), "Commutative equality is implemented for number objects and primitives"); - ok(!_.isEqual(new Number(0), -0), "`new Number(0)` and `-0` are not equal"); - ok(!_.isEqual(0, new Number(-0)), "Commutative equality is implemented for `new Number(0)` and `-0`"); - - ok(!_.isEqual(new Number(75), new Number(63)), "Number objects with different primitive values are not equal"); - ok(!_.isEqual(new Number(63), {valueOf: function(){ return 63; }}), "Number objects and objects with a `valueOf` method are not equal"); - - // Comparisons involving `NaN`. - ok(_.isEqual(NaN, NaN), "`NaN` is equal to `NaN`"); - ok(!_.isEqual(61, NaN), "A number primitive is not equal to `NaN`"); - ok(!_.isEqual(new Number(79), NaN), "A number object is not equal to `NaN`"); - ok(!_.isEqual(Infinity, NaN), "`Infinity` is not equal to `NaN`"); - - // Boolean object and primitive comparisons. - ok(_.isEqual(true, true), "Identical boolean primitives are equal"); - ok(_.isEqual(new Boolean, new Boolean), "Boolean objects with identical primitive values are equal"); - ok(_.isEqual(true, new Boolean(true)), "Boolean primitives and their corresponding object wrappers are equal"); - ok(_.isEqual(new Boolean(true), true), "Commutative equality is implemented for booleans"); - ok(!_.isEqual(new Boolean(true), new Boolean), "Boolean objects with different primitive values are not equal"); - - // Common type coercions. - ok(!_.isEqual(true, new Boolean(false)), "Boolean objects are not equal to the boolean primitive `true`"); - ok(!_.isEqual("75", 75), "String and number primitives with like values are not equal"); - ok(!_.isEqual(new Number(63), new String(63)), "String and number objects with like values are not equal"); - ok(!_.isEqual(75, "75"), "Commutative equality is implemented for like string and number values"); - ok(!_.isEqual(0, ""), "Number and string primitives with like values are not equal"); - ok(!_.isEqual(1, true), "Number and boolean primitives with like values are not equal"); - ok(!_.isEqual(new Boolean(false), new Number(0)), "Boolean and number objects with like values are not equal"); - ok(!_.isEqual(false, new String("")), "Boolean primitives and string objects with like values are not equal"); - ok(!_.isEqual(12564504e5, new Date(2009, 9, 25)), "Dates and their corresponding numeric primitive values are not equal"); - - // Dates. - ok(_.isEqual(new Date(2009, 9, 25), new Date(2009, 9, 25)), "Date objects referencing identical times are equal"); - ok(!_.isEqual(new Date(2009, 9, 25), new Date(2009, 11, 13)), "Date objects referencing different times are not equal"); - ok(!_.isEqual(new Date(2009, 11, 13), { - getTime: function(){ - return 12606876e5; - } - }), "Date objects and objects with a `getTime` method are not equal"); - ok(!_.isEqual(new Date("Curly"), new Date("Curly")), "Invalid dates are not equal"); - - // Functions. - ok(!_.isEqual(First, Second), "Different functions with identical bodies and source code representations are not equal"); - - // RegExps. - ok(_.isEqual(/(?:)/gim, /(?:)/gim), "RegExps with equivalent patterns and flags are equal"); - ok(!_.isEqual(/(?:)/g, /(?:)/gi), "RegExps with equivalent patterns and different flags are not equal"); - ok(!_.isEqual(/Moe/gim, /Curly/gim), "RegExps with different patterns and equivalent flags are not equal"); - ok(!_.isEqual(/(?:)/gi, /(?:)/g), "Commutative equality is implemented for RegExps"); - ok(!_.isEqual(/Curly/g, {source: "Larry", global: true, ignoreCase: false, multiline: false}), "RegExps and RegExp-like objects are not equal"); - - // Empty arrays, array-like objects, and object literals. - ok(_.isEqual({}, {}), "Empty object literals are equal"); - ok(_.isEqual([], []), "Empty array literals are equal"); - ok(_.isEqual([{}], [{}]), "Empty nested arrays and objects are equal"); - ok(!_.isEqual({length: 0}, []), "Array-like objects and arrays are not equal."); - ok(!_.isEqual([], {length: 0}), "Commutative equality is implemented for array-like objects"); - - ok(!_.isEqual({}, []), "Object literals and array literals are not equal"); - ok(!_.isEqual([], {}), "Commutative equality is implemented for objects and arrays"); - - // Arrays with primitive and object values. - ok(_.isEqual([1, "Larry", true], [1, "Larry", true]), "Arrays containing identical primitives are equal"); - ok(_.isEqual([(/Moe/g), new Date(2009, 9, 25)], [(/Moe/g), new Date(2009, 9, 25)]), "Arrays containing equivalent elements are equal"); - - // Multi-dimensional arrays. - var a = [new Number(47), false, "Larry", /Moe/, new Date(2009, 11, 13), ['running', 'biking', new String('programming')], {a: 47}]; - var b = [new Number(47), false, "Larry", /Moe/, new Date(2009, 11, 13), ['running', 'biking', new String('programming')], {a: 47}]; - ok(_.isEqual(a, b), "Arrays containing nested arrays and objects are recursively compared"); - - // Overwrite the methods defined in ES 5.1 section 15.4.4. - a.forEach = a.map = a.filter = a.every = a.indexOf = a.lastIndexOf = a.some = a.reduce = a.reduceRight = null; - b.join = b.pop = b.reverse = b.shift = b.slice = b.splice = b.concat = b.sort = b.unshift = null; - - // Array elements and properties. - ok(_.isEqual(a, b), "Arrays containing equivalent elements and different non-numeric properties are equal"); - a.push("White Rocks"); - ok(!_.isEqual(a, b), "Arrays of different lengths are not equal"); - a.push("East Boulder"); - b.push("Gunbarrel Ranch", "Teller Farm"); - ok(!_.isEqual(a, b), "Arrays of identical lengths containing different elements are not equal"); - - // Sparse arrays. - ok(_.isEqual(Array(3), Array(3)), "Sparse arrays of identical lengths are equal"); - ok(!_.isEqual(Array(3), Array(6)), "Sparse arrays of different lengths are not equal when both are empty"); - - // Simple objects. - ok(_.isEqual({a: "Curly", b: 1, c: true}, {a: "Curly", b: 1, c: true}), "Objects containing identical primitives are equal"); - ok(_.isEqual({a: /Curly/g, b: new Date(2009, 11, 13)}, {a: /Curly/g, b: new Date(2009, 11, 13)}), "Objects containing equivalent members are equal"); - ok(!_.isEqual({a: 63, b: 75}, {a: 61, b: 55}), "Objects of identical sizes with different values are not equal"); - ok(!_.isEqual({a: 63, b: 75}, {a: 61, c: 55}), "Objects of identical sizes with different property names are not equal"); - ok(!_.isEqual({a: 1, b: 2}, {a: 1}), "Objects of different sizes are not equal"); - ok(!_.isEqual({a: 1}, {a: 1, b: 2}), "Commutative equality is implemented for objects"); - ok(!_.isEqual({x: 1, y: undefined}, {x: 1, z: 2}), "Objects with identical keys and different values are not equivalent"); - - // `A` contains nested objects and arrays. - a = { - name: new String("Moe Howard"), - age: new Number(77), - stooge: true, - hobbies: ["acting"], - film: { - name: "Sing a Song of Six Pants", - release: new Date(1947, 9, 30), - stars: [new String("Larry Fine"), "Shemp Howard"], - minutes: new Number(16), - seconds: 54 - } - }; - - // `B` contains equivalent nested objects and arrays. - b = { - name: new String("Moe Howard"), - age: new Number(77), - stooge: true, - hobbies: ["acting"], - film: { - name: "Sing a Song of Six Pants", - release: new Date(1947, 9, 30), - stars: [new String("Larry Fine"), "Shemp Howard"], - minutes: new Number(16), - seconds: 54 - } - }; - ok(_.isEqual(a, b), "Objects with nested equivalent members are recursively compared"); - - // Instances. - ok(_.isEqual(new First, new First), "Object instances are equal"); - ok(!_.isEqual(new First, new Second), "Objects with different constructors and identical own properties are not equal"); - ok(!_.isEqual({value: 1}, new First), "Object instances and objects sharing equivalent properties are not equal"); - ok(!_.isEqual({value: 2}, new Second), "The prototype chain of objects should not be examined"); - - // Circular Arrays. - (a = []).push(a); - (b = []).push(b); - ok(_.isEqual(a, b), "Arrays containing circular references are equal"); - a.push(new String("Larry")); - b.push(new String("Larry")); - ok(_.isEqual(a, b), "Arrays containing circular references and equivalent properties are equal"); - a.push("Shemp"); - b.push("Curly"); - ok(!_.isEqual(a, b), "Arrays containing circular references and different properties are not equal"); - - // More circular arrays #767. - a = ["everything is checked but", "this", "is not"]; - a[1] = a; - b = ["everything is checked but", ["this", "array"], "is not"]; - ok(!_.isEqual(a, b), "Comparison of circular references with non-circular references are not equal"); - - // Circular Objects. - a = {abc: null}; - b = {abc: null}; - a.abc = a; - b.abc = b; - ok(_.isEqual(a, b), "Objects containing circular references are equal"); - a.def = 75; - b.def = 75; - ok(_.isEqual(a, b), "Objects containing circular references and equivalent properties are equal"); - a.def = new Number(75); - b.def = new Number(63); - ok(!_.isEqual(a, b), "Objects containing circular references and different properties are not equal"); - - // More circular objects #767. - a = {everything: "is checked", but: "this", is: "not"}; - a.but = a; - b = {everything: "is checked", but: {that:"object"}, is: "not"}; - ok(!_.isEqual(a, b), "Comparison of circular references with non-circular object references are not equal"); - - // Cyclic Structures. - a = [{abc: null}]; - b = [{abc: null}]; - (a[0].abc = a).push(a); - (b[0].abc = b).push(b); - ok(_.isEqual(a, b), "Cyclic structures are equal"); - a[0].def = "Larry"; - b[0].def = "Larry"; - ok(_.isEqual(a, b), "Cyclic structures containing equivalent properties are equal"); - a[0].def = new String("Larry"); - b[0].def = new String("Curly"); - ok(!_.isEqual(a, b), "Cyclic structures containing different properties are not equal"); - - // Complex Circular References. - a = {foo: {b: {foo: {c: {foo: null}}}}}; - b = {foo: {b: {foo: {c: {foo: null}}}}}; - a.foo.b.foo.c.foo = a; - b.foo.b.foo.c.foo = b; - ok(_.isEqual(a, b), "Cyclic structures with nested and identically-named properties are equal"); - - // Chaining. - ok(!_.isEqual(_({x: 1, y: undefined}).chain(), _({x: 1, z: 2}).chain()), 'Chained objects containing different values are not equal'); - equal(_({x: 1, y: 2}).chain().isEqual(_({x: 1, y: 2}).chain()).value(), true, '`isEqual` can be chained'); - - // Custom `isEqual` methods. - var isEqualObj = {isEqual: function (o) { return o.isEqual == this.isEqual; }, unique: {}}; - var isEqualObjClone = {isEqual: isEqualObj.isEqual, unique: {}}; - - ok(_.isEqual(isEqualObj, isEqualObjClone), 'Both objects implement identical `isEqual` methods'); - ok(_.isEqual(isEqualObjClone, isEqualObj), 'Commutative equality is implemented for objects with custom `isEqual` methods'); - ok(!_.isEqual(isEqualObj, {}), 'Objects that do not implement equivalent `isEqual` methods are not equal'); - ok(!_.isEqual({}, isEqualObj), 'Commutative equality is implemented for objects with different `isEqual` methods'); - - // Objects from another frame. - ok(_.isEqual({}, iObject)); - }); - - test("isEmpty", function() { - ok(!_([1]).isEmpty(), '[1] is not empty'); - ok(_.isEmpty([]), '[] is empty'); - ok(!_.isEmpty({one : 1}), '{one : 1} is not empty'); - ok(_.isEmpty({}), '{} is empty'); - ok(_.isEmpty(new RegExp('')), 'objects with prototype properties are empty'); - ok(_.isEmpty(null), 'null is empty'); - ok(_.isEmpty(), 'undefined is empty'); - ok(_.isEmpty(''), 'the empty string is empty'); - ok(!_.isEmpty('moe'), 'but other strings are not'); - - var obj = {one : 1}; - delete obj.one; - ok(_.isEmpty(obj), 'deleting all the keys from an object empties it'); - }); - - // Setup remote variables for iFrame tests. - var iframe = document.createElement('iframe'); - jQuery(iframe).appendTo(document.body); - var iDoc = iframe.contentDocument || iframe.contentWindow.document; - iDoc.write( - "" - ); - iDoc.close(); - - test("isElement", function() { - ok(!_.isElement('div'), 'strings are not dom elements'); - ok(_.isElement($('html')[0]), 'the html tag is a DOM element'); - ok(_.isElement(iElement), 'even from another frame'); - }); - - test("isArguments", function() { - var args = (function(){ return arguments; })(1, 2, 3); - ok(!_.isArguments('string'), 'a string is not an arguments object'); - ok(!_.isArguments(_.isArguments), 'a function is not an arguments object'); - ok(_.isArguments(args), 'but the arguments object is an arguments object'); - ok(!_.isArguments(_.toArray(args)), 'but not when it\'s converted into an array'); - ok(!_.isArguments([1,2,3]), 'and not vanilla arrays.'); - ok(_.isArguments(iArguments), 'even from another frame'); - }); - - test("isObject", function() { - ok(_.isObject(arguments), 'the arguments object is object'); - ok(_.isObject([1, 2, 3]), 'and arrays'); - ok(_.isObject($('html')[0]), 'and DOM element'); - ok(_.isObject(iElement), 'even from another frame'); - ok(_.isObject(function () {}), 'and functions'); - ok(_.isObject(iFunction), 'even from another frame'); - ok(!_.isObject(null), 'but not null'); - ok(!_.isObject(undefined), 'and not undefined'); - ok(!_.isObject('string'), 'and not string'); - ok(!_.isObject(12), 'and not number'); - ok(!_.isObject(true), 'and not boolean'); - ok(_.isObject(new String('string')), 'but new String()'); - }); - - test("isArray", function() { - ok(!_.isArray(arguments), 'the arguments object is not an array'); - ok(_.isArray([1, 2, 3]), 'but arrays are'); - ok(_.isArray(iArray), 'even from another frame'); - }); - - test("isString", function() { - ok(!_.isString(document.body), 'the document body is not a string'); - ok(_.isString([1, 2, 3].join(', ')), 'but strings are'); - ok(_.isString(iString), 'even from another frame'); - }); - - test("isNumber", function() { - ok(!_.isNumber('string'), 'a string is not a number'); - ok(!_.isNumber(arguments), 'the arguments object is not a number'); - ok(!_.isNumber(undefined), 'undefined is not a number'); - ok(_.isNumber(3 * 4 - 7 / 10), 'but numbers are'); - ok(_.isNumber(NaN), 'NaN *is* a number'); - ok(_.isNumber(Infinity), 'Infinity is a number'); - ok(_.isNumber(iNumber), 'even from another frame'); - ok(!_.isNumber('1'), 'numeric strings are not numbers'); - }); - - test("isBoolean", function() { - ok(!_.isBoolean(2), 'a number is not a boolean'); - ok(!_.isBoolean("string"), 'a string is not a boolean'); - ok(!_.isBoolean("false"), 'the string "false" is not a boolean'); - ok(!_.isBoolean("true"), 'the string "true" is not a boolean'); - ok(!_.isBoolean(arguments), 'the arguments object is not a boolean'); - ok(!_.isBoolean(undefined), 'undefined is not a boolean'); - ok(!_.isBoolean(NaN), 'NaN is not a boolean'); - ok(!_.isBoolean(null), 'null is not a boolean'); - ok(_.isBoolean(true), 'but true is'); - ok(_.isBoolean(false), 'and so is false'); - ok(_.isBoolean(iBoolean), 'even from another frame'); - }); - - test("isFunction", function() { - ok(!_.isFunction([1, 2, 3]), 'arrays are not functions'); - ok(!_.isFunction('moe'), 'strings are not functions'); - ok(_.isFunction(_.isFunction), 'but functions are'); - ok(_.isFunction(iFunction), 'even from another frame'); - }); - - test("isDate", function() { - ok(!_.isDate(100), 'numbers are not dates'); - ok(!_.isDate({}), 'objects are not dates'); - ok(_.isDate(new Date()), 'but dates are'); - ok(_.isDate(iDate), 'even from another frame'); - }); - - test("isRegExp", function() { - ok(!_.isRegExp(_.identity), 'functions are not RegExps'); - ok(_.isRegExp(/identity/), 'but RegExps are'); - ok(_.isRegExp(iRegExp), 'even from another frame'); - }); - - test("isFinite", function() { - ok(!_.isFinite(undefined), 'undefined is not Finite'); - ok(!_.isFinite(null), 'null is not Finite'); - ok(!_.isFinite(NaN), 'NaN is not Finite'); - ok(!_.isFinite(Infinity), 'Infinity is not Finite'); - ok(!_.isFinite(-Infinity), '-Infinity is not Finite'); - ok(!_.isFinite('12'), 'Strings are not numbers'); - var obj = new Number(5); - ok(_.isFinite(obj), 'Number instances can be finite'); - ok(_.isFinite(0), '0 is Finite'); - ok(_.isFinite(123), 'Ints are Finite'); - ok(_.isFinite(-12.44), 'Floats are Finite'); - }); - - test("isNaN", function() { - ok(!_.isNaN(undefined), 'undefined is not NaN'); - ok(!_.isNaN(null), 'null is not NaN'); - ok(!_.isNaN(0), '0 is not NaN'); - ok(_.isNaN(NaN), 'but NaN is'); - ok(_.isNaN(iNaN), 'even from another frame'); - ok(_.isNaN(new Number(NaN)), 'wrapped NaN is still NaN'); - }); - - test("isNull", function() { - ok(!_.isNull(undefined), 'undefined is not null'); - ok(!_.isNull(NaN), 'NaN is not null'); - ok(_.isNull(null), 'but null is'); - ok(_.isNull(iNull), 'even from another frame'); - }); - - test("isUndefined", function() { - ok(!_.isUndefined(1), 'numbers are defined'); - ok(!_.isUndefined(null), 'null is defined'); - ok(!_.isUndefined(false), 'false is defined'); - ok(!_.isUndefined(NaN), 'NaN is defined'); - ok(_.isUndefined(), 'nothing is undefined'); - ok(_.isUndefined(undefined), 'undefined is undefined'); - ok(_.isUndefined(iUndefined), 'even from another frame'); - }); - - if (window.ActiveXObject) { - test("IE host objects", function() { - var xml = new ActiveXObject("Msxml2.DOMDocument.3.0"); - ok(!_.isNumber(xml)); - ok(!_.isBoolean(xml)); - ok(!_.isNaN(xml)); - ok(!_.isFunction(xml)); - ok(!_.isNull(xml)); - ok(!_.isUndefined(xml)); - }); - } - - test("tap", function() { - var intercepted = null; - var interceptor = function(obj) { intercepted = obj; }; - var returned = _.tap(1, interceptor); - equal(intercepted, 1, "passes tapped object to interceptor"); - equal(returned, 1, "returns tapped object"); - - returned = _([1,2,3]).chain(). - map(function(n){ return n * 2; }). - max(). - tap(interceptor). - value(); - ok(returned == 6 && intercepted == 6, 'can use tapped objects in a chain'); - }); -}); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/speed.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/speed.js deleted file mode 100644 index 05e3f2a..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/speed.js +++ /dev/null @@ -1,75 +0,0 @@ -(function() { - - var numbers = []; - for (var i=0; i<1000; i++) numbers.push(i); - var objects = _.map(numbers, function(n){ return {num : n}; }); - var randomized = _.sortBy(numbers, function(){ return Math.random(); }); - var deep = _.map(_.range(100), function() { return _.range(1000); }); - - JSLitmus.test('_.each()', function() { - var timesTwo = []; - _.each(numbers, function(num){ timesTwo.push(num * 2); }); - return timesTwo; - }); - - JSLitmus.test('_(list).each()', function() { - var timesTwo = []; - _(numbers).each(function(num){ timesTwo.push(num * 2); }); - return timesTwo; - }); - - JSLitmus.test('jQuery.each()', function() { - var timesTwo = []; - jQuery.each(numbers, function(){ timesTwo.push(this * 2); }); - return timesTwo; - }); - - JSLitmus.test('_.map()', function() { - return _.map(objects, function(obj){ return obj.num; }); - }); - - JSLitmus.test('jQuery.map()', function() { - return jQuery.map(objects, function(obj){ return obj.num; }); - }); - - JSLitmus.test('_.pluck()', function() { - return _.pluck(objects, 'num'); - }); - - JSLitmus.test('_.uniq()', function() { - return _.uniq(randomized); - }); - - JSLitmus.test('_.uniq() (sorted)', function() { - return _.uniq(numbers, true); - }); - - JSLitmus.test('_.sortBy()', function() { - return _.sortBy(numbers, function(num){ return -num; }); - }); - - JSLitmus.test('_.isEqual()', function() { - return _.isEqual(numbers, randomized); - }); - - JSLitmus.test('_.keys()', function() { - return _.keys(objects); - }); - - JSLitmus.test('_.values()', function() { - return _.values(objects); - }); - - JSLitmus.test('_.intersection()', function() { - return _.intersection(numbers, randomized); - }); - - JSLitmus.test('_.range()', function() { - return _.range(1000); - }); - - JSLitmus.test('_.flatten()', function() { - return _.flatten(deep); - }); - -})(); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/utility.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/utility.js deleted file mode 100644 index c9be20a..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/test/test_underscore/utility.js +++ /dev/null @@ -1,249 +0,0 @@ -$(document).ready(function() { - - var templateSettings; - - module("Utility", { - - setup: function() { - templateSettings = _.clone(_.templateSettings); - }, - - teardown: function() { - _.templateSettings = templateSettings; - } - - }); - - test("#750 - Return _ instance.", 2, function() { - var instance = _([]); - ok(_(instance) === instance); - ok(new _(instance) === instance); - }); - - test("identity", function() { - var moe = {name : 'moe'}; - equal(_.identity(moe), moe, 'moe is the same as his identity'); - }); - - test("uniqueId", function() { - var ids = [], i = 0; - while(i++ < 100) ids.push(_.uniqueId()); - equal(_.uniq(ids).length, ids.length, 'can generate a globally-unique stream of ids'); - }); - - test("times", function() { - var vals = []; - _.times(3, function (i) { vals.push(i); }); - ok(_.isEqual(vals, [0,1,2]), "is 0 indexed"); - // - vals = []; - _(3).times(function (i) { vals.push(i); }); - ok(_.isEqual(vals, [0,1,2]), "works as a wrapper"); - }); - - test("mixin", function() { - _.mixin({ - myReverse: function(string) { - return string.split('').reverse().join(''); - } - }); - equal(_.myReverse('panacea'), 'aecanap', 'mixed in a function to _'); - equal(_('champ').myReverse(), 'pmahc', 'mixed in a function to the OOP wrapper'); - }); - - test("_.escape", function() { - equal(_.escape("Curly & Moe"), "Curly & Moe"); - equal(_.escape("Curly & Moe"), "Curly &amp; Moe"); - equal(_.escape(null), ''); - }); - - test("_.unescape", function() { - var string = "Curly & Moe"; - equal(_.unescape("Curly & Moe"), string); - equal(_.unescape("Curly &amp; Moe"), "Curly & Moe"); - equal(_.unescape(null), ''); - equal(_.unescape(_.escape(string)), string); - }); - - test("template", function() { - var basicTemplate = _.template("<%= thing %> is gettin' on my noives!"); - var result = basicTemplate({thing : 'This'}); - equal(result, "This is gettin' on my noives!", 'can do basic attribute interpolation'); - - var sansSemicolonTemplate = _.template("A <% this %> B"); - equal(sansSemicolonTemplate(), "A B"); - - var backslashTemplate = _.template("<%= thing %> is \\ridanculous"); - equal(backslashTemplate({thing: 'This'}), "This is \\ridanculous"); - - var escapeTemplate = _.template('<%= a ? "checked=\\"checked\\"" : "" %>'); - equal(escapeTemplate({a: true}), 'checked="checked"', 'can handle slash escapes in interpolations.'); - - var fancyTemplate = _.template("
        <% \ - for (key in people) { \ - %>
      • <%= people[key] %>
      • <% } %>
      "); - result = fancyTemplate({people : {moe : "Moe", larry : "Larry", curly : "Curly"}}); - equal(result, "
      • Moe
      • Larry
      • Curly
      ", 'can run arbitrary javascript in templates'); - - var escapedCharsInJavascriptTemplate = _.template("
        <% _.each(numbers.split('\\n'), function(item) { %>
      • <%= item %>
      • <% }) %>
      "); - result = escapedCharsInJavascriptTemplate({numbers: "one\ntwo\nthree\nfour"}); - equal(result, "
      • one
      • two
      • three
      • four
      ", 'Can use escaped characters (e.g. \\n) in Javascript'); - - var namespaceCollisionTemplate = _.template("<%= pageCount %> <%= thumbnails[pageCount] %> <% _.each(thumbnails, function(p) { %>
      \">
      <% }); %>"); - result = namespaceCollisionTemplate({ - pageCount: 3, - thumbnails: { - 1: "p1-thumbnail.gif", - 2: "p2-thumbnail.gif", - 3: "p3-thumbnail.gif" - } - }); - equal(result, "3 p3-thumbnail.gif
      "); - - var noInterpolateTemplate = _.template("

      Just some text. Hey, I know this is silly but it aids consistency.

      "); - result = noInterpolateTemplate(); - equal(result, "

      Just some text. Hey, I know this is silly but it aids consistency.

      "); - - var quoteTemplate = _.template("It's its, not it's"); - equal(quoteTemplate({}), "It's its, not it's"); - - var quoteInStatementAndBody = _.template("<%\ - if(foo == 'bar'){ \ - %>Statement quotes and 'quotes'.<% } %>"); - equal(quoteInStatementAndBody({foo: "bar"}), "Statement quotes and 'quotes'."); - - var withNewlinesAndTabs = _.template('This\n\t\tis: <%= x %>.\n\tok.\nend.'); - equal(withNewlinesAndTabs({x: 'that'}), 'This\n\t\tis: that.\n\tok.\nend.'); - - var template = _.template("<%- value %>"); - var result = template({value: " - - - diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/index.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/index.js deleted file mode 100644 index 2cf0ca5..0000000 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./underscore'); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json index 014ab26..11c7175 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json @@ -15,21 +15,55 @@ }, "repository": { "type": "git", - "url": "git://github.com/documentcloud/underscore.git" + "url": "git://github.com/jashkenas/underscore.git" }, "main": "underscore.js", - "version": "1.4.4", + "version": "1.7.0", "devDependencies": { - "phantomjs": "0.2.2" + "docco": "0.6.x", + "phantomjs": "1.9.7-1", + "uglify-js": "2.4.x", + "eslint": "0.6.x" }, "scripts": { - "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true" + "test": "phantomjs test/vendor/runner.js test/index.html?noglobals=true && eslint underscore.js test/*.js test/vendor/runner.js", + "build": "uglifyjs underscore.js -c \"evaluate=false\" --comments \"/ .*/\" -m --source-map underscore-min.map -o underscore-min.js", + "doc": "docco underscore.js" }, - "readme": " __\n /\\ \\ __\n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____\n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\\n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/\n \\ \\____/\n \\/___/\n\nUnderscore.js is a utility-belt library for JavaScript that provides\nsupport for the usual functional suspects (each, map, reduce, filter...)\nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://underscorejs.org\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n", - "readmeFilename": "README.md", + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/jashkenas/underscore/master/LICENSE" + } + ], + "files": [ + "underscore.js", + "underscore-min.js", + "LICENSE" + ], + "gitHead": "da996e665deb0b69b257e80e3e257c04fde4191c", "bugs": { - "url": "https://github.com/documentcloud/underscore/issues" + "url": "https://github.com/jashkenas/underscore/issues" }, - "_id": "underscore@1.4.4", - "_from": "underscore@~1.4.3" + "_id": "underscore@1.7.0", + "_shasum": "6bbaf0877500d36be34ecaa584e0db9fef035209", + "_from": "underscore@>=1.7.0 <1.8.0", + "_npmVersion": "1.4.24", + "_npmUser": { + "name": "jashkenas", + "email": "jashkenas@gmail.com" + }, + "maintainers": [ + { + "name": "jashkenas", + "email": "jashkenas@gmail.com" + } + ], + "dist": { + "shasum": "6bbaf0877500d36be34ecaa584e0db9fef035209", + "tarball": "http://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js index c1d9d3a..11f1d96 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js @@ -1 +1,6 @@ -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,d=e.filter,g=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.4";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:d&&n.filter===d?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:g&&n.every===g?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2),e=w.isFunction(t);return w.map(n,function(n){return(e?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t,r){return w.isEmpty(t)?r?null:[]:w[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.findWhere=function(n,t){return w.where(n,t,!0)},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var k=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=k(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i},w.bind=function(n,t){if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));var r=o.call(arguments,2);return function(){return n.apply(t,r.concat(o.call(arguments)))}},w.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},w.bindAll=function(n){var t=o.call(arguments,1);return 0===t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var I=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=I(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&I(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return I(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),"function"!=typeof/./&&(w.isFunction=function(n){return"function"==typeof n}),w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return n===void 0},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var M={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};M.unescape=w.invert(M.escape);var S={escape:RegExp("["+w.keys(M.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(M.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(S[n],function(t){return M[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),D.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=++N+"";return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var T=/(.)^/,q={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){var e;r=w.defaults({},r,w.templateSettings);var u=RegExp([(r.escape||T).source,(r.interpolate||T).source,(r.evaluate||T).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(B,function(n){return"\\"+q[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,w);var c=function(n){return e.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},w.chain=function(n){return w(n).chain()};var D=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],D.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return D.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); \ No newline at end of file +// Underscore.js 1.7.0 +// http://underscorejs.org +// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. +(function(){var n=this,t=n._,r=Array.prototype,e=Object.prototype,u=Function.prototype,i=r.push,a=r.slice,o=r.concat,l=e.toString,c=e.hasOwnProperty,f=Array.isArray,s=Object.keys,p=u.bind,h=function(n){return n instanceof h?n:this instanceof h?void(this._wrapped=n):new h(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=h),exports._=h):n._=h,h.VERSION="1.7.0";var g=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}};h.iteratee=function(n,t,r){return null==n?h.identity:h.isFunction(n)?g(n,t,r):h.isObject(n)?h.matches(n):h.property(n)},h.each=h.forEach=function(n,t,r){if(null==n)return n;t=g(t,r);var e,u=n.length;if(u===+u)for(e=0;u>e;e++)t(n[e],e,n);else{var i=h.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},h.map=h.collect=function(n,t,r){if(null==n)return[];t=h.iteratee(t,r);for(var e,u=n.length!==+n.length&&h.keys(n),i=(u||n).length,a=Array(i),o=0;i>o;o++)e=u?u[o]:o,a[o]=t(n[e],e,n);return a};var v="Reduce of empty array with no initial value";h.reduce=h.foldl=h.inject=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length,o=0;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[o++]:o++]}for(;a>o;o++)u=i?i[o]:o,r=t(r,n[u],u,n);return r},h.reduceRight=h.foldr=function(n,t,r,e){null==n&&(n=[]),t=g(t,e,4);var u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;if(arguments.length<3){if(!a)throw new TypeError(v);r=n[i?i[--a]:--a]}for(;a--;)u=i?i[a]:a,r=t(r,n[u],u,n);return r},h.find=h.detect=function(n,t,r){var e;return t=h.iteratee(t,r),h.some(n,function(n,r,u){return t(n,r,u)?(e=n,!0):void 0}),e},h.filter=h.select=function(n,t,r){var e=[];return null==n?e:(t=h.iteratee(t,r),h.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e)},h.reject=function(n,t,r){return h.filter(n,h.negate(h.iteratee(t)),r)},h.every=h.all=function(n,t,r){if(null==n)return!0;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,!t(n[u],u,n))return!1;return!0},h.some=h.any=function(n,t,r){if(null==n)return!1;t=h.iteratee(t,r);var e,u,i=n.length!==+n.length&&h.keys(n),a=(i||n).length;for(e=0;a>e;e++)if(u=i?i[e]:e,t(n[u],u,n))return!0;return!1},h.contains=h.include=function(n,t){return null==n?!1:(n.length!==+n.length&&(n=h.values(n)),h.indexOf(n,t)>=0)},h.invoke=function(n,t){var r=a.call(arguments,2),e=h.isFunction(t);return h.map(n,function(n){return(e?t:n[t]).apply(n,r)})},h.pluck=function(n,t){return h.map(n,h.property(t))},h.where=function(n,t){return h.filter(n,h.matches(t))},h.findWhere=function(n,t){return h.find(n,h.matches(t))},h.max=function(n,t,r){var e,u,i=-1/0,a=-1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],e>i&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(u>a||u===-1/0&&i===-1/0)&&(i=n,a=u)});return i},h.min=function(n,t,r){var e,u,i=1/0,a=1/0;if(null==t&&null!=n){n=n.length===+n.length?n:h.values(n);for(var o=0,l=n.length;l>o;o++)e=n[o],i>e&&(i=e)}else t=h.iteratee(t,r),h.each(n,function(n,r,e){u=t(n,r,e),(a>u||1/0===u&&1/0===i)&&(i=n,a=u)});return i},h.shuffle=function(n){for(var t,r=n&&n.length===+n.length?n:h.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=h.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},h.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=h.values(n)),n[h.random(n.length-1)]):h.shuffle(n).slice(0,Math.max(0,t))},h.sortBy=function(n,t,r){return t=h.iteratee(t,r),h.pluck(h.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var m=function(n){return function(t,r,e){var u={};return r=h.iteratee(r,e),h.each(t,function(e,i){var a=r(e,i,t);n(u,e,a)}),u}};h.groupBy=m(function(n,t,r){h.has(n,r)?n[r].push(t):n[r]=[t]}),h.indexBy=m(function(n,t,r){n[r]=t}),h.countBy=m(function(n,t,r){h.has(n,r)?n[r]++:n[r]=1}),h.sortedIndex=function(n,t,r,e){r=h.iteratee(r,e,1);for(var u=r(t),i=0,a=n.length;a>i;){var o=i+a>>>1;r(n[o])t?[]:a.call(n,0,t)},h.initial=function(n,t,r){return a.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},h.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:a.call(n,Math.max(n.length-t,0))},h.rest=h.tail=h.drop=function(n,t,r){return a.call(n,null==t||r?1:t)},h.compact=function(n){return h.filter(n,h.identity)};var y=function(n,t,r,e){if(t&&h.every(n,h.isArray))return o.apply(e,n);for(var u=0,a=n.length;a>u;u++){var l=n[u];h.isArray(l)||h.isArguments(l)?t?i.apply(e,l):y(l,t,r,e):r||e.push(l)}return e};h.flatten=function(n,t){return y(n,t,!1,[])},h.without=function(n){return h.difference(n,a.call(arguments,1))},h.uniq=h.unique=function(n,t,r,e){if(null==n)return[];h.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=h.iteratee(r,e));for(var u=[],i=[],a=0,o=n.length;o>a;a++){var l=n[a];if(t)a&&i===l||u.push(l),i=l;else if(r){var c=r(l,a,n);h.indexOf(i,c)<0&&(i.push(c),u.push(l))}else h.indexOf(u,l)<0&&u.push(l)}return u},h.union=function(){return h.uniq(y(arguments,!0,!0,[]))},h.intersection=function(n){if(null==n)return[];for(var t=[],r=arguments.length,e=0,u=n.length;u>e;e++){var i=n[e];if(!h.contains(t,i)){for(var a=1;r>a&&h.contains(arguments[a],i);a++);a===r&&t.push(i)}}return t},h.difference=function(n){var t=y(a.call(arguments,1),!0,!0,[]);return h.filter(n,function(n){return!h.contains(t,n)})},h.zip=function(n){if(null==n)return[];for(var t=h.max(arguments,"length").length,r=Array(t),e=0;t>e;e++)r[e]=h.pluck(arguments,e);return r},h.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},h.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=h.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}for(;u>e;e++)if(n[e]===t)return e;return-1},h.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=n.length;for("number"==typeof r&&(e=0>r?e+r+1:Math.min(e,r+1));--e>=0;)if(n[e]===t)return e;return-1},h.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var d=function(){};h.bind=function(n,t){var r,e;if(p&&n.bind===p)return p.apply(n,a.call(arguments,1));if(!h.isFunction(n))throw new TypeError("Bind must be called on a function");return r=a.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(a.call(arguments)));d.prototype=n.prototype;var u=new d;d.prototype=null;var i=n.apply(u,r.concat(a.call(arguments)));return h.isObject(i)?i:u}},h.partial=function(n){var t=a.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===h&&(e[u]=arguments[r++]);for(;r=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=h.bind(n[r],n);return n},h.memoize=function(n,t){var r=function(e){var u=r.cache,i=t?t.apply(this,arguments):e;return h.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},h.delay=function(n,t){var r=a.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},h.defer=function(n){return h.delay.apply(h,[n,1].concat(a.call(arguments,1)))},h.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var l=function(){o=r.leading===!1?0:h.now(),a=null,i=n.apply(e,u),a||(e=u=null)};return function(){var c=h.now();o||r.leading!==!1||(o=c);var f=t-(c-o);return e=this,u=arguments,0>=f||f>t?(clearTimeout(a),a=null,o=c,i=n.apply(e,u),a||(e=u=null)):a||r.trailing===!1||(a=setTimeout(l,f)),i}},h.debounce=function(n,t,r){var e,u,i,a,o,l=function(){var c=h.now()-a;t>c&&c>0?e=setTimeout(l,t-c):(e=null,r||(o=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,a=h.now();var c=r&&!e;return e||(e=setTimeout(l,t)),c&&(o=n.apply(i,u),i=u=null),o}},h.wrap=function(n,t){return h.partial(t,n)},h.negate=function(n){return function(){return!n.apply(this,arguments)}},h.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},h.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},h.before=function(n,t){var r;return function(){return--n>0?r=t.apply(this,arguments):t=null,r}},h.once=h.partial(h.before,2),h.keys=function(n){if(!h.isObject(n))return[];if(s)return s(n);var t=[];for(var r in n)h.has(n,r)&&t.push(r);return t},h.values=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},h.pairs=function(n){for(var t=h.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},h.invert=function(n){for(var t={},r=h.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},h.functions=h.methods=function(n){var t=[];for(var r in n)h.isFunction(n[r])&&t.push(r);return t.sort()},h.extend=function(n){if(!h.isObject(n))return n;for(var t,r,e=1,u=arguments.length;u>e;e++){t=arguments[e];for(r in t)c.call(t,r)&&(n[r]=t[r])}return n},h.pick=function(n,t,r){var e,u={};if(null==n)return u;if(h.isFunction(t)){t=g(t,r);for(e in n){var i=n[e];t(i,e,n)&&(u[e]=i)}}else{var l=o.apply([],a.call(arguments,1));n=new Object(n);for(var c=0,f=l.length;f>c;c++)e=l[c],e in n&&(u[e]=n[e])}return u},h.omit=function(n,t,r){if(h.isFunction(t))t=h.negate(t);else{var e=h.map(o.apply([],a.call(arguments,1)),String);t=function(n,t){return!h.contains(e,t)}}return h.pick(n,t,r)},h.defaults=function(n){if(!h.isObject(n))return n;for(var t=1,r=arguments.length;r>t;t++){var e=arguments[t];for(var u in e)n[u]===void 0&&(n[u]=e[u])}return n},h.clone=function(n){return h.isObject(n)?h.isArray(n)?n.slice():h.extend({},n):n},h.tap=function(n,t){return t(n),n};var b=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof h&&(n=n._wrapped),t instanceof h&&(t=t._wrapped);var u=l.call(n);if(u!==l.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]===n)return e[i]===t;var a=n.constructor,o=t.constructor;if(a!==o&&"constructor"in n&&"constructor"in t&&!(h.isFunction(a)&&a instanceof a&&h.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c,f;if("[object Array]"===u){if(c=n.length,f=c===t.length)for(;c--&&(f=b(n[c],t[c],r,e)););}else{var s,p=h.keys(n);if(c=p.length,f=h.keys(t).length===c)for(;c--&&(s=p[c],f=h.has(t,s)&&b(n[s],t[s],r,e)););}return r.pop(),e.pop(),f};h.isEqual=function(n,t){return b(n,t,[],[])},h.isEmpty=function(n){if(null==n)return!0;if(h.isArray(n)||h.isString(n)||h.isArguments(n))return 0===n.length;for(var t in n)if(h.has(n,t))return!1;return!0},h.isElement=function(n){return!(!n||1!==n.nodeType)},h.isArray=f||function(n){return"[object Array]"===l.call(n)},h.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},h.each(["Arguments","Function","String","Number","Date","RegExp"],function(n){h["is"+n]=function(t){return l.call(t)==="[object "+n+"]"}}),h.isArguments(arguments)||(h.isArguments=function(n){return h.has(n,"callee")}),"function"!=typeof/./&&(h.isFunction=function(n){return"function"==typeof n||!1}),h.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},h.isNaN=function(n){return h.isNumber(n)&&n!==+n},h.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===l.call(n)},h.isNull=function(n){return null===n},h.isUndefined=function(n){return n===void 0},h.has=function(n,t){return null!=n&&c.call(n,t)},h.noConflict=function(){return n._=t,this},h.identity=function(n){return n},h.constant=function(n){return function(){return n}},h.noop=function(){},h.property=function(n){return function(t){return t[n]}},h.matches=function(n){var t=h.pairs(n),r=t.length;return function(n){if(null==n)return!r;n=new Object(n);for(var e=0;r>e;e++){var u=t[e],i=u[0];if(u[1]!==n[i]||!(i in n))return!1}return!0}},h.times=function(n,t,r){var e=Array(Math.max(0,n));t=g(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},h.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},h.now=Date.now||function(){return(new Date).getTime()};var _={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},w=h.invert(_),j=function(n){var t=function(t){return n[t]},r="(?:"+h.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};h.escape=j(_),h.unescape=j(w),h.result=function(n,t){if(null==n)return void 0;var r=n[t];return h.isFunction(r)?n[t]():r};var x=0;h.uniqueId=function(n){var t=++x+"";return n?n+t:t},h.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var A=/(.)^/,k={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},O=/\\|'|\r|\n|\u2028|\u2029/g,F=function(n){return"\\"+k[n]};h.template=function(n,t,r){!t&&r&&(t=r),t=h.defaults({},t,h.templateSettings);var e=RegExp([(t.escape||A).source,(t.interpolate||A).source,(t.evaluate||A).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(O,F),u=o+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":a&&(i+="';\n"+a+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=new Function(t.variable||"obj","_",i)}catch(o){throw o.source=i,o}var l=function(n){return a.call(this,n,h)},c=t.variable||"obj";return l.source="function("+c+"){\n"+i+"}",l},h.chain=function(n){var t=h(n);return t._chain=!0,t};var E=function(n){return this._chain?h(n).chain():n};h.mixin=function(n){h.each(h.functions(n),function(t){var r=h[t]=n[t];h.prototype[t]=function(){var n=[this._wrapped];return i.apply(n,arguments),E.call(this,r.apply(h,n))}})},h.mixin(h),h.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=r[n];h.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],E.call(this,r)}}),h.each(["concat","join","slice"],function(n){var t=r[n];h.prototype[n]=function(){return E.call(this,t.apply(this._wrapped,arguments))}}),h.prototype.value=function(){return this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return h})}).call(this); +//# sourceMappingURL=underscore-min.map \ No newline at end of file diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js index a12f0d9..b4f49a0 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js @@ -1,6 +1,6 @@ -// Underscore.js 1.4.4 +// Underscore.js 1.7.0 // http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc. +// (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. (function() { @@ -8,37 +8,26 @@ // Baseline setup // -------------- - // Establish the root object, `window` in the browser, or `global` on the server. + // Establish the root object, `window` in the browser, or `exports` on the server. var root = this; // Save the previous value of the `_` variable. var previousUnderscore = root._; - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - // Save bytes in the minified (but not gzipped) version: var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; // Create quick reference variables for speed access to core prototypes. - var push = ArrayProto.push, - slice = ArrayProto.slice, - concat = ArrayProto.concat, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; + var + push = ArrayProto.push, + slice = ArrayProto.slice, + concat = ArrayProto.concat, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; // All **ECMAScript 5** native function implementations that we hope to use // are declared here. var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, nativeIsArray = Array.isArray, nativeKeys = Object.keys, nativeBind = FuncProto.bind; @@ -52,8 +41,7 @@ // Export the Underscore object for **Node.js**, with // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. + // the browser, add `_` as a global object. if (typeof exports !== 'undefined') { if (typeof module !== 'undefined' && module.exports) { exports = module.exports = _; @@ -64,98 +52,125 @@ } // Current version. - _.VERSION = '1.4.4'; + _.VERSION = '1.7.0'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var createCallback = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + _.iteratee = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return createCallback(value, context, argCount); + if (_.isObject(value)) return _.matches(value); + return _.property(value); + }; // Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (iterator.call(context, obj[i], i, obj) === breaker) return; + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + if (obj == null) return obj; + iteratee = createCallback(iteratee, context); + var i, length = obj.length; + if (length === +length) { + for (i = 0; i < length; i++) { + iteratee(obj[i], i, obj); } } else { - for (var key in obj) { - if (_.has(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); } } + return obj; }; - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + if (obj == null) return []; + iteratee = _.iteratee(iteratee, context); + var keys = obj.length !== +obj.length && _.keys(obj), + length = (keys || obj).length, + results = Array(length), + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } return results; }; var reduceError = 'Reduce of empty array with no initial value'; // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; + // or `foldl`. + _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) { if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); + iteratee = createCallback(iteratee, context, 4); + var keys = obj.length !== +obj.length && _.keys(obj), + length = (keys || obj).length, + index = 0, currentKey; + if (arguments.length < 3) { + if (!length) throw new TypeError(reduceError); + memo = obj[keys ? keys[index++] : index++]; + } + for (; index < length; index++) { + currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError(reduceError); return memo; }; // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; + _.reduceRight = _.foldr = function(obj, iteratee, memo, context) { if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); + iteratee = createCallback(iteratee, context, 4); + var keys = obj.length !== + obj.length && _.keys(obj), + index = (keys || obj).length, + currentKey; + if (arguments.length < 3) { + if (!index) throw new TypeError(reduceError); + memo = obj[keys ? keys[--index] : --index]; } - var length = obj.length; - if (length !== +length) { - var keys = _.keys(obj); - length = keys.length; + while (index--) { + currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); } - each(obj, function(value, index, list) { - index = keys ? keys[--length] : --length; - if (!initial) { - memo = obj[index]; - initial = true; - } else { - memo = iterator.call(context, memo, obj[index], index, list); - } - }); - if (!initial) throw new TypeError(reduceError); return memo; }; // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { + _.find = _.detect = function(obj, predicate, context) { var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { + predicate = _.iteratee(predicate, context); + _.some(obj, function(value, index, list) { + if (predicate(value, index, list)) { result = value; return true; } @@ -164,61 +179,58 @@ }; // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { + _.filter = _.select = function(obj, predicate, context) { var results = []; if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; + predicate = _.iteratee(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); }); return results; }; // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - return _.filter(obj, function(value, index, list) { - return !iterator.call(context, value, index, list); - }, context); + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(_.iteratee(predicate)), context); }; // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return !!result; + _.every = _.all = function(obj, predicate, context) { + if (obj == null) return true; + predicate = _.iteratee(predicate, context); + var keys = obj.length !== +obj.length && _.keys(obj), + length = (keys || obj).length, + index, currentKey; + for (index = 0; index < length; index++) { + currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; }; // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; + _.some = _.any = function(obj, predicate, context) { + if (obj == null) return false; + predicate = _.iteratee(predicate, context); + var keys = obj.length !== +obj.length && _.keys(obj), + length = (keys || obj).length, + index, currentKey; + for (index = 0; index < length; index++) { + currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; }; // Determine if the array or object contains a given value (using `===`). // Aliased as `include`. _.contains = _.include = function(obj, target) { if (obj == null) return false; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - return any(obj, function(value) { - return value === target; - }); + if (obj.length !== +obj.length) obj = _.values(obj); + return _.indexOf(obj, target) >= 0; }; // Invoke a method (with arguments) on every item in a collection. @@ -232,83 +244,104 @@ // Convenience version of a common use case of `map`: fetching a property. _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); + return _.map(obj, _.property(key)); }; // Convenience version of a common use case of `filter`: selecting only objects // containing specific `key:value` pairs. - _.where = function(obj, attrs, first) { - if (_.isEmpty(attrs)) return first ? null : []; - return _[first ? 'find' : 'filter'](obj, function(value) { - for (var key in attrs) { - if (attrs[key] !== value[key]) return false; - } - return true; - }); + _.where = function(obj, attrs) { + return _.filter(obj, _.matches(attrs)); }; // Convenience version of a common use case of `find`: getting the first object // containing specific `key:value` pairs. _.findWhere = function(obj, attrs) { - return _.where(obj, attrs, true); + return _.find(obj, _.matches(attrs)); }; - // Return the maximum element or (element-based computation). - // Can't optimize arrays of integers longer than 65,535 elements. - // See: https://bugs.webkit.org/show_bug.cgi?id=80797 - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.max.apply(Math, obj); + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = obj.length === +obj.length ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = _.iteratee(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); } - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity, value: -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; + return result; }; // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.min.apply(Math, obj); + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = obj.length === +obj.length ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = _.iteratee(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); } - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity, value: Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; + return result; }; - // Shuffle an array. + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). _.shuffle = function(obj) { - var rand; - var index = 0; - var shuffled = []; - each(obj, function(value) { - rand = _.random(index++); - shuffled[index - 1] = shuffled[rand]; - shuffled[rand] = value; - }); + var set = obj && obj.length === +obj.length ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } return shuffled; }; - // An internal function to generate lookup iterators. - var lookupIterator = function(value) { - return _.isFunction(value) ? value : function(obj){ return obj[value]; }; + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (obj.length !== +obj.length) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); }; - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, value, context) { - var iterator = lookupIterator(value); + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = _.iteratee(iteratee, context); return _.pluck(_.map(obj, function(value, index, list) { return { - value : value, - index : index, - criteria : iterator.call(context, value, index, list) + value: value, + index: index, + criteria: iteratee(value, index, list) }; }).sort(function(left, right) { var a = left.criteria; @@ -317,53 +350,56 @@ if (a > b || a === void 0) return 1; if (a < b || b === void 0) return -1; } - return left.index < right.index ? -1 : 1; + return left.index - right.index; }), 'value'); }; // An internal function used for aggregate "group by" operations. - var group = function(obj, value, context, behavior) { - var result = {}; - var iterator = lookupIterator(value || _.identity); - each(obj, function(value, index) { - var key = iterator.call(context, value, index, obj); - behavior(result, key, value); - }); - return result; + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = _.iteratee(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; }; // Groups the object's values by a criterion. Pass either a string attribute // to group by, or a function that returns the criterion. - _.groupBy = function(obj, value, context) { - return group(obj, value, context, function(result, key, value) { - (_.has(result, key) ? result[key] : (result[key] = [])).push(value); - }); - }; + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); // Counts instances of an object that group by a certain criterion. Pass // either a string attribute to count by, or a function that returns the // criterion. - _.countBy = function(obj, value, context) { - return group(obj, value, context, function(result, key) { - if (!_.has(result, key)) result[key] = 0; - result[key]++; - }); - }; + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); // Use a comparator function to figure out the smallest index at which // an object should be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator, context) { - iterator = iterator == null ? _.identity : lookupIterator(iterator); - var value = iterator.call(context, obj); + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = _.iteratee(iteratee, context, 1); + var value = iteratee(obj); var low = 0, high = array.length; while (low < high) { - var mid = (low + high) >>> 1; - iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; + var mid = low + high >>> 1; + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; } return low; }; - // Safely convert anything iterable into a real, live array. + // Safely create a real, live array from anything iterable. _.toArray = function(obj) { if (!obj) return []; if (_.isArray(obj)) return slice.call(obj); @@ -374,7 +410,18 @@ // Return the number of elements in an object. _.size = function(obj) { if (obj == null) return 0; - return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; + return obj.length === +obj.length ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = _.iteratee(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; }; // Array Functions @@ -385,7 +432,9 @@ // allows it to work with `_.map`. _.first = _.head = _.take = function(array, n, guard) { if (array == null) return void 0; - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; + if (n == null || guard) return array[0]; + if (n < 0) return []; + return slice.call(array, 0, n); }; // Returns everything but the last entry of the array. Especially useful on @@ -393,18 +442,15 @@ // the array, excluding the last N. The **guard** check allows it to work with // `_.map`. _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); }; // Get the last element of an array. Passing **n** will return the last N // values in the array. The **guard** check allows it to work with `_.map`. _.last = function(array, n, guard) { if (array == null) return void 0; - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } + if (n == null || guard) return array[array.length - 1]; + return slice.call(array, Math.max(array.length - n, 0)); }; // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. @@ -412,7 +458,7 @@ // the rest N values in the array. The **guard** // check allows it to work with `_.map`. _.rest = _.tail = _.drop = function(array, n, guard) { - return slice.call(array, (n == null) || guard ? 1 : n); + return slice.call(array, n == null || guard ? 1 : n); }; // Trim out all falsy values from an array. @@ -421,20 +467,26 @@ }; // Internal implementation of a recursive `flatten` function. - var flatten = function(input, shallow, output) { - each(input, function(value) { - if (_.isArray(value)) { - shallow ? push.apply(output, value) : flatten(value, shallow, output); + var flatten = function(input, shallow, strict, output) { + if (shallow && _.every(input, _.isArray)) { + return concat.apply(output, input); + } + for (var i = 0, length = input.length; i < length; i++) { + var value = input[i]; + if (!_.isArray(value) && !_.isArguments(value)) { + if (!strict) output.push(value); + } else if (shallow) { + push.apply(output, value); } else { - output.push(value); + flatten(value, shallow, strict, output); } - }); + } return output; }; - // Return a completely flattened version of an array. + // Flatten out an array, either recursively (by default), or just one level. _.flatten = function(array, shallow) { - return flatten(array, shallow, []); + return flatten(array, shallow, false, []); }; // Return a version of the array that does not contain the specified value(s). @@ -445,56 +497,74 @@ // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator, context) { - if (_.isFunction(isSorted)) { - context = iterator; - iterator = isSorted; + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (array == null) return []; + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; isSorted = false; } - var initial = iterator ? _.map(array, iterator, context) : array; - var results = []; + if (iteratee != null) iteratee = _.iteratee(iteratee, context); + var result = []; var seen = []; - each(initial, function(value, index) { - if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { - seen.push(value); - results.push(array[index]); + for (var i = 0, length = array.length; i < length; i++) { + var value = array[i]; + if (isSorted) { + if (!i || seen !== value) result.push(value); + seen = value; + } else if (iteratee) { + var computed = iteratee(value, i, array); + if (_.indexOf(seen, computed) < 0) { + seen.push(computed); + result.push(value); + } + } else if (_.indexOf(result, value) < 0) { + result.push(value); } - }); - return results; + } + return result; }; // Produce an array that contains the union: each distinct element from all of // the passed-in arrays. _.union = function() { - return _.uniq(concat.apply(ArrayProto, arguments)); + return _.uniq(flatten(arguments, true, true, [])); }; // Produce an array that contains every item shared between all the // passed-in arrays. _.intersection = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); + if (array == null) return []; + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = array.length; i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; }; // Take the difference between one array and a number of other arrays. // Only the elements present in just the first array will remain. _.difference = function(array) { - var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); - return _.filter(array, function(value){ return !_.contains(rest, value); }); + var rest = flatten(slice.call(arguments, 1), true, true, []); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); }; // Zip together multiple lists into a single array -- elements that share // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); + _.zip = function(array) { + if (array == null) return []; + var length = _.max(arguments, 'length').length; + var results = Array(length); for (var i = 0; i < length; i++) { - results[i] = _.pluck(args, "" + i); + results[i] = _.pluck(arguments, i); } return results; }; @@ -505,7 +575,7 @@ _.object = function(list, values) { if (list == null) return {}; var result = {}; - for (var i = 0, l = list.length; i < l; i++) { + for (var i = 0, length = list.length; i < length; i++) { if (values) { result[list[i]] = values[i]; } else { @@ -515,37 +585,32 @@ return result; }; - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. // If the array is large and already in sort order, pass `true` // for **isSorted** to use binary search. _.indexOf = function(array, item, isSorted) { if (array == null) return -1; - var i = 0, l = array.length; + var i = 0, length = array.length; if (isSorted) { if (typeof isSorted == 'number') { - i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); + i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted; } else { i = _.sortedIndex(array, item); return array[i] === item ? i : -1; } } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); - for (; i < l; i++) if (array[i] === item) return i; + for (; i < length; i++) if (array[i] === item) return i; return -1; }; - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. _.lastIndexOf = function(array, item, from) { if (array == null) return -1; - var hasIndex = from != null; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { - return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); + var idx = array.length; + if (typeof from == 'number') { + idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1); } - var i = (hasIndex ? from : array.length); - while (i--) if (array[i] === item) return i; + while (--idx >= 0) if (array[idx] === item) return idx; return -1; }; @@ -557,15 +622,13 @@ stop = start || 0; start = 0; } - step = arguments[2] || 1; + step = step || 1; - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); - while(idx < len) { - range[idx++] = start; - start += step; + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; } return range; @@ -574,50 +637,77 @@ // Function (ahem) Functions // ------------------ + // Reusable constructor function for prototype setting. + var Ctor = function(){}; + // Create a function bound to a given object (assigning `this`, and arguments, // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if // available. _.bind = function(func, context) { - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - var args = slice.call(arguments, 2); - return function() { - return func.apply(context, args.concat(slice.call(arguments))); + var args, bound; + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + args = slice.call(arguments, 2); + bound = function() { + if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); + Ctor.prototype = func.prototype; + var self = new Ctor; + Ctor.prototype = null; + var result = func.apply(self, args.concat(slice.call(arguments))); + if (_.isObject(result)) return result; + return self; }; + return bound; }; // Partially apply a function by creating a version that has had some of its - // arguments pre-filled, without changing its dynamic `this` context. + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. _.partial = function(func) { - var args = slice.call(arguments, 1); + var boundArgs = slice.call(arguments, 1); return function() { - return func.apply(this, args.concat(slice.call(arguments))); + var position = 0; + var args = boundArgs.slice(); + for (var i = 0, length = args.length; i < length; i++) { + if (args[i] === _) args[i] = arguments[position++]; + } + while (position < arguments.length) args.push(arguments[position++]); + return func.apply(this, args); }; }; - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length === 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } return obj; }; // Memoize an expensive function by storing its results. _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + var memoize = function(key) { + var cache = memoize.cache; + var address = hasher ? hasher.apply(this, arguments) : key; + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; }; + memoize.cache = {}; + return memoize; }; // Delays a function for the given number of milliseconds, and then calls // it with the arguments supplied. _.delay = function(func, wait) { var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(null, args); }, wait); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); }; // Defers a function, scheduling it to run after the current call stack has @@ -627,26 +717,34 @@ }; // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, result; + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; var previous = 0; + if (!options) options = {}; var later = function() { - previous = new Date; + previous = options.leading === false ? 0 : _.now(); timeout = null; result = func.apply(context, args); + if (!timeout) context = args = null; }; return function() { - var now = new Date; + var now = _.now(); + if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; - if (remaining <= 0) { + if (remaining <= 0 || remaining > wait) { clearTimeout(timeout); timeout = null; previous = now; result = func.apply(context, args); - } else if (!timeout) { + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; @@ -658,31 +756,34 @@ // N milliseconds. If `immediate` is passed, trigger the function on the // leading edge, instead of the trailing. _.debounce = function(func, wait, immediate) { - var timeout, result; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - if (!immediate) result = func.apply(context, args); - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) result = func.apply(context, args); - return result; - }; - }; + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; }; }; @@ -690,29 +791,31 @@ // allowing you to adjust arguments, run code before and after, and // conditionally execute the original function. _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { return function() { - var args = [func]; - push.apply(args, arguments); - return wrapper.apply(this, args); + return !predicate.apply(this, arguments); }; }; // Returns a function that is the composition of a list of functions, each // consuming the return value of the function that follows. _.compose = function() { - var funcs = arguments; + var args = arguments; + var start = args.length - 1; return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; }; }; // Returns a function that will only be executed after being called N times. _.after = function(times, func) { - if (times <= 0) return func(); return function() { if (--times < 1) { return func.apply(this, arguments); @@ -720,36 +823,65 @@ }; }; + // Returns a function that will only be executed before being called N times. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } else { + func = null; + } + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + // Object Functions // ---------------- // Retrieve the names of an object's properties. // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); var keys = []; - for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; + for (var key in obj) if (_.has(obj, key)) keys.push(key); return keys; }; // Retrieve the values of an object's properties. _.values = function(obj) { - var values = []; - for (var key in obj) if (_.has(obj, key)) values.push(obj[key]); + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } return values; }; // Convert an object into a list of `[key, value]` pairs. _.pairs = function(obj) { - var pairs = []; - for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]); + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } return pairs; }; // Invert the keys and values of an object. The values must be serializable. _.invert = function(obj) { var result = {}; - for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } return result; }; @@ -765,45 +897,62 @@ // Extend a given object with all the properties in passed-in object(s). _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - obj[prop] = source[prop]; + if (!_.isObject(obj)) return obj; + var source, prop; + for (var i = 1, length = arguments.length; i < length; i++) { + source = arguments[i]; + for (prop in source) { + if (hasOwnProperty.call(source, prop)) { + obj[prop] = source[prop]; } } - }); + } return obj; }; // Return a copy of the object only containing the whitelisted properties. - _.pick = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - each(keys, function(key) { - if (key in obj) copy[key] = obj[key]; - }); - return copy; + _.pick = function(obj, iteratee, context) { + var result = {}, key; + if (obj == null) return result; + if (_.isFunction(iteratee)) { + iteratee = createCallback(iteratee, context); + for (key in obj) { + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + } else { + var keys = concat.apply([], slice.call(arguments, 1)); + obj = new Object(obj); + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (key in obj) result[key] = obj[key]; + } + } + return result; }; // Return a copy of the object without the blacklisted properties. - _.omit = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - for (var key in obj) { - if (!_.contains(keys, key)) copy[key] = obj[key]; + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(concat.apply([], slice.call(arguments, 1)), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; } - return copy; + return _.pick(obj, iteratee, context); }; // Fill in a given object with default properties. _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } + if (!_.isObject(obj)) return obj; + for (var i = 1, length = arguments.length; i < length; i++) { + var source = arguments[i]; + for (var prop in source) { + if (obj[prop] === void 0) obj[prop] = source[prop]; } - }); + } return obj; }; @@ -824,8 +973,8 @@ // Internal recursive comparison function for `isEqual`. var eq = function(a, b, aStack, bStack) { // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; // A strict comparison is necessary because `null == undefined`. if (a == null || b == null) return a === b; // Unwrap any wrapped objects. @@ -833,29 +982,27 @@ if (b instanceof _) b = b._wrapped; // Compare `[[Class]]` names. var className = toString.call(a); - if (className != toString.call(b)) return false; + if (className !== toString.call(b)) return false; switch (className) { - // Strings, numbers, dates, and booleans are compared by value. + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') case '[object String]': // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is // equivalent to `new String("5")`. - return a == String(b); + return '' + a === '' + b; case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; case '[object Date]': case '[object Boolean]': // Coerce dates and booleans to numeric primitive values. Dates are compared by their // millisecond representations. Note that invalid dates with millisecond representations // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; + return +a === +b; } if (typeof a != 'object' || typeof b != 'object') return false; // Assume equality for cyclic structures. The algorithm for detecting cyclic @@ -864,17 +1011,29 @@ while (length--) { // Linear search. Performance is inversely proportional to the number of // unique nested structures. - if (aStack[length] == a) return bStack[length] == b; + if (aStack[length] === a) return bStack[length] === b; + } + // Objects with different constructors are not equivalent, but `Object`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if ( + aCtor !== bCtor && + // Handle Object.create(x) cases + 'constructor' in a && 'constructor' in b && + !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + ) { + return false; } // Add the first object to the stack of traversed objects. aStack.push(a); bStack.push(b); - var size = 0, result = true; + var size, result; // Recursively compare objects and arrays. - if (className == '[object Array]') { + if (className === '[object Array]') { // Compare array lengths to determine if a deep comparison is necessary. size = a.length; - result = size == b.length; + result = size === b.length; if (result) { // Deep compare the contents, ignoring non-numeric properties. while (size--) { @@ -882,29 +1041,18 @@ } } } else { - // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && - _.isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; - } // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. + var keys = _.keys(a), key; + size = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + result = _.keys(b).length === size; + if (result) { + while (size--) { + // Deep compare each member + key = keys[size]; if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; } } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; - } } // Remove the first object from the stack of traversed objects. aStack.pop(); @@ -921,7 +1069,7 @@ // An "empty" object has no enumerable own-properties. _.isEmpty = function(obj) { if (obj == null) return true; - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; + if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0; for (var key in obj) if (_.has(obj, key)) return false; return true; }; @@ -934,18 +1082,19 @@ // Is a given value an array? // Delegates to ECMA5's native Array.isArray _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; + return toString.call(obj) === '[object Array]'; }; // Is a given variable an object? _.isObject = function(obj) { - return obj === Object(obj); + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; }; // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. - each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { _['is' + name] = function(obj) { - return toString.call(obj) == '[object ' + name + ']'; + return toString.call(obj) === '[object ' + name + ']'; }; }); @@ -953,14 +1102,14 @@ // there isn't any inspectable "Arguments" type. if (!_.isArguments(arguments)) { _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); + return _.has(obj, 'callee'); }; } - // Optimize `isFunction` if appropriate. - if (typeof (/./) !== 'function') { + // Optimize `isFunction` if appropriate. Work around an IE 11 bug. + if (typeof /./ !== 'function') { _.isFunction = function(obj) { - return typeof obj === 'function'; + return typeof obj == 'function' || false; }; } @@ -971,12 +1120,12 @@ // Is the given value `NaN`? (NaN is the only number which does not equal itself). _.isNaN = function(obj) { - return _.isNumber(obj) && obj != +obj; + return _.isNumber(obj) && obj !== +obj; }; // Is a given value a boolean? _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; }; // Is a given value equal to null? @@ -992,7 +1141,7 @@ // Shortcut function for checking if an object has a given property directly // on itself (in other words, not on a prototype). _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); + return obj != null && hasOwnProperty.call(obj, key); }; // Utility Functions @@ -1005,15 +1154,44 @@ return this; }; - // Keep the identity function around for default iterators. + // Keep the identity function around for default iteratees. _.identity = function(value) { return value; }; + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = function(key) { + return function(obj) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of `key:value` pairs. + _.matches = function(attrs) { + var pairs = _.pairs(attrs), length = pairs.length; + return function(obj) { + if (obj == null) return !length; + obj = new Object(obj); + for (var i = 0; i < length; i++) { + var pair = pairs[i], key = pair[0]; + if (pair[1] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + }; + // Run a function **n** times. - _.times = function(n, iterator, context) { - var accum = Array(n); - for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = createCallback(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); return accum; }; @@ -1026,53 +1204,45 @@ return min + Math.floor(Math.random() * (max - min + 1)); }; - // List of HTML entities for escaping. - var entityMap = { - escape: { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/' - } + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); }; - entityMap.unescape = _.invert(entityMap.escape); - // Regexes containing the keys and values listed immediately above. - var entityRegexes = { - escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), - unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' }; + var unescapeMap = _.invert(escapeMap); // Functions for escaping and unescaping strings to/from HTML interpolation. - _.each(['escape', 'unescape'], function(method) { - _[method] = function(string) { - if (string == null) return ''; - return ('' + string).replace(entityRegexes[method], function(match) { - return entityMap[method][match]; - }); + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; }; - }); - - // If the value of the named property is a function then invoke it; - // otherwise, return it. - _.result = function(object, property) { - if (object == null) return null; - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); - // Add your own custom functions to the Underscore object. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - var func = _[name] = obj[name]; - _.prototype[name] = function() { - var args = [this._wrapped]; - push.apply(args, arguments); - return result.call(this, func.apply(_, args)); - }; - }); + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property) { + if (object == null) return void 0; + var value = object[property]; + return _.isFunction(value) ? object[property]() : value; }; // Generate a unique integer id (unique within the entire client session). @@ -1103,22 +1273,26 @@ '\\': '\\', '\r': 'r', '\n': 'n', - '\t': 't', '\u2028': 'u2028', '\u2029': 'u2029' }; - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; // JavaScript micro-templating, similar to John Resig's implementation. // Underscore templating handles arbitrary delimiters, preserves whitespace, // and correctly escapes quotes within interpolated code. - _.template = function(text, data, settings) { - var render; + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; settings = _.defaults({}, settings, _.templateSettings); // Combine delimiters into one regular expression via alternation. - var matcher = new RegExp([ + var matcher = RegExp([ (settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source @@ -1128,19 +1302,18 @@ var index = 0; var source = "__p+='"; text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset) - .replace(escaper, function(match) { return '\\' + escapes[match]; }); + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; if (escape) { source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; - } - if (interpolate) { + } else if (interpolate) { source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } - if (evaluate) { + } else if (evaluate) { source += "';\n" + evaluate + "\n__p+='"; } - index = offset + match.length; + + // Adobe VMs need the match returned to produce the correct offest. return match; }); source += "';\n"; @@ -1150,29 +1323,31 @@ source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + - source + "return __p;\n"; + source + 'return __p;\n'; try { - render = new Function(settings.variable || 'obj', '_', source); + var render = new Function(settings.variable || 'obj', '_', source); } catch (e) { e.source = source; throw e; } - if (data) return render(data, _); var template = function(data) { return render.call(this, data, _); }; - // Provide the compiled function source as a convenience for precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; return template; }; - // Add a "chain" function, which will delegate to the wrapper. + // Add a "chain" function. Start chaining a wrapped Underscore object. _.chain = function(obj) { - return _(obj).chain(); + var instance = _(obj); + instance._chain = true; + return instance; }; // OOP @@ -1186,41 +1361,55 @@ return this._chain ? _(obj).chain() : obj; }; + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result.call(this, func.apply(_, args)); + }; + }); + }; + // Add all of the Underscore functions to the wrapper object. _.mixin(_); // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { var obj = this._wrapped; method.apply(obj, arguments); - if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; return result.call(this, obj); }; }); // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { + _.each(['concat', 'join', 'slice'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { return result.call(this, method.apply(this._wrapped, arguments)); }; }); - _.extend(_.prototype, { + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; - // Start chaining a wrapped Underscore object. - chain: function() { - this._chain = true; - return this; - }, - - // Extracts the result from a wrapped and chained object. - value: function() { - return this._wrapped; - } - - }); - -}).call(this); + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}.call(this)); diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/package.json b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/package.json index 09382f8..b64aac3 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/package.json +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/argparse/package.json @@ -1,7 +1,7 @@ { "name": "argparse", "description": "Very powerful CLI arguments parser. Native port of argparse - python's options parsing library", - "version": "0.1.15", + "version": "0.1.16", "keywords": [ "cli", "parser", @@ -21,10 +21,7 @@ "bugs": { "url": "https://github.com/nodeca/argparse/issues" }, - "license": { - "type": "MIT", - "url": "https://github.com/nodeca/argparse/blob/master/LICENSE" - }, + "license": "MIT", "repository": { "type": "git", "url": "git://github.com/nodeca/argparse.git" @@ -34,17 +31,32 @@ "test": "make test" }, "dependencies": { - "underscore": "~1.4.3", - "underscore.string": "~2.3.1" + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" }, "devDependencies": { "mocha": "*" }, - "engines": { - "node": ">= 0.6.0" + "gitHead": "9c32eb1405d5d4b5686087d95bac010774979659", + "_id": "argparse@0.1.16", + "_shasum": "cfd01e0fbba3d6caed049fbd758d40f65196f57c", + "_from": "argparse@>=0.1.11 <0.2.0", + "_npmVersion": "1.4.28", + "_npmUser": { + "name": "vitaly", + "email": "vitaly@rcdesign.ru" }, - "readme": "argparse\n========\n\n[![Build Status](https://secure.travis-ci.org/nodeca/argparse.png?branch=master)](http://travis-ci.org/nodeca/argparse)\n\nCLI arguments parser for node.js. Javascript port of python's\n[argparse](http://docs.python.org/dev/library/argparse.html) module\n(original version 3.2). That's a full port, except some very rare options,\nrecorded in issue tracker.\n\n**NB.** Method names changed to camelCase. See [generated docs](http://nodeca.github.com/argparse/).\n\n\nExample\n=======\n\ntest.js file:\n\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n version: '0.0.1',\n addHelp:true,\n description: 'Argparse example'\n});\nparser.addArgument(\n [ '-f', '--foo' ],\n {\n help: 'foo bar'\n }\n);\nparser.addArgument(\n [ '-b', '--bar' ],\n {\n help: 'bar foo'\n }\n);\nvar args = parser.parseArgs();\nconsole.dir(args);\n```\n\nDisplay help:\n\n```\n$ ./test.js -h\nusage: example.js [-h] [-v] [-f FOO] [-b BAR]\n\nArgparse example\n\nOptional arguments:\n -h, --help Show this help message and exit.\n -v, --version Show program's version number and exit.\n -f FOO, --foo FOO foo bar\n -b BAR, --bar BAR bar foo\n```\n\nParse arguments:\n\n```\n$ ./test.js -f=3 --bar=4\n{ foo: '3', bar: '4' }\n```\n\nMore [examples](https://github.com/nodeca/argparse/tree/master/examples).\n\n\nArgumentParser objects\n======================\n\n```\nnew ArgumentParser({paramters hash});\n```\n\nCreates a new ArgumentParser object.\n\n**Supported params:**\n\n- ```description``` - Text to display before the argument help.\n- ```epilog``` - Text to display after the argument help.\n- ```addHelp``` - Add a -h/–help option to the parser. (default: True)\n- ```argumentDefault``` - Set the global default value for arguments. (default: None)\n- ```parents``` - A list of ArgumentParser objects whose arguments should also be included.\n- ```prefixChars``` - The set of characters that prefix optional arguments. (default: ‘-‘)\n- ```formatterClass``` - A class for customizing the help output.\n- ```prog``` - The name of the program (default: sys.argv[0])\n- ```usage``` - The string describing the program usage (default: generated)\n- ```conflictHandler``` - Usually unnecessary, defines strategy for resolving conflicting optionals.\n\n**Not supportied yet**\n\n- ```fromfilePrefixChars``` - The set of characters that prefix files from which additional arguments should be read.\n\n\nDetails in [original ArgumentParser guide](http://docs.python.org/dev/library/argparse.html#argumentparser-objects)\n\n\naddArgument() method\n====================\n\n```\nArgumentParser.addArgument([names or flags], {options})\n```\n\nDefines how a single command-line argument should be parsed.\n\n- ```name or flags``` - Either a name or a list of option strings, e.g. foo or -f, --foo.\n\nOptions:\n\n- ```action``` - The basic type of action to be taken when this argument is encountered at the command line.\n- ```nargs```- The number of command-line arguments that should be consumed.\n- ```constant``` - A constant value required by some action and nargs selections.\n- ```defaultValue``` - The value produced if the argument is absent from the command line.\n- ```type``` - The type to which the command-line argument should be converted.\n- ```choices``` - A container of the allowable values for the argument.\n- ```required``` - Whether or not the command-line option may be omitted (optionals only).\n- ```help``` - A brief description of what the argument does.\n- ```metavar``` - A name for the argument in usage messages.\n- ```dest``` - The name of the attribute to be added to the object returned by parseArgs().\n\nDetails in [original add_argument guide](http://docs.python.org/dev/library/argparse.html#the-add-argument-method)\n\n\nAction (some details)\n================\n\nArgumentParser objects associate command-line arguments with actions.\nThese actions can do just about anything with the command-line arguments associated\nwith them, though most actions simply add an attribute to the object returned by\nparseArgs(). The action keyword argument specifies how the command-line arguments\nshould be handled. The supported actions are:\n\n- ```store``` - Just stores the argument’s value. This is the default action.\n- ```storeConst``` - Stores value, specified by the const keyword argument.\n (Note that the const keyword argument defaults to the rather unhelpful None.)\n The 'storeConst' action is most commonly used with optional arguments, that\n specify some sort of flag.\n- ```storeTrue``` and ```storeFalse``` - Stores values True and False\n respectively. These are special cases of 'storeConst'.\n- ```append``` - Stores a list, and appends each argument value to the list.\n This is useful to allow an option to be specified multiple times.\n- ```appendConst``` - Stores a list, and appends value, specified by the\n const keyword argument to the list. (Note, that the const keyword argument defaults\n is None.) The 'appendConst' action is typically used when multiple arguments need\n to store constants to the same list.\n- ```count``` - Counts the number of times a keyword argument occurs. For example,\n used for increasing verbosity levels.\n- ```help``` - Prints a complete help message for all the options in the current\n parser and then exits. By default a help action is automatically added to the parser.\n See ArgumentParser for details of how the output is created.\n- ```version``` - Prints version information and exit. Expects a `version=`\n keyword argument in the addArgument() call.\n\nDetails in [original action guide](http://docs.python.org/dev/library/argparse.html#action)\n\n\nSub-commands\n============\n\nArgumentParser.addSubparsers()\n\nMany programs split their functionality into a number of sub-commands, for\nexample, the svn program can invoke sub-commands like `svn checkout`, `svn update`,\nand `svn commit`. Splitting up functionality this way can be a particularly good\nidea when a program performs several different functions which require different\nkinds of command-line arguments. `ArgumentParser` supports creation of such\nsub-commands with `addSubparsers()` method. The `addSubparsers()` method is\nnormally called with no arguments and returns an special action object.\nThis object has a single method `addParser()`, which takes a command name and\nany `ArgumentParser` constructor arguments, and returns an `ArgumentParser` object\nthat can be modified as usual.\n\nExample:\n\nsub_commands.js\n```javascript\n#!/usr/bin/env node\n'use strict';\n\nvar ArgumentParser = require('../lib/argparse').ArgumentParser;\nvar parser = new ArgumentParser({\n version: '0.0.1',\n addHelp:true,\n description: 'Argparse examples: sub-commands',\n});\n\nvar subparsers = parser.addSubparsers({\n title:'subcommands',\n dest:\"subcommand_name\"\n});\n\nvar bar = subparsers.addParser('c1', {addHelp:true});\nbar.addArgument(\n [ '-f', '--foo' ],\n {\n action: 'store',\n help: 'foo3 bar3'\n }\n);\nvar bar = subparsers.addParser(\n 'c2',\n {aliases:['co'], addHelp:true}\n);\nbar.addArgument(\n [ '-b', '--bar' ],\n {\n action: 'store',\n type: 'int',\n help: 'foo3 bar3'\n }\n);\n\nvar args = parser.parseArgs();\nconsole.dir(args);\n\n```\n\nDetails in [original sub-commands guide](http://docs.python.org/dev/library/argparse.html#sub-commands)\n\n\nContributors\n============\n\n- [Eugene Shkuropat](https://github.com/shkuropat)\n- [Paul Jacobson](https://github.com/hpaulj)\n\n[others](https://github.com/nodeca/argparse/graphs/contributors)\n\nLicense\n=======\n\nCopyright (c) 2012 [Vitaly Puzrin](https://github.com/puzrin).\nReleased under the MIT license. See\n[LICENSE](https://github.com/nodeca/argparse/blob/master/LICENSE) for details.\n\n\n", - "readmeFilename": "README.md", - "_id": "argparse@0.1.15", - "_from": "argparse@~ 0.1.11" + "maintainers": [ + { + "name": "vitaly", + "email": "vitaly@rcdesign.ru" + } + ], + "dist": { + "shasum": "cfd01e0fbba3d6caed049fbd758d40f65196f57c", + "tarball": "http://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/js-yaml/node_modules/esprima/package.json b/node_modules/grunt/node_modules/js-yaml/node_modules/esprima/package.json index 9a2294a..fdabb39 100644 --- a/node_modules/grunt/node_modules/js-yaml/node_modules/esprima/package.json +++ b/node_modules/grunt/node_modules/js-yaml/node_modules/esprima/package.json @@ -22,14 +22,13 @@ }, "maintainers": [ { - "name": "Ariya Hidayat", - "email": "ariya.hidayat@gmail.com", - "url": "http://ariya.ofilabs.com" + "name": "ariya", + "email": "ariya.hidayat@gmail.com" } ], "repository": { "type": "git", - "url": "http://github.com/ariya/esprima.git" + "url": "git+ssh://git@github.com/ariya/esprima.git" }, "licenses": [ { @@ -49,11 +48,22 @@ "benchmark": "node test/benchmarks.js", "benchmark-quick": "node test/benchmarks.js quick" }, - "readme": "**Esprima** ([esprima.org](http://esprima.org)) is a high performance,\nstandard-compliant [ECMAScript](http://www.ecma-international.org/publications/standards/Ecma-262.htm)\nparser written in ECMAScript (also popularly known as\n[JavaScript](http://en.wikipedia.org/wiki/JavaScript>JavaScript)).\nEsprima is created and maintained by [Ariya Hidayat](http://twitter.com/ariyahidayat),\nwith the help of [many contributors](https://github.com/ariya/esprima/contributors).\n\nEsprima runs on web browsers (IE 6+, Firefox 1+, Safari 3+, Chrome 1+, Konqueror 4.6+, Opera 8+) as well as\n[Node.js](http://nodejs.org).\n\n### Features\n\n- Full support for [ECMAScript 5.1](http://www.ecma-international.org/publications/standards/Ecma-262.htm)(ECMA-262)\n- Sensible [syntax tree format](http://esprima.org/doc/index.html#ast) compatible with Mozilla\n[Parser AST](https://developer.mozilla.org/en/SpiderMonkey/Parser_API)\n- Heavily tested (> 550 [unit tests](http://esprima.org/test/) with solid 100% statement coverage)\n- Optional tracking of syntax node location (index-based and line-column)\n- Experimental support for ES6/Harmony (module, class, destructuring, ...)\n\nEsprima is blazing fast (see the [benchmark suite](http://esprima.org/test/benchmarks.html)).\nIt is up to 3x faster than UglifyJS v1 and it is still [competitive](http://esprima.org/test/compare.html)\nwith the new generation of fast parsers.\n\n### Applications\n\nEsprima serves as the basis for many popular JavaScript development tools:\n\n- Code coverage analysis: [node-cover](https://github.com/itay/node-cover), [Istanbul](https://github.com/yahoo/Istanbul)\n- Documentation tool: [JFDoc](https://github.com/thejohnfreeman/jfdoc), [JSDuck](https://github.com/senchalabs/jsduck)\n- Language extension: [LLJS](http://mbebenita.github.com/LLJS/) (low-level JS),\n[Sweet.js](http://sweetjs.org/) (macro)\n- ES6/Harmony transpiler: [Six](https://github.com/matthewrobb/six), [Harmonizr](https://github.com/jdiamond/harmonizr)\n- Eclipse Orion smart editing ([outline view](https://github.com/aclement/esprima-outline), [content assist](http://contraptionsforprogramming.blogspot.com/2012/02/better-javascript-content-assist-in.html))\n- Source code modification: [Esmorph](https://github.com/ariya/esmorph), [Code Painter](https://github.com/fawek/codepainter),\n- Source transformation: [node-falafel](https://github.com/substack/node-falafel), [Esmangle](https://github.com/Constellation/esmangle), [escodegen](https://github.com/Constellation/escodegen)\n\n### Questions?\n- [Documentation](http://esprima.org/doc)\n- [Issue tracker](http://issues.esprima.org): [known problems](http://code.google.com/p/esprima/issues/list?q=Defect)\nand [future plans](http://code.google.com/p/esprima/issues/list?q=Enhancement)\n- [Mailing list](http://groups.google.com/group/esprima)\n- [Contribution guide](http://esprima.org/doc/index.html#contribution)\n\nFollow [@Esprima](http://twitter.com/Esprima) on Twitter to get the\ndevelopment updates.\nFeedback and contribution are welcomed!\n\n### License\n\nCopyright (C) 2012, 2011 [Ariya Hidayat](http://ariya.ofilabs.com/about)\n and other contributors.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n", - "readmeFilename": "README.md", + "_id": "esprima@1.0.4", + "dist": { + "shasum": "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad", + "tarball": "http://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + }, + "_npmVersion": "1.1.61", + "_npmUser": { + "name": "ariya", + "email": "ariya.hidayat@gmail.com" + }, + "directories": {}, + "_shasum": "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad", + "_from": "esprima@>=1.0.2 <1.1.0", + "_resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", "bugs": { "url": "https://github.com/ariya/esprima/issues" }, - "_id": "esprima@1.0.4", - "_from": "esprima@~ 1.0.2" + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/js-yaml/package.json b/node_modules/grunt/node_modules/js-yaml/package.json index 43b050a..841d8c9 100644 --- a/node_modules/grunt/node_modules/js-yaml/package.json +++ b/node_modules/grunt/node_modules/js-yaml/package.json @@ -53,8 +53,25 @@ "engines": { "node": ">= 0.6.0" }, - "readme": "JS-YAML - YAML 1.2 parser and serializer for JavaScript\n=======================================================\n\n[![Build Status](https://secure.travis-ci.org/nodeca/js-yaml.png)](http://travis-ci.org/nodeca/js-yaml)\n\n[Online Demo](http://nodeca.github.com/js-yaml/)\n\n\nThis is an implementation of [YAML](http://yaml.org/), a human friendly data\nserialization language. Started as [PyYAML](http://pyyaml.org/) port, it was\ncompletely rewritten from scratch. Now it's very fast, and supports 1.2 spec.\n\n\nBreaking changes in 1.x.x -> 2.0.x\n----------------------------------\n\nIf your have not used __custom__ tags or loader classes - no changes needed. Just\nupgrade library and enjoy high parse speed.\n\nIn other case, you should rewrite your tag constructors and custom loader\nclasses, to conform new schema-based API. See\n[examples](https://github.com/nodeca/js-yaml/tree/master/examples) and\n[wiki](https://github.com/nodeca/js-yaml/wiki) for details.\nNote, that parser internals were completely rewritten.\n\n\nInstallation\n------------\n\n### YAML module for node.js\n\n```\nnpm install js-yaml\n```\n\n\n### CLI executable\n\nIf you want to inspect your YAML files from CLI, install js-yaml globally:\n\n```\nnpm install js-yaml -g\n```\n\n#### Usage\n\n```\nusage: js-yaml [-h] [-v] [-c] [-j] [-t] file\n\nPositional arguments:\n file File with YAML document(s)\n\nOptional arguments:\n -h, --help Show this help message and exit.\n -v, --version Show program's version number and exit.\n -c, --compact Display errors in compact mode\n -j, --to-json Output a non-funky boring JSON\n -t, --trace Show stack trace on error\n```\n\n\n### Bundled YAML library for browsers\n\n``` html\n\n\n```\n\nBrowser support was done mostly for online demo. If you find any errors - feel\nfree to send pull requests with fixes. Also note, that IE and other old browsers\nneeds [es5-shims](https://github.com/kriskowal/es5-shim) to operate.\n\n\nAPI\n---\n\nHere we cover the most 'useful' methods. If you need advanced details (creating\nyour own tags), see [wiki](https://github.com/nodeca/js-yaml/wiki) and\n[examples](https://github.com/nodeca/js-yaml/tree/master/examples) for more\ninfo.\n\nIn node.js JS-YAML automatically registers handlers for `.yml` and `.yaml`\nfiles. You can load them just with `require`. That's mostly equivalent to\ncalling `load()` on fetched content of a file. Just with one string!\n\n``` javascript\nrequire('js-yaml');\n\n// Get document, or throw exception on error\ntry {\n var doc = require('/home/ixti/example.yml');\n console.log(doc);\n} catch (e) {\n console.log(e);\n}\n```\n\n\n### load (string [ , options ])\n\nParses `string` as single YAML document. Returns a JavaScript object or throws\n`YAMLException` on error.\n\nNOTE: This function **does not** understands multi-document sources, it throws\nexception on those.\n\noptions:\n\n- `filename` _(default: null)_ - string to be used as a file path in\n error/warning messages.\n- `strict` _(default - false)_ makes the loader to throw errors instead of\n warnings.\n- `schema` _(default: `DEFAULT_SCHEMA`)_ - specifies a schema to use.\n\n\n### loadAll (string, iterator [ , options ])\n\nSame as `load()`, but understands multi-document sources and apply `iterator` to\neach document.\n\n``` javascript\nvar yaml = require('js-yaml');\n\nyaml.loadAll(data, function (doc) {\n console.log(doc);\n});\n```\n\n\n### safeLoad (string [ , options ])\n\nSame as `load()` but uses `SAFE_SCHEMA` by default - only recommended tags of\nYAML specification (no JavaScript-specific tags, e.g. `!!js/regexp`).\n\n\n### safeLoadAll (string, iterator [ , options ])\n\nSame as `loadAll()` but uses `SAFE_SCHEMA` by default - only recommended tags of\nYAML specification (no JavaScript-specific tags, e.g. `!!js/regexp`).\n\n\n### dump (object [ , options ])\n\nSerializes `object` as YAML document.\n\noptions:\n\n- `indent` _(default: 2)_ - indentation width to use (in spaces).\n- `flowLevel` (default: -1) - specifies level of nesting, when to switch from\n block to flow style for collections. -1 means block style everwhere\n- `styles` - \"tag\" => \"style\" map. Each tag may have own set of styles.\n- `schema` _(default: `DEFAULT_SCHEMA`)_ specifies a schema to use.\n\nstyles:\n\n``` none\n!!null\n \"canonical\" => \"~\"\n\n!!int\n \"binary\" => \"0b1\", \"0b101010\", \"0b1110001111010\"\n \"octal\" => \"01\", \"052\", \"016172\"\n \"decimal\" => \"1\", \"42\", \"7290\"\n \"hexadecimal\" => \"0x1\", \"0x2A\", \"0x1C7A\"\n\n!!null, !!bool, !!float\n \"lowercase\" => \"null\", \"true\", \"false\", \".nan\", '.inf'\n \"uppercase\" => \"NULL\", \"TRUE\", \"FALSE\", \".NAN\", '.INF'\n \"camelcase\" => \"Null\", \"True\", \"False\", \".NaN\", '.Inf'\n```\n\nBy default, !!int uses `decimal`, and !!null, !!bool, !!float use `lowercase`.\n\n\n### safeDump (object [ , options ])\n\nSame as `dump()` but uses `SAFE_SCHEMA` by default - only recommended tags of\nYAML specification (no JavaScript-specific tags, e.g. `!!js/regexp`).\n\n\nSupported YAML types\n--------------------\n\nThe list of standard YAML tags and corresponding JavaScipt types. See also\n[YAML tag discussion](http://pyyaml.org/wiki/YAMLTagDiscussion) and\n[YAML types repository](http://yaml.org/type/).\n\n```\n!!null '' # null\n!!bool 'yes' # bool\n!!int '3...' # number\n!!float '3.14...' # number\n!!binary '...base64...' # buffer\n!!timestamp 'YYYY-...' # date\n!!omap [ ... ] # array of key-value pairs\n!!pairs [ ... ] # array or array pairs\n!!set { ... } # array of objects with given keys and null values\n!!str '...' # string\n!!seq [ ... ] # array\n!!map { ... } # object\n```\n\n**JavaScript-specific tags**\n\n```\n!!js/regexp /pattern/gim # RegExp\n!!js/undefined '' # Undefined\n!!js/function 'function () {...}' # Function\n```\n\n\n\n\n## Caveats\n\nNote, that you use arrays or objects as key in JS-YAML. JS do not allows objects\nor array as keys, and stringifies (by calling .toString method) them at the\nmoment of adding them.\n\n``` yaml\n---\n? [ foo, bar ]\n: - baz\n? { foo: bar }\n: - baz\n - baz\n```\n\n``` javascript\n{ \"foo,bar\": [\"baz\"], \"[object Object]\": [\"baz\", \"baz\"] }\n```\n\nAlso, reading of properties on implicit block mapping keys is not supported yet.\nSo, the following YAML document cannot be loaded.\n\n``` yaml\n&anchor foo:\n foo: bar\n *anchor: duplicate key\n baz: bat\n *anchor: duplicate key\n```\n\n## License\n\nView the [LICENSE](https://github.com/nodeca/js-yaml/blob/master/LICENSE) file\n(MIT).\n", - "readmeFilename": "README.md", "_id": "js-yaml@2.0.5", - "_from": "js-yaml@~2.0.5" + "dist": { + "shasum": "a25ae6509999e97df278c6719da11bd0687743a8", + "tarball": "http://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz" + }, + "_from": "js-yaml@>=2.0.5 <2.1.0", + "_resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "_npmVersion": "1.2.14", + "_npmUser": { + "name": "vitaly", + "email": "vitaly@rcdesign.ru" + }, + "maintainers": [ + { + "name": "vitaly", + "email": "vitaly@rcdesign.ru" + } + ], + "directories": {}, + "_shasum": "a25ae6509999e97df278c6719da11bd0687743a8", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/lodash/package.json b/node_modules/grunt/node_modules/lodash/package.json index 3a5fec8..c099117 100644 --- a/node_modules/grunt/node_modules/lodash/package.json +++ b/node_modules/grunt/node_modules/lodash/package.json @@ -46,7 +46,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/lodash/lodash.git" + "url": "git+https://github.com/lodash/lodash.git" }, "engines": [ "node", @@ -55,8 +55,25 @@ "jam": { "main": "./lodash.js" }, - "readme": "# Lo-Dash v0.9.2\n\nA utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features).\n\n## Download\n\n * [Development build](https://raw.github.com/lodash/lodash/0.9.2/lodash.js)\n * [Production build](https://raw.github.com/lodash/lodash/0.9.2/lodash.min.js)\n * [Underscore build](https://raw.github.com/lodash/lodash/0.9.2/lodash.underscore.min.js) tailored for projects already using Underscore\n * CDN copies of ≤ v0.9.2’s [Production](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/0.9.2/lodash.min.js), [Underscore](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/0.9.2/lodash.underscore.min.js), and [Development](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/0.9.2/lodash.js) builds are available on [cdnjs](http://cdnjs.com/) thanks to [CloudFlare](http://www.cloudflare.com/)\n * For optimal file size, [create a custom build](http://lodash.com/custom-builds) with only the features you need\n\n## Dive in\n\nWe’ve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests).\n\nCreate your own benchmarks at [jsPerf](http://jsperf.com), or [search](http://jsperf.com/search?q=lodash) for existing ones.\n\nFor a list of upcoming features, check out our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap).\n\n## Screencasts\n\nFor more information check out these screencasts over Lo-Dash:\n\n * [Introducing Lo-Dash](https://vimeo.com/44154599)\n * [Lo-Dash optimizations and custom builds](https://vimeo.com/44154601)\n * [Lo-Dash’s origin and why it’s a better utility belt](https://vimeo.com/44154600)\n * [Unit testing in Lo-Dash](https://vimeo.com/45865290)\n * [Lo-Dash’s approach to native method use](https://vimeo.com/48576012)\n\n## Features\n\n * AMD loader support ([RequireJS](http://requirejs.org/), [curl.js](https://github.com/cujojs/curl), etc.)\n * [_.clone](http://lodash.com/docs#clone) supports *“deep”* cloning\n * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex` argument\n * [_.forEach](http://lodash.com/docs#forEach) is chainable and supports exiting iteration early\n * [_.forIn](http://lodash.com/docs#forIn) for iterating over an object’s own and inherited properties\n * [_.forOwn](http://lodash.com/docs#forOwn) for iterating over an object’s own properties\n * [_.isPlainObject](http://lodash.com/docs#isPlainObject) checks if values are created by the `Object` constructor\n * [_.lateBind](http://lodash.com/docs#lateBind) for late binding\n * [_.merge](http://lodash.com/docs#merge) for a *“deep”* [_.extend](http://lodash.com/docs#extend)\n * [_.partial](http://lodash.com/docs#partial) for partial application without `this` binding\n * [_.pick](http://lodash.com/docs#pick) and [_.omit](http://lodash.com/docs#omit) accepts `callback` and `thisArg` arguments\n * [_.template](http://lodash.com/docs#template) supports [ES6 delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6) and utilizes [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) for easier debugging\n * [_.contains](http://lodash.com/docs#contains), [_.size](http://lodash.com/docs#size), [_.toArray](http://lodash.com/docs#toArray),\n [and more…](http://lodash.com/docs \"_.countBy, _.every, _.filter, _.find, _.forEach, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.some, _.sortBy, _.where\") accept strings\n\n## Support\n\nLo-Dash has been tested in at least Chrome 5~23, Firefox 1~16, IE 6-10, Opera 9.25-12, Safari 3-6, Node.js 0.4.8-0.8.14, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.\n\n## Installation and usage\n\nIn browsers:\n\n```html\n\n```\n\nUsing [npm](http://npmjs.org/):\n\n```bash\nnpm install lodash\n\nnpm install -g lodash\nnpm link lodash\n```\n\nIn [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):\n\n```js\nvar _ = require('lodash');\n```\n\n**Note:** If Lo-Dash is installed globally, [run `npm link lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory before requiring it.\n\nIn [RingoJS v0.7.0-](http://ringojs.org/):\n\n```js\nvar _ = require('lodash')._;\n```\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('lodash.js');\n```\n\nIn an AMD loader like [RequireJS](http://requirejs.org/):\n\n```js\nrequire({\n 'paths': {\n 'underscore': 'path/to/lodash'\n }\n},\n['underscore'], function(_) {\n console.log(_.VERSION);\n});\n```\n\n## Resolved Underscore.js issues\n\n * Allow iteration of objects with a `length` property [[#799](https://github.com/documentcloud/underscore/pull/799), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L545-551)]\n * Fix cross-browser object iteration bugs [[#60](https://github.com/documentcloud/underscore/issues/60), [#376](https://github.com/documentcloud/underscore/issues/376), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L558-582)]\n * Methods should work on pages with incorrectly shimmed native methods [[#7](https://github.com/documentcloud/underscore/issues/7), [#742](https://github.com/documentcloud/underscore/issues/742), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L140-146)]\n * `_.isEmpty` should support jQuery/MooTools DOM query collections [[#690](https://github.com/documentcloud/underscore/pull/690), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L747-752)]\n * `_.isObject` should avoid V8 bug [#2291](http://code.google.com/p/8/issues/detail?id=2291) [[#605](https://github.com/documentcloud/underscore/issues/605), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L828-840)]\n * `_.keys` should work with `arguments` objects cross-browser [[#396](https://github.com/documentcloud/underscore/issues/396), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L921-923)]\n * `_.range` should coerce arguments to numbers [[#634](https://github.com/documentcloud/underscore/issues/634), [#683](https://github.com/documentcloud/underscore/issues/683), [test](https://github.com/lodash/lodash/blob/0.9.2/test/test.js#L1337-1340)]\n\n## Release Notes\n\n### v0.9.2\n\n * Added `fromIndex` argument to `_.contains`\n * Added `moduleId` build option\n * Added Closure Compiler *“simple”* optimizations to the build process\n * Added support for strings in `_.max` and `_.min`\n * Added support for ES6 template delimiters to `_.template`\n * Ensured re-minification of Lo-Dash by third parties avoids Closure Compiler bugs\n * Optimized `_.every`, `_.find`, `_.some`, and `_.uniq`\n\nThe full changelog is available [here](https://github.com/lodash/lodash/wiki/Changelog).\n\n## BestieJS\n\nLo-Dash is part of the [BestieJS](https://github.com/bestiejs) *“Best in Class”* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.\n\n## Author\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](http://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## Contributors\n\n| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](http://twitter.com/blainebublitz \"Follow @BlaineBublitz on Twitter\") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge \"Follow @kitcambridge on Twitter\") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|---|---|\n| [Blaine Bublitz](http://iceddev.com/) | [Kit Cambridge](http://kitcambridge.github.io/) | [Mathias Bynens](http://mathiasbynens.be/) |\n", - "readmeFilename": "README.md", "_id": "lodash@0.9.2", - "_from": "lodash@~0.9.2" + "dist": { + "shasum": "8f3499c5245d346d682e5b0d3b40767e09f1a92c", + "tarball": "http://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + }, + "_from": "lodash@>=0.9.2 <0.10.0", + "_npmVersion": "1.2.24", + "_npmUser": { + "name": "jdalton", + "email": "john.david.dalton@gmail.com" + }, + "maintainers": [ + { + "name": "jdalton", + "email": "john.david.dalton@gmail.com" + } + ], + "directories": {}, + "_shasum": "8f3499c5245d346d682e5b0d3b40767e09f1a92c", + "_resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/README.md b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/README.md index 03ee0f9..82a6dab 100644 --- a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/README.md +++ b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/README.md @@ -54,11 +54,12 @@ away. ## API -* `set(key, value)` +* `set(key, value, max)` * `get(key) => value` Both of these will update the "recently used"-ness of the key. - They do what you think. + They do what you think. `max` is optional and overrides the + cache `max` option if provided. * `peek(key)` @@ -95,3 +96,14 @@ away. * `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. diff --git a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js index d1d1381..d66e7a2 100644 --- a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +++ b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js @@ -86,11 +86,13 @@ Object.defineProperty(LRUCache.prototype, "itemCount", LRUCache.prototype.forEach = function (fn, thisp) { thisp = thisp || this - var i = 0; - for (var k = this._mru - 1; k >= 0 && i < this._itemCount; k--) if (this._lruList[k]) { + var i = 0 + var itemCount = this._itemCount + + for (var k = this._mru - 1; k >= 0 && i < itemCount; k--) if (this._lruList[k]) { i++ var hit = this._lruList[k] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + if (isStale(this, hit)) { del(this, hit) if (!this._allowStale) hit = undefined } @@ -145,19 +147,24 @@ LRUCache.prototype.dumpLru = function () { return this._lruList } -LRUCache.prototype.set = function (key, value) { +LRUCache.prototype.set = function (key, value, maxAge) { + maxAge = maxAge || this._maxAge + var now = maxAge ? Date.now() : 0 + if (hOP(this._cache, key)) { // dispose of the old one before overwriting - if (this._dispose) this._dispose(key, this._cache[key].value) - if (this._maxAge) this._cache[key].now = Date.now() + if (this._dispose) + this._dispose(key, this._cache[key].value) + + this._cache[key].now = now + this._cache[key].maxAge = maxAge this._cache[key].value = value this.get(key) return true } var len = this._lengthCalculator(value) - var age = this._maxAge ? Date.now() : 0 - var hit = new Entry(key, value, this._mru++, len, age) + var hit = new Entry(key, value, this._mru++, len, now, maxAge) // oversized objects fall out of cache automatically. if (hit.length > this._max) { @@ -169,14 +176,16 @@ LRUCache.prototype.set = function (key, value) { this._lruList[hit.lu] = this._cache[key] = hit this._itemCount ++ - if (this._length > this._max) trim(this) + if (this._length > this._max) + trim(this) + return true } LRUCache.prototype.has = function (key) { if (!hOP(this._cache, key)) return false var hit = this._cache[key] - if (this._maxAge && (Date.now() - hit.now > this._maxAge)) { + if (isStale(this, hit)) { return false } return true @@ -203,7 +212,7 @@ LRUCache.prototype.del = function (key) { function get (self, key, doUse) { var hit = self._cache[key] if (hit) { - if (self._maxAge && (Date.now() - hit.now > self._maxAge)) { + if (isStale(self, hit)) { del(self, hit) if (!self._allowStale) hit = undefined } else { @@ -214,6 +223,18 @@ function get (self, key, doUse) { return hit } +function isStale(self, hit) { + if (!hit || (!hit.maxAge && !self._maxAge)) return false + var stale = false; + var diff = Date.now() - hit.now + if (hit.maxAge) { + stale = diff > hit.maxAge + } else { + stale = self._maxAge && (diff > self._maxAge) + } + return stale; +} + function use (self, hit) { shiftLU(self, hit) hit.lu = self._mru ++ @@ -241,12 +262,13 @@ function del (self, hit) { } // classy, since V8 prefers predictable objects. -function Entry (key, value, lu, length, now) { +function Entry (key, value, lu, length, now, maxAge) { this.key = key this.value = value this.lu = lu this.length = length this.now = now + if (maxAge) this.maxAge = maxAge } })() diff --git a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json index 4472725..5446578 100644 --- a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json +++ b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/package.json @@ -1,11 +1,16 @@ { "name": "lru-cache", "description": "A cache object that deletes the least-recently-used items.", - "version": "2.5.0", + "version": "2.6.2", "author": { "name": "Isaac Z. Schlueter", "email": "i@izs.me" }, + "keywords": [ + "mru", + "lru", + "cache" + ], "scripts": { "test": "tap test --gc" }, @@ -15,19 +20,38 @@ "url": "git://github.com/isaacs/node-lru-cache.git" }, "devDependencies": { - "tap": "", + "tap": "^0.7.1", "weak": "" }, "license": { "type": "MIT", "url": "http://github.com/isaacs/node-lru-cache/raw/master/LICENSE" }, - "readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum size of the cache, checked by applying the length\n function to all values in the cache. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n* `stale` By default, if you set a `maxAge`, it'll only actually pull\n stale items out of the cache when you `get(key)`. (That is, it's\n not pre-emptively doing a `setTimeout` or anything.) If you set\n `stale:true`, it'll return the stale value before deleting it. If\n you don't set this, then it'll return `undefined` when you try to\n get a stale entry, as if it had already been deleted.\n\n## API\n\n* `set(key, value)`\n* `get(key) => value`\n\n Both of these will update the \"recently used\"-ness of the key.\n They do what you think.\n\n* `peek(key)`\n\n Returns the key value (or `undefined` if not found) without\n updating the \"recently used\"-ness of the key.\n\n (If you find yourself using this a lot, you *might* be using the\n wrong sort of data structure, but there are some use cases where\n it's handy.)\n\n* `del(key)`\n\n Deletes a key out of the cache.\n\n* `reset()`\n\n Clear the cache entirely, throwing away all values.\n\n* `has(key)`\n\n Check if a key is in the cache, without updating the recent-ness\n or deleting it for being stale.\n\n* `forEach(function(value,key,cache), [thisp])`\n\n Just like `Array.prototype.forEach`. Iterates over all the keys\n in the cache, in order of recent-ness. (Ie, more recently used\n items are iterated over first.)\n\n* `keys()`\n\n Return an array of the keys in the cache.\n\n* `values()`\n\n Return an array of the values in the cache.\n", - "readmeFilename": "README.md", + "gitHead": "278d05fcc714636eeedb3959bca80c20c19a61df", "bugs": { "url": "https://github.com/isaacs/node-lru-cache/issues" }, - "homepage": "https://github.com/isaacs/node-lru-cache", - "_id": "lru-cache@2.5.0", - "_from": "lru-cache@2" + "homepage": "https://github.com/isaacs/node-lru-cache#readme", + "_id": "lru-cache@2.6.2", + "_shasum": "77741638c6dc972e503dbe41dcb6bfdfba499a38", + "_from": "lru-cache@>=2.0.0 <3.0.0", + "_npmVersion": "2.8.4", + "_nodeVersion": "1.4.2", + "_npmUser": { + "name": "isaacs", + "email": "isaacs@npmjs.com" + }, + "dist": { + "shasum": "77741638c6dc972e503dbe41dcb6bfdfba499a38", + "tarball": "http://registry.npmjs.org/lru-cache/-/lru-cache-2.6.2.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.6.2.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/basic.js b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/basic.js index f72697c..949113e 100644 --- a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/basic.js +++ b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/basic.js @@ -215,7 +215,7 @@ test("drop the old items", function(t) { cache.set("c", "C") // timed out t.notOk(cache.get("a")) - }, 60) + }, 60 + 25) setTimeout(function () { t.notOk(cache.get("b")) @@ -228,6 +228,32 @@ test("drop the old items", function(t) { }, 155) }) +test("individual item can have it's own maxAge", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 50 + }) + + cache.set("a", "A", 20) + setTimeout(function () { + t.notOk(cache.get("a")) + t.end() + }, 25) +}) + +test("individual item can have it's own maxAge > cache's", function(t) { + var cache = new LRU({ + max: 5, + maxAge: 20 + }) + + cache.set("a", "A", 50) + setTimeout(function () { + t.equal(cache.get("a"), "A") + t.end() + }, 25) +}) + test("disposal function", function(t) { var disposed = false var cache = new LRU({ diff --git a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/foreach.js b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/foreach.js index eefb80d..429ebc1 100644 --- a/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +++ b/node_modules/grunt/node_modules/minimatch/node_modules/lru-cache/test/foreach.js @@ -28,6 +28,7 @@ test('forEach', function (t) { t.equal(key, j.toString()) t.equal(val, j.toString(2)) }) + t.equal(i, order.length); t.end() }) @@ -50,3 +51,71 @@ test('keys() and values()', function (t) { t.end() }) + +test('all entries are iterated over', function(t) { + var l = new LRU(5) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 0 + l.forEach(function (val, key, cache) { + if (i > 0) { + cache.del(key) + } + i += 1 + }) + + t.equal(i, 5) + t.equal(l.keys().length, 1) + + t.end() +}) + +test('all stale entries are removed', function(t) { + var l = new LRU({ max: 5, maxAge: -5, stale: true }) + for (var i = 0; i < 10; i ++) { + l.set(i.toString(), i.toString(2)) + } + + var i = 0 + l.forEach(function () { + i += 1 + }) + + t.equal(i, 5) + t.equal(l.keys().length, 0) + + t.end() +}) + +test('expires', function (t) { + var l = new LRU({ + max: 10, + maxAge: 50 + }) + for (var i = 0; i < 10; i++) { + l.set(i.toString(), i.toString(2), ((i % 2) ? 25 : undefined)) + } + + var i = 0 + var order = [ 8, 6, 4, 2, 0 ] + setTimeout(function () { + l.forEach(function (val, key, cache) { + var j = order[i++] + t.equal(cache, l) + t.equal(key, j.toString()) + t.equal(val, j.toString(2)) + }) + t.equal(i, order.length); + t.end() + + setTimeout(function () { + var count = 0; + l.forEach(function (val, key, cache) { count++; }) + t.equal(0, count); + t.end() + }, 25) + + }, 26) +}) diff --git a/node_modules/grunt/node_modules/minimatch/node_modules/sigmund/package.json b/node_modules/grunt/node_modules/minimatch/node_modules/sigmund/package.json index cb7e2bd..26c0d15 100644 --- a/node_modules/grunt/node_modules/minimatch/node_modules/sigmund/package.json +++ b/node_modules/grunt/node_modules/minimatch/node_modules/sigmund/package.json @@ -16,7 +16,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/isaacs/sigmund" + "url": "git://github.com/isaacs/sigmund.git" }, "keywords": [ "object", @@ -32,11 +32,27 @@ }, "license": "BSD", "readme": "# sigmund\n\nQuick and dirty signatures for Objects.\n\nThis is like a much faster `deepEquals` comparison, which returns a\nstring key suitable for caches and the like.\n\n## Usage\n\n```javascript\nfunction doSomething (someObj) {\n var key = sigmund(someObj, maxDepth) // max depth defaults to 10\n var cached = cache.get(key)\n if (cached) return cached)\n\n var result = expensiveCalculation(someObj)\n cache.set(key, result)\n return result\n}\n```\n\nThe resulting key will be as unique and reproducible as calling\n`JSON.stringify` or `util.inspect` on the object, but is much faster.\nIn order to achieve this speed, some differences are glossed over.\nFor example, the object `{0:'foo'}` will be treated identically to the\narray `['foo']`.\n\nAlso, just as there is no way to summon the soul from the scribblings\nof a cocain-addled psychoanalyst, there is no way to revive the object\nfrom the signature string that sigmund gives you. In fact, it's\nbarely even readable.\n\nAs with `sys.inspect` and `JSON.stringify`, larger objects will\nproduce larger signature strings.\n\nBecause sigmund is a bit less strict than the more thorough\nalternatives, the strings will be shorter, and also there is a\nslightly higher chance for collisions. For example, these objects\nhave the same signature:\n\n var obj1 = {a:'b',c:/def/,g:['h','i',{j:'',k:'l'}]}\n var obj2 = {a:'b',c:'/def/',g:['h','i','{jkl']}\n\nLike a good Freudian, sigmund is most effective when you already have\nsome understanding of what you're looking for. It can help you help\nyourself, but you must be willing to do some work as well.\n\nCycles are handled, and cyclical objects are silently omitted (though\nthe key is included in the signature output.)\n\nThe second argument is the maximum depth, which defaults to 10,\nbecause that is the maximum object traversal depth covered by most\ninsurance carriers.\n", - "readmeFilename": "README.md", + "_id": "sigmund@1.0.0", + "dist": { + "shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296", + "tarball": "http://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz" + }, + "_npmVersion": "1.1.48", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "_shasum": "66a2b3a749ae8b5fb89efd4fcc01dc94fbe02296", + "_from": "sigmund@>=1.0.0 <1.1.0", + "_resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.0.tgz", "bugs": { "url": "https://github.com/isaacs/sigmund/issues" }, - "homepage": "https://github.com/isaacs/sigmund", - "_id": "sigmund@1.0.0", - "_from": "sigmund@~1.0.0" + "homepage": "https://github.com/isaacs/sigmund" } diff --git a/node_modules/grunt/node_modules/minimatch/package.json b/node_modules/grunt/node_modules/minimatch/package.json index de0704b..a949c3c 100644 --- a/node_modules/grunt/node_modules/minimatch/package.json +++ b/node_modules/grunt/node_modules/minimatch/package.json @@ -29,12 +29,29 @@ "type": "MIT", "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE" }, - "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nEventually, it will replace the C binding in node-glob.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instanting the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n Each row in the\n array corresponds to a brace-expanded pattern. Each item in the row\n corresponds to a single path-part. For example, the pattern\n `{a,b/c}/d` would expand to a set of patterns like:\n\n [ [ a, d ]\n , [ b, c, d ] ]\n\n If a portion of the pattern doesn't have any \"magic\" in it\n (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n will be left as a string rather than converted to a regular\n expression.\n\n* `regexp` Created by the `makeRe` method. A single regular expression\n expressing the entire pattern. This is useful in cases where you wish\n to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n filename, and match it against a single row in the `regExpSet`. This\n method is mainly for internal use, but is exposed so that it can be\n used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n## Functions\n\nThe top-level exported function has a `cache` property, which is an LRU\ncache set to store 100 items. So, calling these methods repeatedly\nwith the same pattern and options will use the same Minimatch object,\nsaving the cost of parsing it multiple times.\n\n### minimatch(path, pattern, options)\n\nMain export. Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`. Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob. If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself. When set, an empty list is returned if there are\nno matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes. For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated. Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally. This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`. Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything. Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set. This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part. That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes. For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`. This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern. Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity. Since those two are valid, matching proceeds.\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/isaacs/minimatch/issues" }, "homepage": "https://github.com/isaacs/minimatch", "_id": "minimatch@0.2.14", - "_from": "minimatch@~0.2.12" + "dist": { + "shasum": "c74e780574f63c6f9a090e90efbe6ef53a6a756a", + "tarball": "http://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + }, + "_from": "minimatch@>=0.2.12 <0.3.0", + "_npmVersion": "1.3.17", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "c74e780574f63c6f9a090e90efbe6ef53a6a756a", + "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/nopt/node_modules/abbrev/package.json b/node_modules/grunt/node_modules/nopt/node_modules/abbrev/package.json index b189020..14f3de1 100644 --- a/node_modules/grunt/node_modules/nopt/node_modules/abbrev/package.json +++ b/node_modules/grunt/node_modules/nopt/node_modules/abbrev/package.json @@ -12,18 +12,35 @@ }, "repository": { "type": "git", - "url": "http://github.com/isaacs/abbrev-js" + "url": "git+ssh://git@github.com/isaacs/abbrev-js.git" }, "license": { "type": "MIT", "url": "https://github.com/isaacs/abbrev-js/raw/master/LICENSE" }, - "readme": "# abbrev-js\n\nJust like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).\n\nUsage:\n\n var abbrev = require(\"abbrev\");\n abbrev(\"foo\", \"fool\", \"folding\", \"flop\");\n \n // returns:\n { fl: 'flop'\n , flo: 'flop'\n , flop: 'flop'\n , fol: 'folding'\n , fold: 'folding'\n , foldi: 'folding'\n , foldin: 'folding'\n , folding: 'folding'\n , foo: 'foo'\n , fool: 'fool'\n }\n\nThis is handy for command-line scripts, or other cases where you want to be able to accept shorthands.\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/isaacs/abbrev-js/issues" }, "homepage": "https://github.com/isaacs/abbrev-js", "_id": "abbrev@1.0.5", - "_from": "abbrev@1" + "_shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", + "_from": "abbrev@>=1.0.0 <2.0.0", + "_npmVersion": "1.4.7", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "5d8257bd9ebe435e698b2fa431afde4fe7b10b03", + "tarball": "http://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.5.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/nopt/package.json b/node_modules/grunt/node_modules/nopt/package.json index ca3ad65..fd6e027 100644 --- a/node_modules/grunt/node_modules/nopt/package.json +++ b/node_modules/grunt/node_modules/nopt/package.json @@ -13,7 +13,7 @@ }, "repository": { "type": "git", - "url": "http://github.com/isaacs/nopt" + "url": "git://github.com/isaacs/nopt.git" }, "bin": { "nopt": "./bin/nopt.js" @@ -25,12 +25,36 @@ "dependencies": { "abbrev": "1" }, - "readme": "If you want to write an option parser, and have it be good, there are\ntwo ways to do it. The Right Way, and the Wrong Way.\n\nThe Wrong Way is to sit down and write an option parser. We've all done\nthat.\n\nThe Right Way is to write some complex configurable program with so many\noptions that you go half-insane just trying to manage them all, and put\nit off with duct-tape solutions until you see exactly to the core of the\nproblem, and finally snap and write an awesome option parser.\n\nIf you want to write an option parser, don't write an option parser.\nWrite a package manager, or a source control system, or a service\nrestarter, or an operating system. You probably won't end up with a\ngood one of those, but if you don't give up, and you are relentless and\ndiligent enough in your procrastination, you may just end up with a very\nnice option parser.\n\n## USAGE\n\n // my-program.js\n var nopt = require(\"nopt\")\n , Stream = require(\"stream\").Stream\n , path = require(\"path\")\n , knownOpts = { \"foo\" : [String, null]\n , \"bar\" : [Stream, Number]\n , \"baz\" : path\n , \"bloo\" : [ \"big\", \"medium\", \"small\" ]\n , \"flag\" : Boolean\n , \"pick\" : Boolean\n , \"many\" : [String, Array]\n }\n , shortHands = { \"foofoo\" : [\"--foo\", \"Mr. Foo\"]\n , \"b7\" : [\"--bar\", \"7\"]\n , \"m\" : [\"--bloo\", \"medium\"]\n , \"p\" : [\"--pick\"]\n , \"f\" : [\"--flag\"]\n }\n // everything is optional.\n // knownOpts and shorthands default to {}\n // arg list defaults to process.argv\n // slice defaults to 2\n , parsed = nopt(knownOpts, shortHands, process.argv, 2)\n console.log(parsed)\n\nThis would give you support for any of the following:\n\n```bash\n$ node my-program.js --foo \"blerp\" --no-flag\n{ \"foo\" : \"blerp\", \"flag\" : false }\n\n$ node my-program.js ---bar 7 --foo \"Mr. Hand\" --flag\n{ bar: 7, foo: \"Mr. Hand\", flag: true }\n\n$ node my-program.js --foo \"blerp\" -f -----p\n{ foo: \"blerp\", flag: true, pick: true }\n\n$ node my-program.js -fp --foofoo\n{ foo: \"Mr. Foo\", flag: true, pick: true }\n\n$ node my-program.js --foofoo -- -fp # -- stops the flag parsing.\n{ foo: \"Mr. Foo\", argv: { remain: [\"-fp\"] } }\n\n$ node my-program.js --blatzk 1000 -fp # unknown opts are ok.\n{ blatzk: 1000, flag: true, pick: true }\n\n$ node my-program.js --blatzk true -fp # but they need a value\n{ blatzk: true, flag: true, pick: true }\n\n$ node my-program.js --no-blatzk -fp # unless they start with \"no-\"\n{ blatzk: false, flag: true, pick: true }\n\n$ node my-program.js --baz b/a/z # known paths are resolved.\n{ baz: \"/Users/isaacs/b/a/z\" }\n\n# if Array is one of the types, then it can take many\n# values, and will always be an array. The other types provided\n# specify what types are allowed in the list.\n\n$ node my-program.js --many 1 --many null --many foo\n{ many: [\"1\", \"null\", \"foo\"] }\n\n$ node my-program.js --many foo\n{ many: [\"foo\"] }\n```\n\nRead the tests at the bottom of `lib/nopt.js` for more examples of\nwhat this puppy can do.\n\n## Types\n\nThe following types are supported, and defined on `nopt.typeDefs`\n\n* String: A normal string. No parsing is done.\n* path: A file system path. Gets resolved against cwd if not absolute.\n* url: A url. If it doesn't parse, it isn't accepted.\n* Number: Must be numeric.\n* Date: Must parse as a date. If it does, and `Date` is one of the options,\n then it will return a Date object, not a string.\n* Boolean: Must be either `true` or `false`. If an option is a boolean,\n then it does not need a value, and its presence will imply `true` as\n the value. To negate boolean flags, do `--no-whatever` or `--whatever\n false`\n* NaN: Means that the option is strictly not allowed. Any value will\n fail.\n* Stream: An object matching the \"Stream\" class in node. Valuable\n for use when validating programmatically. (npm uses this to let you\n supply any WriteStream on the `outfd` and `logfd` config options.)\n* Array: If `Array` is specified as one of the types, then the value\n will be parsed as a list of options. This means that multiple values\n can be specified, and that the value will always be an array.\n\nIf a type is an array of values not on this list, then those are\nconsidered valid values. For instance, in the example above, the\n`--bloo` option can only be one of `\"big\"`, `\"medium\"`, or `\"small\"`,\nand any other value will be rejected.\n\nWhen parsing unknown fields, `\"true\"`, `\"false\"`, and `\"null\"` will be\ninterpreted as their JavaScript equivalents, and numeric values will be\ninterpreted as a number.\n\nYou can also mix types and values, or multiple types, in a list. For\ninstance `{ blah: [Number, null] }` would allow a value to be set to\neither a Number or null.\n\nTo define a new type, add it to `nopt.typeDefs`. Each item in that\nhash is an object with a `type` member and a `validate` method. The\n`type` member is an object that matches what goes in the type list. The\n`validate` method is a function that gets called with `validate(data,\nkey, val)`. Validate methods should assign `data[key]` to the valid\nvalue of `val` if it can be handled properly, or return boolean\n`false` if it cannot.\n\nYou can also call `nopt.clean(data, types, typeDefs)` to clean up a\nconfig object and remove its invalid properties.\n\n## Error Handling\n\nBy default, nopt outputs a warning to standard error when invalid\noptions are found. You can change this behavior by assigning a method\nto `nopt.invalidHandler`. This method will be called with\nthe offending `nopt.invalidHandler(key, val, types)`.\n\nIf no `nopt.invalidHandler` is assigned, then it will console.error\nits whining. If it is assigned to boolean `false` then the warning is\nsuppressed.\n\n## Abbreviations\n\nYes, they are supported. If you define options like this:\n\n```javascript\n{ \"foolhardyelephants\" : Boolean\n, \"pileofmonkeys\" : Boolean }\n```\n\nThen this will work:\n\n```bash\nnode program.js --foolhar --pil\nnode program.js --no-f --pileofmon\n# etc.\n```\n\n## Shorthands\n\nShorthands are a hash of shorter option names to a snippet of args that\nthey expand to.\n\nIf multiple one-character shorthands are all combined, and the\ncombination does not unambiguously match any other option or shorthand,\nthen they will be broken up into their constituent parts. For example:\n\n```json\n{ \"s\" : [\"--loglevel\", \"silent\"]\n, \"g\" : \"--global\"\n, \"f\" : \"--force\"\n, \"p\" : \"--parseable\"\n, \"l\" : \"--long\"\n}\n```\n\n```bash\nnpm ls -sgflp\n# just like doing this:\nnpm ls --loglevel silent --global --force --long --parseable\n```\n\n## The Rest of the args\n\nThe config object returned by nopt is given a special member called\n`argv`, which is an object with the following fields:\n\n* `remain`: The remaining args after all the parsing has occurred.\n* `original`: The args as they originally appeared.\n* `cooked`: The args after flags and shorthands are expanded.\n\n## Slicing\n\nNode programs are called with more or less the exact argv as it appears\nin C land, after the v8 and node-specific options have been plucked off.\nAs such, `argv[0]` is always `node` and `argv[1]` is always the\nJavaScript program being run.\n\nThat's usually not very useful to you. So they're sliced off by\ndefault. If you want them, then you can pass in `0` as the last\nargument, or any other number that you'd like to slice off the start of\nthe list.\n", - "readmeFilename": "README.md", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "_id": "nopt@1.0.10", + "devDependencies": {}, + "engines": { + "node": "*" + }, + "_engineSupported": true, + "_npmVersion": "1.0.93", + "_nodeVersion": "v0.5.9-pre", + "_defaultsLoaded": true, + "dist": { + "shasum": "6ddd21bd2a31417b92727dd585f8a6f37608ebee", + "tarball": "http://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "directories": {}, + "_shasum": "6ddd21bd2a31417b92727dd585f8a6f37608ebee", + "_from": "nopt@>=1.0.10 <1.1.0", + "_resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", "bugs": { "url": "https://github.com/isaacs/nopt/issues" }, - "homepage": "https://github.com/isaacs/nopt", - "_id": "nopt@1.0.10", - "_from": "nopt@~1.0.10" + "readme": "ERROR: No README data found!", + "homepage": "https://github.com/isaacs/nopt" } diff --git a/node_modules/grunt/node_modules/rimraf/package.json b/node_modules/grunt/node_modules/rimraf/package.json index 14f5c5d..b4b70f4 100644 --- a/node_modules/grunt/node_modules/rimraf/package.json +++ b/node_modules/grunt/node_modules/rimraf/package.json @@ -45,12 +45,29 @@ "email": "yosefd@microsoft.com" } ], - "readme": "`rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, callback)`\n\nThe callback will be called with an error if there is one. Certain\nerrors are handled for you:\n\n* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of\n `opts.maxBusyTries` times before giving up.\n* `ENOENT` - If the file doesn't exist, rimraf will return\n successfully, since your desired outcome is already the case.\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too. But that's not so good. Use\nthe async API. It's better.\n\n## CLI\n\nIf installed with `npm install rimraf -g` it can be used as a global\ncommand `rimraf ` which is useful for cross platform support.\n\n## mkdirp\n\nIf you need to create a directory recursively, check out\n[mkdirp](https://github.com/substack/node-mkdirp).\n", - "readmeFilename": "README.md", "bugs": { "url": "https://github.com/isaacs/rimraf/issues" }, "homepage": "https://github.com/isaacs/rimraf", "_id": "rimraf@2.2.8", - "_from": "rimraf@~2.2.8" + "_shasum": "e439be2aaee327321952730f99a8929e4fc50582", + "_from": "rimraf@>=2.2.8 <2.3.0", + "_npmVersion": "1.4.10", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "e439be2aaee327321952730f99a8929e4fc50582", + "tarball": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/underscore.string/package.json b/node_modules/grunt/node_modules/underscore.string/package.json index 6711c0a..57dc21e 100644 --- a/node_modules/grunt/node_modules/underscore.string/package.json +++ b/node_modules/grunt/node_modules/underscore.string/package.json @@ -55,7 +55,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/epeli/underscore.string.git" + "url": "git+https://github.com/epeli/underscore.string.git" }, "bugs": { "url": "https://github.com/epeli/underscore.string/issues" @@ -65,8 +65,32 @@ "type": "MIT" } ], - "readme": "# Underscore.string [![Build Status](https://secure.travis-ci.org/epeli/underscore.string.png?branch=master)](http://travis-ci.org/epeli/underscore.string) #\n\n\n\nJavascript lacks complete string manipulation operations.\nThis an attempt to fill that gap. List of build-in methods can be found\nfor example from [Dive Into JavaScript][d].\n\n[d]: http://www.diveintojavascript.com/core-javascript-reference/the-string-object\n\n\nAs name states this an extension for [Underscore.js][u], but it can be used\nindependently from **_s**-global variable. But with Underscore.js you can\nuse Object-Oriented style and chaining:\n\n[u]: http://documentcloud.github.com/underscore/\n\n```javascript\n_(\" epeli \").chain().trim().capitalize().value()\n=> \"Epeli\"\n```\n\n## Download ##\n\n * [Development version](https://raw.github.com/epeli/underscore.string/master/lib/underscore.string.js) *Uncompressed with Comments 18kb*\n * [Production version](https://github.com/epeli/underscore.string/raw/master/dist/underscore.string.min.js) *Minified 7kb*\n\n\n## Node.js installation ##\n\n**npm package**\n\n npm install underscore.string\n\n**Standalone usage**:\n\n```javascript\nvar _s = require('underscore.string');\n```\n\n**Integrate with Underscore.js**:\n\n```javascript\nvar _ = require('underscore');\n\n// Import Underscore.string to separate object, because there are conflict functions (include, reverse, contains)\n_.str = require('underscore.string');\n\n// Mix in non-conflict functions to Underscore namespace if you want\n_.mixin(_.str.exports());\n\n// All functions, include conflict, will be available through _.str object\n_.str.include('Underscore.string', 'string'); // => true\n```\n\n## String Functions ##\n\nFor availability of functions in this way you need to mix in Underscore.string functions:\n\n```javascript\n_.mixin(_.string.exports());\n```\n\notherwise functions from examples will be available through _.string or _.str objects:\n\n```javascript\n_.str.capitalize('epeli')\n=> \"Epeli\"\n```\n\n**capitalize** _.capitalize(string)\n\nConverts first letter of the string to uppercase.\n\n```javascript\n_.capitalize(\"foo Bar\")\n=> \"Foo Bar\"\n```\n\n**chop** _.chop(string, step)\n\n```javascript\n_.chop('whitespace', 3)\n=> ['whi','tes','pac','e']\n```\n\n**clean** _.clean(str)\n\nCompress some whitespaces to one.\n\n```javascript\n_.clean(\" foo bar \")\n=> 'foo bar'\n```\n\n**chars** _.chars(str)\n\n```javascript\n_.chars('Hello')\n=> ['H','e','l','l','o']\n```\n\n**includes** _.includes(string, substring)\n\nTests if string contains a substring.\n\n```javascript\n_.includes(\"foobar\", \"ob\")\n=> true\n```\n\n**include** available only through _.str object, because Underscore has function with the same name.\n\n```javascript\n_.str.include(\"foobar\", \"ob\")\n=> true\n```\n\n**includes** function was removed\n\nBut you can create it in this way, for compatibility with previous versions:\n\n```javascript\n_.includes = _.str.include\n```\n\n**count** _.count(string, substring)\n\n```javascript\n_('Hello world').count('l')\n=> 3\n```\n\n**escapeHTML** _.escapeHTML(string)\n\nConverts HTML special characters to their entity equivalents.\n\n```javascript\n_('
      Blah blah blah
      ').escapeHTML();\n=> '<div>Blah blah blah</div>'\n```\n\n**unescapeHTML** _.unescapeHTML(string)\n\nConverts entity characters to HTML equivalents.\n\n```javascript\n_('<div>Blah blah blah</div>').unescapeHTML();\n=> '
      Blah blah blah
      '\n```\n\n**insert** _.insert(string, index, substing)\n\n```javascript\n_('Hello ').insert(6, 'world')\n=> 'Hello world'\n```\n\n**isBlank** _.isBlank(string)\n\n```javascript\n_('').isBlank(); // => true\n_('\\n').isBlank(); // => true\n_(' ').isBlank(); // => true\n_('a').isBlank(); // => false\n```\n\n**join** _.join(separator, *strings)\n\nJoins strings together with given separator\n\n```javascript\n_.join(\" \", \"foo\", \"bar\")\n=> \"foo bar\"\n```\n\n**lines** _.lines(str)\n\n```javascript\n_.lines(\"Hello\\nWorld\")\n=> [\"Hello\", \"World\"]\n```\n\n**reverse** available only through _.str object, because Underscore has function with the same name.\n\nReturn reversed string:\n\n```javascript\n_.str.reverse(\"foobar\")\n=> 'raboof'\n```\n\n**splice** _.splice(string, index, howmany, substring)\n\nLike a array splice.\n\n```javascript\n_('https://edtsech@bitbucket.org/edtsech/underscore.strings').splice(30, 7, 'epeli')\n=> 'https://edtsech@bitbucket.org/epeli/underscore.strings'\n```\n\n**startsWith** _.startsWith(string, starts)\n\nThis method checks whether string starts with starts.\n\n```javascript\n_(\"image.gif\").startsWith(\"image\")\n=> true\n```\n\n**endsWith** _.endsWith(string, ends)\n\nThis method checks whether string ends with ends.\n\n```javascript\n_(\"image.gif\").endsWith(\"gif\")\n=> true\n```\n\n**succ** _.succ(str)\n\nReturns the successor to str.\n\n```javascript\n_('a').succ()\n=> 'b'\n\n_('A').succ()\n=> 'B'\n```\n\n**supplant**\n\nSupplant function was removed, use Underscore.js [template function][p].\n\n[p]: http://documentcloud.github.com/underscore/#template\n\n**strip** alias for *trim*\n\n**lstrip** alias for *ltrim*\n\n**rstrip** alias for *rtrim*\n\n**titleize** _.titleize(string)\n\n```javascript\n_('my name is epeli').titleize()\n=> 'My Name Is Epeli'\n```\n\n**camelize** _.camelize(string)\n\nConverts underscored or dasherized string to a camelized one\n\n```javascript\n_('-moz-transform').camelize()\n=> 'MozTransform'\n```\n\n**classify** _.classify(string)\n\nConverts string to camelized class name\n\n```javascript\n_('some_class_name').classify()\n=> 'SomeClassName'\n```\n\n**underscored** _.underscored(string)\n\nConverts a camelized or dasherized string into an underscored one\n\n```javascript\n_('MozTransform').underscored()\n=> 'moz_transform'\n```\n\n**dasherize** _.dasherize(string)\n\nConverts a underscored or camelized string into an dasherized one\n\n```javascript\n_('MozTransform').dasherize()\n=> '-moz-transform'\n```\n\n**humanize** _.humanize(string)\n\nConverts an underscored, camelized, or dasherized string into a humanized one.\nAlso removes beginning and ending whitespace, and removes the postfix '_id'.\n\n```javascript\n_(' capitalize dash-CamelCase_underscore trim ').humanize()\n=> 'Capitalize dash camel case underscore trim'\n```\n\n**trim** _.trim(string, [characters])\n\ntrims defined characters from begining and ending of the string.\nDefaults to whitespace characters.\n\n```javascript\n_.trim(\" foobar \")\n=> \"foobar\"\n\n_.trim(\"_-foobar-_\", \"_-\")\n=> \"foobar\"\n```\n\n\n**ltrim** _.ltrim(string, [characters])\n\nLeft trim. Similar to trim, but only for left side.\n\n\n**rtrim** _.rtrim(string, [characters])\n\nRight trim. Similar to trim, but only for right side.\n\n**truncate** _.truncate(string, length, truncateString)\n\n```javascript\n_('Hello world').truncate(5)\n=> 'Hello...'\n\n_('Hello').truncate(10)\n=> 'Hello'\n```\n\n**prune** _.prune(string, length, pruneString)\n\nElegant version of truncate.\nMakes sure the pruned string does not exceed the original length.\nAvoid half-chopped words when truncating.\n\n```javascript\n_('Hello, world').prune(5)\n=> 'Hello...'\n\n_('Hello, world').prune(8)\n=> 'Hello...'\n\n_('Hello, world').prune(5, ' (read a lot more)')\n=> 'Hello, world' (as adding \"(read a lot more)\" would be longer than the original string)\n\n_('Hello, cruel world').prune(15)\n=> 'Hello, cruel...'\n\n_('Hello').prune(10)\n=> 'Hello'\n```\n\n**words** _.words(str, delimiter=\" \")\n\nSplit string by delimiter (String or RegExp), ' ' by default.\n\n```javascript\n_.words(\"I love you\")\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\"I_love_you\", \"_\")\n=> [\"I\",\"love\",\"you\"]\n\n_.words(\"I-love-you\", /-/)\n=> [\"I\",\"love\",\"you\"]\n```\n\n**sprintf** _.sprintf(string format, *arguments)\n\nC like string formatting.\nCredits goes to [Alexandru Marasteanu][o].\nFor more detailed documentation, see the [original page][o].\n\n[o]: http://www.diveintojavascript.com/projects/sprintf-for-javascript\n\n```javascript\n_.sprintf(\"%.1f\", 1.17)\n\"1.2\"\n```\n\n**pad** _.pad(str, length, [padStr, type])\n\npads the `str` with characters until the total string length is equal to the passed `length` parameter. By default, pads on the **left** with the space char (`\" \"`). `padStr` is truncated to a single character if necessary.\n\n```javascript\n_.pad(\"1\", 8)\n-> \" 1\";\n\n_.pad(\"1\", 8, '0')\n-> \"00000001\";\n\n_.pad(\"1\", 8, '0', 'right')\n-> \"10000000\";\n\n_.pad(\"1\", 8, '0', 'both')\n-> \"00001000\";\n\n_.pad(\"1\", 8, 'bleepblorp', 'both')\n-> \"bbbb1bbb\";\n```\n\n**lpad** _.lpad(str, length, [padStr])\n\nleft-pad a string. Alias for `pad(str, length, padStr, 'left')`\n\n```javascript\n_.lpad(\"1\", 8, '0')\n-> \"00000001\";\n```\n\n**rpad** _.rpad(str, length, [padStr])\n\nright-pad a string. Alias for `pad(str, length, padStr, 'right')`\n\n```javascript\n_.rpad(\"1\", 8, '0')\n-> \"10000000\";\n```\n\n**lrpad** _.lrpad(str, length, [padStr])\n\nleft/right-pad a string. Alias for `pad(str, length, padStr, 'both')`\n\n```javascript\n_.lrpad(\"1\", 8, '0')\n-> \"00001000\";\n```\n\n**center** alias for **lrpad**\n\n**ljust** alias for *rpad*\n\n**rjust** alias for *lpad*\n\n**toNumber** _.toNumber(string, [decimals])\n\nParse string to number. Returns NaN if string can't be parsed to number.\n\n```javascript\n_('2.556').toNumber()\n=> 3\n\n_('2.556').toNumber(1)\n=> 2.6\n```\n\n**strRight** _.strRight(string, pattern)\n\nSearches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strRight('_')\n=> \"is_a_test_string\";\n```\n\n**strRightBack** _.strRightBack(string, pattern)\n\nSearches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the right of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strRightBack('_')\n=> \"string\";\n```\n\n**strLeft** _.strLeft(string, pattern)\n\nSearches a string from left to right for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strLeft('_')\n=> \"This\";\n```\n\n**strLeftBack** _.strLeftBack(string, pattern)\n\nSearches a string from right to left for a pattern and returns a substring consisting of the characters in the string that are to the left of the pattern or all string if no match found.\n\n```javascript\n_('This_is_a_test_string').strLeftBack('_')\n=> \"This_is_a_test\";\n```\n\n**stripTags**\n\nRemoves all html tags from string.\n\n```javascript\n_('a link').stripTags()\n=> 'a link'\n\n_('a link').stripTags()\n=> 'a linkalert(\"hello world!\")'\n```\n\n**toSentence** _.toSentence(array, [delimiter, lastDelimiter])\n\nJoin an array into a human readable sentence.\n\n```javascript\n_.toSentence(['jQuery', 'Mootools', 'Prototype'])\n=> 'jQuery, Mootools and Prototype';\n\n_.toSentence(['jQuery', 'Mootools', 'Prototype'], ', ', ' unt ')\n=> 'jQuery, Mootools unt Prototype';\n```\n\n**repeat** _.repeat(string, count, [separator])\n\nRepeats a string count times.\n\n```javascript\n_.repeat(\"foo\", 3)\n=> 'foofoofoo';\n\n_.repeat(\"foo\", 3, \"bar\")\n=> 'foobarfoobarfoo'\n```\n\n**slugify** _.slugify(string)\n\nTransform text into a URL slug. Replaces whitespaces, accentuated, and special characters with a dash.\n\n```javascript\n_.slugify(\"Un éléphant à l'orée du bois\")\n=> 'un-elephant-a-loree-du-bois';\n```\n\n***Caution: this function is charset dependent***\n\n## Roadmap ##\n\nAny suggestions or bug reports are welcome. Just email me or more preferably open an issue.\n\n## Changelog ##\n\n### 2.0.0 ###\n\n* Added prune, humanize functions\n* Added _.string (_.str) namespace for Underscore.string library\n* Removed includes function\n\n#### Problems\n\nWe lose two things for `include` and `reverse` methods from `_.string`:\n\n* Calls like `_('foobar').include('bar')` aren't available;\n* Chaining isn't available too.\n\nBut if you need this functionality you can create aliases for conflict functions which will be convenient for you:\n\n```javascript\n_.mixin({\n includeString: _.str.include,\n reverseString: _.str.reverse\n})\n\n// Now wrapper calls and chaining are available.\n_('foobar').chain().reverseString().includeString('rab').value()\n```\n\n#### Standalone Usage\n\nIf you are using Underscore.string without Underscore. You also have `_.string` namespace for it and `_.str` alias\nBut of course you can just reassign `_` variable with `_.string`\n\n```javascript\n_ = _.string\n```\n### 2.2.0 ###\n\n* Capitalize method behavior changed\n* Various perfomance tweaks\n\n### 2.1.1###\n\n* Fixed words method bug\n* Added classify method\n\n### 2.1.0 ###\n\n* AMD support\n* Added toSentence method\n* Added slugify method\n* Lots of speed optimizations\n\n### 2.0.0 ###\n\nFor upgrading to this version you need to mix in Underscore.string library to Underscore object:\n\n```javascript\n_.mixin(_.string.exports());\n```\n\nand all non-conflict Underscore.string functions will be available through Underscore object.\nAlso function `includes` has been removed, you should replace this function by `_.str.include`\nor create alias `_.includes = _.str.include` and all your code will work fine.\n\n### 1.1.6 ###\n\n* Fixed reverse and truncate\n* Added isBlank, stripTags, inlude(alias for includes)\n* Added uglifier compression\n\n### 1.1.5 ###\n\n* Added strRight, strRightBack, strLeft, strLeftBack\n\n### 1.1.4 ###\n\n* Added pad, lpad, rpad, lrpad methods and aliases center, ljust, rjust\n* Integration with Underscore 1.1.6\n\n### 1.1.3 ###\n\n* Added methods: underscored, camelize, dasherize\n* Support newer version of npm\n\n### 1.1.2 ###\n\n* Created functions: lines, chars, words functions\n\n### 1.0.2 ###\n\n* Created integration test suite with underscore.js 1.1.4 (now it's absolutely compatible)\n* Removed 'reverse' function, because this function override underscore.js 'reverse'\n\n## Contribute ##\n\n* Fork & pull request. Don't forget about tests.\n* If you planning add some feature please create issue before.\n\nOtherwise changes will be rejected.\n\n## Contributors list ##\n\n* Esa-Matti Suuronen (),\n* Edward Tsech ,\n* Sasha Koss (),\n* Vladimir Dronnikov ,\n* Pete Kruckenberg (),\n* Paul Chavard (),\n* Ed Finkler ()\n* Pavel Pravosud \n* Anton Lindqvist ()\n\n## Licence ##\n\nThe MIT License\n\nCopyright (c) 2011 Esa-Matti Suuronen esa-matti@suuronen.org\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n", - "readmeFilename": "README.markdown", "_id": "underscore.string@2.2.1", - "_from": "underscore.string@~2.2.1" + "dist": { + "shasum": "d7c0fa2af5d5a1a67f4253daee98132e733f0f19", + "tarball": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" + }, + "_from": "underscore.string@>=2.2.1 <2.3.0", + "_npmVersion": "1.2.32", + "_npmUser": { + "name": "epeli", + "email": "esa-matti@suuronen.org" + }, + "maintainers": [ + { + "name": "edtsech", + "email": "edtsech@gmail.com" + }, + { + "name": "rwz", + "email": "rwz@duckroll.ru" + }, + { + "name": "epeli", + "email": "esa-matti@suuronen.org" + } + ], + "_shasum": "d7c0fa2af5d5a1a67f4253daee98132e733f0f19", + "_resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/which/LICENSE b/node_modules/grunt/node_modules/which/LICENSE index 05a4010..19129e3 100644 --- a/node_modules/grunt/node_modules/which/LICENSE +++ b/node_modules/grunt/node_modules/which/LICENSE @@ -1,23 +1,15 @@ -Copyright 2009, 2010, 2011 Isaac Z. Schlueter. -All rights reserved. +The ISC 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: +Copyright (c) Isaac Z. Schlueter and Contributors -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. +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", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. +THE 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/grunt/node_modules/which/package.json b/node_modules/grunt/node_modules/which/package.json index de76ae3..c935af2 100644 --- a/node_modules/grunt/node_modules/which/package.json +++ b/node_modules/grunt/node_modules/which/package.json @@ -6,7 +6,7 @@ }, "name": "which", "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.", - "version": "1.0.5", + "version": "1.0.9", "repository": { "type": "git", "url": "git://github.com/isaacs/node-which.git" @@ -15,18 +15,33 @@ "bin": { "which": "./bin/which" }, - "engines": { - "node": "*" - }, - "dependencies": {}, - "devDependencies": {}, - "readme": "The \"which\" util from npm's guts.\n\nFinds the first instance of a specified executable in the PATH\nenvironment variable. Does not cache the results, so `hash -r` is not\nneeded when the PATH changes.\n", - "readmeFilename": "README.md", + "license": "ISC", + "gitHead": "df3d52a0ecd5f366d550e0f14d67ca4d5e621bad", "bugs": { "url": "https://github.com/isaacs/node-which/issues" }, "homepage": "https://github.com/isaacs/node-which", - "_id": "which@1.0.5", - "_from": "which@~1.0.5", - "scripts": {} + "_id": "which@1.0.9", + "scripts": {}, + "_shasum": "460c1da0f810103d0321a9b633af9e575e64486f", + "_from": "which@>=1.0.5 <1.1.0", + "_npmVersion": "2.6.0", + "_nodeVersion": "1.1.0", + "_npmUser": { + "name": "isaacs", + "email": "i@izs.me" + }, + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "dist": { + "shasum": "460c1da0f810103d0321a9b633af9e575e64486f", + "tarball": "http://registry.npmjs.org/which/-/which-1.0.9.tgz" + }, + "directories": {}, + "_resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/grunt/node_modules/which/which.js b/node_modules/grunt/node_modules/which/which.js index db7e8f7..2a45417 100644 --- a/node_modules/grunt/node_modules/which/which.js +++ b/node_modules/grunt/node_modules/which/which.js @@ -5,12 +5,7 @@ var path = require("path") , fs , COLON = process.platform === "win32" ? ";" : ":" , isExe - -try { - fs = require("graceful-fs") -} catch (ex) { - fs = require("fs") -} + , fs = require("fs") if (process.platform == "win32") { // On windows, there is no good way to check that a file is executable @@ -21,7 +16,9 @@ if (process.platform == "win32") { //console.error("isExe?", (mod & 0111).toString(8)) var ret = (mod & 0001) || (mod & 0010) && process.getgid && gid === process.getgid() + || (mod & 0010) && process.getuid && 0 === process.getuid() || (mod & 0100) && process.getuid && uid === process.getuid() + || (mod & 0100) && process.getuid && 0 === process.getuid() //console.error("isExe?", ret) return ret } diff --git a/node_modules/grunt/package.json b/node_modules/grunt/package.json index 62d409c..dd94eb6 100644 --- a/node_modules/grunt/package.json +++ b/node_modules/grunt/package.json @@ -77,10 +77,29 @@ "semver": "2.1.0", "shelljs": "~0.2.5" }, - "readme": "# Grunt: The JavaScript Task Runner\n\n[![Build Status: Linux](https://secure.travis-ci.org/gruntjs/grunt.png?branch=master)](http://travis-ci.org/gruntjs/grunt)\n\"Build\n[![Built with Grunt](https://cdn.gruntjs.com/builtwith.png)](http://gruntjs.com/)\n\n\n\n\n### Documentation\n\nVisit the [gruntjs.com](http://gruntjs.com/) website for all the things.\n\n### Support / Contributing\nBefore you make an issue, please read our [Contributing](http://gruntjs.com/contributing) guide.\n\nYou can find the grunt team in [#grunt on irc.freenode.net](http://webchat.freenode.net/?channels=grunt).\n\n### Release History\nSee the [CHANGELOG](CHANGELOG).\n", - "readmeFilename": "README.md", "_id": "grunt@0.4.5", + "dist": { + "shasum": "56937cd5194324adff6d207631832a9d6ba4e7f0", + "tarball": "http://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz" + }, + "_from": "grunt@>=0.4.0", + "_npmVersion": "1.4.4", + "_npmUser": { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + "maintainers": [ + { + "name": "cowboy", + "email": "cowboy@rj3.net" + }, + { + "name": "tkellen", + "email": "tyler@sleekcode.net" + } + ], + "directories": {}, "_shasum": "56937cd5194324adff6d207631832a9d6ba4e7f0", - "_from": "grunt@~0.4.2", - "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz" + "_resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "readme": "ERROR: No README data found!" } diff --git a/node_modules/uglify-save-license/package.json b/node_modules/uglify-save-license/package.json index 24a4fe5..9245644 100644 --- a/node_modules/uglify-save-license/package.json +++ b/node_modules/uglify-save-license/package.json @@ -49,7 +49,7 @@ }, "_id": "uglify-save-license@0.4.1", "_shasum": "95726c17cc6fd171c3617e3bf4d8d82aa8c4cce1", - "_from": "uglify-save-license@*", + "_from": "uglify-save-license@>=0.4.1 <0.5.0", "_npmVersion": "1.4.7", "_npmUser": { "name": "shinnn",