From f3d6378a28b70143ce62838ab46686c36c295c5e Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 25 Feb 2017 15:54:16 +0530 Subject: [PATCH 1/9] chore(package): update mocha-lcov-reporter to version 1.3.0 (#14) https://greenkeeper.io/ --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0fc9108..beb7427 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "cz-conventional-changelog": "^1.2.0", "istanbul": "^0.4.5", "mocha": "^3.2.0", - "mocha-lcov-reporter": "1.2.0", + "mocha-lcov-reporter": "1.3.0", "standard": "^8.6.0" }, "directories": { From 314c45c888165167c8e1eed7d3baadf43ab4271d Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Sat, 25 Feb 2017 15:54:22 +0530 Subject: [PATCH 2/9] chore(package): update cz-conventional-changelog to version 2.0.0 (#13) https://greenkeeper.io/ --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index beb7427..d159b66 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "co": "^4.6.0", "co-mocha": "^1.1.3", "coveralls": "^2.11.15", - "cz-conventional-changelog": "^1.2.0", + "cz-conventional-changelog": "^2.0.0", "istanbul": "^0.4.5", "mocha": "^3.2.0", "mocha-lcov-reporter": "1.3.0", From d4d726de3898d039d4a60c7200e301b8c39371bc Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 18:58:18 +0530 Subject: [PATCH 3/9] feat(*): rewrite for 4.0 --- .gitignore | 94 +- .npmignore | 12 + .../1091693139425e51bd0e4b440d0d3262.json | 1 + package-lock.json | 3997 +++++++++++++++++ package.json | 20 +- providers/ValidatorProvider.js | 56 +- src/ExtendedRules/index.js | 56 - src/Middleware/Validator.js | 209 + src/Validation/index.js | 129 + src/Validator/index.js | 57 +- src/Validator/schema.js | 90 - test/api.spec.js | 78 + test/validation.spec.js | 68 + test/validator-middleware.spec.js | 452 ++ test/validator.spec.js | 191 - 15 files changed, 5011 insertions(+), 499 deletions(-) create mode 100644 .npmignore create mode 100644 .nyc_output/1091693139425e51bd0e4b440d0d3262.json create mode 100644 package-lock.json delete mode 100644 src/ExtendedRules/index.js create mode 100644 src/Middleware/Validator.js create mode 100644 src/Validation/index.js delete mode 100644 src/Validator/schema.js create mode 100644 test/api.spec.js create mode 100644 test/validation.spec.js create mode 100644 test/validator-middleware.spec.js delete mode 100644 test/validator.spec.js diff --git a/.gitignore b/.gitignore index ca389a4..1d9d24f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,92 +1,8 @@ -# Created by https://www.gitignore.io - -### Node ### -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules - - -### OSX ### .DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - - -### SublimeText ### -# cache files for sublime text -*.tmlanguage.cache -*.tmPreferences.cache -*.stTheme.cache - -# workspace files are user-specific -*.sublime-workspace - -# project files should be checked into the repository, unless a significant -# proportion of contributors will probably not be using SublimeText -# *.sublime-project - -# sftp configuration file -sftp-config.json - - -### VirtualEnv ### -# Virtualenv -# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ -.Python -[Bb]in -[Ii]nclude -[Ll]ib -[Ss]cripts -pyvenv.cfg -pip-selfcheck.json - - -## nightwatch -reports -reports/* \ No newline at end of file +npm-debug.log +.idea +out +.nyc_output +test/tmp diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..225554a --- /dev/null +++ b/.npmignore @@ -0,0 +1,12 @@ +coverage +node_modules +.DS_Store +npm-debug.log +test +.travis.yml +.editorconfig +benchmarks +.idea +bin +out +.nyc_output diff --git a/.nyc_output/1091693139425e51bd0e4b440d0d3262.json b/.nyc_output/1091693139425e51bd0e4b440d0d3262.json new file mode 100644 index 0000000..9f36b8d --- /dev/null +++ b/.nyc_output/1091693139425e51bd0e4b440d0d3262.json @@ -0,0 +1 @@ +{"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validator/index.js":{"path":"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validator/index.js","statementMap":{"0":{"start":{"line":12,"column":19},"end":{"line":12,"column":40}},"1":{"start":{"line":13,"column":19},"end":{"line":13,"column":43}},"2":{"start":{"line":15,"column":0},"end":{"line":23,"column":1}},"3":{"start":{"line":16,"column":30},"end":{"line":16,"column":64}},"4":{"start":{"line":17,"column":27},"end":{"line":17,"column":58}},"5":{"start":{"line":18,"column":27},"end":{"line":18,"column":57}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":15},"end":{"line":16,"column":16}},"loc":{"start":{"line":16,"column":30},"end":{"line":16,"column":64}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":12},"end":{"line":17,"column":13}},"loc":{"start":{"line":17,"column":27},"end":{"line":17,"column":58}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":12},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":27},"end":{"line":18,"column":57}},"line":18}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":9,"5":1},"f":{"0":1,"1":9,"2":1},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"a85e8b474c1d51b04faf453e6946420491bbe49e","contentHash":"5237b8bdefa40b11363c3d23bb1683aa_11.1.0"},"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validation/index.js":{"path":"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validation/index.js","statementMap":{"0":{"start":{"line":12,"column":19},"end":{"line":12,"column":40}},"1":{"start":{"line":23,"column":4},"end":{"line":23,"column":21}},"2":{"start":{"line":24,"column":4},"end":{"line":24,"column":23}},"3":{"start":{"line":25,"column":4},"end":{"line":25,"column":34}},"4":{"start":{"line":26,"column":4},"end":{"line":26,"column":30}},"5":{"start":{"line":27,"column":4},"end":{"line":27,"column":26}},"6":{"start":{"line":42,"column":4},"end":{"line":45,"column":5}},"7":{"start":{"line":43,"column":6},"end":{"line":43,"column":34}},"8":{"start":{"line":44,"column":6},"end":{"line":44,"column":12}},"9":{"start":{"line":46,"column":4},"end":{"line":46,"column":16}},"10":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"11":{"start":{"line":63,"column":6},"end":{"line":63,"column":73}},"12":{"start":{"line":65,"column":4},"end":{"line":65,"column":25}},"13":{"start":{"line":76,"column":4},"end":{"line":81,"column":5}},"14":{"start":{"line":77,"column":6},"end":{"line":77,"column":28}},"15":{"start":{"line":78,"column":6},"end":{"line":78,"column":72}},"16":{"start":{"line":80,"column":6},"end":{"line":80,"column":28}},"17":{"start":{"line":82,"column":4},"end":{"line":82,"column":15}},"18":{"start":{"line":95,"column":4},"end":{"line":100,"column":5}},"19":{"start":{"line":96,"column":6},"end":{"line":96,"column":28}},"20":{"start":{"line":97,"column":6},"end":{"line":97,"column":75}},"21":{"start":{"line":99,"column":6},"end":{"line":99,"column":28}},"22":{"start":{"line":101,"column":4},"end":{"line":101,"column":15}},"23":{"start":{"line":113,"column":4},"end":{"line":113,"column":30}},"24":{"start":{"line":125,"column":4},"end":{"line":125,"column":28}},"25":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":2},"end":{"line":22,"column":3}},"loc":{"start":{"line":22,"column":38},"end":{"line":28,"column":3}},"line":22},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":2},"end":{"line":41,"column":3}},"loc":{"start":{"line":41,"column":22},"end":{"line":47,"column":3}},"line":41},"2":{"name":"(anonymous_2)","decl":{"start":{"line":57,"column":2},"end":{"line":57,"column":3}},"loc":{"start":{"line":57,"column":21},"end":{"line":66,"column":3}},"line":57},"3":{"name":"(anonymous_3)","decl":{"start":{"line":75,"column":2},"end":{"line":75,"column":3}},"loc":{"start":{"line":75,"column":15},"end":{"line":83,"column":3}},"line":75},"4":{"name":"(anonymous_4)","decl":{"start":{"line":94,"column":2},"end":{"line":94,"column":3}},"loc":{"start":{"line":94,"column":18},"end":{"line":102,"column":3}},"line":94},"5":{"name":"(anonymous_5)","decl":{"start":{"line":112,"column":2},"end":{"line":112,"column":3}},"loc":{"start":{"line":112,"column":14},"end":{"line":114,"column":3}},"line":112},"6":{"name":"(anonymous_6)","decl":{"start":{"line":124,"column":2},"end":{"line":124,"column":3}},"loc":{"start":{"line":124,"column":11},"end":{"line":126,"column":3}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":42,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":45,"column":5}},{"start":{"line":42,"column":4},"end":{"line":45,"column":5}}],"line":42},"1":{"loc":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},{"start":{"line":62,"column":4},"end":{"line":64,"column":5}}],"line":62}},"s":{"0":1,"1":15,"2":15,"3":15,"4":15,"5":15,"6":11,"7":10,"8":10,"9":1,"10":16,"11":1,"12":15,"13":14,"14":14,"15":13,"16":9,"17":13,"18":2,"19":2,"20":2,"21":2,"22":2,"23":18,"24":11,"25":1},"f":{"0":15,"1":11,"2":16,"3":14,"4":2,"5":18,"6":11},"b":{"0":[10,1],"1":[1,15]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"21a6402a4b34c0bfdc743d8cf5383ba6fab2b0c9","contentHash":"aca61afc38683d2051d38d5363e8f955_11.1.0"},"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Middleware/Validator.js":{"path":"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Middleware/Validator.js","statementMap":{"0":{"start":{"line":12,"column":21},"end":{"line":12,"column":46}},"1":{"start":{"line":41,"column":4},"end":{"line":41,"column":30}},"2":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"3":{"start":{"line":67,"column":6},"end":{"line":67,"column":17}},"4":{"start":{"line":77,"column":21},"end":{"line":79,"column":29}},"5":{"start":{"line":84,"column":23},"end":{"line":88,"column":5}},"6":{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},"7":{"start":{"line":94,"column":6},"end":{"line":94,"column":17}},"8":{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},"9":{"start":{"line":102,"column":6},"end":{"line":102,"column":58}},"10":{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},"11":{"start":{"line":111,"column":18},"end":{"line":111,"column":29}},"12":{"start":{"line":112,"column":4},"end":{"line":112,"column":42}},"13":{"start":{"line":113,"column":4},"end":{"line":113,"column":15}},"14":{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},"15":{"start":{"line":129,"column":6},"end":{"line":129,"column":17}},"16":{"start":{"line":131,"column":4},"end":{"line":131,"column":40}},"17":{"start":{"line":149,"column":4},"end":{"line":151,"column":5}},"18":{"start":{"line":150,"column":6},"end":{"line":150,"column":43}},"19":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"20":{"start":{"line":167,"column":6},"end":{"line":167,"column":122}},"21":{"start":{"line":169,"column":30},"end":{"line":169,"column":60}},"22":{"start":{"line":170,"column":4},"end":{"line":170,"column":31}},"23":{"start":{"line":181,"column":21},"end":{"line":181,"column":79}},"24":{"start":{"line":182,"column":4},"end":{"line":185,"column":5}},"25":{"start":{"line":183,"column":6},"end":{"line":183,"column":122}},"26":{"start":{"line":184,"column":6},"end":{"line":184,"column":12}},"27":{"start":{"line":196,"column":23},"end":{"line":196,"column":63}},"28":{"start":{"line":197,"column":4},"end":{"line":200,"column":5}},"29":{"start":{"line":198,"column":6},"end":{"line":198,"column":129}},"30":{"start":{"line":199,"column":6},"end":{"line":199,"column":12}},"31":{"start":{"line":205,"column":4},"end":{"line":205,"column":16}},"32":{"start":{"line":209,"column":0},"end":{"line":209,"column":36}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":40,"column":2},"end":{"line":40,"column":3}},"loc":{"start":{"line":40,"column":26},"end":{"line":42,"column":3}},"line":40},"1":{"name":"(anonymous_1)","decl":{"start":{"line":61,"column":2},"end":{"line":61,"column":3}},"loc":{"start":{"line":61,"column":53},"end":{"line":114,"column":3}},"line":61},"2":{"name":"(anonymous_2)","decl":{"start":{"line":127,"column":2},"end":{"line":127,"column":3}},"loc":{"start":{"line":127,"column":33},"end":{"line":132,"column":3}},"line":127},"3":{"name":"(anonymous_3)","decl":{"start":{"line":148,"column":2},"end":{"line":148,"column":3}},"loc":{"start":{"line":148,"column":48},"end":{"line":152,"column":3}},"line":148},"4":{"name":"(anonymous_4)","decl":{"start":{"line":165,"column":2},"end":{"line":165,"column":3}},"loc":{"start":{"line":165,"column":38},"end":{"line":206,"column":3}},"line":165}},"branchMap":{"0":{"loc":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},{"start":{"line":66,"column":4},"end":{"line":68,"column":5}}],"line":66},"1":{"loc":{"start":{"line":77,"column":21},"end":{"line":79,"column":29}},"type":"cond-expr","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":32}},{"start":{"line":79,"column":6},"end":{"line":79,"column":29}}],"line":77},"2":{"loc":{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},"type":"if","locations":[{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},{"start":{"line":93,"column":4},"end":{"line":95,"column":5}}],"line":93},"3":{"loc":{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},{"start":{"line":101,"column":4},"end":{"line":104,"column":5}}],"line":101},"4":{"loc":{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},"type":"if","locations":[{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},{"start":{"line":128,"column":4},"end":{"line":130,"column":5}}],"line":128},"5":{"loc":{"start":{"line":149,"column":4},"end":{"line":151,"column":5}},"type":"if","locations":[{"start":{"line":149,"column":4},"end":{"line":151,"column":5}},{"start":{"line":149,"column":4},"end":{"line":151,"column":5}}],"line":149},"6":{"loc":{"start":{"line":149,"column":8},"end":{"line":149,"column":87}},"type":"binary-expr","locations":[{"start":{"line":149,"column":9},"end":{"line":149,"column":35}},{"start":{"line":149,"column":39},"end":{"line":149,"column":64}},{"start":{"line":149,"column":69},"end":{"line":149,"column":87}}],"line":149},"7":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"8":{"loc":{"start":{"line":166,"column":8},"end":{"line":166,"column":39}},"type":"binary-expr","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":18}},{"start":{"line":166,"column":22},"end":{"line":166,"column":39}}],"line":166},"9":{"loc":{"start":{"line":182,"column":4},"end":{"line":185,"column":5}},"type":"if","locations":[{"start":{"line":182,"column":4},"end":{"line":185,"column":5}},{"start":{"line":182,"column":4},"end":{"line":185,"column":5}}],"line":182},"10":{"loc":{"start":{"line":197,"column":4},"end":{"line":200,"column":5}},"type":"if","locations":[{"start":{"line":197,"column":4},"end":{"line":200,"column":5}},{"start":{"line":197,"column":4},"end":{"line":200,"column":5}}],"line":197}},"s":{"0":1,"1":10,"2":9,"3":1,"4":8,"5":8,"6":8,"7":5,"8":3,"9":1,"10":1,"11":2,"12":2,"13":2,"14":6,"15":2,"16":4,"17":3,"18":3,"19":10,"20":1,"21":9,"22":9,"23":9,"24":7,"25":1,"26":1,"27":6,"28":5,"29":2,"30":2,"31":3,"32":1},"f":{"0":10,"1":9,"2":6,"3":3,"4":10},"b":{"0":[1,8],"1":[1,7],"2":[5,3],"3":[1,2],"4":[2,4],"5":[3,0],"6":[3,0,3],"7":[1,9],"8":[10,10],"9":[1,6],"10":[2,3]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"a6ed4e2ae04ec98fc6199d165de37fd14bae2cc4","contentHash":"25d4a6009a16d1c9df025e8706dbedb4_11.1.0"}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2792b9f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3997 @@ +{ + "name": "adonis-validation-provider", + "version": "3.0.5", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@adonisjs/fold": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@adonisjs/fold/-/fold-4.0.2.tgz", + "integrity": "sha512-0A7S2lMsTZ8JEV2yhAXYtPTTqGvwdRnBNCsR47+8Jl3b9FtQVIfKEsno//NQd3TNLCqeMfBB1fM+C6EdKiNSPQ==", + "dev": true, + "requires": { + "@adonisjs/generic-exceptions": "1.0.0", + "caller": "1.0.1", + "debug": "2.6.8", + "lodash": "4.17.4", + "require-stack": "1.0.2" + } + }, + "@adonisjs/generic-exceptions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@adonisjs/generic-exceptions/-/generic-exceptions-1.0.0.tgz", + "integrity": "sha512-Ll9uC1g6jg/P63A+8VkHdP8fUXIPqKxx38fW6W/ZfYawMkreQklQX19Kz3XodwDg32Leqv5DXUZ3JN4JG89vig==", + "dev": true, + "requires": { + "node-exceptions": "2.0.2", + "upcast": "1.0.4" + } + }, + "@adonisjs/sink": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@adonisjs/sink/-/sink-1.0.12.tgz", + "integrity": "sha512-gei5v1EHSV6e6hOcjwDizOKcH0K+jlUYTwnWRuRgLcatK+34joOaYoK0sqXjWmlmqC9guyPiVpWUhg7mKFoFhw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "acorn": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", + "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array.prototype.find": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.0.4.tgz", + "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.8.0" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/caller/-/caller-1.0.1.tgz", + "integrity": "sha1-uFGGD3Dhlds9J3OVqhp+I+ow7PU=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", + "dev": true + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "conventional-commit-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz", + "integrity": "sha1-XblXOdbCEqy+e29lahG5QLqmiUY=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", + "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=", + "dev": true, + "requires": { + "js-yaml": "3.6.1", + "lcov-parse": "0.0.10", + "log-driver": "1.2.5", + "minimist": "1.2.0", + "request": "2.79.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "cz-conventional-changelog": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-2.0.0.tgz", + "integrity": "sha1-Val5r9/pXnAkh50qD1kkYwFwtTM=", + "dev": true, + "requires": { + "conventional-commit-types": "2.2.0", + "lodash.map": "4.6.0", + "longest": "1.0.1", + "pad-right": "0.2.2", + "right-pad": "1.0.1", + "word-wrap": "1.2.3" + } + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.29" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "deglob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz", + "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=", + "dev": true, + "requires": { + "find-root": "1.1.0", + "glob": "7.1.2", + "ignore": "3.3.3", + "pkg-config": "1.1.1", + "run-parallel": "1.1.6", + "uniq": "1.0.1" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.0.tgz", + "integrity": "sha512-Cf9/h5MrXtExM20gSS55YFrGKCyPrRBjIVBtVyy8vmlsDfe0NPKMWj65tPLgzyfPuapWxh5whpXCtW4+AW5mRg==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.0", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.29", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.29.tgz", + "integrity": "sha512-KXla9NXo5sdaEkGSmbFPYgjH6m75kxsthL6GDRSug/Y2OiMoYm0I9giL39j4cgmaFmAbkIFJ6gG+SGKnLSmOvA==", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.29", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.29", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.29", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.29" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.29", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.8", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.0", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.3", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.6.1", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "dev": true + }, + "eslint-config-standard-jsx": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz", + "integrity": "sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw==", + "dev": true + }, + "eslint-import-resolver-node": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", + "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", + "dev": true, + "requires": { + "debug": "2.6.8", + "object-assign": "4.1.1", + "resolve": "1.4.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.8", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", + "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.8", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.2.3", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "pkg-up": "1.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz", + "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", + "dev": true, + "requires": { + "ignore": "3.3.3", + "minimatch": "3.0.4", + "object-assign": "4.1.1", + "resolve": "1.4.0", + "semver": "5.3.0" + } + }, + "eslint-plugin-promise": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", + "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", + "dev": true + }, + "eslint-plugin-react": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", + "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", + "dev": true, + "requires": { + "array.prototype.find": "2.0.4", + "doctrine": "1.5.0", + "has": "1.0.1", + "jsx-ast-utils": "1.4.1", + "object.assign": "4.0.4" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "espree": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.0.tgz", + "integrity": "sha1-mDWGJb3QVYYeon4oZ+pyn69GPY0=", + "dev": true, + "requires": { + "acorn": "5.1.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.29" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.2.2", + "object-assign": "4.1.1" + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.2.2.tgz", + "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.16" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.0", + "pinkie-promise": "2.0.1" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "haye": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/haye/-/haye-1.0.1.tgz", + "integrity": "sha1-pmH87i7kKXUCKmfn0JAD1bI/icw=", + "requires": { + "lodash": "4.17.4" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "ignore": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.3.tgz", + "integrity": "sha1-QyNS5XrM2HqzEQ6C0/6g5HgSFW0=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indicative": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/indicative/-/indicative-3.0.0.tgz", + "integrity": "sha512-hoDbXsURoQ9ZGNzFmbx0jGpIvtoGfWG48mBQ8FM/+2csmriBNBia9KrrTgopJYw7ctZNe9oLLPjKAw8qGO1pLA==", + "requires": { + "haye": "1.0.1", + "lodash": "4.17.4", + "moment": "2.18.1", + "p-settle": "2.0.0", + "pluralize": "6.0.0", + "pope": "1.0.2" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.1.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", + "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "japa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/japa/-/japa-1.0.4.tgz", + "integrity": "sha512-E8w9RITlOgPGnDPR4wSELdFVoivxnpZF4k/vzZhhgJQ7YghHG+buuBVFs9vGccU3FwZ6TfVxYLx2jVe7YAtNww==", + "dev": true, + "requires": { + "chai": "3.5.0", + "chalk": "1.1.3", + "ms": "0.7.3", + "retry": "0.10.1", + "right-pad": "1.0.1", + "variable-diff": "1.1.0" + }, + "dependencies": { + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true + } + } + }, + "japa-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/japa-cli/-/japa-cli-1.0.1.tgz", + "integrity": "sha1-CGcrxKIvh5IaWij54X+5N3OBcGA=", + "dev": true, + "requires": { + "colors": "1.1.2", + "commander": "2.11.0", + "globby": "6.1.0", + "left-pad": "1.1.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "jsx-ast-utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", + "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", + "dev": true + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "left-pad": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.1.3.tgz", + "integrity": "sha1-YS9hwDPzqeCOk58crr7qQbbzGZo=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "mime-db": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", + "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", + "dev": true + }, + "mime-types": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", + "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "dev": true, + "requires": { + "mime-db": "1.29.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "moment": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", + "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-exceptions": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-exceptions/-/node-exceptions-2.0.2.tgz", + "integrity": "sha512-nILccFLvnaOBoKZZtWfZipn/hlThZOT6UJOLX6SA3yLMYPcvLTIF26PXx73sPnAg45p05iYFYw2jvayNHz4rDA==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.1.0.tgz", + "integrity": "sha1-1rPF4WiSolr2MTi6SEZ2qooi7ac=", + "dev": true, + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.0", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.1.1", + "istanbul-lib-hook": "1.0.7", + "istanbul-lib-instrument": "1.7.4", + "istanbul-lib-report": "1.1.1", + "istanbul-lib-source-maps": "1.2.1", + "istanbul-reports": "1.1.1", + "md5-hex": "1.3.0", + "merge-source-map": "1.0.4", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.1", + "signal-exit": "3.0.2", + "spawn-wrap": "1.3.8", + "test-exclude": "4.1.1", + "yargs": "8.0.2", + "yargs-parser": "5.0.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.22.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.4", + "source-map": "0.5.6", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.23.0" + } + }, + "babel-runtime": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "2.4.1", + "regenerator-runtime": "0.10.5" + } + }, + "babel-template": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "lodash": "4.17.4" + } + }, + "babel-traverse": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "6.22.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.23.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "debug": "2.6.8", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.25.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "6.23.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.17.4", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.4.1", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "which": "1.2.14" + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "get-stream": "2.3.1", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "for-own": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "bundled": true, + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "bundled": true, + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.2", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "bundled": true, + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.7.4", + "bundled": true, + "dev": true, + "requires": { + "babel-generator": "6.25.0", + "babel-template": "6.25.0", + "babel-traverse": "6.25.0", + "babel-types": "6.25.0", + "babylon": "6.17.4", + "istanbul-lib-coverage": "1.1.1", + "semver": "5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "requires": { + "debug": "2.6.8", + "istanbul-lib-coverage": "1.1.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.1", + "source-map": "0.5.6" + } + }, + "istanbul-reports": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "requires": { + "handlebars": "4.0.10" + } + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "merge-source-map": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "requires": { + "source-map": "0.5.6" + } + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } + }, + "mimic-fn": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.3.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "execa": "0.5.1", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "preserve": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.10.5", + "bundled": true, + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "bundled": true, + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.5.6", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.3.8", + "bundled": true, + "dev": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.1", + "signal-exit": "3.0.2", + "which": "1.2.14" + } + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.2.14", + "bundled": true, + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "8.0.2", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.0.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.0", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "3.2.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "load-json-file": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "yargs-parser": { + "version": "7.0.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.0", + "object-keys": "1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "p-reflect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz", + "integrity": "sha1-9Poe4btUbY6z7AMhFI3+CnkTe7g=" + }, + "p-settle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-2.0.0.tgz", + "integrity": "sha1-ts2lq4bnFzY5FkkJtSatzEK4dzM=", + "requires": { + "p-reflect": "1.0.0" + } + }, + "pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", + "dev": true, + "requires": { + "repeat-string": "1.6.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-conf": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", + "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "load-json-file": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "requires": { + "debug-log": "1.0.1", + "find-root": "1.1.0", + "xtend": "4.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pkg-up": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", + "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-6.0.0.tgz", + "integrity": "sha1-2bUa+tl9PVEHXMHdupsTLKzMt7o=" + }, + "pope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pope/-/pope-1.0.2.tgz", + "integrity": "sha1-KSrtdioM189eDqVcI+5k6Zb7z3w=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.16", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, + "require-stack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/require-stack/-/require-stack-1.0.2.tgz", + "integrity": "sha1-4A7jSL+Wy1w+LUwntJ5BR24Ill0=", + "dev": true, + "requires": { + "syntax-error": "1.3.0" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "right-pad": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/right-pad/-/right-pad-1.0.1.tgz", + "integrity": "sha1-jKCMLLtbVedNr6lr9/0aJ9VoyNA=", + "dev": true + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "run-parallel": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.6.tgz", + "integrity": "sha1-KQA8miFj4B4tLfyQV18sbB1hoDk=", + "dev": true + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.3", + "rechoir": "0.6.2" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "standard": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.3.tgz", + "integrity": "sha512-JURZ+85ExKLQULckDFijdX5WHzN6RC7fgiZNSV4jFQVo+3tPoQGHyBrGekye/yf0aOfb4210EM5qPNlc2cRh4w==", + "dev": true, + "requires": { + "eslint": "3.19.0", + "eslint-config-standard": "10.2.1", + "eslint-config-standard-jsx": "4.0.2", + "eslint-plugin-import": "2.2.0", + "eslint-plugin-node": "4.2.3", + "eslint-plugin-promise": "3.5.0", + "eslint-plugin-react": "6.10.3", + "eslint-plugin-standard": "3.0.1", + "standard-engine": "7.0.0" + } + }, + "standard-engine": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz", + "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", + "dev": true, + "requires": { + "deglob": "2.1.0", + "get-stdin": "5.0.1", + "minimist": "1.2.0", + "pkg-conf": "2.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "syntax-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz", + "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "upcast": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/upcast/-/upcast-1.0.4.tgz", + "integrity": "sha1-3fi0wme26j81N+d+HGWUsv0epA8=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "variable-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/variable-diff/-/variable-diff-1.1.0.tgz", + "integrity": "sha1-0r1cZtt2wTh52W5qMG7cmJ35eNo=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "object-assign": "4.1.1" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/package.json b/package.json index d159b66..b5f373f 100644 --- a/package.json +++ b/package.json @@ -11,20 +11,18 @@ "author": "adonisjs", "license": "MIT", "dependencies": { - "indicative": "^2.2.1" + "indicative": "^3.0.0" }, "devDependencies": { - "adonis-fold": "^3.0.3", - "chai": "^3.5.0", - "clone": "^2.1.0", - "co": "^4.6.0", - "co-mocha": "^1.1.3", - "coveralls": "^2.11.15", + "@adonisjs/fold": "^4.0.2", + "@adonisjs/sink": "^1.0.12", + "clone": "^2.1.1", + "coveralls": "^2.13.1", "cz-conventional-changelog": "^2.0.0", - "istanbul": "^0.4.5", - "mocha": "^3.2.0", - "mocha-lcov-reporter": "1.3.0", - "standard": "^8.6.0" + "japa": "^1.0.4", + "japa-cli": "^1.0.1", + "nyc": "^11.1.0", + "standard": "^10.0.3" }, "directories": { "test": "test" diff --git a/providers/ValidatorProvider.js b/providers/ValidatorProvider.js index 4e40aaf..e057ac8 100644 --- a/providers/ValidatorProvider.js +++ b/providers/ValidatorProvider.js @@ -1,31 +1,45 @@ 'use strict' -/** - * adonis-validation-provider - * Copyright(c) 2015-2015 Harminder Virk - * MIT Licensed +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ -const ServiceProvider = require('adonis-fold').ServiceProvider -const ExtendedRules = require('../src/ExtendedRules') +const { ServiceProvider } = require('@adonisjs/fold') -class ValidatorProvider extends ServiceProvider { +class ValidationProvider extends ServiceProvider { + register () { + this.app.bind('Adonis/Addons/Validator', () => require('../src/Validator')) + this.app.alias('Adonis/Addons/Validator', 'Validator') + } + + boot () { + const Route = this.app.use('Adonis/Src/Route') + const Server = this.app.use('Adonis/Src/Server') + + /** + * Define a named middleware with server + * + * @type {String} + */ + Server.registerNamed({ + addonValidator: 'Adonis/Middleware/Validator' + }) - * register () { - this.app.singleton('Adonis/Addons/Validator', function (app) { - const validator = require('../src/Validator') - /** - * Wrap database unique rule inside a try/catch block - * incase someone is not using Lucid - */ - try { - const Database = app.use('Adonis/Src/Database') - const extendedRules = new ExtendedRules(Database) - validator.extend('unique', extendedRules.unique.bind(extendedRules), '{{field}} has already been taken by someone else') - } catch (e) {} - return validator + /** + * Extend route class by adding a macro, which pushes a + * middleware to the route middleware stack and + * validates the request via validator + * class + */ + Route.Route.macro('validator', function (validatorClass) { + this.middleware([`addonValidator:${validatorClass}`]) }) } } -module.exports = ValidatorProvider +module.exports = ValidationProvider diff --git a/src/ExtendedRules/index.js b/src/ExtendedRules/index.js deleted file mode 100644 index f6dfd64..0000000 --- a/src/ExtendedRules/index.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict' - -/** - * adonis-validation-provider - * - * (c) Harminder Virk - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. -*/ - -class ExtendedRules { - - constructor (Database) { - this.database = Database - } - - unique (data, field, message, args, get) { - return new Promise((resolve, reject) => { - const fieldValue = get(data, field) - - /** - * skip if value is empty, required validation will - * take care of empty values - */ - if (!fieldValue) { - return resolve('validation skipped') - } - - const tableName = args[0] - const databaseField = args[1] || field - const query = this.database.table(tableName).where(databaseField, fieldValue) - - /** - * if args[2] and args[3] are avaiable inside the array - * take them as whereNot key/valye pair - */ - if (args[2] && args[3]) { - query.whereNot(args[2], args[3]) - } - - query - .pluck(databaseField) - .then((result) => { - if (result && result.length) { - return reject(message) - } - resolve('validation passed') - }) - .catch(reject) - }) - } - -} - -module.exports = ExtendedRules diff --git a/src/Middleware/Validator.js b/src/Middleware/Validator.js new file mode 100644 index 0000000..2a88b81 --- /dev/null +++ b/src/Middleware/Validator.js @@ -0,0 +1,209 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const { resolver } = require('@adonisjs/fold') + +/** + * The middleware to validate requests using a custom + * validator. + * + * This middleware is wrapped inside `Route.validator()` method + * which automatically pushes this middleware in the route + * middleware stack + * + * @namespace Adonis/Middleware/ValidatorMiddleware + * + * @class ValidatorMiddleware + * @constructor + */ +class ValidatorMiddleware { + /* istanbul ignore next */ + /** + * IoC container injections + * + * @method inject + * + * @return {Array} + */ + static get inject () { + return ['Adonis/Addons/Validator'] + } + + constructor (Validator) { + this.Validator = Validator + } + + /** + * Runs validations on the current request data using + * the validator instance. + * + * @method _runValidations + * @async + * + * @param {Object} ctx + * @param {Object} validatorInstance + * + * @return {Boolean} + * + * @throws {ValidationException} If validation fails and there is no `fails` method + * on the validatorInstance + * + * @private + */ + async _runValidations (request, validatorInstance) { + /** + * Skip validation when there are no rules + * defined + */ + if (!validatorInstance.rules) { + return true + } + + /** + * The validation method to be used. If there is a + * property called `validateAll` on the validator + * instance, then validateAll otherwise not. + * + * @type {Function} + */ + const validate = validatorInstance.validateAll + ? this.Validator.validateAll + : this.Validator.validate + + /** + * Run validations + */ + const validation = await validate( + request.all(), + validatorInstance.rules, + validatorInstance.messages + ) + + /** + * Validation passed + */ + if (!validation.fails()) { + return true + } + + /** + * If validator has a method to handle messages, then + * call the method. + */ + if (typeof (validatorInstance.fails) === 'function') { + await validatorInstance.fails(validation.messages()) + return false + } + + /** + * Finally throw the validation messages + * + * @type {Error} + */ + const error = new Error() + error.messages = validation.messages() + throw error + } + + /** + * Calls the validator authorize method when it exists + * + * @method _authorize + * + * @param {Object} validatorInstance + * + * @return {Boolean} + * + * @private + */ + _authorize (validatorInstance) { + if (typeof (validatorInstance.authorize) !== 'function') { + return true + } + return validatorInstance.authorize() + } + + /** + * Ends the response when it's pending and the end-user + * has not made any response so far. + * + * @method _endResponseIfCan + * + * @param {Object} response + * @param {String} message + * @param {Number} status + * + * @return {void} + * + * @private + */ + _endResponseIfCan (response, message, status) { + if ((!response.lazyBody.content || !response.lazyBody.method) && response.isPending) { + response.status(status).send(message) + } + } + + /** + * Handle method executed by adonis middleware chain + * + * @method handle + * + * @param {Object} ctx + * @param {Function} next + * @param {Array} validator + * + * @return {void} + */ + async handle (ctx, next, validator) { + if (!validator || !validator.length) { + throw new Error('Cannot validate request without a validator. Make sure to call Route.validator(\'validatorPath\')') + } + const validatorInstance = resolver.resolve(validator[0]) + validatorInstance.ctx = ctx + + /** + * Validate the request. This method should handle the request + * response, since the middleware chain has been stopped. + * + * If this method doesn't handles the response, then a generic + * response is made + * + * @type {void} + */ + const validate = await this._runValidations(ctx.request, validatorInstance) + if (!validate) { + this._endResponseIfCan(ctx.response, 'Validation failed. Make sure to handle it inside validator.fails method', 400) + return + } + + /** + * Authorize the request. This method should return true to + * authorize the request. + * + * Make response or throw an exception to reject the request. + * + * Returning false from the method will result in a generic + * error message + */ + const authorized = await this._authorize(validatorInstance) + if (!authorized) { + this._endResponseIfCan(ctx.response, 'Unauthorized request. Make sure to handle it inside validator.authorize method', 401) + return + } + + /** + * All good, so continue + */ + await next() + } +} + +module.exports = ValidatorMiddleware diff --git a/src/Validation/index.js b/src/Validation/index.js new file mode 100644 index 0000000..d178447 --- /dev/null +++ b/src/Validation/index.js @@ -0,0 +1,129 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const indicative = require('indicative') + +/** + * Validation class to validate data with a rules + * schema. + * + * @class Validation + * @constructor + */ +class Validation { + constructor (data, rules, messages) { + this._data = data + this._rules = rules + this._messages = this.messages + this._errorMessages = null + this._executed = false + } + + /** + * Sets the error as a property on instance, if they + * are validation errors. Otherwise an exception + * is thrown + * + * @method _useErrors + * + * @param {Array} errors + * + * @return {void} + */ + _useErrors (errors) { + if (errors instanceof Array === true) { + this._errorMessages = errors + return + } + throw errors + } + + /** + * Marks the validation as executed, also makes sure + * that not re-executing the validations + * + * @method _markAsExecuted + * + * @return {void} + */ + _markAsExecuted () { + /** + * Throw exception when re-running the validation for + * multiple times + */ + if (this._executed) { + throw new Error('Cannot re-run validations on same data and rules') + } + this._executed = true + } + + /** + * Run validation on data using defined rules + * + * @method run + * + * @return {this} + */ + async run () { + try { + this._markAsExecuted() + await indicative.validate(this._data, this._rules, this._messages) + } catch (error) { + this._useErrors(error) + } + return this + } + + /** + * Run all validations, regardless of failures. The `run` + * method on the opposite side stops at the first + * validation + * + * @method runAll + * + * @return {this} + */ + async runAll () { + try { + this._markAsExecuted() + await indicative.validateAll(this._data, this._rules, this._messages) + } catch (error) { + this._useErrors(error) + } + return this + } + + /** + * Returns an array of validation messages + * or null, if there are no errors + * + * @method messages + * + * @return {Array|Null} + */ + messages () { + return this._errorMessages + } + + /** + * Returns a boolean indicating if there are + * validation errors + * + * @method fails + * + * @return {Boolean} + */ + fails () { + return !!this.messages() + } +} + +module.exports = Validation diff --git a/src/Validator/index.js b/src/Validator/index.js index 09beaac..3d22ccb 100644 --- a/src/Validator/index.js +++ b/src/Validator/index.js @@ -1,48 +1,23 @@ 'use strict' -/** - * adonis-validation-provider - * Copyright(c) 2015-2015 Harminder Virk - * MIT Licensed +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. */ const indicative = require('indicative') -const Validator = exports = module.exports = {} -const SchemaValidator = require('./schema') +const Validation = require('../Validation') -/** - * assigning indicative methods to the Validator - * object. - */ -Validator.extend = indicative.extend -Validator.sanitize = indicative.sanitize -Validator.sanitizor = indicative.sanitizor -Validator.is = indicative.is - -/** - * @description returns a new instance of schema validator class - * and calls its validate method - * @method validate - * @param {Object} data - * @param {Object} rules - * @param {Object} messages - * @return {Object} - * @public - */ -Validator.validate = function (data, rules, messages) { - return new SchemaValidator().validate(data, rules, messages) -} - -/** - * @description returns a new instance of schema validator class - * and calls its validateAll method - * @method validateAll - * @param {Object} data - * @param {Object} rules - * @param {Object} messages - * @return {Object} - * @public - */ -Validator.validateAll = function (data, rules, messages) { - return new SchemaValidator().validateAll(data, rules, messages) +module.exports = { + validateAll: (...params) => new Validation(...params).runAll(), + validate: (...params) => new Validation(...params).run(), + sanitize: (...params) => indicative.sanitize(...params), + rule: indicative.rule, + is: indicative.is, + sanitizor: indicative.sanitizor, + extend: indicative.extend } diff --git a/src/Validator/schema.js b/src/Validator/schema.js deleted file mode 100644 index 900c433..0000000 --- a/src/Validator/schema.js +++ /dev/null @@ -1,90 +0,0 @@ -'use strict' - -/** - * adonis-validation-provider - * Copyright(c) 2015-2015 Harminder Virk - * MIT Licensed -*/ - -const Indicative = require('indicative') - -class SchemaValidator { - - constructor () { - this.errors = [] - } - - /** - * @description validate schema using indicative validate - * and returns on first error - * @method validate - * @param {Object} data - * @param {Object} rules - * @param {Object} messages - * @return {Promise} - * @public - */ - validate (data, rules, messages) { - let self = this - return new Promise(function (resolve, reject) { - Indicative - .validate(data, rules, messages) - .then(function (success) { - self.errors = [] - resolve(self) - }) - .catch(function (error) { - self.errors = error - resolve(self) - }) - }) - } - - /** - * @description validate schema using indicative validate - * @method validateAll - * @param {Object} data - * @param {Object} rules - * @param {Object} messages - * @return {Promise} - * @public - */ - validateAll (data, rules, messages) { - let self = this - return new Promise(function (resolve, reject) { - Indicative - .validateAll(data, rules, messages) - .then(function (success) { - self.errors = [] - resolve(self) - }) - .catch(function (error) { - self.errors = error - resolve(self) - }) - }) - } - - /** - * @description tells whether there was an error using validate method - * or not - * @method fails - * @return {Boolean} - * @public - */ - fails () { - return !!this.errors.length - } - - /** - * @description returns error messages - * @method messages - * @return {Array} - * @public - */ - messages () { - return this.errors - } -} - -module.exports = SchemaValidator diff --git a/test/api.spec.js b/test/api.spec.js new file mode 100644 index 0000000..fb58010 --- /dev/null +++ b/test/api.spec.js @@ -0,0 +1,78 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const test = require('japa') +const Validator = require('../src/Validator') + +test.group('Validator', () => { + test('sanitize data', (assert) => { + const { sanitize } = Validator + const data = { + email: 'foo+9@gmail.com' + } + + const rules = { + email: 'normalize_email' + } + + assert.deepEqual(sanitize(data, rules), { + email: 'foo@gmail.com' + }) + }) + + test('define rule via rule method', async (assert) => { + const { validate, rule } = Validator + const rules = { + email: [rule('required')] + } + + const validation = await validate({}, rules) + assert.isTrue(validation.fails()) + assert.deepEqual(validation.messages(), [{ + field: 'email', + message: 'required validation failed on email', + validation: 'required' + }]) + }) + + test('use raw validator', async (assert) => { + const { is } = Validator + assert.isFalse(is.email('foo')) + }) + + test('use raw sanitizor', async (assert) => { + const { sanitizor } = Validator + assert.equal(sanitizor.normalizeEmail('foo+9@gmail.com'), 'foo@gmail.com') + }) + + test('add validation rules', async (assert) => { + const { extend, validate } = Validator + extend('foo', function () { + return new Promise((resolve, reject) => { + /* eslint-disable */ + reject('foo rejected') + /* eslint-enable */ + }) + }) + + const rules = { + email: 'foo' + } + + const validation = await validate({}, rules) + assert.isTrue(validation.fails()) + assert.deepEqual(validation.messages(), [{ + field: 'email', + validation: 'foo', + message: 'foo rejected' + }]) + }) +}) diff --git a/test/validation.spec.js b/test/validation.spec.js new file mode 100644 index 0000000..d78d945 --- /dev/null +++ b/test/validation.spec.js @@ -0,0 +1,68 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const test = require('japa') +const Validation = require('../src/Validation') + +test.group('Validation', () => { + test('do not throw on validation errors', async (assert) => { + const validation = new Validation({ email: '' }, { email: 'required' }) + await validation.run() + assert.isArray(validation._errorMessages) + }) + + test('return true from fails when there are validation errors', async (assert) => { + const validation = new Validation({ email: '' }, { email: 'required' }) + await validation.run() + assert.isTrue(validation.fails()) + }) + + test('return array of error message', async (assert) => { + const validation = new Validation({ email: '' }, { email: 'required' }) + await validation.run() + assert.deepEqual(validation.messages(), [{ + field: 'email', + validation: 'required', + message: 'required validation failed on email' + }]) + }) + + test('throw exception when trying to rerun validation multiple times', async (assert) => { + assert.plan(1) + + const validation = new Validation({ email: '' }, { email: 'required' }) + await validation.run() + try { + await validation.run() + } catch ({ message }) { + assert.equal(message, 'Cannot re-run validations on same data and rules') + } + }) + + test('run all validations', async (assert) => { + assert.plan(1) + + const validation = new Validation({ email: '' }, { email: 'required', age: 'required' }) + await validation.runAll() + assert.deepEqual(validation.messages(), [ + { + field: 'email', + validation: 'required', + message: 'required validation failed on email' + }, + { + field: 'age', + validation: 'required', + message: 'required validation failed on age' + } + ]) + }) +}) diff --git a/test/validator-middleware.spec.js b/test/validator-middleware.spec.js new file mode 100644 index 0000000..fadce03 --- /dev/null +++ b/test/validator-middleware.spec.js @@ -0,0 +1,452 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const test = require('japa') +const { setupResolver } = require('@adonisjs/sink') +const { ioc } = require('@adonisjs/fold') +const ValidatorMiddleware = require('../src/Middleware/Validator') +const Validator = require('../src/Validator') + +test.group('Validator Middleware', (group) => { + group.before(() => { + setupResolver() + }) + + group.beforeEach(() => { + ioc.restore() + }) + + test('skip validation when there are no rules', async (assert) => { + const request = {} + const next = function () {} + + const middleware = new ValidatorMiddleware(Validator) + class UserValidator {} + + ioc.fake('App/Validators/User', () => new UserValidator()) + await middleware.handle({ request }, next, ['App/Validators/User']) + }) + + test('throw validation exception when there are rules', async (assert) => { + assert.plan(1) + + const request = { + all () { + return {} + } + } + const next = function () {} + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + + try { + await middleware.handle({ request }, next, ['App/Validators/User']) + } catch (error) { + assert.deepEqual(error.messages, [{ + field: 'email', + validation: 'required', + message: 'required validation failed on email' + }]) + } + }) + + test('call validateAll when validator instructs for it', async (assert) => { + assert.plan(1) + + const request = { + all () { + return {} + } + } + const next = function () {} + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required', + age: 'required' + } + } + + get validateAll () { + return true + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + + try { + await middleware.handle({ request }, next, ['App/Validators/User']) + } catch (error) { + assert.deepEqual(error.messages, [ + { + field: 'email', + validation: 'required', + message: 'required validation failed on email' + }, + { + field: 'age', + validation: 'required', + message: 'required validation failed on age' + } + ]) + } + }) + + test('do not throw exception when fails method is there', async (assert) => { + assert.plan(2) + + const request = { + all () { + return {} + } + } + + const response = { + lazyBody: { + content: null, + method: null + }, + isPending () { + return !!this.lazyBody.content + }, + status (status) { + this._status = status + return this + }, + send (content) { + this.lazyBody.content = content + this.lazyBody.method = 'send' + return this + } + } + + const next = function () {} + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + + fails (messages) { + assert.deepEqual(messages, [{ + field: 'email', + validation: 'required', + message: 'required validation failed on email' + }]) + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + await middleware.handle({ request, response }, next, ['App/Validators/User']) + assert.deepEqual(response.lazyBody, { + content: 'Validation failed. Make sure to handle it inside validator.fails method', + method: 'send' + }) + }) + + test('all authorize when validation passes', async (assert) => { + let authorizedCalled = false + + const request = { + all () { + return { + email: 'foo@bar.com' + } + } + } + + const response = { + lazyBody: { + content: null, + method: null + }, + isPending () { + return !!this.lazyBody.content + }, + status (status) { + this._status = status + return this + }, + send (content) { + this.lazyBody.content = content + this.lazyBody.method = 'send' + return this + } + } + + const next = function () {} + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + + authorize () { + authorizedCalled = true + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + await middleware.handle({ request, response }, next, ['App/Validators/User']) + assert.isTrue(authorizedCalled) + }) + + test('call next when there is no authorize method and validation passes', async (assert) => { + let authorizedCalled = false + let nextCalled = false + + const request = { + all () { + return { + email: 'foo@bar.com' + } + } + } + + const response = { + lazyBody: { + content: null, + method: null + }, + isPending () { + return !!this.lazyBody.content + }, + status (status) { + this._status = status + return this + }, + send (content) { + this.lazyBody.content = content + this.lazyBody.method = 'send' + return this + } + } + + const next = function () { + nextCalled = true + } + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + await middleware.handle({ request, response }, next, ['App/Validators/User']) + assert.isTrue(nextCalled) + assert.isFalse(authorizedCalled) + }) + + test('call next when authorize returns true', async (assert) => { + let authorizedCalled = false + let nextCalled = false + + const request = { + all () { + return { + email: 'foo@bar.com' + } + } + } + + const response = { + lazyBody: { + content: null, + method: null + }, + isPending () { + return !!this.lazyBody.content + }, + status (status) { + this._status = status + return this + }, + send (content) { + this.lazyBody.content = content + this.lazyBody.method = 'send' + return this + } + } + + const next = function () { + nextCalled = true + } + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + + authorize () { + authorizedCalled = true + return true + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + await middleware.handle({ request, response }, next, ['App/Validators/User']) + assert.isTrue(nextCalled) + assert.isTrue(authorizedCalled) + }) + + test('throw exception thrown by authorize called', async (assert) => { + assert.plan(2) + let nextCalled = false + + const request = { + all () { + return { + email: 'foo@bar.com' + } + } + } + + const response = { + lazyBody: { + content: null, + method: null + }, + isPending () { + return !!this.lazyBody.content + }, + status (status) { + this._status = status + return this + }, + send (content) { + this.lazyBody.content = content + this.lazyBody.method = 'send' + return this + } + } + + const next = function () { + nextCalled = true + } + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + + authorize () { + throw new Error('Not allowed') + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + try { + await middleware.handle({ request, response }, next, ['App/Validators/User']) + } catch ({ message }) { + assert.isFalse(nextCalled) + assert.equal(message, 'Not allowed') + } + }) + + test('make generic response when authorize returns false when leaves the request hanging', async (assert) => { + assert.plan(2) + let nextCalled = false + + const request = { + all () { + return { + email: 'foo@bar.com' + } + } + } + + const response = { + lazyBody: { + content: null, + method: null + }, + isPending () { + return !!this.lazyBody.content + }, + status (status) { + this._status = status + return this + }, + send (content) { + this.lazyBody.content = content + this.lazyBody.method = 'send' + return this + } + } + + const next = function () { + nextCalled = true + } + + const middleware = new ValidatorMiddleware(Validator) + + class UserValidator { + get rules () { + return { + email: 'required' + } + } + + authorize () { + return false + } + } + + ioc.fake('App/Validators/User', () => new UserValidator()) + await middleware.handle({ request, response }, next, ['App/Validators/User']) + assert.isFalse(nextCalled) + assert.equal(response.lazyBody.content, 'Unauthorized request. Make sure to handle it inside validator.authorize method') + }) + + test('throw exception when validator is missing', async (assert) => { + assert.plan(1) + const middleware = new ValidatorMiddleware(Validator) + try { + await middleware.handle({}, function () {}, []) + } catch ({ message }) { + assert.equal(message, `Cannot validate request without a validator. Make sure to call Route.validator('validatorPath')`) + } + }) +}) diff --git a/test/validator.spec.js b/test/validator.spec.js deleted file mode 100644 index 64267a3..0000000 --- a/test/validator.spec.js +++ /dev/null @@ -1,191 +0,0 @@ -'use strict' - -/* global describe,it */ - -/** - * adonis-validation-provider - * Copyright(c) 2015-2015 Harminder Virk - * MIT Licensed -*/ - -const Validator = require('../src/Validator') -const ExtendedRules = require('../src/ExtendedRules') -const chai = require('chai') -const clone = require('clone') -const expect = chai.expect -require('co-mocha') -const Database = { - whereNotCalled: false, - table: function (table) { - return this - }, - pluck: function (field) { - return new Promise((resolve, reject) => { - if (this.whereNotCalled) { - resolve() - } else { - resolve(['ssksk@gmail.com']) - } - }) - }, - where: function (field, value) { - return this - }, - - whereNot: function () { - this.whereNotCalled = true - return this - } -} - -describe('Validator', function () { - it('should validate data schema and return appropriate errors', function * () { - let rules = { - username: 'required' - } - let data = {} - const validate = yield Validator.validate(data, rules) - expect(validate.fails()).to.equal(true) - expect(validate.messages()[0].validation).to.equal('required') - }) - - it('should not return previous errors when validation is passed next time', function * () { - let rules = { - username: 'required' - } - let data = { - username: 'boom' - } - const validate = yield Validator.validate(data, rules) - expect(validate.fails()).to.equal(false) - }) - - it('should return all errors at once , when using validateAll', function * () { - let rules = { - username: 'required', - email: 'required' - } - - let data = { - } - - const validate = yield Validator.validateAll(data, rules) - const messages = validate.messages() - let fields = [] - expect(validate.fails()).to.equal(true) - expect(messages).to.have.length(2) - - messages.forEach(function (message) { - fields.push(message.field) - }) - expect(fields).deep.equal(['username', 'email']) - }) - - it('should return errors to false, when data satisfy rules using validateAll', function * () { - let rules = { - username: 'required', - email: 'required' - } - - let data = { - username: 'bar', - email: 'foo' - } - const validate = yield Validator.validateAll(data, rules) - expect(validate.fails()).to.equal(false) - }) - - it('should extend indicative using extend method', function * () { - var nums = function (data, field, message, args) { - return new Promise(function (resolve, reject) { - if (!data[field]) { - resolve() - return - } - if (typeof (data[field]) === 'number') { - resolve() - return - } - reject(message) - }) - } - - Validator.extend('nums', nums, 'Enter a valid number') - const rules = { - age: 'required|nums' - } - const data = { - age: '20' - } - const validate = yield Validator.validate(data, rules) - expect(validate.fails()).to.equal(true) - expect(validate.messages()[0].message).to.equal('Enter a valid number') - }) - - it('should be able to call raw validations using is method', function () { - const isArray = Validator.is.array - expect(typeof (isArray)).to.equal('function') - }) - - it('should be able to extend raw validations', function () { - Validator.is.extend('fooBar', function () {}) - const isFooBar = Validator.is.fooBar - expect(typeof (isFooBar)).to.equal('function') - }) - - it('should be able to call sanitize method', function () { - const sanitize = Validator.sanitize - expect(typeof (sanitize)).to.equal('function') - }) - - it('should be able to access raw sanitizor', function () { - const title = Validator.sanitizor.title('hello-world') - expect(title).to.equal('Hello World') - }) - - it('should throw an error when field already exists', function * () { - const extendedRules = new ExtendedRules(Database) - Validator.extend('unique', extendedRules.unique.bind(extendedRules), '{{field}} has already been taken by someone else') - const rules = { - email: 'unique:users' - } - const data = { - email: 'sdjsajkdaksj@gmail.com' - } - const validate = yield Validator.validate(data, rules) - expect(validate.fails()).to.equal(true) - expect(validate.messages()[0].message).to.equal('email has already been taken by someone else') - }) - - it('should work fine when field does not exists', function * () { - const DbClone = clone(Database) - DbClone.pluck = function () { - return new Promise((resolve) => { - resolve() - }) - } - const extendedRules = new ExtendedRules(DbClone) - Validator.extend('unique', extendedRules.unique.bind(extendedRules), '{{field}} has already been taken by someone else') - const rules = { - email: 'unique:users' - } - const data = { - email: 'sdjsajkdaksj@gmail.com' - } - const validate = yield Validator.validate(data, rules) - expect(validate.fails()).to.equal(false) - }) - - it('should pass validation when whereNot key/value pairs are availabe', function * () { - const extendedRules = new ExtendedRules(Database) - Validator.extend('unique', extendedRules.unique.bind(extendedRules), '{{field}} has already been taken by someone else') - const rules = { - email: 'unique:users,email,id,1' - } - const data = { - email: 'sdjsajkdaksj@gmail.com' - } - const validate = yield Validator.validate(data, rules) - expect(validate.fails()).to.equal(false) - }) -}) From 10bf456c7c49d2ca65d9b5bb702ffbaee7c733d8 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 19:33:38 +0530 Subject: [PATCH 4/9] chore(package): update scripts and package name --- .coveralls.yml | 0 .travis.yml | 13 ++----------- appveyor.yml | 22 ++++++++++++++++++++++ bin/index.js | 40 ++++++++++++++++++++++++++++++++++++++++ package.json | 14 +++++++++----- 5 files changed, 73 insertions(+), 16 deletions(-) delete mode 100644 .coveralls.yml create mode 100644 appveyor.yml create mode 100644 bin/index.js diff --git a/.coveralls.yml b/.coveralls.yml deleted file mode 100644 index e69de29..0000000 diff --git a/.travis.yml b/.travis.yml index a950fc9..9d4fb63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,19 +1,10 @@ language: node_js -env: - - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 node_js: - node -- 5.3.0 -- 4.0.0 +- 7.0.0 sudo: false install: -- npm install --no-optional +- npm install notifications: slack: secure: m91zkX2cLVDRDMBAUnR1d+hbZqtSHXLkuPencHadhJ3C3wm53Box8U25co/goAmjnW5HNJ1SMSIg+DojtgDhqTbReSh5gSbU0uU8YaF8smbvmUv3b2Q8PRCA7f6hQiea+a8+jAb7BOvwh66dV4Al/1DJ2b4tCjPuVuxQ96Wll7Pnj1S7yW/Hb8fQlr9wc+INXUZOe8erFin+508r5h1L4Xv0N5ZmNw+Gqvn2kPJD8f/YBPpx0AeZdDssTL0IOcol1+cDtDzMw5PAkGnqwamtxhnsw+i8OW4avFt1GrRNlz3eci5Cb3NQGjHxJf+JIALvBeSqkOEFJIFGqwAXMctJ9q8/7XyXk7jVFUg5+0Z74HIkBwdtLwi/BTyXMZAgsnDjndmR9HsuBP7OSTJF5/V7HCJZAaO9shEgS8DwR78owv9Fr5er5m9IMI+EgSH3qtb8iuuQaPtflbk+cPD3nmYbDqmPwkSCXcXRfq3IxdcV9hkiaAw52AIqqhnAXJWZfL6+Ct32i2mtSaov9FYtp/G0xb4tjrUAsDUd/AGmMJNEBVoHtP7mKjrVQ35cEtFwJr/8SmZxGvOaJXPaLs43dhXKa2tAGl11wF02d+Rz1HhbOoq9pJvJuqkLAVvRdBHUJrB4/hnTta5B0W5pe3mIgLw3AmOpk+s/H4hAP4Hp0gOWlPA= diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..c0f2fec --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,22 @@ +environment: + matrix: + - nodejs_version: 'Stable' + - nodejs_version: '7' + +init: + git config --global core.autocrlf true + +install: + - ps: Install-Product node $env:nodejs_version + - npm install + +test_script: + - node --version + - npm --version + - npm run test:win + +build: off +clone_depth: 1 + +matrix: + fast_finish: true diff --git a/bin/index.js b/bin/index.js new file mode 100644 index 0000000..b53ef79 --- /dev/null +++ b/bin/index.js @@ -0,0 +1,40 @@ +'use strict' + +/* + * adonis-framework + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const semver = require('semver') +const { spawn } = require('child_process') +const spawnArgs = [] + +if (semver.lt(process.version, '8.0.0')) { + spawnArgs.push('--harmony-async-await') +} + +function local () { + spawnArgs.push('./node_modules/.bin/japa') + const tests = spawn('node', spawnArgs) + tests.stdout.on('data', (data) => process.stdout.write(data)) + tests.stderr.on('data', (data) => process.stderr.write(data)) + tests.on('close', (code) => process.exit(code)) +} + +function win () { + spawnArgs.push('./node_modules/japa-cli/index.js') + const tests = spawn('node', spawnArgs) + tests.stdout.on('data', (data) => process.stdout.write(data)) + tests.stderr.on('data', (data) => process.stderr.write(data)) + tests.on('close', (code) => process.exit(code)) +} + +if (process.argv.indexOf('--local') > -1) { + local() +} else if (process.argv.indexOf('--win') > -1) { + win() +} diff --git a/package.json b/package.json index b5f373f..29efc28 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,18 @@ { - "name": "adonis-validation-provider", + "name": "@adonisjs/validator", "version": "3.0.5", "description": "Validator for adonis framework", "main": "index.js", "scripts": { - "test": "npm run lint && istanbul cover _mocha --report lcovonly -- -R spec test && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage", - "coverage": "istanbul cover ./node_modules/.bin/_mocha test", - "lint": "standard src/**/*.js providers/*.js test/*.js" + "lint": "standard", + "pretest": "npm run lint", + "posttest": "npm run coverage", + "test:local": "FORCE_COLOR=true node bin/index.js --local", + "test": "nyc npm run test:local", + "test:win": "set FORCE_COLOR=true && node bin/index.js --win", + "coverage": "nyc report --reporter=text-lcov | coveralls" }, - "author": "adonisjs", + "author": "virk", "license": "MIT", "dependencies": { "indicative": "^3.0.0" From da04ae6048ac58699b6010794ff2b462e49ff13b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 19:59:52 +0530 Subject: [PATCH 5/9] feat(exceptions): add custom exception --- .../1091693139425e51bd0e4b440d0d3262.json | 1 - package-lock.json | 9 +++---- package.json | 4 +++ src/Exceptions/index.js | 27 +++++++++++++++++++ src/Middleware/Validator.js | 16 +++++++---- 5 files changed, 45 insertions(+), 12 deletions(-) delete mode 100644 .nyc_output/1091693139425e51bd0e4b440d0d3262.json create mode 100644 src/Exceptions/index.js diff --git a/.nyc_output/1091693139425e51bd0e4b440d0d3262.json b/.nyc_output/1091693139425e51bd0e4b440d0d3262.json deleted file mode 100644 index 9f36b8d..0000000 --- a/.nyc_output/1091693139425e51bd0e4b440d0d3262.json +++ /dev/null @@ -1 +0,0 @@ -{"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validator/index.js":{"path":"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validator/index.js","statementMap":{"0":{"start":{"line":12,"column":19},"end":{"line":12,"column":40}},"1":{"start":{"line":13,"column":19},"end":{"line":13,"column":43}},"2":{"start":{"line":15,"column":0},"end":{"line":23,"column":1}},"3":{"start":{"line":16,"column":30},"end":{"line":16,"column":64}},"4":{"start":{"line":17,"column":27},"end":{"line":17,"column":58}},"5":{"start":{"line":18,"column":27},"end":{"line":18,"column":57}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":15},"end":{"line":16,"column":16}},"loc":{"start":{"line":16,"column":30},"end":{"line":16,"column":64}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":12},"end":{"line":17,"column":13}},"loc":{"start":{"line":17,"column":27},"end":{"line":17,"column":58}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":12},"end":{"line":18,"column":13}},"loc":{"start":{"line":18,"column":27},"end":{"line":18,"column":57}},"line":18}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":9,"5":1},"f":{"0":1,"1":9,"2":1},"b":{},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"a85e8b474c1d51b04faf453e6946420491bbe49e","contentHash":"5237b8bdefa40b11363c3d23bb1683aa_11.1.0"},"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validation/index.js":{"path":"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Validation/index.js","statementMap":{"0":{"start":{"line":12,"column":19},"end":{"line":12,"column":40}},"1":{"start":{"line":23,"column":4},"end":{"line":23,"column":21}},"2":{"start":{"line":24,"column":4},"end":{"line":24,"column":23}},"3":{"start":{"line":25,"column":4},"end":{"line":25,"column":34}},"4":{"start":{"line":26,"column":4},"end":{"line":26,"column":30}},"5":{"start":{"line":27,"column":4},"end":{"line":27,"column":26}},"6":{"start":{"line":42,"column":4},"end":{"line":45,"column":5}},"7":{"start":{"line":43,"column":6},"end":{"line":43,"column":34}},"8":{"start":{"line":44,"column":6},"end":{"line":44,"column":12}},"9":{"start":{"line":46,"column":4},"end":{"line":46,"column":16}},"10":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"11":{"start":{"line":63,"column":6},"end":{"line":63,"column":73}},"12":{"start":{"line":65,"column":4},"end":{"line":65,"column":25}},"13":{"start":{"line":76,"column":4},"end":{"line":81,"column":5}},"14":{"start":{"line":77,"column":6},"end":{"line":77,"column":28}},"15":{"start":{"line":78,"column":6},"end":{"line":78,"column":72}},"16":{"start":{"line":80,"column":6},"end":{"line":80,"column":28}},"17":{"start":{"line":82,"column":4},"end":{"line":82,"column":15}},"18":{"start":{"line":95,"column":4},"end":{"line":100,"column":5}},"19":{"start":{"line":96,"column":6},"end":{"line":96,"column":28}},"20":{"start":{"line":97,"column":6},"end":{"line":97,"column":75}},"21":{"start":{"line":99,"column":6},"end":{"line":99,"column":28}},"22":{"start":{"line":101,"column":4},"end":{"line":101,"column":15}},"23":{"start":{"line":113,"column":4},"end":{"line":113,"column":30}},"24":{"start":{"line":125,"column":4},"end":{"line":125,"column":28}},"25":{"start":{"line":129,"column":0},"end":{"line":129,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":22,"column":2},"end":{"line":22,"column":3}},"loc":{"start":{"line":22,"column":38},"end":{"line":28,"column":3}},"line":22},"1":{"name":"(anonymous_1)","decl":{"start":{"line":41,"column":2},"end":{"line":41,"column":3}},"loc":{"start":{"line":41,"column":22},"end":{"line":47,"column":3}},"line":41},"2":{"name":"(anonymous_2)","decl":{"start":{"line":57,"column":2},"end":{"line":57,"column":3}},"loc":{"start":{"line":57,"column":21},"end":{"line":66,"column":3}},"line":57},"3":{"name":"(anonymous_3)","decl":{"start":{"line":75,"column":2},"end":{"line":75,"column":3}},"loc":{"start":{"line":75,"column":15},"end":{"line":83,"column":3}},"line":75},"4":{"name":"(anonymous_4)","decl":{"start":{"line":94,"column":2},"end":{"line":94,"column":3}},"loc":{"start":{"line":94,"column":18},"end":{"line":102,"column":3}},"line":94},"5":{"name":"(anonymous_5)","decl":{"start":{"line":112,"column":2},"end":{"line":112,"column":3}},"loc":{"start":{"line":112,"column":14},"end":{"line":114,"column":3}},"line":112},"6":{"name":"(anonymous_6)","decl":{"start":{"line":124,"column":2},"end":{"line":124,"column":3}},"loc":{"start":{"line":124,"column":11},"end":{"line":126,"column":3}},"line":124}},"branchMap":{"0":{"loc":{"start":{"line":42,"column":4},"end":{"line":45,"column":5}},"type":"if","locations":[{"start":{"line":42,"column":4},"end":{"line":45,"column":5}},{"start":{"line":42,"column":4},"end":{"line":45,"column":5}}],"line":42},"1":{"loc":{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},"type":"if","locations":[{"start":{"line":62,"column":4},"end":{"line":64,"column":5}},{"start":{"line":62,"column":4},"end":{"line":64,"column":5}}],"line":62}},"s":{"0":1,"1":15,"2":15,"3":15,"4":15,"5":15,"6":11,"7":10,"8":10,"9":1,"10":16,"11":1,"12":15,"13":14,"14":14,"15":13,"16":9,"17":13,"18":2,"19":2,"20":2,"21":2,"22":2,"23":18,"24":11,"25":1},"f":{"0":15,"1":11,"2":16,"3":14,"4":2,"5":18,"6":11},"b":{"0":[10,1],"1":[1,15]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"21a6402a4b34c0bfdc743d8cf5383ba6fab2b0c9","contentHash":"aca61afc38683d2051d38d5363e8f955_11.1.0"},"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Middleware/Validator.js":{"path":"/Users/harmindervirk/workspace/dawn/@adonisjs/validator/src/Middleware/Validator.js","statementMap":{"0":{"start":{"line":12,"column":21},"end":{"line":12,"column":46}},"1":{"start":{"line":41,"column":4},"end":{"line":41,"column":30}},"2":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"3":{"start":{"line":67,"column":6},"end":{"line":67,"column":17}},"4":{"start":{"line":77,"column":21},"end":{"line":79,"column":29}},"5":{"start":{"line":84,"column":23},"end":{"line":88,"column":5}},"6":{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},"7":{"start":{"line":94,"column":6},"end":{"line":94,"column":17}},"8":{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},"9":{"start":{"line":102,"column":6},"end":{"line":102,"column":58}},"10":{"start":{"line":103,"column":6},"end":{"line":103,"column":18}},"11":{"start":{"line":111,"column":18},"end":{"line":111,"column":29}},"12":{"start":{"line":112,"column":4},"end":{"line":112,"column":42}},"13":{"start":{"line":113,"column":4},"end":{"line":113,"column":15}},"14":{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},"15":{"start":{"line":129,"column":6},"end":{"line":129,"column":17}},"16":{"start":{"line":131,"column":4},"end":{"line":131,"column":40}},"17":{"start":{"line":149,"column":4},"end":{"line":151,"column":5}},"18":{"start":{"line":150,"column":6},"end":{"line":150,"column":43}},"19":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"20":{"start":{"line":167,"column":6},"end":{"line":167,"column":122}},"21":{"start":{"line":169,"column":30},"end":{"line":169,"column":60}},"22":{"start":{"line":170,"column":4},"end":{"line":170,"column":31}},"23":{"start":{"line":181,"column":21},"end":{"line":181,"column":79}},"24":{"start":{"line":182,"column":4},"end":{"line":185,"column":5}},"25":{"start":{"line":183,"column":6},"end":{"line":183,"column":122}},"26":{"start":{"line":184,"column":6},"end":{"line":184,"column":12}},"27":{"start":{"line":196,"column":23},"end":{"line":196,"column":63}},"28":{"start":{"line":197,"column":4},"end":{"line":200,"column":5}},"29":{"start":{"line":198,"column":6},"end":{"line":198,"column":129}},"30":{"start":{"line":199,"column":6},"end":{"line":199,"column":12}},"31":{"start":{"line":205,"column":4},"end":{"line":205,"column":16}},"32":{"start":{"line":209,"column":0},"end":{"line":209,"column":36}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":40,"column":2},"end":{"line":40,"column":3}},"loc":{"start":{"line":40,"column":26},"end":{"line":42,"column":3}},"line":40},"1":{"name":"(anonymous_1)","decl":{"start":{"line":61,"column":2},"end":{"line":61,"column":3}},"loc":{"start":{"line":61,"column":53},"end":{"line":114,"column":3}},"line":61},"2":{"name":"(anonymous_2)","decl":{"start":{"line":127,"column":2},"end":{"line":127,"column":3}},"loc":{"start":{"line":127,"column":33},"end":{"line":132,"column":3}},"line":127},"3":{"name":"(anonymous_3)","decl":{"start":{"line":148,"column":2},"end":{"line":148,"column":3}},"loc":{"start":{"line":148,"column":48},"end":{"line":152,"column":3}},"line":148},"4":{"name":"(anonymous_4)","decl":{"start":{"line":165,"column":2},"end":{"line":165,"column":3}},"loc":{"start":{"line":165,"column":38},"end":{"line":206,"column":3}},"line":165}},"branchMap":{"0":{"loc":{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},"type":"if","locations":[{"start":{"line":66,"column":4},"end":{"line":68,"column":5}},{"start":{"line":66,"column":4},"end":{"line":68,"column":5}}],"line":66},"1":{"loc":{"start":{"line":77,"column":21},"end":{"line":79,"column":29}},"type":"cond-expr","locations":[{"start":{"line":78,"column":6},"end":{"line":78,"column":32}},{"start":{"line":79,"column":6},"end":{"line":79,"column":29}}],"line":77},"2":{"loc":{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},"type":"if","locations":[{"start":{"line":93,"column":4},"end":{"line":95,"column":5}},{"start":{"line":93,"column":4},"end":{"line":95,"column":5}}],"line":93},"3":{"loc":{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},"type":"if","locations":[{"start":{"line":101,"column":4},"end":{"line":104,"column":5}},{"start":{"line":101,"column":4},"end":{"line":104,"column":5}}],"line":101},"4":{"loc":{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},"type":"if","locations":[{"start":{"line":128,"column":4},"end":{"line":130,"column":5}},{"start":{"line":128,"column":4},"end":{"line":130,"column":5}}],"line":128},"5":{"loc":{"start":{"line":149,"column":4},"end":{"line":151,"column":5}},"type":"if","locations":[{"start":{"line":149,"column":4},"end":{"line":151,"column":5}},{"start":{"line":149,"column":4},"end":{"line":151,"column":5}}],"line":149},"6":{"loc":{"start":{"line":149,"column":8},"end":{"line":149,"column":87}},"type":"binary-expr","locations":[{"start":{"line":149,"column":9},"end":{"line":149,"column":35}},{"start":{"line":149,"column":39},"end":{"line":149,"column":64}},{"start":{"line":149,"column":69},"end":{"line":149,"column":87}}],"line":149},"7":{"loc":{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},"type":"if","locations":[{"start":{"line":166,"column":4},"end":{"line":168,"column":5}},{"start":{"line":166,"column":4},"end":{"line":168,"column":5}}],"line":166},"8":{"loc":{"start":{"line":166,"column":8},"end":{"line":166,"column":39}},"type":"binary-expr","locations":[{"start":{"line":166,"column":8},"end":{"line":166,"column":18}},{"start":{"line":166,"column":22},"end":{"line":166,"column":39}}],"line":166},"9":{"loc":{"start":{"line":182,"column":4},"end":{"line":185,"column":5}},"type":"if","locations":[{"start":{"line":182,"column":4},"end":{"line":185,"column":5}},{"start":{"line":182,"column":4},"end":{"line":185,"column":5}}],"line":182},"10":{"loc":{"start":{"line":197,"column":4},"end":{"line":200,"column":5}},"type":"if","locations":[{"start":{"line":197,"column":4},"end":{"line":200,"column":5}},{"start":{"line":197,"column":4},"end":{"line":200,"column":5}}],"line":197}},"s":{"0":1,"1":10,"2":9,"3":1,"4":8,"5":8,"6":8,"7":5,"8":3,"9":1,"10":1,"11":2,"12":2,"13":2,"14":6,"15":2,"16":4,"17":3,"18":3,"19":10,"20":1,"21":9,"22":9,"23":9,"24":7,"25":1,"26":1,"27":6,"28":5,"29":2,"30":2,"31":3,"32":1},"f":{"0":10,"1":9,"2":6,"3":3,"4":10},"b":{"0":[1,8],"1":[1,7],"2":[5,3],"3":[1,2],"4":[2,4],"5":[3,0],"6":[3,0,3],"7":[1,9],"8":[10,10],"9":[1,6],"10":[2,3]},"_coverageSchema":"332fd63041d2c1bcb487cc26dd0d5f7d97098a6c","hash":"a6ed4e2ae04ec98fc6199d165de37fd14bae2cc4","contentHash":"25d4a6009a16d1c9df025e8706dbedb4_11.1.0"}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2792b9f..d098328 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "adonis-validation-provider", + "name": "@adonisjs/validator", "version": "3.0.5", "lockfileVersion": 1, "requires": true, @@ -21,7 +21,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@adonisjs/generic-exceptions/-/generic-exceptions-1.0.0.tgz", "integrity": "sha512-Ll9uC1g6jg/P63A+8VkHdP8fUXIPqKxx38fW6W/ZfYawMkreQklQX19Kz3XodwDg32Leqv5DXUZ3JN4JG89vig==", - "dev": true, "requires": { "node-exceptions": "2.0.2", "upcast": "1.0.4" @@ -1590,8 +1589,7 @@ "node-exceptions": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-exceptions/-/node-exceptions-2.0.2.tgz", - "integrity": "sha512-nILccFLvnaOBoKZZtWfZipn/hlThZOT6UJOLX6SA3yLMYPcvLTIF26PXx73sPnAg45p05iYFYw2jvayNHz4rDA==", - "dev": true + "integrity": "sha512-nILccFLvnaOBoKZZtWfZipn/hlThZOT6UJOLX6SA3yLMYPcvLTIF26PXx73sPnAg45p05iYFYw2jvayNHz4rDA==" }, "number-is-nan": { "version": "1.0.1", @@ -3907,8 +3905,7 @@ "upcast": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/upcast/-/upcast-1.0.4.tgz", - "integrity": "sha1-3fi0wme26j81N+d+HGWUsv0epA8=", - "dev": true + "integrity": "sha1-3fi0wme26j81N+d+HGWUsv0epA8=" }, "user-home": { "version": "2.0.0", diff --git a/package.json b/package.json index 29efc28..a31a813 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "author": "virk", "license": "MIT", "dependencies": { + "@adonisjs/generic-exceptions": "^1.0.0", "indicative": "^3.0.0" }, "devDependencies": { @@ -48,5 +49,8 @@ "commitizen": { "path": "./node_modules/cz-conventional-changelog" } + }, + "nyc": { + "exclude": ["bin"] } } diff --git a/src/Exceptions/index.js b/src/Exceptions/index.js new file mode 100644 index 0000000..a24d34e --- /dev/null +++ b/src/Exceptions/index.js @@ -0,0 +1,27 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +const GE = require('@adonisjs/generic-exceptions') + +/** + * Exception to throw when validation fails + * + * @class ValidationException + */ +class ValidationException extends GE.RuntimeException { + static validationFailed (messages) { + const error = new this('Validation failed', 400, 'E_VALIDATION_FAILED') + error.messages = messages + return error + } +} + +module.exports = { ValidationException } diff --git a/src/Middleware/Validator.js b/src/Middleware/Validator.js index 2a88b81..c9b82b5 100644 --- a/src/Middleware/Validator.js +++ b/src/Middleware/Validator.js @@ -10,6 +10,7 @@ */ const { resolver } = require('@adonisjs/fold') +const CE = require('../Exceptions') /** * The middleware to validate requests using a custom @@ -108,9 +109,7 @@ class ValidatorMiddleware { * * @type {Error} */ - const error = new Error() - error.messages = validation.messages() - throw error + throw CE.ValidationException.validationFailed(validation.messages()) } /** @@ -163,10 +162,17 @@ class ValidatorMiddleware { * @return {void} */ async handle (ctx, next, validator) { - if (!validator || !validator.length) { + validator = validator instanceof Array === true ? validator[0] : validator + + if (!validator) { throw new Error('Cannot validate request without a validator. Make sure to call Route.validator(\'validatorPath\')') } - const validatorInstance = resolver.resolve(validator[0]) + + const validatorInstance = resolver.resolve(validator) + + /** + * Set request ctx on the validator + */ validatorInstance.ctx = ctx /** From e3ae357fbbf38a7e7883df5dc29a436723a02035 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 20:07:56 +0530 Subject: [PATCH 6/9] feat(exception): add exception handler --- providers/ValidatorProvider.js | 9 ++++++-- src/ExceptionHandler/index.js | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/ExceptionHandler/index.js diff --git a/providers/ValidatorProvider.js b/providers/ValidatorProvider.js index e057ac8..6f57561 100644 --- a/providers/ValidatorProvider.js +++ b/providers/ValidatorProvider.js @@ -18,14 +18,18 @@ class ValidationProvider extends ServiceProvider { } boot () { - const Route = this.app.use('Adonis/Src/Route') - const Server = this.app.use('Adonis/Src/Server') + /** + * Add exception handler to handle exception gracefully. + */ + const Exception = this.app.use('Adonis/Src/Exception') + Exception.on('ValidationException', require('../src/ExceptionHandler')) /** * Define a named middleware with server * * @type {String} */ + const Server = this.app.use('Adonis/Src/Server') Server.registerNamed({ addonValidator: 'Adonis/Middleware/Validator' }) @@ -36,6 +40,7 @@ class ValidationProvider extends ServiceProvider { * validates the request via validator * class */ + const Route = this.app.use('Adonis/Src/Route') Route.Route.macro('validator', function (validatorClass) { this.middleware([`addonValidator:${validatorClass}`]) }) diff --git a/src/ExceptionHandler/index.js b/src/ExceptionHandler/index.js new file mode 100644 index 0000000..eff9a4e --- /dev/null +++ b/src/ExceptionHandler/index.js @@ -0,0 +1,40 @@ +'use strict' + +/* + * adonis-validator + * + * (c) Harminder Virk + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. +*/ + +module.exports = async ({ messages }, { request, response, session }) => { + const isJSON = request.accepts(['html', 'json']) === 'json' + + /** + * If request is json then send json response + */ + if (isJSON) { + return response.status(400).send(messages) + } + + /** + * If session provider exists, then flash errors back to the + * actual page + */ + if (session && session.withErrors) { + session.withErrors(messages).flashAll() + await session.commit() + response.redirect('back') + return + } + + /** + * Otherwise do the dumbest thing and send a 400 + * with plain message + */ + response + .status(400) + .send('Validation failed. Make sure you have filled all fields correctly') +} From 29b31e79fbc85459605d510df88ac3af6a594229 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 20:10:56 +0530 Subject: [PATCH 7/9] fix(provider): register middleware to ioc container --- providers/ValidatorProvider.js | 48 +++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/providers/ValidatorProvider.js b/providers/ValidatorProvider.js index 6f57561..7249846 100644 --- a/providers/ValidatorProvider.js +++ b/providers/ValidatorProvider.js @@ -12,11 +12,57 @@ const { ServiceProvider } = require('@adonisjs/fold') class ValidationProvider extends ServiceProvider { - register () { + /** + * Register the validator to the IoC container + * with `Adonis/Addons/Validator` namespace. + * + * @method _registerValidator + * + * @return {void} + * + * @private + */ + _registerValidator () { this.app.bind('Adonis/Addons/Validator', () => require('../src/Validator')) this.app.alias('Adonis/Addons/Validator', 'Validator') } + /** + * Register the middleware to the IoC container + * with `Adonis/Middleware/Validator` namespace + * + * @method _registerMiddleware + * + * @return {void} + * + * @private + */ + _registerMiddleware () { + this.app.bind('Adonis/Middleware/Validator', (app) => { + const MiddlewareValidator = require('../src/Middleware/Validator') + return new MiddlewareValidator(app.use('Adonis/Addons/Validator')) + }) + } + + /** + * Register bindings + * + * @method register + * + * @return {void} + */ + register () { + this._registerValidator() + this._registerMiddleware() + } + + /** + * On boot + * + * @method boot + * + * @return {void} + */ boot () { /** * Add exception handler to handle exception gracefully. From e75ff8b9c7f57a68e8608c408313e1d0770b250b Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 22:36:44 +0530 Subject: [PATCH 8/9] refactor(*): small tweaks around the codebase --- package.json | 2 +- providers/ValidatorProvider.js | 2 +- src/Middleware/Validator.js | 12 ------------ 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index a31a813..4ccc767 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,6 @@ } }, "nyc": { - "exclude": ["bin"] + "exclude": ["bin", "test"] } } diff --git a/providers/ValidatorProvider.js b/providers/ValidatorProvider.js index 7249846..9cb034b 100644 --- a/providers/ValidatorProvider.js +++ b/providers/ValidatorProvider.js @@ -68,7 +68,7 @@ class ValidationProvider extends ServiceProvider { * Add exception handler to handle exception gracefully. */ const Exception = this.app.use('Adonis/Src/Exception') - Exception.on('ValidationException', require('../src/ExceptionHandler')) + Exception.handle('ValidationException', require('../src/ExceptionHandler')) /** * Define a named middleware with server diff --git a/src/Middleware/Validator.js b/src/Middleware/Validator.js index c9b82b5..e0557f2 100644 --- a/src/Middleware/Validator.js +++ b/src/Middleware/Validator.js @@ -26,18 +26,6 @@ const CE = require('../Exceptions') * @constructor */ class ValidatorMiddleware { - /* istanbul ignore next */ - /** - * IoC container injections - * - * @method inject - * - * @return {Array} - */ - static get inject () { - return ['Adonis/Addons/Validator'] - } - constructor (Validator) { this.Validator = Validator } From 5d64fc7f41ec9861ee3147d9ca5eb50aba5ebff0 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Sat, 19 Aug 2017 22:37:33 +0530 Subject: [PATCH 9/9] chore(release): 4.0.0 --- CHANGELOG.md | 17 +++++++++++++++++ package.json | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02e76f4..67a8aa8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ + +# [4.0.0](https://github.com/adonisjs/adonis-validation-provider/compare/v3.0.5...v4.0.0) (2017-08-19) + + +### Bug Fixes + +* **provider:** register middleware to ioc container ([29b31e7](https://github.com/adonisjs/adonis-validation-provider/commit/29b31e7)) + + +### Features + +* rewrite for 4.0 ([d4d726d](https://github.com/adonisjs/adonis-validation-provider/commit/d4d726d)) +* **exception:** add exception handler ([e3ae357](https://github.com/adonisjs/adonis-validation-provider/commit/e3ae357)) +* **exceptions:** add custom exception ([da04ae6](https://github.com/adonisjs/adonis-validation-provider/commit/da04ae6)) + + + ## [3.0.5](https://github.com/adonisjs/adonis-validation-provider/compare/v3.0.4...v3.0.5) (2016-12-12) diff --git a/package.json b/package.json index 4ccc767..ff8f3f6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@adonisjs/validator", - "version": "3.0.5", + "version": "4.0.0", "description": "Validator for adonis framework", "main": "index.js", "scripts": {