diff --git a/package-lock.json b/package-lock.json index adf953374b..61ab9fa13c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1172,6 +1172,12 @@ "color-convert": "^1.9.0" } }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", + "dev": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", @@ -2646,6 +2652,16 @@ "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2891,6 +2907,33 @@ "restore-cursor": "^2.0.0" } }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + } + } + }, + "cli-usage": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/cli-usage/-/cli-usage-0.1.8.tgz", + "integrity": "sha512-EZJ+ty1TsqdnhZNt2QbI+ed3IUNHTH31blSOJLVph3oL4IExskPRyCDGJH7RuCBPy3QBmWgpbeUxXPhK0isXIw==", + "dev": true, + "requires": { + "marked": "^0.5.0", + "marked-terminal": "^3.0.0" + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -3160,6 +3203,12 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, + "content-type-parser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz", + "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==", + "dev": true + }, "convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", @@ -4947,14 +4996,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4969,18 +5016,19 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5097,7 +5145,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -5109,6 +5158,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5123,7 +5173,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5235,7 +5284,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5368,6 +5418,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7375,6 +7426,12 @@ "jest-util": "^23.4.0" } }, + "jest-file-exists": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/jest-file-exists/-/jest-file-exists-17.0.0.tgz", + "integrity": "sha1-f2Prc6HEOhP0Yb4mF2i0WvLN0Wk=", + "dev": true + }, "jest-get-type": { "version": "22.4.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", @@ -7437,6 +7494,96 @@ "pretty-format": "^23.6.0" } }, + "jest-matchers": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matchers/-/jest-matchers-18.1.0.tgz", + "integrity": "sha1-A0FIS/h6H9C6wKTSyJnit3o/Hq0=", + "dev": true, + "requires": { + "jest-diff": "^18.1.0", + "jest-matcher-utils": "^18.1.0", + "jest-util": "^18.1.0", + "pretty-format": "^18.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "jest-diff": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-18.1.0.tgz", + "integrity": "sha1-T/eedN2YjBORlbNl3GXYf2BvSAM=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "diff": "^3.0.0", + "jest-matcher-utils": "^18.1.0", + "pretty-format": "^18.1.0" + } + }, + "jest-matcher-utils": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz", + "integrity": "sha1-GsRlGVXuKmDO8ef8yYzf13PA+TI=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "pretty-format": "^18.1.0" + } + }, + "jest-mock": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-18.0.0.tgz", + "integrity": "sha1-XCSIRuoz+lWLUm9TEqtKZ2XkibM=", + "dev": true + }, + "jest-util": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-18.1.0.tgz", + "integrity": "sha1-OpnDIRSrF/hL4JQ4JScAbm1L/Go=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "diff": "^3.0.0", + "graceful-fs": "^4.1.6", + "jest-file-exists": "^17.0.0", + "jest-mock": "^18.0.0", + "mkdirp": "^0.5.1" + } + }, + "pretty-format": { + "version": "18.1.0", + "resolved": "http://registry.npmjs.org/pretty-format/-/pretty-format-18.1.0.tgz", + "integrity": "sha1-+2Wob3p/kZSWPu6RhlwbzxA54oQ=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "jest-message-util": { "version": "23.4.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", @@ -7456,6 +7603,642 @@ "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", "dev": true }, + "jest-mock-express": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jest-mock-express/-/jest-mock-express-0.1.1.tgz", + "integrity": "sha512-4H/1XpsJVmm/NqLaziosWr3Uxx1S2EA1xzMI+XAV3EUD0lCqW5WpqZnm19yilSS2MCALZOUUg0ebMC06lRq+Og==", + "dev": true, + "requires": { + "jest": "^18.1.0" + }, + "dependencies": { + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "requires": { + "acorn": "^4.0.4" + } + }, + "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-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-jest": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-18.0.0.tgz", + "integrity": "sha1-F+u6jLMoXJBthZ6HB+Tnl5X7ZeM=", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^3.0.0", + "babel-preset-jest": "^18.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz", + "integrity": "sha1-EdWr3hhCXsJLXWSMfgtdJc01SiI=", + "dev": true, + "requires": { + "find-up": "^1.1.2", + "istanbul-lib-instrument": "^1.4.2", + "object-assign": "^4.1.0", + "test-exclude": "^3.3.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz", + "integrity": "sha1-QVDnDsq1YObnNErchJSYBy004So=", + "dev": true + }, + "babel-preset-jest": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz", + "integrity": "sha1-hPr4yj7GWrp9Xj9Zu67ZNaskBJ4=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "^18.0.0" + } + }, + "bser": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bser/-/bser-1.0.2.tgz", + "integrity": "sha1-OBEWlwsqbe6lZG3RXdcnhES1YWk=", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "fb-watchman": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-1.9.2.tgz", + "integrity": "sha1-okz0eCf4LTj7Waaa1wt247auc4M=", + "dev": true, + "requires": { + "bser": "1.0.2" + } + }, + "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.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "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.0" + } + }, + "jest": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-18.1.0.tgz", + "integrity": "sha1-vOvx4gPe5cKtIJHIBTAKND2ebH0=", + "dev": true, + "requires": { + "jest-cli": "^18.1.0" + }, + "dependencies": { + "jest-cli": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-18.1.0.tgz", + "integrity": "sha1-Xq027K1CCBfCybqiqnV09jJXs9Y=", + "dev": true, + "requires": { + "ansi-escapes": "^1.4.0", + "callsites": "^2.0.0", + "chalk": "^1.1.1", + "graceful-fs": "^4.1.6", + "is-ci": "^1.0.9", + "istanbul-api": "^1.1.0-alpha.1", + "istanbul-lib-coverage": "^1.0.0", + "istanbul-lib-instrument": "^1.1.1", + "jest-changed-files": "^17.0.2", + "jest-config": "^18.1.0", + "jest-environment-jsdom": "^18.1.0", + "jest-file-exists": "^17.0.0", + "jest-haste-map": "^18.1.0", + "jest-jasmine2": "^18.1.0", + "jest-mock": "^18.0.0", + "jest-resolve": "^18.1.0", + "jest-resolve-dependencies": "^18.1.0", + "jest-runtime": "^18.1.0", + "jest-snapshot": "^18.1.0", + "jest-util": "^18.1.0", + "json-stable-stringify": "^1.0.0", + "node-notifier": "^4.6.1", + "sane": "~1.4.1", + "strip-ansi": "^3.0.1", + "throat": "^3.0.0", + "which": "^1.1.1", + "worker-farm": "^1.3.1", + "yargs": "^6.3.0" + } + } + } + }, + "jest-changed-files": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-17.0.2.tgz", + "integrity": "sha1-9WV3WHNplvWQpRuH5ck2nZBLp7c=", + "dev": true + }, + "jest-config": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-18.1.0.tgz", + "integrity": "sha1-YRF0Cm1Iqrhv9anmqwuYvZk7b/Q=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "jest-environment-jsdom": "^18.1.0", + "jest-environment-node": "^18.1.0", + "jest-jasmine2": "^18.1.0", + "jest-mock": "^18.0.0", + "jest-resolve": "^18.1.0", + "jest-util": "^18.1.0", + "json-stable-stringify": "^1.0.0" + } + }, + "jest-diff": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-18.1.0.tgz", + "integrity": "sha1-T/eedN2YjBORlbNl3GXYf2BvSAM=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "diff": "^3.0.0", + "jest-matcher-utils": "^18.1.0", + "pretty-format": "^18.1.0" + } + }, + "jest-environment-jsdom": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz", + "integrity": "sha1-GLQvDE6iuunzbKs2ObHo+MOE4k4=", + "dev": true, + "requires": { + "jest-mock": "^18.0.0", + "jest-util": "^18.1.0", + "jsdom": "^9.9.1" + } + }, + "jest-environment-node": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-18.1.0.tgz", + "integrity": "sha1-TWeXVyyN2pms9frmlutilFVHx3k=", + "dev": true, + "requires": { + "jest-mock": "^18.0.0", + "jest-util": "^18.1.0" + } + }, + "jest-haste-map": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-18.1.0.tgz", + "integrity": "sha1-BoOcdLdwpAwaEGlohR340oHAg3U=", + "dev": true, + "requires": { + "fb-watchman": "^1.9.0", + "graceful-fs": "^4.1.6", + "micromatch": "^2.3.11", + "sane": "~1.4.1", + "worker-farm": "^1.3.1" + } + }, + "jest-jasmine2": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz", + "integrity": "sha1-CU4QTCwYlwh2bHcmO7Kuy1hgqAs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "jest-matcher-utils": "^18.1.0", + "jest-matchers": "^18.1.0", + "jest-snapshot": "^18.1.0", + "jest-util": "^18.1.0" + } + }, + "jest-matcher-utils": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz", + "integrity": "sha1-GsRlGVXuKmDO8ef8yYzf13PA+TI=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "pretty-format": "^18.1.0" + } + }, + "jest-mock": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-18.0.0.tgz", + "integrity": "sha1-XCSIRuoz+lWLUm9TEqtKZ2XkibM=", + "dev": true + }, + "jest-resolve": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-18.1.0.tgz", + "integrity": "sha1-aACsy1NmWMkGzV4p3kErGrmsJJs=", + "dev": true, + "requires": { + "browser-resolve": "^1.11.2", + "jest-file-exists": "^17.0.0", + "jest-haste-map": "^18.1.0", + "resolve": "^1.2.0" + } + }, + "jest-resolve-dependencies": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz", + "integrity": "sha1-gTT7XK9Zye2EL+AVKrAcUnEfG7s=", + "dev": true, + "requires": { + "jest-file-exists": "^17.0.0", + "jest-resolve": "^18.1.0" + } + }, + "jest-runtime": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-18.1.0.tgz", + "integrity": "sha1-Or/WhxdbIfw7haK4BkOZ6ZeFmSI=", + "dev": true, + "requires": { + "babel-core": "^6.0.0", + "babel-jest": "^18.0.0", + "babel-plugin-istanbul": "^3.0.0", + "chalk": "^1.1.3", + "graceful-fs": "^4.1.6", + "jest-config": "^18.1.0", + "jest-file-exists": "^17.0.0", + "jest-haste-map": "^18.1.0", + "jest-mock": "^18.0.0", + "jest-resolve": "^18.1.0", + "jest-snapshot": "^18.1.0", + "jest-util": "^18.1.0", + "json-stable-stringify": "^1.0.0", + "micromatch": "^2.3.11", + "yargs": "^6.3.0" + } + }, + "jest-snapshot": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-18.1.0.tgz", + "integrity": "sha1-VbltLuY5ybznb4fyo/1Atxx6WRY=", + "dev": true, + "requires": { + "jest-diff": "^18.1.0", + "jest-file-exists": "^17.0.0", + "jest-matcher-utils": "^18.1.0", + "jest-util": "^18.1.0", + "natural-compare": "^1.4.0", + "pretty-format": "^18.1.0" + } + }, + "jest-util": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-18.1.0.tgz", + "integrity": "sha1-OpnDIRSrF/hL4JQ4JScAbm1L/Go=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "diff": "^3.0.0", + "graceful-fs": "^4.1.6", + "jest-file-exists": "^17.0.0", + "jest-mock": "^18.0.0", + "mkdirp": "^0.5.1" + } + }, + "jsdom": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz", + "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", + "dev": true, + "requires": { + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha1-oKHkDYKl6on/WxR7hETtY9koJ9s=", + "dev": true, + "requires": { + "lodash._baseclone": "^3.0.0", + "lodash._bindcallback": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node-notifier": { + "version": "4.6.1", + "resolved": "http://registry.npmjs.org/node-notifier/-/node-notifier-4.6.1.tgz", + "integrity": "sha1-BW0UJE89zBzq3+aK+c/wxUc6M/M=", + "dev": true, + "requires": { + "cli-usage": "^0.1.1", + "growly": "^1.2.0", + "lodash.clonedeep": "^3.0.0", + "minimist": "^1.1.1", + "semver": "^5.1.0", + "shellwords": "^0.1.0", + "which": "^1.0.5" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "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.0" + } + }, + "pretty-format": { + "version": "18.1.0", + "resolved": "http://registry.npmjs.org/pretty-format/-/pretty-format-18.1.0.tgz", + "integrity": "sha1-+2Wob3p/kZSWPu6RhlwbzxA54oQ=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1" + } + }, + "sane": { + "version": "1.4.1", + "resolved": "http://registry.npmjs.org/sane/-/sane-1.4.1.tgz", + "integrity": "sha1-iPdj10BA9fDCVrYWPbOZvxEKxxU=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "fb-watchman": "^1.8.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.10.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "test-exclude": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/test-exclude/-/test-exclude-3.3.0.tgz", + "integrity": "sha1-ehfKEjmYjJg2ewYhRW27fUvDiXc=", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } + }, + "throat": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-3.2.0.tgz", + "integrity": "sha512-/EY8VpvlqJ+sFtLPeOgc8Pl7kQVOWv0woD87KTXVHPIAE842FGT+rokxIhe8xIUP1cfgrkt0as0vDLjDiMtr8w==", + "dev": true + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "watch": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha1-d3mLLaD5kQ1ZXxrOWwwiWFIfIdw=", + "dev": true + }, + "whatwg-url": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", + "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + } + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^4.2.0" + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, "jest-regex-util": { "version": "23.3.0", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", @@ -7775,6 +8558,15 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "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-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -8000,6 +8792,66 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha1-MDUZv2OT/n5C802LYw73eU41Qrc=", + "dev": true, + "requires": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._baseassign": "^3.0.0", + "lodash._basefor": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", @@ -8034,6 +8886,18 @@ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -8059,6 +8923,17 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -8105,6 +8980,12 @@ "lodash._reinterpolate": "~3.0.0" } }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -8205,6 +9086,25 @@ "object-visit": "^1.0.0" } }, + "marked": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", + "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==", + "dev": true + }, + "marked-terminal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.1.1.tgz", + "integrity": "sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w==", + "dev": true, + "requires": { + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "cli-table": "^0.3.1", + "lodash.assign": "^4.2.0", + "node-emoji": "^1.4.1" + } + }, "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", @@ -8808,6 +9708,15 @@ "lower-case": "^1.1.1" } }, + "node-emoji": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.8.1.tgz", + "integrity": "sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } + }, "node-forge": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", @@ -9184,6 +10093,12 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "dev": true + }, "nwsapi": { "version": "2.0.9", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", @@ -11426,6 +12341,15 @@ "strip-indent": "^1.0.1" } }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, "redux": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", diff --git a/package.json b/package.json index 48d6d78def..d9f33dafb2 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "extract-text-webpack-plugin": "^4.0.0-beta.0", "html-webpack-plugin": "^3.2.0", "jest": "^23.6.0", + "jest-mock-express": "^0.1.1", "mongoose": "^5.2.5", "node-sass": "^4.9.2", "node-sass-chokidar": "^1.3.3", diff --git a/src/middleware/index.js b/src/middleware/index.js index be476fe082..9d790a0371 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -1,22 +1,22 @@ - export function role(role) { - return function (req, res, next) { - if (role !== req.user.role) res.send(401, 'Role not authorized.'); - else next(); - } +export function role(role) { + return function (req, res, next) { + if (role !== req.user.role) res.status(401).send('Role not authorized.'); + else next(); } +} - export function atLeastRole(roleList, permittedRole) { - return function(req, res, next) { - let actualRoleIndex = roleList.indexOf(req.user.role); - if (actualRoleIndex === -1) res.status(400).send('Invalid role.'); +export function atLeastRole(roleList, permittedRole) { + return function(req, res, next) { + let actualRoleIndex = roleList.indexOf(req.user.role); + if (actualRoleIndex === -1) res.status(400).send('Invalid role.'); - let permittedRoleIndex = roleList.indexOf(permittedRole); - if (permittedRoleIndex === -1) res.status(500).send(); + let permittedRoleIndex = roleList.indexOf(permittedRole); + if (permittedRoleIndex === -1) res.status(500).send(); - if (actualRoleIndex <= permittedRoleIndex) next(); + if (actualRoleIndex <= permittedRoleIndex) next(); - res.status(401).send('Role not authorized.'); - } + res.status(401).send('Role not authorized.'); } +} export default { role, atLeastRole }; diff --git a/src/tests/middleware.spec.js b/src/tests/middleware.spec.js new file mode 100644 index 0000000000..99be8a2e27 --- /dev/null +++ b/src/tests/middleware.spec.js @@ -0,0 +1,109 @@ +import middleware from '../middleware'; +import mockExpress from 'jest-mock-express'; + +let res = null; +let next = null; + +beforeEach(() => { + res = mockExpress.response(); + next = jest.fn(); +}); + +describe('Payload Role Middleware', () => { + it('Exact role - authorized', () => { + const req = { + user: { + role: 'user' + } + }; + + middleware.role('user')(req, res, next); + + expect(next.mock.calls.length).toBe(1); + expect(res.status).not.toHaveBeenCalled(); + }); + + it('Exact role - unauthorized', () => { + const req = { + user: { + role: 'user' + } + }; + + middleware.role('admin')(req, res, next); + + expect(next.mock.calls.length).toBe(0); + expect(res.status).toHaveBeenCalled(); + expect(res.send).toHaveBeenCalled(); + }); + + it('At least role - exact', () => { + const roleList = [ + 'admin', + 'user', + 'viewer' + ]; + const req = { + user: { + role: 'user' + } + }; + + middleware.atLeastRole(roleList, 'user')(req, res, next); + + expect(next.mock.calls.length).toBe(1); + }); + + it('At least role - permitted', () => { + const roleList = [ + 'admin', + 'user', + 'viewer' + ]; + const req = { + user: { + role: 'user' + } + }; + + middleware.atLeastRole(roleList, 'viewer')(req, res, next); + + expect(next.mock.calls.length).toBe(1); + }); + + it('At least role - unauthorized', () => { + const roleList = [ + 'admin', + 'user', + 'viewer' + ]; + const req = { + user: { + role: 'user' + } + }; + + middleware.atLeastRole(roleList, 'admin')(req, res, next); + + expect(next.mock.calls.length).toBe(0); + expect(res.status).toHaveBeenCalledWith(401); + }); + + it('At least role - non-existent role', () => { + const roleList = [ + 'admin', + 'user', + 'viewer' + ]; + const req = { + user: { + role: 'user' + } + }; + + middleware.atLeastRole(roleList, 'invalid')(req, res, next); + + expect(next.mock.calls.length).toBe(0); + expect(res.status).toHaveBeenCalledWith(500); + }) +});