diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..a65b417 --- /dev/null +++ b/.eslintignore @@ -0,0 +1 @@ +lib diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..466e993 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ['standard', 'prettier'], + plugins: ['prettier'], + rules: { + 'prettier/prettier': [ + 'error', + { + singleQuote: true, + semi: false, + }, + ], + }, + env: { mocha: true }, +} diff --git a/package-lock.json b/package-lock.json index 4bd8c69..5e76ca1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -171,57 +171,25 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", "integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-code-frame": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", - "dev": true, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true - } - } + "dev": true }, "babel-core": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-generator": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", @@ -239,15 +207,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz", "integrity": "sha1-epdH8ljYlH0y1RX2qhx70CIEoIA=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", @@ -283,15 +243,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", @@ -363,15 +315,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz", "integrity": "sha1-dsKV3DpHQbFmWt/TFnIV3P8ypXY=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-plugin-transform-es2015-classes": { "version": "6.24.1", @@ -521,15 +465,7 @@ "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-runtime": { "version": "6.23.0", @@ -541,43 +477,19 @@ "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-traverse": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babel-types": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "babylon": { "version": "6.17.4", @@ -612,14 +524,7 @@ "body-parser": { "version": "1.17.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "dependencies": { - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" - } - } + "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=" }, "boom": { "version": "2.10.1", @@ -684,9 +589,9 @@ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" }, "caniuse-lite": { - "version": "1.0.30000693", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000693.tgz", - "integrity": "sha1-ycYphpfHH99ssT7v6KqTkm8vhhM=", + "version": "1.0.30000696", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000696.tgz", + "integrity": "sha1-MPJpXSoBoN/XeaJquD9NE0s9pcw=", "dev": true }, "capture-stack-trace": { @@ -767,9 +672,9 @@ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.10.0.tgz", + "integrity": "sha512-q/r9trjmuikWDRJNTBHAVnWhuU6w+z80KgBq7j9YDclik5E7X4xi0KnlZBNFA1zOQ+SH/vHMWd2mC9QTOz7GpA==", "dev": true }, "component-emitter": { @@ -820,13 +725,26 @@ "configstore": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=" + "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + } + } }, "connect-pause": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/connect-pause/-/connect-pause-0.1.0.tgz", "integrity": "sha1-D9d72e+Lpg0KJw7lIxOz2tRsQSo=" }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", @@ -916,9 +834,9 @@ } }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" }, "debug-log": { "version": "1.0.1", @@ -952,15 +870,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "dependencies": { - "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 - } - } + "dev": true }, "delayed-stream": { "version": "1.0.0", @@ -990,9 +900,9 @@ "dev": true }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true }, "dot-prop": { @@ -1017,9 +927,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.14.tgz", - "integrity": "sha1-ZK8Pnv08PGrNV9cfg7Scp+6cS0M=", + "version": "1.3.15", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz", + "integrity": "sha1-CDl5NIkcvPrrvRi4KpW1pIETg2k=", "dev": true }, "encodeurl": { @@ -1090,29 +1000,23 @@ "dev": true }, "eslint": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.10.2.tgz", - "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, "pluralize": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -1121,10 +1025,16 @@ } } }, + "eslint-config-prettier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.3.0.tgz", + "integrity": "sha1-t1seq+oMi5ezRANkfuJds0m52KA=", + "dev": true + }, "eslint-config-standard": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz", - "integrity": "sha1-06aKr8cZFjnn7kQec0hzkCY1QpI=", + "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": { @@ -1133,22 +1043,126 @@ "integrity": "sha1-wkDibtkZoRpCqk3oBZRys4Jo1iA=", "dev": true }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true + } + } + }, + "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, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.6.1.tgz", + "integrity": "sha512-aAMb32eHCQaQmgdb1MOG1hfu/rPiNgGur2IF71VJeDfTXdLpPiKALKWlzxMdcxQOZZ2CmYVKabAxCvjACxH1uQ==", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true + }, + "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 + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.1.0.tgz", + "integrity": "sha512-MzAAnEfNOl6g871VgjKswHkyG+bqsXX2//SWXwNkyREvWAPUoU8X6ZvcrambHEGecUIbE0pAVPzzfKU/p9H5lg==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.1.2.tgz", + "integrity": "sha1-S5D07n+Sv74ukmAX4cpA62KJZeo=", + "dev": true + }, "eslint-plugin-promise": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.4.2.tgz", - "integrity": "sha1-G+J5Pq/i0YtbEjuBNsJp+AT+cSI=", + "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.7.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.7.1.tgz", "integrity": "sha1-Gvlq6lRYVoJRV9l8G1DVqPtkpac=", - "dev": true + "dev": true, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + } + } }, "eslint-plugin-standard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-2.0.1.tgz", - "integrity": "sha1-NYlpn/nJF/LCX3apFmh/ZBw2n/M=", + "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": { @@ -1163,19 +1177,17 @@ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true + }, "esrecurse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "dependencies": { - "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 - } - } + "dev": true }, "estraverse": { "version": "4.2.0", @@ -1222,14 +1234,7 @@ "express": { "version": "4.15.3", "resolved": "https://registry.npmjs.org/express/-/express-4.15.3.tgz", - "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=", - "dependencies": { - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" - } - } + "integrity": "sha1-urZdDwOqgMNYQIly/HAPkWlEtmI=" }, "extend": { "version": "3.0.1", @@ -1254,6 +1259,12 @@ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" }, + "fast-diff": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.1.tgz", + "integrity": "sha1-CuoOTmBbaiGJ8Ok21Lf7rxt8/Zs=", + "dev": true + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", @@ -1264,29 +1275,13 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "dependencies": { - "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 - } - } + "dev": true }, "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, - "dependencies": { - "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 - } - } + "dev": true }, "filename-regex": { "version": "2.0.1", @@ -1309,19 +1304,12 @@ "finalhandler": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", - "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", - "dependencies": { - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" - } - } + "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=" }, "find-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.0.0.tgz", - "integrity": "sha1-li/yEaqyXGUg/u641ih/j26VgHo=", + "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": { @@ -1354,10 +1342,9 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.2.0.tgz", - "integrity": "sha1-ml47kpX5gLJiPPZPojixTOvKcHs=", - "dev": true + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" }, "formidable": { "version": "1.1.1", @@ -1396,172 +1383,146 @@ "dependencies": { "abbrev": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "bundled": true, "dev": true, "optional": true }, "ajv": { "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "bundled": true, "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "bundled": true, "dev": true }, "aproba": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "bundled": true, "dev": true, "optional": true }, "are-we-there-yet": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "bundled": true, "dev": true, "optional": true }, "asn1": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "bundled": true, "dev": true, "optional": 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=", + "bundled": true, "dev": true, "optional": true }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "bundled": true, "dev": true, "optional": true }, "aws-sign2": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "bundled": true, "dev": true, "optional": true }, "aws4": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "bundled": true, "dev": true, "optional": true }, "balanced-match": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "bundled": true, "dev": true }, "bcrypt-pbkdf": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "bundled": true, "dev": true, "optional": true }, "block-stream": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "bundled": true, "dev": true }, "boom": { "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "bundled": true, "dev": true }, "brace-expansion": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "bundled": true, "dev": true }, "buffer-shims": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "bundled": true, "dev": true }, "caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "bundled": true, "dev": true, "optional": true }, "co": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "bundled": true, "dev": true, "optional": 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=", + "bundled": true, "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=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "console-control-strings": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "bundled": true, "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=", + "bundled": true, "dev": true }, "cryptiles": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "bundled": true, "dev": true, "optional": true }, "dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "bundled": true, "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true, "optional": true } @@ -1569,102 +1530,87 @@ }, "debug": { "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "bundled": true, "dev": true, "optional": true }, "deep-extend": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "bundled": true, "dev": true, "optional": true }, "delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "bundled": true, "dev": true }, "delegates": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "bundled": true, "dev": true, "optional": true }, "ecc-jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "bundled": true, "dev": true, "optional": true }, "extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "bundled": true, "dev": true, "optional": true }, "extsprintf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "bundled": true, "dev": true }, "forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "bundled": true, "dev": true, "optional": true }, "form-data": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "bundled": true, "dev": true, "optional": true }, "fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "bundled": true, "dev": true }, "fstream": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "bundled": true, "dev": true }, "fstream-ignore": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "bundled": true, "dev": true, "optional": true }, "gauge": { "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "bundled": true, "dev": true, "optional": true }, "getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "bundled": true, "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true, "optional": true } @@ -1672,155 +1618,132 @@ }, "glob": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "bundled": true, "dev": true }, "graceful-fs": { "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "bundled": true, "dev": true }, "har-schema": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "bundled": true, "dev": true, "optional": true }, "har-validator": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "bundled": true, "dev": true, "optional": true }, "has-unicode": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "bundled": true, "dev": true, "optional": true }, "hawk": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "bundled": true, "dev": true, "optional": true }, "hoek": { "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "bundled": true, "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=", + "bundled": true, "dev": true, "optional": true }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "bundled": true, "dev": true }, "inherits": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "bundled": true, "dev": true }, "ini": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "bundled": true, "dev": true, "optional": 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=", + "bundled": true, "dev": true }, "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "bundled": true, "dev": true, "optional": true }, "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "bundled": true, "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=", + "bundled": true, "dev": true, "optional": true }, "jodid25519": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "bundled": true, "dev": true, "optional": true }, "jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "bundled": true, "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=", + "bundled": true, "dev": true, "optional": 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=", + "bundled": true, "dev": true, "optional": true }, "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=", + "bundled": true, "dev": true, "optional": true }, "jsonify": { "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "bundled": true, "dev": true, "optional": true }, "jsprim": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "bundled": true, "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true, "optional": true } @@ -1828,153 +1751,130 @@ }, "mime-db": { "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "bundled": true, "dev": true }, "mime-types": { "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "bundled": true, "dev": true }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "bundled": true, "dev": true }, "minimist": { "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "bundled": true, "dev": true }, "mkdirp": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "bundled": true, "dev": true }, "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bundled": true, "dev": true, "optional": true }, "node-pre-gyp": { "version": "0.6.36", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", - "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "bundled": true, "dev": true, "optional": true }, "nopt": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "bundled": true, "dev": true, "optional": true }, "npmlog": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "bundled": true, "dev": true, "optional": 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=", + "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=", + "bundled": true, "dev": true, "optional": true }, "object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "bundled": true, "dev": true, "optional": true }, "once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "bundled": true, "dev": true }, "os-homedir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "bundled": true, "dev": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "bundled": true, "dev": true, "optional": true }, "osenv": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "bundled": true, "dev": true, "optional": true }, "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=", + "bundled": true, "dev": true }, "performance-now": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "bundled": true, "dev": true, "optional": 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=", + "bundled": true, "dev": true }, "punycode": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "bundled": true, "dev": true, "optional": true }, "qs": { "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "bundled": true, "dev": true, "optional": true }, "rc": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "bundled": true, "dev": true, "optional": true, "dependencies": { "minimist": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "bundled": true, "dev": true, "optional": true } @@ -1982,68 +1882,58 @@ }, "readable-stream": { "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "bundled": true, "dev": true }, "request": { "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "bundled": true, "dev": true, "optional": true }, "rimraf": { "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "bundled": true, "dev": true }, "safe-buffer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "bundled": true, "dev": true }, "semver": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bundled": true, "dev": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "bundled": true, "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "bundled": true, "dev": true, "optional": true }, "sntp": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "bundled": true, "dev": true, "optional": true }, "sshpk": { "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "bundled": true, "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "bundled": true, "dev": true, "optional": true } @@ -2051,112 +1941,102 @@ }, "string_decoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "bundled": true, "dev": true }, "string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "bundled": true, "dev": true }, "stringstream": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "bundled": true, "dev": true, "optional": true }, "strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "bundled": true, "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=", + "bundled": true, "dev": true, "optional": true }, "tar": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "bundled": true, "dev": true }, "tar-pack": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "bundled": true, "dev": true, "optional": true }, "tough-cookie": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "bundled": true, "dev": true, "optional": true }, "tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "bundled": true, "dev": true, "optional": true }, "tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "bundled": true, "dev": true, "optional": true }, "uid-number": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "bundled": true, "dev": true, "optional": true }, "util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "bundled": true, "dev": true }, "uuid": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "bundled": true, "dev": true, "optional": true }, "verror": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "bundled": true, "dev": true, "optional": true }, "wide-align": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "bundled": true, "dev": true, "optional": true }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "bundled": true, "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", @@ -2221,15 +2101,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "dependencies": { - "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 - } - } + "dev": true }, "got": { "version": "5.7.1", @@ -2269,6 +2141,12 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -2297,9 +2175,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", - "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" }, "http-errors": { "version": "1.6.1", @@ -2312,10 +2190,18 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" }, "husky": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.1.tgz", - "integrity": "sha512-y9tvOU2s1FnYl0UoOsKMwuByay0wu3NgKeD8hD9lXQcZhatpr4Td5K3DC4j/AYI/0PvXvR0OoFdOjMPGzEbAAQ==", - "dev": true + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.2.tgz", + "integrity": "sha512-okPabyq6yMnec3sRGYBPItL5QLwiJPc13pJAI92hCBp1ay5pAix6sVWmD9HLDHQD8HPS0WekC/0FXb0fTBMTeQ==", + "dev": true, + "dependencies": { + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + } + } }, "iconv-lite": { "version": "0.4.15", @@ -2353,21 +2239,7 @@ "version": "0.12.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "dev": true, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - } - } + "dev": true }, "interpret": { "version": "1.0.3", @@ -2579,15 +2451,21 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, + "jest-docblock": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-20.0.3.tgz", + "integrity": "sha1-F76phDQswz2DxQ++FUXqDvqkRxI=", + "dev": true + }, "jju": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=" }, "js-tokens": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "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": { @@ -2711,12 +2589,19 @@ "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, "dependencies": { - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" + "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 } } }, @@ -2778,6 +2663,12 @@ "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", "dev": true }, + "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.create": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", @@ -2863,7 +2754,14 @@ "method-override": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.9.tgz", - "integrity": "sha1-vRUfLONM8Bp2ykAKuVwBKxAtj3E=" + "integrity": "sha1-vRUfLONM8Bp2ykAKuVwBKxAtj3E=", + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + } + } }, "methods": { "version": "1.1.2", @@ -2875,22 +2773,12 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, - "optional": true, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true - } - } + "optional": true }, "mime": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", - "dev": true + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" }, "mime-db": { "version": "1.27.0", @@ -2930,6 +2818,12 @@ "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", "dev": true, "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true + }, "debug": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", @@ -2959,7 +2853,14 @@ "morgan": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", - "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=" + "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=", + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=" + } + } }, "ms": { "version": "2.0.0", @@ -2996,15 +2897,16 @@ "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" }, "normalize-package-data": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", - "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==" }, "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true }, "number-is-nan": { "version": "1.0.1", @@ -3086,15 +2988,19 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", - "dev": true, - "dependencies": { - "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 - } - } + "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 }, "package-json": { "version": "2.4.0", @@ -3177,6 +3083,12 @@ "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", "dev": true }, + "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 + }, "pkg-ok": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pkg-ok/-/pkg-ok-1.1.0.tgz", @@ -3206,6 +3118,12 @@ "dev": true, "optional": true }, + "prettier": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.5.2.tgz", + "integrity": "sha512-f55mvineQ5yc36cLX4n4RWP6JH6MLcfi5f9MVsjpfBs4MVSG2GYT4v6cukzmvkIOvmNOdCZfDSMY3hQcMcDQbQ==", + "dev": true + }, "private": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", @@ -3291,11 +3209,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "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=" } } }, @@ -3315,9 +3228,9 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" }, "readable-stream": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.2.tgz", - "integrity": "sha1-WgTfBeT1f+Pw3Gj90R3FyXx+b00=" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==" }, "readdirp": { "version": "2.1.0", @@ -3440,19 +3353,7 @@ "request": { "version": "2.81.0", "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dependencies": { - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - } - } + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" }, "require-directory": { "version": "2.1.1", @@ -3530,19 +3431,7 @@ "send": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", - "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=", - "dependencies": { - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" - }, - "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" - } - } + "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=" }, "serve-static": { "version": "1.12.3", @@ -3665,7 +3554,51 @@ "version": "8.6.0", "resolved": "https://registry.npmjs.org/standard/-/standard-8.6.0.tgz", "integrity": "sha1-Y1Eyvnv7VnwpIQBfMPnjUOR1Kq0=", - "dev": true + "dev": true, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + }, + "eslint": { + "version": "3.10.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.10.2.tgz", + "integrity": "sha1-yaEOi/bp1lZRIEd4xQM0Hx6sPOc=", + "dev": true + }, + "eslint-config-standard": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-6.2.1.tgz", + "integrity": "sha1-06aKr8cZFjnn7kQec0hzkCY1QpI=", + "dev": true + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "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": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "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 + } + } }, "standard-engine": { "version": "5.2.0", @@ -3692,16 +3625,9 @@ "integrity": "sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=" }, "string_decoder": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", - "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=", - "dependencies": { - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" - } - } + "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==" }, "string-width": { "version": "1.0.2", @@ -3719,10 +3645,9 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" }, "strip-color": { "version": "0.1.0", @@ -3737,10 +3662,9 @@ "dev": true }, "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, "superagent": { "version": "3.5.2", @@ -3765,10 +3689,10 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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": { @@ -3777,16 +3701,16 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "string-width": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.0.tgz", + "integrity": "sha1-AwZkVh/BRslCPsfZeP4kV0N/5tA=", "dev": true }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true } } @@ -3795,7 +3719,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-2.1.0.tgz", "integrity": "sha1-WYkJGODvCdVIqqNC9L00CdhATpY=", - "dev": true + "dev": true, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + } + } }, "text-table": { "version": "0.2.0", @@ -3932,9 +3864,9 @@ "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" }, "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "v8flags": { "version": "2.1.1", diff --git a/package.json b/package.json index 98c3b2b..8101d17 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,21 @@ "babel-preset-env": "^1.3.2", "babel-register": "^6.16.3", "cross-env": "^2.0.1", + "eslint": "^3.19.0", + "eslint-config-prettier": "^2.3.0", + "eslint-config-standard": "^10.2.1", + "eslint-plugin-import": "^2.6.1", + "eslint-plugin-node": "^5.1.0", + "eslint-plugin-prettier": "^2.1.2", + "eslint-plugin-promise": "^3.5.0", + "eslint-plugin-standard": "^3.0.1", "husky": "^0.14.1", "markdown-toc": "^0.13.0", "mkdirp": "^0.5.1", "mocha": "^3.2.0", "os-tmpdir": "^1.0.1", "pkg-ok": "^1.0.1", + "prettier": "^1.5.2", "rimraf": "^2.5.2", "server-ready": "^0.3.1", "standard": "^8.3.0", @@ -47,14 +56,15 @@ "temp-write": "^2.1.0" }, "scripts": { - "test": "npm run test:cli && npm run test:server && standard", + "test": "npm run test:cli && npm run test:server && eslint .", "test:cli": "npm run build && cross-env NODE_ENV=test mocha test/cli/*.js", "test:server": "cross-env NODE_ENV=test mocha test/server/*.js", "start": "babel-node src/cli/bin", - "precommit": "npm test", + "format": "eslint . --fix", "build": "babel src -d lib --copy-files", "toc": "markdown-toc -i README.md", - "prepublishOnly": "npm run build && pkg-ok" + "prepublishOnly": "npm run build && pkg-ok", + "precommit": "npm test" }, "repository": { "type": "git", diff --git a/src/cli/index.js b/src/cli/index.js index f72fc0c..ba26c76 100644 --- a/src/cli/index.js +++ b/src/cli/index.js @@ -3,7 +3,7 @@ const yargs = require('yargs') const run = require('./run') const pkg = require('../../package.json') -module.exports = function () { +module.exports = function() { updateNotifier({ pkg }).notify() const argv = yargs @@ -83,14 +83,15 @@ module.exports = function () { .boolean('quiet') .boolean('no-cors') .boolean('no-gzip') - .help('help').alias('help', 'h') - .version(pkg.version).alias('version', 'v') + .help('help') + .alias('help', 'h') + .version(pkg.version) + .alias('version', 'v') .example('$0 db.json', '') .example('$0 file.js', '') .example('$0 http://example.com/db.json', '') .epilog('https://github.com/typicode/json-server') - .require(1, 'Missing argument') - .argv + .require(1, 'Missing argument').argv run(argv) } diff --git a/src/cli/run.js b/src/cli/run.js index feeb498..c811cd9 100644 --- a/src/cli/run.js +++ b/src/cli/run.js @@ -10,7 +10,7 @@ const load = require('./utils/load') const example = require('./example.json') const jsonServer = require('../server') -function prettyPrint (argv, object, rules) { +function prettyPrint(argv, object, rules) { const host = argv.host === '0.0.0.0' ? 'localhost' : argv.host const port = argv.port const root = `http://${host}:${port}` @@ -35,7 +35,7 @@ function prettyPrint (argv, object, rules) { console.log() } -function createApp (source, object, routes, middlewares, argv) { +function createApp(source, object, routes, middlewares, argv) { const app = jsonServer.create() let router @@ -86,7 +86,7 @@ function createApp (source, object, routes, middlewares, argv) { return app } -module.exports = function (argv) { +module.exports = function(argv) { const source = argv._[0] let app let server @@ -104,7 +104,7 @@ module.exports = function (argv) { console.log() console.log(chalk.cyan(' \\{^_^}/ hi!')) - function start (cb) { + function start(cb) { console.log() // Be nice and create a default db.json if it doesn't exist @@ -131,7 +131,7 @@ module.exports = function (argv) { // Load middlewares let middlewares if (argv.middlewares) { - middlewares = argv.middlewares.map(function (m) { + middlewares = argv.middlewares.map(function(m) { console.log(chalk.gray(' Loading', m)) return require(path.resolve(m)) }) @@ -158,7 +158,9 @@ module.exports = function (argv) { start(() => { // Snapshot console.log( - chalk.gray(' Type s + enter at any time to create a snapshot of the database') + chalk.gray( + ' Type s + enter at any time to create a snapshot of the database' + ) ) // Support nohup @@ -168,13 +170,15 @@ module.exports = function (argv) { console.log(` Creating a snapshot from the CLI won't be possible`) }) process.stdin.setEncoding('utf8') - process.stdin.on('data', (chunk) => { + process.stdin.on('data', chunk => { if (chunk.trim().toLowerCase() === 's') { const filename = 'db-' + Date.now() + '.json' const file = path.join(argv.snapshots, filename) const state = app.db.getState() fs.writeFileSync(file, JSON.stringify(state, null, 2), 'utf-8') - console.log(` Saved snapshot to ${path.relative(process.cwd(), file)}\n`) + console.log( + ` Saved snapshot to ${path.relative(process.cwd(), file)}\n` + ) } }) @@ -185,7 +189,7 @@ module.exports = function (argv) { const source = argv._[0] // Can't watch URL - if (is.URL(source)) throw new Error('Can\'t watch URL') + if (is.URL(source)) throw new Error("Can't watch URL") // Watch .js or .json file // Since lowdb uses atomic writing, directory is watched instead of file @@ -231,7 +235,9 @@ module.exports = function (argv) { if (file) { const watchedFile = path.resolve(watchedDir, file) if (watchedFile === path.resolve(argv.routes)) { - console.log(chalk.gray(` ${argv.routes} has changed, reloading...`)) + console.log( + chalk.gray(` ${argv.routes} has changed, reloading...`) + ) server && server.destroy() start() } diff --git a/src/cli/utils/is.js b/src/cli/utils/is.js index 2f5b8df..41ff75b 100644 --- a/src/cli/utils/is.js +++ b/src/cli/utils/is.js @@ -4,14 +4,14 @@ module.exports = { URL } -function JSON (s) { +function JSON(s) { return !URL(s) && /\.json$/.test(s) } -function JS (s) { +function JS(s) { return !URL(s) && /\.js$/.test(s) } -function URL (s) { +function URL(s) { return /^(http|https):/.test(s) } diff --git a/src/cli/utils/load.js b/src/cli/utils/load.js index 27d2767..8cb26d6 100644 --- a/src/cli/utils/load.js +++ b/src/cli/utils/load.js @@ -4,7 +4,7 @@ const low = require('lowdb') const fileAsync = require('lowdb/lib/storages/file-async') const is = require('./is') -module.exports = function (source, cb) { +module.exports = function(source, cb) { if (is.URL(source)) { // Load remote data const opts = { @@ -23,7 +23,9 @@ module.exports = function (source, cb) { const dataFn = require(filename) if (typeof dataFn !== 'function') { - throw new Error('The database is a JavaScript file but the export is not a function.') + throw new Error( + 'The database is a JavaScript file but the export is not a function.' + ) } // Run dataFn to generate data diff --git a/src/server/body-parser.js b/src/server/body-parser.js index eeeda21..59daf24 100644 --- a/src/server/body-parser.js +++ b/src/server/body-parser.js @@ -1,6 +1,6 @@ const bodyParser = require('body-parser') module.exports = [ - bodyParser.json({limit: '10mb', extended: false}), - bodyParser.urlencoded({extended: false}) + bodyParser.json({ limit: '10mb', extended: false }), + bodyParser.urlencoded({ extended: false }) ] diff --git a/src/server/defaults.js b/src/server/defaults.js index 44265a3..9dc56ad 100644 --- a/src/server/defaults.js +++ b/src/server/defaults.js @@ -7,12 +7,10 @@ const compression = require('compression') const errorhandler = require('errorhandler') const objectAssign = require('object-assign') -module.exports = function (opts) { +module.exports = function(opts) { const userDir = path.join(process.cwd(), 'public') const defaultDir = path.join(__dirname, 'public') - const staticDir = fs.existsSync(userDir) - ? userDir - : defaultDir + const staticDir = fs.existsSync(userDir) ? userDir : defaultDir opts = objectAssign({ logger: true, static: staticDir }, opts) @@ -27,10 +25,8 @@ module.exports = function (opts) { if (opts.logger) { arr.push( logger('dev', { - skip: (req) => ( - process.env.NODE_ENV === 'test' || - req.path === '/favicon.ico' - ) + skip: req => + process.env.NODE_ENV === 'test' || req.path === '/favicon.ico' }) ) } diff --git a/src/server/mixins.js b/src/server/mixins.js index 3d9632e..b1a999e 100644 --- a/src/server/mixins.js +++ b/src/server/mixins.js @@ -9,16 +9,18 @@ module.exports = { // Returns document ids that have unsatisfied relations // Example: a comment that references a post that doesn't exist -function getRemovable (db, opts) { +function getRemovable(db, opts) { const _ = this const removable = [] _.each(db, (coll, collName) => { - _.each(coll, (doc) => { + _.each(coll, doc => { _.each(doc, (value, key) => { if (new RegExp(`${opts.foreignKeySuffix}$`).test(key)) { // Remove foreign key suffix and pluralize it // Example postId -> posts - const refName = pluralize.plural(key.replace(new RegExp(`${opts.foreignKeySuffix}$`), '')) + const refName = pluralize.plural( + key.replace(new RegExp(`${opts.foreignKeySuffix}$`), '') + ) // Test if table exists if (db[refName]) { // Test if references is defined in table @@ -37,7 +39,7 @@ function getRemovable (db, opts) { // Return incremented id or uuid // Used to override lodash-id's createId with utils.createId -function createId (coll) { +function createId(coll) { const _ = this const idProperty = _.__id() if (_.isEmpty(coll)) { @@ -46,13 +48,11 @@ function createId (coll) { let id = _(coll).maxBy(idProperty)[idProperty] // Increment integer id or generate string id - return _.isFinite(id) - ? ++id - : shortid.generate() + return _.isFinite(id) ? ++id : shortid.generate() } } -function deepQuery (value, q) { +function deepQuery(value, q) { const _ = this if (value && q) { if (_.isArray(value)) { diff --git a/src/server/public/main.js b/src/server/public/main.js index 270ef55..626e470 100644 --- a/src/server/public/main.js +++ b/src/server/public/main.js @@ -3,68 +3,55 @@ // Resource list var db = {} -m.request('db').then(function (data) { +m.request('db').then(function(data) { db = data }) -m.mount( - document.getElementById('resources'), - { - view: function () { - var keys = Object.keys(db) - var resourceList = ( - m( - 'ul', - keys - .map(function (key) { - return m('li', [ - m('a', { href: key }, '/' + key), - m('sup', Array.isArray(db[key]) - ? ' ' + db[key].length + 'x' - : ' object' - ) - ]) - }) - .concat([ - m('a', { href: 'db' }, '/db'), - m('sup', m('em', ' state')) - ]) - ) - ) +m.mount(document.getElementById('resources'), { + view: function() { + var keys = Object.keys(db) + var resourceList = m( + 'ul', + keys + .map(function(key) { + return m('li', [ + m('a', { href: key }, '/' + key), + m( + 'sup', + Array.isArray(db[key]) ? ' ' + db[key].length + 'x' : ' object' + ) + ]) + }) + .concat([m('a', { href: 'db' }, '/db'), m('sup', m('em', ' state'))]) + ) - return [ - m('h4', 'Resources'), - keys.length - ? resourceList - : m('p', 'No resources found') - ] - } + return [ + m('h4', 'Resources'), + keys.length ? resourceList : m('p', 'No resources found') + ] } -) +}) // Custom routes var customRoutes = {} -m.request('__rules').then(function (data) { +m.request('__rules').then(function(data) { customRoutes = data }) -m.mount( - document.getElementById('custom-routes'), - { - view: function () { - var rules = Object.keys(customRoutes) - if (rules.length) { - return [ - m('h4', 'Custom routes'), - m('table', rules.map(function (rule) { - return m('tr', [ - m('td', rule), - m('td', '⇢ ' + customRoutes[rule]) - ]) - })) - ] - } +m.mount(document.getElementById('custom-routes'), { + view: function() { + var rules = Object.keys(customRoutes) + if (rules.length) { + return [ + m('h4', 'Custom routes'), + m( + 'table', + rules.map(function(rule) { + return m('tr', [m('td', rule), m('td', '⇢ ' + customRoutes[rule])]) + }) + ) + ] } } -) +}) diff --git a/src/server/rewriter.js b/src/server/rewriter.js index d7f3c74..b88afd5 100644 --- a/src/server/rewriter.js +++ b/src/server/rewriter.js @@ -1,17 +1,19 @@ const express = require('express') const url = require('url') const _ = require('lodash') -function updateQueryString (target, sourceUrl) { - return ~sourceUrl.indexOf('?') ? _.assign(target, url.parse(sourceUrl, true).query) : {} +function updateQueryString(target, sourceUrl) { + return ~sourceUrl.indexOf('?') + ? _.assign(target, url.parse(sourceUrl, true).query) + : {} } -module.exports = (routes) => { +module.exports = routes => { const router = express.Router() router.get('/__rules', (req, res) => { res.json(routes) }) - Object.keys(routes).forEach((route) => { + Object.keys(routes).forEach(route => { if (route.indexOf(':') !== -1) { router.all(route, (req, res, next) => { // Rewrite target url using params diff --git a/src/server/router/get-full-url.js b/src/server/router/get-full-url.js index 19cd41b..cb620a9 100644 --- a/src/server/router/get-full-url.js +++ b/src/server/router/get-full-url.js @@ -1,6 +1,6 @@ const url = require('url') -module.exports = function getFullURL (req) { +module.exports = function getFullURL(req) { const root = url.format({ protocol: req.protocol, host: req.get('host') diff --git a/src/server/router/index.js b/src/server/router/index.js index a4da0b2..f6370c8 100644 --- a/src/server/router/index.js +++ b/src/server/router/index.js @@ -53,24 +53,27 @@ module.exports = (source, opts = { foreignKeySuffix: 'Id' }) => { router.use(nested(opts)) // Create routes - db.forEach((value, key) => { - if (_.isPlainObject(value)) { - router.use(`/${key}`, singular(db, key)) - return - } + db + .forEach((value, key) => { + if (_.isPlainObject(value)) { + router.use(`/${key}`, singular(db, key)) + return + } - if (_.isArray(value)) { - router.use(`/${key}`, plural(db, key, opts)) - return - } + if (_.isArray(value)) { + router.use(`/${key}`, plural(db, key, opts)) + return + } - const msg = - `Type of "${key}" (${typeof value}) ` + - (_.isObject(source) ? '' : `in ${source}`) + ' is not supported. ' + - 'Use objects or arrays of objects.' + const msg = + `Type of "${key}" (${typeof value}) ` + + (_.isObject(source) ? '' : `in ${source}`) + + ' is not supported. ' + + 'Use objects or arrays of objects.' - throw new Error(msg) - }).value() + throw new Error(msg) + }) + .value() router.use((req, res) => { if (!res.locals.data) { diff --git a/src/server/router/nested.js b/src/server/router/nested.js index 46ddef3..ca5a72d 100644 --- a/src/server/router/nested.js +++ b/src/server/router/nested.js @@ -1,11 +1,11 @@ const express = require('express') const pluralize = require('pluralize') -module.exports = (opts) => { +module.exports = opts => { const router = express.Router() // Rewrite URL (/:resource/:id/:nested -> /:nested) and request query - function get (req, res, next) { + function get(req, res, next) { const prop = pluralize.singular(req.params.resource) req.query[`${prop}${opts.foreignKeySuffix}`] = req.params.id req.url = `/${req.params.nested}` @@ -13,7 +13,7 @@ module.exports = (opts) => { } // Rewrite URL (/:resource/:id/:nested -> /:nested) and request body - function post (req, res, next) { + function post(req, res, next) { const prop = pluralize.singular(req.params.resource) req.body[`${prop}${opts.foreignKeySuffix}`] = req.params.id req.url = `/${req.params.nested}` diff --git a/src/server/router/plural.js b/src/server/router/plural.js index 9d0574a..da7194c 100644 --- a/src/server/router/plural.js +++ b/src/server/router/plural.js @@ -10,26 +10,32 @@ module.exports = (db, name, opts) => { const router = express.Router() // Embed function used in GET /name and GET /name/id - function embed (resource, e) { - e && [].concat(e) - .forEach((externalResource) => { + function embed(resource, e) { + e && + [].concat(e).forEach(externalResource => { if (db.get(externalResource).value) { const query = {} const singularResource = pluralize.singular(name) query[`${singularResource}${opts.foreignKeySuffix}`] = resource.id - resource[externalResource] = db.get(externalResource).filter(query).value() + resource[externalResource] = db + .get(externalResource) + .filter(query) + .value() } }) } // Expand function used in GET /name and GET /name/id - function expand (resource, e) { - e && [].concat(e) - .forEach((innerResource) => { + function expand(resource, e) { + e && + [].concat(e).forEach(innerResource => { const plural = pluralize(innerResource) if (db.get(plural).value()) { const prop = `${innerResource}${opts.foreignKeySuffix}` - resource[innerResource] = db.get(plural).getById(resource[prop]).value() + resource[innerResource] = db + .get(plural) + .getById(resource[prop]) + .value() } }) } @@ -40,7 +46,7 @@ module.exports = (db, name, opts) => { // GET /name?_end=& // GET /name?_start=&_end=& // GET /name?_embed=&_expand= - function list (req, res, next) { + function list(req, res, next) { // Resource chain let chain = db.get(name) @@ -66,7 +72,7 @@ module.exports = (db, name, opts) => { // Automatically delete query parameters that can't be found // in the database - Object.keys(req.query).forEach((query) => { + Object.keys(req.query).forEach(query => { const arr = db.get(name).value() for (let i in arr) { if ( @@ -77,7 +83,8 @@ module.exports = (db, name, opts) => { /_gte$/.test(query) || /_ne$/.test(query) || /_like$/.test(query) - ) return + ) + return } delete req.query[query] }) @@ -90,7 +97,7 @@ module.exports = (db, name, opts) => { q = q.toLowerCase() - chain = chain.filter((obj) => { + chain = chain.filter(obj => { for (let key in obj) { const value = obj[key] if (db._.deepQuery(value, q)) { @@ -100,16 +107,16 @@ module.exports = (db, name, opts) => { }) } - Object.keys(req.query).forEach((key) => { + Object.keys(req.query).forEach(key => { // Don't take into account JSONP query parameters // jQuery adds a '_' query parameter too if (key !== 'callback' && key !== '_') { // Always use an array, in case req.query is an array const arr = [].concat(req.query[key]) - chain = chain.filter((element) => { + chain = chain.filter(element => { return arr - .map(function (value) { + .map(function(value) { const isDifferent = /_ne$/.test(key) const isRange = /_lte$/.test(key) || /_gte$/.test(key) const isLike = /_like$/.test(key) @@ -152,7 +159,10 @@ module.exports = (db, name, opts) => { // Slice result if (_end || _limit || _page) { res.setHeader('X-Total-Count', chain.size()) - res.setHeader('Access-Control-Expose-Headers', 'X-Total-Count' + (_page ? ', Link' : '')) + res.setHeader( + 'Access-Control-Expose-Headers', + 'X-Total-Count' + (_page ? ', Link' : '') + ) } if (_page) { @@ -164,19 +174,31 @@ module.exports = (db, name, opts) => { const fullURL = getFullURL(req) if (page.first) { - links.first = fullURL.replace('page=' + page.current, 'page=' + page.first) + links.first = fullURL.replace( + 'page=' + page.current, + 'page=' + page.first + ) } if (page.prev) { - links.prev = fullURL.replace('page=' + page.current, 'page=' + page.prev) + links.prev = fullURL.replace( + 'page=' + page.current, + 'page=' + page.prev + ) } if (page.next) { - links.next = fullURL.replace('page=' + page.current, 'page=' + page.next) + links.next = fullURL.replace( + 'page=' + page.current, + 'page=' + page.next + ) } if (page.last) { - links.last = fullURL.replace('page=' + page.current, 'page=' + page.last) + links.last = fullURL.replace( + 'page=' + page.current, + 'page=' + page.last + ) } res.links(links) @@ -192,12 +214,10 @@ module.exports = (db, name, opts) => { } // embed and expand - chain = chain - .cloneDeep() - .forEach(function (element) { - embed(element, _embed) - expand(element, _expand) - }) + chain = chain.cloneDeep().forEach(function(element) { + embed(element, _embed) + expand(element, _expand) + }) res.locals.data = chain.value() next() @@ -205,12 +225,10 @@ module.exports = (db, name, opts) => { // GET /name/:id // GET /name/:id?_embed=&_expand - function show (req, res, next) { + function show(req, res, next) { const _embed = req.query._embed const _expand = req.query._expand - const resource = db.get(name) - .getById(req.params.id) - .value() + const resource = db.get(name).getById(req.params.id).value() if (resource) { // Clone resource to avoid making changes to the underlying object @@ -231,11 +249,8 @@ module.exports = (db, name, opts) => { } // POST /name - function create (req, res, next) { - const resource = db - .get(name) - .insert(req.body) - .value() + function create(req, res, next) { + const resource = db.get(name).insert(req.body).value() res.setHeader('Access-Control-Expose-Headers', 'Location') res.location(`${getFullURL(req)}/${resource.id}`) @@ -248,13 +263,14 @@ module.exports = (db, name, opts) => { // PUT /name/:id // PATCH /name/:id - function update (req, res, next) { + function update(req, res, next) { const id = req.params.id let chain = db.get(name) - chain = req.method === 'PATCH' - ? chain.updateById(id, req.body) - : chain.replaceById(id, req.body) + chain = + req.method === 'PATCH' + ? chain.updateById(id, req.body) + : chain.replaceById(id, req.body) const resource = chain.value() @@ -266,19 +282,15 @@ module.exports = (db, name, opts) => { } // DELETE /name/:id - function destroy (req, res, next) { - const resource = db.get(name) - .removeById(req.params.id) - .value() + function destroy(req, res, next) { + const resource = db.get(name).removeById(req.params.id).value() // Remove dependents documents - console.log({opts}) + console.log({ opts }) const removable = db._.getRemovable(db.getState(), opts) console.log(removable) - removable.forEach((item) => { - db.get(item.name) - .removeById(item.id) - .value() + removable.forEach(item => { + db.get(item.name).removeById(item.id).value() }) if (resource) { @@ -290,11 +302,10 @@ module.exports = (db, name, opts) => { const w = write(db) - router.route('/') - .get(list) - .post(create, w) + router.route('/').get(list).post(create, w) - router.route('/:id') + router + .route('/:id') .get(show) .put(update, w) .patch(update, w) diff --git a/src/server/router/singular.js b/src/server/router/singular.js index 0ef3356..cbf5a7d 100644 --- a/src/server/router/singular.js +++ b/src/server/router/singular.js @@ -5,12 +5,12 @@ const getFullURL = require('./get-full-url') module.exports = (db, name) => { const router = express.Router() - function show (req, res, next) { + function show(req, res, next) { res.locals.data = db.get(name).value() next() } - function create (req, res, next) { + function create(req, res, next) { db.set(name, req.body).value() res.locals.data = db.get(name).value() @@ -21,14 +21,11 @@ module.exports = (db, name) => { next() } - function update (req, res, next) { + function update(req, res, next) { if (req.method === 'PUT') { - db.set(name, req.body) - .value() + db.set(name, req.body).value() } else { - db.get(name) - .assign(req.body) - .value() + db.get(name).assign(req.body).value() } res.locals.data = db.get(name).value() @@ -37,11 +34,7 @@ module.exports = (db, name) => { const w = write(db) - router.route('/') - .get(show) - .post(create, w) - .put(update, w) - .patch(update, w) + router.route('/').get(show).post(create, w).put(update, w).patch(update, w) return router } diff --git a/src/server/router/validate-data.js b/src/server/router/validate-data.js index ebdc155..e764146 100644 --- a/src/server/router/validate-data.js +++ b/src/server/router/validate-data.js @@ -1,26 +1,24 @@ const _ = require('lodash') -function validateKey (key) { +function validateKey(key) { if (key.indexOf('/') !== -1) { const msg = [ `Oops, found / character in database property '${key}'.`, '', - '/ aren\'t supported, if you want to tweak default routes, see', + "/ aren't supported, if you want to tweak default routes, see", 'https://github.com/typicode/json-server/#add-custom-routes' ].join('\n') throw new Error(msg) } } -module.exports = (obj) => { +module.exports = obj => { if (_.isPlainObject(obj)) { - Object - .keys(obj) - .forEach(validateKey) + Object.keys(obj).forEach(validateKey) } else { throw new Error( `Data must be an object. Found ${typeof obj}.` + - 'See https://github.com/typicode/json-server for example.' + 'See https://github.com/typicode/json-server for example.' ) } } diff --git a/src/server/router/write.js b/src/server/router/write.js index 19378b5..9d70a02 100644 --- a/src/server/router/write.js +++ b/src/server/router/write.js @@ -1,4 +1,4 @@ -module.exports = function write (db) { +module.exports = function write(db) { return (req, res, next) => { db.write() next() diff --git a/src/server/utils.js b/src/server/utils.js index f7a5c9a..3339e72 100644 --- a/src/server/utils.js +++ b/src/server/utils.js @@ -2,7 +2,7 @@ module.exports = { getPage } -function getPage (array, page, perPage) { +function getPage(array, page, perPage) { var obj = {} var start = (page - 1) * perPage var end = page * perPage diff --git a/test/cli/fixtures/middlewares/en.js b/test/cli/fixtures/middlewares/en.js index 8799d00..997d01b 100644 --- a/test/cli/fixtures/middlewares/en.js +++ b/test/cli/fixtures/middlewares/en.js @@ -1,4 +1,4 @@ -module.exports = function (req, res, next) { +module.exports = function(req, res, next) { res.header('X-Hello', 'World') next() } diff --git a/test/cli/fixtures/middlewares/jp.js b/test/cli/fixtures/middlewares/jp.js index 4df4d16..427994f 100644 --- a/test/cli/fixtures/middlewares/jp.js +++ b/test/cli/fixtures/middlewares/jp.js @@ -1,4 +1,4 @@ -module.exports = function (req, res, next) { +module.exports = function(req, res, next) { res.header('X-Konnichiwa', 'Sekai') next() } diff --git a/test/cli/fixtures/seed.js b/test/cli/fixtures/seed.js index 93b90f3..38a4848 100644 --- a/test/cli/fixtures/seed.js +++ b/test/cli/fixtures/seed.js @@ -1,29 +1,37 @@ // Need some fake data for the gzip test to work -module.exports = function () { - return { posts: [ - { - id: 1, - content: "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" - }, - { - id: 2, - content: "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" - }, - { - id: 3, - content: "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" - }, - { - id: 4, - content: "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" - }, - { - id: 5, - content: "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" - }, - { - id: 6, - content: "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" - } - ]} +module.exports = function() { + return { + posts: [ + { + id: 1, + content: + "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" + }, + { + id: 2, + content: + "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" + }, + { + id: 3, + content: + "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" + }, + { + id: 4, + content: + "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" + }, + { + id: 5, + content: + "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" + }, + { + id: 6, + content: + "Oh! The garbage chute was a really wonderful idea. What an incredible smell you've discovered! Let's get out of here! Get away from there... No! wait! Will you forget it? I already tried it. It's magnetically sealed! Put that thing away! You're going to get us all killed. Absolutely, Your Worship. Look, I had everything under control until you led us down here. You know, it's not going to take them long to figure out what happened to us. It could be worst... It's worst. There's something alive in here! That's your imagination. Something just moves past my leg! Look! Did you see that? What? Help!" + } + ] + } } diff --git a/test/cli/index.js b/test/cli/index.js index 989863a..b4d110d 100644 --- a/test/cli/index.js +++ b/test/cli/index.js @@ -19,7 +19,7 @@ const middlewareFiles = { const bin = path.join(__dirname, '../../lib/cli/bin') -function cli (args) { +function cli(args) { return cp.spawn('node', ['--', bin, '-p', PORT].concat(args), { cwd: __dirname, stdio: ['pipe', process.stdout, process.stderr] @@ -35,13 +35,8 @@ describe('cli', () => { beforeEach(() => { dbFile = tempWrite.sync( JSON.stringify({ - posts: [ - { id: 1 }, - { _id: 2 } - ], - comments: [ - { id: 1, post_id: 1 } - ] + posts: [{ id: 1 }, { _id: 2 }], + comments: [{ id: 1, post_id: 1 }] }), 'db.json' ) @@ -60,72 +55,82 @@ describe('cli', () => { }) describe('db.json', () => { - beforeEach((done) => { - child = cli([ dbFile ]) + beforeEach(done => { + child = cli([dbFile]) serverReady(PORT, done) }) - it('should support JSON file', (done) => { + it('should support JSON file', done => { request.get('/posts').expect(200, done) }) - it('should send CORS headers', (done) => { + it('should send CORS headers', done => { const origin = 'http://example.com' - request.get('/posts') + request + .get('/posts') .set('Origin', origin) .expect('access-control-allow-origin', origin) .expect(200, done) }) - it('should update JSON file', (done) => { - request.post('/posts') - .send({ title: 'hello' }) - .end(() => { - setTimeout(() => { - const str = fs.readFileSync(dbFile, 'utf8') - assert(str.indexOf('hello') !== -1) - done() - }, 1000) - }) + it('should update JSON file', done => { + request.post('/posts').send({ title: 'hello' }).end(() => { + setTimeout(() => { + const str = fs.readFileSync(dbFile, 'utf8') + assert(str.indexOf('hello') !== -1) + done() + }, 1000) + }) }) }) describe('seed.js', () => { - beforeEach((done) => { - child = cli([ 'fixtures/seed.js' ]) + beforeEach(done => { + child = cli(['fixtures/seed.js']) serverReady(PORT, done) }) - it('should support JS file', (done) => { + it('should support JS file', done => { request.get('/posts').expect(200, done) }) }) describe('http://localhost:8080/db', () => { - beforeEach((done) => { + beforeEach(done => { const fakeServer = express() fakeServer.get('/db', (req, res) => { res.jsonp({ posts: [] }) }) fakeServer.listen(8080, () => { - child = cli([ 'http://localhost:8080/db' ]) + child = cli(['http://localhost:8080/db']) serverReady(PORT, done) }) }) - it('should support URL file', (done) => { + it('should support URL file', done => { request.get('/posts').expect(200, done) }) }) describe('db.json -r routes.json -m middleware.js -i _id --foreignKeySuffix _id --read-only', () => { - beforeEach((done) => { - child = cli([ dbFile, '-r', routesFile, '-m', middlewareFiles.en, '-i', '_id', '--read-only', '--foreignKeySuffix', '_id' ]) + beforeEach(done => { + child = cli([ + dbFile, + '-r', + routesFile, + '-m', + middlewareFiles.en, + '-i', + '_id', + '--read-only', + '--foreignKeySuffix', + '_id' + ]) serverReady(PORT, done) }) - it('should use routes.json and _id as the identifier', (done) => { + it('should use routes.json and _id as the identifier', done => { request.get('/blog/posts/2').expect(200, done) }) @@ -134,43 +139,40 @@ describe('cli', () => { assert.equal(response.body.length, 1) }) - it('should apply middlewares', (done) => { + it('should apply middlewares', done => { request.get('/blog/posts/2').expect('X-Hello', 'World', done) }) - it('should allow only GET requests', (done) => { + it('should allow only GET requests', done => { request.post('/blog/posts').expect(403, done) }) }) describe('db.json -m first-middleware.js second-middleware.js', () => { - beforeEach((done) => { - child = cli([ dbFile, '-m', middlewareFiles.en, middlewareFiles.jp ]) + beforeEach(done => { + child = cli([dbFile, '-m', middlewareFiles.en, middlewareFiles.jp]) serverReady(PORT, done) }) - it('should apply all middlewares', (done) => { - request.get('/posts') + it('should apply all middlewares', done => { + request + .get('/posts') .expect('X-Hello', 'World') .expect('X-Konnichiwa', 'Sekai', done) }) }) describe('db.json -d 1000', () => { - beforeEach((done) => { - child = cli([ dbFile, '-d', 1000 ]) + beforeEach(done => { + child = cli([dbFile, '-d', 1000]) serverReady(PORT, done) }) - it('should delay response', (done) => { + it('should delay response', done => { const start = new Date() - request.get('/posts').expect(200, function (err) { + request.get('/posts').expect(200, function(err) { const end = new Date() - done( - end - start > 1000 - ? err - : new Error('Request wasn\'t delayed') - ) + done(end - start > 1000 ? err : new Error("Request wasn't delayed")) }) }) }) @@ -179,18 +181,18 @@ describe('cli', () => { const snapshotsDir = path.join(osTmpdir(), 'snapshots') const publicDir = 'fixtures/public' - beforeEach((done) => { + beforeEach(done => { rimraf.sync(snapshotsDir) mkdirp.sync(snapshotsDir) - child = cli([ dbFile, '-s', publicDir, '-S', snapshotsDir ]) + child = cli([dbFile, '-s', publicDir, '-S', snapshotsDir]) serverReady(PORT, () => { child.stdin.write('s\n') setTimeout(done, 100) }) }) - it('should serve fixtures/public', (done) => { + it('should serve fixtures/public', done => { request.get('/').expect(/Hello/, done) }) @@ -200,21 +202,23 @@ describe('cli', () => { }) describe('fixtures/seed.json --no-cors=true', () => { - beforeEach((done) => { - child = cli([ 'fixtures/seed.js', '--no-cors=true' ]) + beforeEach(done => { + child = cli(['fixtures/seed.js', '--no-cors=true']) serverReady(PORT, done) }) - it('should not send Access-Control-Allow-Origin headers', (done) => { + it('should not send Access-Control-Allow-Origin headers', done => { const origin = 'http://example.com' - request.get('/posts') + request + .get('/posts') .set('Origin', origin) .expect(200) .end((err, res) => { if (err) { done(err) - } if ('access-control-allow-origin' in res.headers) { + } + if ('access-control-allow-origin' in res.headers) { done(new Error('CORS headers were not excluded from response')) } else { done() @@ -224,40 +228,38 @@ describe('cli', () => { }) describe('fixtures/seed.json --no-gzip=true', () => { - beforeEach((done) => { - child = cli([ 'fixtures/seed.js', '--no-gzip=true' ]) + beforeEach(done => { + child = cli(['fixtures/seed.js', '--no-gzip=true']) serverReady(PORT, done) }) - it('should not set Content-Encoding to gzip', (done) => { - request.get('/posts') - .expect(200) - .end(function (err, res) { - if (err) { - done(err) - } else if ('content-encoding' in res.headers) { - done(new Error('Content-Encoding is set to gzip')) - } else { - done() - } - }) + it('should not set Content-Encoding to gzip', done => { + request.get('/posts').expect(200).end(function(err, res) { + if (err) { + done(err) + } else if ('content-encoding' in res.headers) { + done(new Error('Content-Encoding is set to gzip')) + } else { + done() + } + }) }) }) describe('--watch db.json -r routes.json', () => { - beforeEach((done) => { - child = cli([ dbFile, '-r', routesFile, '--watch' ]) + beforeEach(done => { + child = cli([dbFile, '-r', routesFile, '--watch']) serverReady(PORT, done) }) - it('should watch db file', (done) => { + it('should watch db file', done => { fs.writeFileSync(dbFile, JSON.stringify({ foo: [] })) setTimeout(() => { request.get('/foo').expect(200, done) }, 1000) }) - it('should watch routes file', (done) => { + it('should watch routes file', done => { fs.writeFileSync(routesFile, JSON.stringify({ '/api/': '/' })) setTimeout(() => { request.get('/api/posts').expect(200, done) @@ -266,28 +268,25 @@ describe('cli', () => { }) describe('non existent db.json', () => { - beforeEach((done) => { + beforeEach(done => { fs.unlinkSync(dbFile) - child = cli([ dbFile ]) + child = cli([dbFile]) serverReady(PORT, done) }) - it('should create JSON file if it doesn\'t exist', (done) => { + it("should create JSON file if it doesn't exist", done => { request.get('/posts').expect(200, done) }) }) describe('db.json with error', () => { beforeEach(() => { - dbFile = tempWrite.sync( - JSON.stringify({ 'a/b': [] }), - 'db-error.json' - ) + dbFile = tempWrite.sync(JSON.stringify({ 'a/b': [] }), 'db-error.json') }) - it('should exit with an error', (done) => { - child = cli([ dbFile ]) - child.on('exit', (code) => { + it('should exit with an error', done => { + child = cli([dbFile]) + child.on('exit', code => { if (code === 1) { return done() } diff --git a/test/server/mixins.js b/test/server/mixins.js index 5ab0a90..1e463c9 100644 --- a/test/server/mixins.js +++ b/test/server/mixins.js @@ -13,19 +13,14 @@ describe('mixins', () => { beforeEach(() => { db = { - posts: [ - { id: 1, comment: 1 } - ], + posts: [{ id: 1, comment: 1 }], comments: [ { id: 1, postId: 1 }, // Comments below references a post that doesn't exist { id: 2, postId: 2 }, { id: 3, postId: 2 } ], - photos: [ - { id: '1' }, - { id: '2' } - ] + photos: [{ id: '1' }, { id: '2' }] } }) diff --git a/test/server/plural-with-custom-foreign-key.js b/test/server/plural-with-custom-foreign-key.js index 7e7b136..7bdd91e 100644 --- a/test/server/plural-with-custom-foreign-key.js +++ b/test/server/plural-with-custom-foreign-key.js @@ -11,10 +11,7 @@ describe('Server with custom foreign key', () => { beforeEach(() => { db = {} - db.posts = [ - { id: 1, body: 'foo' }, - { id: 2, body: 'bar' } - ] + db.posts = [{ id: 1, body: 'foo' }, { id: 2, body: 'bar' }] db.comments = [ { id: 1, post_id: 1 }, @@ -29,33 +26,28 @@ describe('Server with custom foreign key', () => { }) describe('GET /:parent/:parentId/:resource', () => { - it('should respond with json and corresponding nested resources', () => ( + it('should respond with json and corresponding nested resources', () => request(server) .get('/posts/1/comments') .expect('Content-Type', /json/) - .expect([ - db.comments[0], - db.comments[1] - ]) - .expect(200) - )) + .expect([db.comments[0], db.comments[1]]) + .expect(200)) }) describe('GET /:resource/:id', () => { - it('should respond with json and corresponding resource', () => ( + it('should respond with json and corresponding resource', () => request(server) .get('/posts/1') .expect('Content-Type', /json/) .expect(db.posts[0]) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?_embed=', () => { it('should respond with corresponding resources and embedded resources', () => { const posts = _.cloneDeep(db.posts) - posts[0].comments = [ db.comments[0], db.comments[1] ] - posts[1].comments = [ db.comments[2] ] + posts[0].comments = [db.comments[0], db.comments[1]] + posts[1].comments = [db.comments[2]] return request(server) .get('/posts?_embed=comments') .expect('Content-Type', /json/) @@ -67,7 +59,7 @@ describe('Server with custom foreign key', () => { describe('GET /:resource/:id?_embed=', () => { it('should respond with corresponding resources and embedded resources', () => { const post = _.cloneDeep(db.posts[0]) - post.comments = [ db.comments[0], db.comments[1] ] + post.comments = [db.comments[0], db.comments[1]] return request(server) .get('/posts/1?_embed=comments') .expect('Content-Type', /json/) @@ -103,22 +95,18 @@ describe('Server with custom foreign key', () => { }) describe('POST /:parent/:parentId/:resource', () => { - it('should respond with json and set parentId', () => ( + it('should respond with json and set parentId', () => request(server) .post('/posts/1/comments') - .send({body: 'foo'}) + .send({ body: 'foo' }) .expect('Content-Type', /json/) - .expect({id: 4, post_id: 1, body: 'foo'}) - .expect(201) - )) + .expect({ id: 4, post_id: 1, body: 'foo' }) + .expect(201)) }) describe('DELETE /:resource/:id', () => { it('should respond with empty data, destroy resource and dependent resources', async () => { - await request(server) - .del('/posts/1') - .expect({}) - .expect(200) + await request(server).del('/posts/1').expect({}).expect(200) assert.equal(db.posts.length, 1) assert.equal(db.comments.length, 1) }) diff --git a/test/server/plural.js b/test/server/plural.js index 0d92232..66c0576 100644 --- a/test/server/plural.js +++ b/test/server/plural.js @@ -18,10 +18,7 @@ describe('Server', () => { beforeEach(() => { db = {} - db.posts = [ - { id: 1, body: 'foo' }, - { id: 2, body: 'bar' } - ] + db.posts = [{ id: 1, body: 'foo' }, { id: 2, body: 'bar' }] db.tags = [ { id: 1, body: 'Technology' }, @@ -58,19 +55,14 @@ describe('Server', () => { { id: 'abcd-1234', url: 'http://example.com', postId: 1, userId: 1 } ] - db.stringIds = [ - { id: '1234' } - ] + db.stringIds = [{ id: '1234' }] - db.deep = [ - { a: { b: 1 } }, - { a: 1 } - ] + db.deep = [{ a: { b: 1 } }, { a: 1 }] db.nested = [ - { resource: {name: 'dewey'} }, - { resource: {name: 'cheatem'} }, - { resource: {name: 'howe'} } + { resource: { name: 'dewey' } }, + { resource: { name: 'cheatem' } }, + { resource: { name: 'howe' } } ] db.list = [ @@ -99,17 +91,16 @@ describe('Server', () => { }) describe('GET /db', () => { - it('should respond with json and full database', () => ( + it('should respond with json and full database', () => request(server) .get('/db') .expect('Content-Type', /json/) .expect(db) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource', () => { - it('should respond with json and corresponding resources', () => ( + it('should respond with json and corresponding resources', () => request(server) .get('/posts') .set('Origin', 'http://example.com') @@ -117,64 +108,54 @@ describe('Server', () => { .expect('Access-Control-Allow-Credentials', 'true') .expect('Access-Control-Allow-Origin', 'http://example.com') .expect(db.posts) - .expect(200) - )) + .expect(200)) - it('should respond with 404 if resource is not found', () => ( - request(server) - .get('/undefined') - .expect(404) - )) + it('should respond with 404 if resource is not found', () => + request(server).get('/undefined').expect(404)) }) describe('GET /:resource?attr=&attr=', () => { - it('should respond with json and filter resources', () => ( + it('should respond with json and filter resources', () => request(server) .get('/comments?postId=1&published=true') .expect('Content-Type', /json/) - .expect([ db.comments[0] ]) - .expect(200) - )) + .expect([db.comments[0]]) + .expect(200)) - it('should be strict', () => ( + it('should be strict', () => request(server) .get('/users?tel=123') .expect('Content-Type', /json/) - .expect([ db.users[1] ]) - .expect(200) - )) + .expect([db.users[1]]) + .expect(200)) - it('should support multiple filters', () => ( + it('should support multiple filters', () => request(server) .get('/comments?id=1&id=2') .expect('Content-Type', /json/) - .expect([ db.comments[0], db.comments[1] ]) - .expect(200) - )) + .expect([db.comments[0], db.comments[1]]) + .expect(200)) - it('should support deep filter', () => ( + it('should support deep filter', () => request(server) .get('/deep?a.b=1') .expect('Content-Type', /json/) - .expect([ db.deep[0] ]) - .expect(200) - )) + .expect([db.deep[0]]) + .expect(200)) - it('should ignore JSONP query parameters callback and _ ', () => ( + it('should ignore JSONP query parameters callback and _ ', () => request(server) .get('/comments?callback=1&_=1') .expect('Content-Type', /text/) .expect(new RegExp(db.comments[0].body)) // JSONP returns text - .expect(200) - )) + .expect(200)) - it('should ignore unknown query parameters', () => ( + it('should ignore unknown query parameters', () => request(server) .get('/comments?foo=1&bar=2') .expect('Content-Type', /json/) .expect(db.comments) - .expect(200) - )) + .expect(200)) // https://github.com/typicode/json-server/issues/510 it('should not fail with null value', () => { @@ -182,153 +163,144 @@ describe('Server', () => { return request(server) .get('/posts?body=foo') .expect('Content-Type', /json/) - .expect([ db.posts[0] ]) + .expect([db.posts[0]]) .expect(200) }) }) describe('GET /:resource?q=', () => { - it('should respond with json and make a full-text search', () => ( + it('should respond with json and make a full-text search', () => request(server) .get('/tags?q=pho') .expect('Content-Type', /json/) - .expect([ db.tags[1], db.tags[2] ]) - .expect(200) - )) + .expect([db.tags[1], db.tags[2]]) + .expect(200)) - it('should respond with json and make a deep full-text search', () => ( + it('should respond with json and make a deep full-text search', () => request(server) .get('/deep?q=1') .expect('Content-Type', /json/) .expect(db.deep) - .expect(200) - )) + .expect(200)) - it('should return an empty array when nothing is matched', () => ( + it('should return an empty array when nothing is matched', () => request(server) .get('/tags?q=nope') .expect('Content-Type', /json/) - .expect([ ]) - .expect(200) - )) + .expect([]) + .expect(200)) - it('should support other query parameters', () => ( + it('should support other query parameters', () => request(server) .get('/comments?q=qu&published=true') .expect('Content-Type', /json/) - .expect([ db.comments[3] ]) - .expect(200) - )) + .expect([db.comments[3]]) + .expect(200)) - it('should ignore duplicate q query parameters', () => ( + it('should ignore duplicate q query parameters', () => request(server) .get('/comments?q=foo&q=bar') .expect('Content-Type', /json/) - .expect([ db.comments[0] ]) - .expect(200) - )) + .expect([db.comments[0]]) + .expect(200)) - it('should support filtering by boolean value false', () => ( + it('should support filtering by boolean value false', () => request(server) .get('/comments?published=false') .expect('Content-Type', /json/) - .expect([ db.comments[1], db.comments[2], db.comments[4] ]) - .expect(200) - )) + .expect([db.comments[1], db.comments[2], db.comments[4]]) + .expect(200)) }) describe('GET /:resource?_end=', () => { - it('should respond with a sliced array', () => ( + it('should respond with a sliced array', () => request(server) .get('/comments?_end=2') .expect('Content-Type', /json/) .expect('x-total-count', db.comments.length.toString()) .expect('Access-Control-Expose-Headers', 'X-Total-Count') .expect(db.comments.slice(0, 2)) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?_sort=', () => { - it('should respond with json and sort on a field', () => ( + it('should respond with json and sort on a field', () => request(server) .get('/tags?_sort=body') .expect('Content-Type', /json/) - .expect([ db.tags[1], db.tags[0], db.tags[2] ]) - .expect(200) - )) + .expect([db.tags[1], db.tags[0], db.tags[2]]) + .expect(200)) - it('should reverse sorting with _order=DESC', () => ( + it('should reverse sorting with _order=DESC', () => request(server) .get('/tags?_sort=body&_order=DESC') .expect('Content-Type', /json/) - .expect([ db.tags[2], db.tags[0], db.tags[1] ]) - .expect(200) - )) + .expect([db.tags[2], db.tags[0], db.tags[1]]) + .expect(200)) - it('should sort on numerical field', () => ( + it('should sort on numerical field', () => request(server) .get('/posts?_sort=id&_order=DESC') .expect('Content-Type', /json/) .expect(db.posts.reverse()) - .expect(200) - )) + .expect(200)) - it('should sort on nested field', () => ( + it('should sort on nested field', () => request(server) .get('/nested?_sort=resource.name') .expect('Content-Type', /json/) - .expect([ db.nested[1], db.nested[0], db.nested[2] ]) - .expect(200) - )) + .expect([db.nested[1], db.nested[0], db.nested[2]]) + .expect(200)) - it('should sort on multiple fields', () => ( + it('should sort on multiple fields', () => request(server) .get('/buyers?_sort=country,total&_order=asc,desc') .expect('Content-Type', /json/) .expect([ - db.buyers[8], db.buyers[7], db.buyers[6], - db.buyers[3], db.buyers[4], db.buyers[5], - db.buyers[2], db.buyers[1], db.buyers[0] + db.buyers[8], + db.buyers[7], + db.buyers[6], + db.buyers[3], + db.buyers[4], + db.buyers[5], + db.buyers[2], + db.buyers[1], + db.buyers[0] ]) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?_start=&_end=', () => { - it('should respond with a sliced array', () => ( + it('should respond with a sliced array', () => request(server) .get('/comments?_start=1&_end=2') .expect('Content-Type', /json/) .expect('X-Total-Count', db.comments.length.toString()) .expect('Access-Control-Expose-Headers', 'X-Total-Count') .expect(db.comments.slice(1, 2)) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?_start=&_limit=', () => { - it('should respond with a limited array', () => ( + it('should respond with a limited array', () => request(server) .get('/comments?_start=1&_limit=1') .expect('Content-Type', /json/) .expect('X-Total-Count', db.comments.length.toString()) .expect('Access-Control-Expose-Headers', 'X-Total-Count') .expect(db.comments.slice(1, 2)) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?_page=', () => { - it('should paginate', () => ( + it('should paginate', () => request(server) .get('/list?_page=2') .expect('Content-Type', /json/) .expect('x-total-count', db.list.length.toString()) .expect('Access-Control-Expose-Headers', 'X-Total-Count, Link') .expect(db.list.slice(10, 20)) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?_page=&_limit=', () => { @@ -352,90 +324,76 @@ describe('Server', () => { }) describe('GET /:resource?attr_gte=&attr_lte=', () => { - it('should respond with a limited array', () => ( + it('should respond with a limited array', () => request(server) .get('/comments?id_gte=2&id_lte=3') .expect('Content-Type', /json/) .expect(db.comments.slice(1, 3)) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?attr_ne=', () => { - it('should respond with a limited array', () => ( + it('should respond with a limited array', () => request(server) .get('/comments?id_ne=1') .expect('Content-Type', /json/) .expect(db.comments.slice(1)) - .expect(200) - )) + .expect(200)) }) describe('GET /:resource?attr_like=', () => { - it('should respond with an array that matches the like operator (case insensitive)', () => ( + it('should respond with an array that matches the like operator (case insensitive)', () => request(server) .get('/tags?body_like=photo') .expect('Content-Type', /json/) - .expect([ - db.tags[1], - db.tags[2] - ]) - .expect(200) - )) + .expect([db.tags[1], db.tags[2]]) + .expect(200)) }) describe('GET /:parent/:parentId/:resource', () => { - it('should respond with json and corresponding nested resources', () => ( + it('should respond with json and corresponding nested resources', () => request(server) .get('/posts/1/comments') .expect('Content-Type', /json/) - .expect([ - db.comments[0], - db.comments[1] - ]) - .expect(200) - )) + .expect([db.comments[0], db.comments[1]]) + .expect(200)) }) describe('GET /:resource/:id', () => { - it('should respond with json and corresponding resource', () => ( + it('should respond with json and corresponding resource', () => request(server) .get('/posts/1') .expect('Content-Type', /json/) .expect(db.posts[0]) - .expect(200) - )) + .expect(200)) - it('should support string id, respond with json and corresponding resource', () => ( + it('should support string id, respond with json and corresponding resource', () => request(server) .get('/refs/abcd-1234') .expect('Content-Type', /json/) .expect(db.refs[0]) - .expect(200) - )) + .expect(200)) - it('should support integer id as string', () => ( + it('should support integer id as string', () => request(server) .get('/stringIds/1234') .expect('Content-Type', /json/) .expect(db.stringIds[0]) - .expect(200) - )) + .expect(200)) - it('should respond with 404 if resource is not found', () => ( + it('should respond with 404 if resource is not found', () => request(server) .get('/posts/9001') .expect('Content-Type', /json/) .expect({}) - .expect(404) - )) + .expect(404)) }) describe('GET /:resource?_embed=', () => { it('should respond with corresponding resources and embedded resources', () => { const posts = _.cloneDeep(db.posts) - posts[0].comments = [ db.comments[0], db.comments[1] ] - posts[1].comments = [ db.comments[2], db.comments[3], db.comments[4] ] + posts[0].comments = [db.comments[0], db.comments[1]] + posts[1].comments = [db.comments[2], db.comments[3], db.comments[4]] return request(server) .get('/posts?_embed=comments') .expect('Content-Type', /json/) @@ -447,9 +405,9 @@ describe('Server', () => { describe('GET /:resource?_embed&_embed=', () => { it('should respond with corresponding resources and embedded resources', () => { const posts = _.cloneDeep(db.posts) - posts[0].comments = [ db.comments[0], db.comments[1] ] - posts[0].refs = [ db.refs[0] ] - posts[1].comments = [ db.comments[2], db.comments[3], db.comments[4] ] + posts[0].comments = [db.comments[0], db.comments[1]] + posts[0].refs = [db.refs[0]] + posts[1].comments = [db.comments[2], db.comments[3], db.comments[4]] posts[1].refs = [] return request(server) .get('/posts?_embed=comments&_embed=refs') @@ -462,7 +420,7 @@ describe('Server', () => { describe('GET /:resource/:id?_embed=', () => { it('should respond with corresponding resources and embedded resources', () => { const post = _.cloneDeep(db.posts[0]) - post.comments = [ db.comments[0], db.comments[1] ] + post.comments = [db.comments[0], db.comments[1]] return request(server) .get('/posts/1?_embed=comments') .expect('Content-Type', /json/) @@ -474,7 +432,7 @@ describe('Server', () => { describe('GET /:resource/:id?_embed=&_embed=', () => { it('should respond with corresponding resource and embedded resources', () => { const post = _.cloneDeep(db.posts[0]) - post.comments = [ db.comments[0], db.comments[1] ] + post.comments = [db.comments[0], db.comments[1]] post.refs = [db.refs[0]] return request(server) .get('/posts/1?_embed=comments&_embed=refs') @@ -538,11 +496,11 @@ describe('Server', () => { it('should respond with json, create a resource and increment id', async () => { await request(server) .post('/posts') - .send({body: 'foo', booleanValue: true, integerValue: 1}) + .send({ body: 'foo', booleanValue: true, integerValue: 1 }) .expect('Access-Control-Expose-Headers', 'Location') .expect('Location', /posts\/3$/) .expect('Content-Type', /json/) - .expect({id: 3, body: 'foo', booleanValue: true, integerValue: 1}) + .expect({ id: 3, body: 'foo', booleanValue: true, integerValue: 1 }) .expect(201) assert.equal(db.posts.length, 3) }) @@ -551,10 +509,10 @@ describe('Server', () => { await request(server) .post('/posts') .type('form') - .send({body: 'foo', booleanValue: true, integerValue: 1}) + .send({ body: 'foo', booleanValue: true, integerValue: 1 }) .expect('Content-Type', /json/) // x-www-form-urlencoded will convert to string - .expect({id: 3, body: 'foo', booleanValue: 'true', integerValue: '1'}) + .expect({ id: 3, body: 'foo', booleanValue: 'true', integerValue: '1' }) .expect(201) assert.equal(db.posts.length, 3) }) @@ -562,7 +520,7 @@ describe('Server', () => { it('should respond with json, create a resource and generate string id', async () => { await request(server) .post('/refs') - .send({url: 'http://foo.com', postId: '1'}) + .send({ url: 'http://foo.com', postId: '1' }) .expect('Content-Type', /json/) .expect(201) assert.equal(db.refs.length, 2) @@ -570,19 +528,18 @@ describe('Server', () => { }) describe('POST /:parent/:parentId/:resource', () => { - it('should respond with json and set parentId', () => ( + it('should respond with json and set parentId', () => request(server) .post('/posts/1/comments') - .send({body: 'foo'}) + .send({ body: 'foo' }) .expect('Content-Type', /json/) - .expect({id: 6, postId: 1, body: 'foo'}) - .expect(201) - )) + .expect({ id: 6, postId: 1, body: 'foo' }) + .expect(201)) }) describe('PUT /:resource/:id', () => { it('should respond with json and replace resource', async () => { - const post = {id: 1, booleanValue: true, integerValue: 1} + const post = { id: 1, booleanValue: true, integerValue: 1 } const res = await request(server) .put('/posts/1') .set('Accept', 'application/json') @@ -598,20 +555,19 @@ describe('Server', () => { assert.deepStrictEqual(db.posts[0], post) }) - it('should respond with 404 if resource is not found', () => ( + it('should respond with 404 if resource is not found', () => request(server) .put('/posts/9001') - .send({id: 1, body: 'bar'}) + .send({ id: 1, body: 'bar' }) .expect('Content-Type', /json/) .expect({}) - .expect(404) - )) + .expect(404)) }) describe('PATCH /:resource/:id', () => { it('should respond with json and update resource', async () => { - const partial = {body: 'bar'} - const post = {id: 1, body: 'bar'} + const partial = { body: 'bar' } + const post = { id: 1, body: 'bar' } const res = await request(server) .patch('/posts/1') .send(partial) @@ -623,61 +579,53 @@ describe('Server', () => { assert.deepStrictEqual(db.posts[0], post) }) - it('should respond with 404 if resource is not found', () => ( + it('should respond with 404 if resource is not found', () => request(server) .patch('/posts/9001') - .send({body: 'bar'}) + .send({ body: 'bar' }) .expect('Content-Type', /json/) .expect({}) - .expect(404) - )) + .expect(404)) }) describe('DELETE /:resource/:id', () => { it('should respond with empty data, destroy resource and dependent resources', async () => { - await request(server) - .del('/posts/1') - .expect({}) - .expect(200) + await request(server).del('/posts/1').expect({}).expect(200) assert.equal(db.posts.length, 1) assert.equal(db.comments.length, 3) }) - it('should respond with 404 if resource is not found', () => ( + it('should respond with 404 if resource is not found', () => request(server) .del('/posts/9001') .expect('Content-Type', /json/) .expect({}) - .expect(404) - )) + .expect(404)) }) describe('Static routes', () => { describe('GET /', () => { - it('should respond with html', () => ( + it('should respond with html', () => request(server) .get('/') .expect(/You're successfully running JSON Server/) - .expect(200) - )) + .expect(200)) }) describe('GET /main.js', () => { - it('should respond with js', () => ( + it('should respond with js', () => request(server) .get('/main.js') .expect('Content-Type', /javascript/) - .expect(200) - )) + .expect(200)) }) describe('GET /style.css', () => { - it('should respond with css', () => ( + it('should respond with css', () => request(server) .get('/style.css') .expect('Content-Type', /css/) - .expect(200) - )) + .expect(200)) }) }) @@ -688,41 +636,29 @@ describe('Server', () => { }) describe('Responses', () => { - it('should have no cache headers (for IE)', () => ( + it('should have no cache headers (for IE)', () => request(server) .get('/db') .expect('Cache-Control', 'no-cache') .expect('Pragma', 'no-cache') - .expect('Expires', '-1') - )) + .expect('Expires', '-1')) }) describe('Rewriter', () => { - it('should rewrite using prefix', () => ( - request(server) - .get('/api/posts/1') - .expect(db.posts[0]) - )) + it('should rewrite using prefix', () => + request(server).get('/api/posts/1').expect(db.posts[0])) - it('should rewrite using params', () => ( - request(server) - .get('/blog/posts/1/show') - .expect(db.posts[0]) - )) + it('should rewrite using params', () => + request(server).get('/blog/posts/1/show').expect(db.posts[0])) it('should rewrite using query without params', () => { const expectedPost = _.cloneDeep(db.posts[0]) - expectedPost.comments = [ db.comments[0], db.comments[1] ] - return request(server) - .get('/firstpostwithcomments') - .expect(expectedPost) + expectedPost.comments = [db.comments[0], db.comments[1]] + return request(server).get('/firstpostwithcomments').expect(expectedPost) }) - it('should rewrite using params and query', () => ( - request(server) - .get('/comments/special/1-quux') - .expect([db.comments[4]]) - )) + it('should rewrite using params and query', () => + request(server).get('/comments/special/1-quux').expect([db.comments[4]])) // TODO // it('should rewrite query params', () => ( @@ -732,11 +668,8 @@ describe('Server', () => { // .end(done) // }) - it('should expose routes', () => ( - request(server) - .get('/__rules') - .expect(rewriterRules) - )) + it('should expose routes', () => + request(server).get('/__rules').expect(rewriterRules)) }) describe('router.render', () => { @@ -746,41 +679,36 @@ describe('Server', () => { } }) - it('should be possible to wrap response', () => ( + it('should be possible to wrap response', () => request(server) .get('/posts/1') .expect('Content-Type', /json/) .expect({ data: db.posts[0] }) - .expect(200) - )) + .expect(200)) }) describe('router.db._.id', () => { beforeEach(() => { router.db.setState({ - posts: [ - { _id: 1 } - ] + posts: [{ _id: 1 }] }) router.db._.id = '_id' }) - it('should be possible to GET using a different id property', () => ( + it('should be possible to GET using a different id property', () => request(server) .get('/posts/1') .expect('Content-Type', /json/) .expect(router.db.getState().posts[0]) - .expect(200) - )) + .expect(200)) - it('should be possible to POST using a different id property', () => ( + it('should be possible to POST using a different id property', () => request(server) .post('/posts') .send({ body: 'hello' }) .expect('Content-Type', /json/) .expect({ _id: 2, body: 'hello' }) - .expect(201) - )) + .expect(201)) }) }) diff --git a/test/server/singular.js b/test/server/singular.js index 128d2c9..5f1ac14 100644 --- a/test/server/singular.js +++ b/test/server/singular.js @@ -21,43 +21,30 @@ describe('Server', () => { }) describe('GET /:resource', () => { - it('should respond with corresponding resource', () => ( - request(server) - .get('/user') - .expect(db.user) - .expect(200) - )) + it('should respond with corresponding resource', () => + request(server).get('/user').expect(db.user).expect(200)) }) describe('POST /:resource', () => { it('should create resource', () => { const user = { name: 'bar' } - return request(server) - .post('/user') - .send(user) - .expect(user) - .expect(201) + return request(server).post('/user').send(user).expect(user).expect(201) }) }) describe('PUT /:resource', () => { it('should update resource', () => { const user = { name: 'bar' } - return request(server) - .put('/user') - .send(user) - .expect(user) - .expect(200) + return request(server).put('/user').send(user).expect(user).expect(200) }) }) describe('PATCH /:resource', () => { - it('should update resource', () => ( + it('should update resource', () => request(server) .patch('/user') .send({ name: 'bar' }) .expect({ name: 'bar', email: 'foo@example.com' }) - .expect(200) - )) + .expect(200)) }) }) diff --git a/test/server/utils.js b/test/server/utils.js index e000361..1ded65c 100644 --- a/test/server/utils.js +++ b/test/server/utils.js @@ -7,70 +7,52 @@ describe('utils', () => { const perPage = 2 it('should return first page', () => { - assert.deepEqual( - utils.getPage(array, 1, perPage), - { - items: [1, 2], - current: 1, - first: 1, - next: 2, - last: 3 - } - ) + assert.deepEqual(utils.getPage(array, 1, perPage), { + items: [1, 2], + current: 1, + first: 1, + next: 2, + last: 3 + }) }) it('should return second page', () => { - assert.deepEqual( - utils.getPage(array, 2, perPage), - { - items: [3, 4], - current: 2, - first: 1, - prev: 1, - next: 3, - last: 3 - } - ) + assert.deepEqual(utils.getPage(array, 2, perPage), { + items: [3, 4], + current: 2, + first: 1, + prev: 1, + next: 3, + last: 3 + }) }) it('should return third page (last)', () => { - assert.deepEqual( - utils.getPage(array, 3, perPage), - { - items: [5], - current: 3, - first: 1, - prev: 2, - last: 3 - } - ) + assert.deepEqual(utils.getPage(array, 3, perPage), { + items: [5], + current: 3, + first: 1, + prev: 2, + last: 3 + }) }) it('should return an empty array if page is greater than the last page', () => { - assert.deepEqual( - utils.getPage(array, 99, perPage), - { - items: [] - } - ) + assert.deepEqual(utils.getPage(array, 99, perPage), { + items: [] + }) }) it('should return the array if perPage is greater than the array size', () => { - assert.deepEqual( - utils.getPage(array, 1, 99), - { - items: array - } - ) + assert.deepEqual(utils.getPage(array, 1, 99), { + items: array + }) }) it('should return an empty array if the array is empty', () => { - assert.deepEqual( - utils.getPage([], 1, 1), - { - items: [] - } - ) + assert.deepEqual(utils.getPage([], 1, 1), { + items: [] + }) }) }) }) diff --git a/test/server/validate-data.js b/test/server/validate-data.js index 8087215..00337c9 100644 --- a/test/server/validate-data.js +++ b/test/server/validate-data.js @@ -3,22 +3,14 @@ const validateData = require('../../src/server/router/validate-data') describe('validateData', () => { it('should throw an error if data contains /', () => { - assert.throws( - () => validateData({ 'a/b': [] }), - /found \// - ) + assert.throws(() => validateData({ 'a/b': [] }), /found \//) }) it('should throw an error if data is an array', () => { - assert.throws( - () => validateData([]), - /must be an object/ - ) + assert.throws(() => validateData([]), /must be an object/) }) - it('shouldn\'t throw an error', () => { - assert.doesNotThrow( - () => validateData({ a: [] }) - ) + it("shouldn't throw an error", () => { + assert.doesNotThrow(() => validateData({ a: [] })) }) })