From a91accbd3d1d9fbed638862a0311b592b2299b45 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 11 Jun 2017 18:18:05 +0200 Subject: [PATCH 01/95] adding babel --- .babelrc | 4 ++++ .gitignore | 2 ++ package-lock.json | 32 ++++++++++++++++++++++++++++++++ package.json | 2 ++ 4 files changed, 40 insertions(+) create mode 100644 .babelrc diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..d7eb80d --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": [], + "plugins": [] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index d175496..cd45877 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,5 @@ yarn.lock # VS Code Editor files .vscode *.orig + +dist/* diff --git a/package-lock.json b/package-lock.json index a87e342..4c8cfc4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -528,6 +528,12 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, + "babel-cli": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", + "integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=", + "dev": true + }, "babel-code-frame": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", @@ -2336,6 +2342,12 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5335,6 +5347,12 @@ } } }, + "output-file-sync": { + "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 + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -7212,6 +7230,20 @@ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", "dev": true }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "dependencies": { + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + } + } + }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", diff --git a/package.json b/package.json index 6404833..44d18f0 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "main": "index.js", "scripts": { "start": "node .", + "build": "babel src/**/*.js -d dist -w -s", "watch": "nodemon .", "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\"", "mocha": "node_modules/.bin/_mocha \"test/**/*.js\"", @@ -75,6 +76,7 @@ "winston-loggly": "1.3.1" }, "devDependencies": { + "babel-cli": "6.24.1", "chai": "4.0.1", "dirty-chai": "1.2.2", "eslint": "3.19.0", From 1323db6cf252da814f625525edb8dbc9637fd6e9 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 11 Jun 2017 18:20:25 +0200 Subject: [PATCH 02/95] removing source maps options, not needed. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44d18f0..fd4f17a 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "main": "index.js", "scripts": { "start": "node .", - "build": "babel src/**/*.js -d dist -w -s", + "build": "babel src/**/*.js -d dist -w", "watch": "nodemon .", "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\"", "mocha": "node_modules/.bin/_mocha \"test/**/*.js\"", From cac1a5660eca0116896fc8b904a407927eb7bcee Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 11 Jun 2017 19:14:26 +0200 Subject: [PATCH 03/95] Updating script to copile for es2017 to dist. --- .babelrc | 3 +-- package-lock.json | 6 ++++++ package.json | 5 +++-- index.js => src/index.js | 8 ++++---- 4 files changed, 14 insertions(+), 8 deletions(-) rename index.js => src/index.js (73%) diff --git a/.babelrc b/.babelrc index d7eb80d..e4656b4 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,3 @@ { - "presets": [], - "plugins": [] + "presets": ["es2017"] } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4c8cfc4..284fd65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -680,6 +680,12 @@ "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", "dev": true }, + "babel-preset-es2017": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", + "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", + "dev": true + }, "babel-register": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", diff --git a/package.json b/package.json index fd4f17a..584d1cd 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,10 @@ "version": "0.0.0", "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", - "main": "index.js", + "main": "dist/src/index.js", "scripts": { "start": "node .", - "build": "babel src/**/*.js -d dist -w", + "build": "babel src -d dist -w --copy-files", "watch": "nodemon .", "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\"", "mocha": "node_modules/.bin/_mocha \"test/**/*.js\"", @@ -77,6 +77,7 @@ }, "devDependencies": { "babel-cli": "6.24.1", + "babel-preset-es2017": "6.24.1", "chai": "4.0.1", "dirty-chai": "1.2.2", "eslint": "3.19.0", diff --git a/index.js b/src/index.js similarity index 73% rename from index.js rename to src/index.js index 33adb9d..f6bcce5 100644 --- a/index.js +++ b/src/index.js @@ -1,11 +1,11 @@ 'use strict'; -require('./config/init-nconf')('Api'); -require('./src/logging/index'); +require('./../config/init-nconf')('Api'); +require('./logging/index'); const util = require('util'); const config = require('nconf'); -const packageJson = require('./package.json'); +const packageJson = require('./../package.json'); const port = config.get('PORT'); -const createApp = require('./src/app.js'); +const createApp = require('./app.js'); createApp(function(err, app) { if (err) { From 7ab3dbb6ff95ce99eae09d29225e328437d4f63a Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 11 Jun 2017 19:15:17 +0200 Subject: [PATCH 04/95] fixing path. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 584d1cd..d19653b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", - "main": "dist/src/index.js", + "main": "dist/index.js", "scripts": { "start": "node .", "build": "babel src -d dist -w --copy-files", From 38059ac08b5ba2f84060375d88add9e95ee773f9 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 11 Jun 2017 19:43:22 +0200 Subject: [PATCH 05/95] Adding snyk test to CI process, updating .snyk tracking file. --- .snyk | 66 +++- package-lock.json | 767 +++++++++++++++++++++++----------------------- package.json | 10 +- 3 files changed, 461 insertions(+), 382 deletions(-) diff --git a/.snyk b/.snyk index e5029d7..1a1ffd3 100644 --- a/.snyk +++ b/.snyk @@ -1,9 +1,69 @@ -version: v1.5.2 -ignore: {} +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.7.1 +# ignores vulnerabilities until expiry date; change duration by modifying expiry date +ignore: + 'npm:brace-expansion:20170302': + - babel-cli > chokidar > fsevents > node-pre-gyp > tar-pack > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.710Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar-pack > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.712Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.719Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.721Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > tar-pack > tar > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.722Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar-pack > tar > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.725Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > tar > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.726Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.727Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > tar-pack > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.728Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar-pack > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.730Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > tar-pack > fstream-ignore > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.731Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar-pack > fstream-ignore > fstream > rimraf > glob > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.732Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > tar-pack > fstream-ignore > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.734Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar-pack > fstream-ignore > minimatch > brace-expansion: + reason: None given + expires: '2017-07-11T17:36:01.737Z' +# patches apply the minimum changes required to fix a vulnerability patch: 'npm:moment:20161019': - express-brute-mongo > moment: - patched: '2016-11-18T11:48:06.051Z' + patched: '2017-06-11T17:33:32.049Z' 'npm:request:20160119': - nodejs-dashboard > blessed-contrib > picture-tube > request: patched: '2016-11-18T11:48:06.051Z' + 'npm:ms:20170412': + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > tar-pack > debug > ms: + patched: '2017-06-11T17:33:32.049Z' + - babel-cli > chokidar > fsevents > node-pre-gyp > tar-pack > debug > ms: + patched: '2017-06-11T17:33:32.049Z' + - api-query-params > ava > ms: + patched: '2017-06-11T17:33:32.049Z' + - bcrypt > node-pre-gyp > tar-pack > debug > ms: + patched: '2017-06-11T17:33:32.049Z' + 'npm:qs:20170213': + - babel-cli > chokidar > fsevents > node-pre-gyp > request > qs: + patched: '2017-06-11T17:33:32.049Z' + - api-query-params > ava > chokidar > fsevents > node-pre-gyp > request > qs: + patched: '2017-06-11T17:33:32.049Z' diff --git a/package-lock.json b/package-lock.json index a87e342..27dc866 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,21 @@ "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=" }, "@ava/babel-preset-stage-4": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.0.0.tgz", - "integrity": "sha1-phO14VL1KTBUIlRrBy1H+s+yYpE=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.1.0.tgz", + "integrity": "sha512-oWqTnIGXW3k72UFidXzW0ONlO7hnO9x02S/QReJ7NBGeiBH9cUHY9+EfV6C8PXC6YJH++WrliEq03wMSJGNZFg==", + "dependencies": { + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=" + }, + "package-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", + "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=" + } + } }, "@ava/babel-preset-transform-test-files": { "version": "3.0.0", @@ -111,6 +123,23 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" + } + } + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", @@ -141,263 +170,7 @@ "api-query-params": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/api-query-params/-/api-query-params-4.4.0.tgz", - "integrity": "sha512-oj8DCXP06+OzSs2M2EdP65MjddiNRH6eAgFarG5lVVZYPGEOSh4syu31Rv5xA68bpMqQ5mXWmG2YA3rvVcxohQ==", - "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=" - }, - "auto-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.1.0.tgz", - "integrity": "sha1-k7hk3H7gGjJigXddXHXKCnUeWWE=" - }, - "ava": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/ava/-/ava-0.19.1.tgz", - "integrity": "sha1-Q92CQ1rRmzmA/8okiPBdqrlAsnM=" - }, - "ava-init": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.0.tgz", - "integrity": "sha1-kwTItMNX1m49/a4fv/R7EZnVxV0=" - }, - "boxen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz", - "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=" - }, - "cli-spinners": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", - "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=" - }, - "cli-truncate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.0.0.tgz", - "integrity": "sha1-IeuR9Hs/ZWDwBNt3p2m0Zo2cVRg=" - }, - "configstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", - "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=" - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" - }, - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" - }, - "execa": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.5.1.tgz", - "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" - }, - "get-port": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.1.0.tgz", - "integrity": "sha1-7wGxioTKZIaXD/meVERhQac//T4=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=" - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } - } - }, - "indent-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", - "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=" - }, - "lazy-req": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", - "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=" - }, - "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=" - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" - }, - "observable-to-promise": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", - "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=" - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=" - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" - }, - "pkg-conf": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", - "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" - }, - "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=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=" - }, - "stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - } - } - }, - "symbol-observable": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", - "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "update-notifier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", - "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=" - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" - }, - "write-json-file": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.2.0.tgz", - "integrity": "sha1-UYYlBruzthnu+reFnx/WxtBTCHY=" - }, - "write-pkg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-2.1.0.tgz", - "integrity": "sha1-NTqkTDnEjCFED1wIzmq9RhQcnAg=" - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - } - } + "integrity": "sha512-oj8DCXP06+OzSs2M2EdP65MjddiNRH6eAgFarG5lVVZYPGEOSh4syu31Rv5xA68bpMqQ5mXWmG2YA3rvVcxohQ==" }, "aproba": { "version": "1.1.2", @@ -420,11 +193,6 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=" }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=" - }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -512,12 +280,128 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "auto-bind": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.1.0.tgz", + "integrity": "sha1-k7hk3H7gGjJigXddXHXKCnUeWWE=" + }, "autolinker": { "version": "0.15.3", "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=", "dev": true }, + "ava": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/ava/-/ava-0.19.1.tgz", + "integrity": "sha1-Q92CQ1rRmzmA/8okiPBdqrlAsnM=", + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=" + }, + "cli-spinners": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", + "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=" + }, + "dot-prop": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=" + }, + "indent-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", + "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + } + } + } + } + }, + "ava-init": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.0.tgz", + "integrity": "sha1-kwTItMNX1m49/a4fv/R7EZnVxV0=", + "dependencies": { + "execa": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.5.1.tgz", + "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=" + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=" + }, + "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=" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" + }, + "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=" + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, "aws-sign2": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", @@ -534,14 +418,38 @@ "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=" }, "babel-core": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", - "integrity": "sha1-jEKFZNzh4fQfszfsNPTDsCK1rYM=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "dependencies": { + "babel-traverse": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" + }, + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" + } + } }, "babel-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", - "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "dependencies": { + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } }, "babel-helper-builder-binary-assignment-operator-visitor": { "version": "6.24.1", @@ -685,9 +593,21 @@ "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=" }, "babel-template": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", - "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "dependencies": { + "babel-traverse": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" + }, + "babel-types": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" + } + } }, "babel-traverse": { "version": "6.24.1", @@ -823,6 +743,28 @@ "integrity": "sha1-Fp3kAYcR+ZQkK/+agAnneh814AM=", "dev": true }, + "boxen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz", + "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" + } + } + }, "brace": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/brace/-/brace-0.7.0.tgz", @@ -884,7 +826,14 @@ "caching-transform": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=" + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dependencies": { + "md5-hex": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=" + } + } }, "call-matcher": { "version": "1.0.1", @@ -1049,6 +998,23 @@ "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", "dev": true }, + "cli-truncate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.0.0.tgz", + "integrity": "sha1-IeuR9Hs/ZWDwBNt3p2m0Zo2cVRg=", + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" + } + } + }, "cli-width": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", @@ -1124,43 +1090,6 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, - "codecov": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-2.2.0.tgz", - "integrity": "sha1-LQaBfOuIkeymNog21Ptr9swE/9E=", - "dependencies": { - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=" - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=" - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" - } - } - }, "color-convert": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", @@ -1571,6 +1500,11 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, "diff-match-patch": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", @@ -2964,6 +2898,11 @@ "resolved": "https://registry.npmjs.org/get-parameter-names/-/get-parameter-names-0.3.0.tgz", "integrity": "sha1-LSI3zVkubFuFmrLv2rQ18Ajlu5c=" }, + "get-port": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.1.0.tgz", + "integrity": "sha1-7wGxioTKZIaXD/meVERhQac//T4=" + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -2972,8 +2911,7 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "getbase": { "version": "2.8.2", @@ -3002,8 +2940,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" }, "glob-base": { "version": "0.3.0", @@ -3035,14 +2972,7 @@ "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" - } - } + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=" }, "got": { "version": "5.7.1", @@ -3283,9 +3213,9 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" }, "hullabaloo-config-manager": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.0.tgz", - "integrity": "sha512-Y73/Famlt4ZESK0x/qDhC/lmJ73A92kAIIDgvHgiQ+anSlf5nfdMMVaNrfFrh/X6R0BBjp3aE/bAYZdRtvVv6A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", + "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==", "dependencies": { "dot-prop": { "version": "4.1.1", @@ -3302,16 +3232,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=" - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=" - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -3376,6 +3296,11 @@ "integrity": "sha1-IAgH8Rqw9ycQ6khVQt4IgHX2jNI=", "dev": true }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3801,14 +3726,7 @@ "jest-diff": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-19.0.0.tgz", - "integrity": "sha1-0VY8/FbItgIymI+8BdTRbtkPBjw=", - "dependencies": { - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" - } - } + "integrity": "sha1-0VY8/FbItgIymI+8BdTRbtkPBjw=" }, "jest-docblock": { "version": "20.0.3", @@ -3844,14 +3762,12 @@ "jest-util": { "version": "19.0.2", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-19.0.2.tgz", - "integrity": "sha1-4KAjKiq55rK1Nmi9s1NMK1l37UE=", - "dependencies": { - "jest-validate": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-19.0.2.tgz", - "integrity": "sha1-3FNN9fEnjVtj3zKxQkHU2/ckTAw=" - } - } + "integrity": "sha1-4KAjKiq55rK1Nmi9s1NMK1l37UE=" + }, + "jest-validate": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-19.0.2.tgz", + "integrity": "sha1-3FNN9fEnjVtj3zKxQkHU2/ckTAw=" }, "jodid25519": { "version": "1.0.2", @@ -3881,9 +3797,9 @@ "optional": true }, "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" }, "jshint": { "version": "2.9.4", @@ -4345,9 +4261,9 @@ "integrity": "sha1-7yDL3mTCTFDMYa9bg+4LG4/wAQE=" }, "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", + "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=" }, "md5-o-matic": { "version": "0.1.1", @@ -5209,6 +5125,18 @@ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=" }, + "observable-to-promise": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/observable-to-promise/-/observable-to-promise-0.5.0.tgz", + "integrity": "sha1-yCjw8NxH6fhq+KSXfF1VB2znqR8=", + "dependencies": { + "symbol-observable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz", + "integrity": "sha1-Kb9hXUqnEhvdiYsi1LP5vE4qoD0=" + } + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -5351,9 +5279,9 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" }, "package-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", - "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", + "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=" }, "package-json": { "version": "2.4.0", @@ -5481,6 +5409,28 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" }, + "pkg-conf": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", + "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" + }, + "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=" + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, "pkg-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", @@ -6023,14 +5973,7 @@ "regjsparser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=" }, "release-zalgo": { "version": "1.0.0", @@ -6633,6 +6576,11 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=" + }, "stackframe": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", @@ -7160,6 +7108,58 @@ "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", "dev": true }, + "update-notifier": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", + "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", + "dependencies": { + "configstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", + "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=" + }, + "dot-prop": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=" + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "write-file-atomic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", + "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + } + } + }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -7185,11 +7185,6 @@ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=" - }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -7400,6 +7395,28 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" }, + "write-json-file": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.2.0.tgz", + "integrity": "sha1-UYYlBruzthnu+reFnx/WxtBTCHY=", + "dependencies": { + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" + }, + "write-file-atomic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", + "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" + } + } + }, + "write-pkg": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-2.1.0.tgz", + "integrity": "sha1-NTqkTDnEjCFED1wIzmq9RhQcnAg=" + }, "x-xss-protection": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz", diff --git a/package.json b/package.json index 6404833..c51e873 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,9 @@ "secure": "node_modules/.bin/snyk wizard", "setDeploymentDate": "node ./utilities/set-deployment-date/index.js", "ensureNoWildcards": "node ./utilities/check-dependencies-for-wildcards/index.js", - "snyk-protect": "snyk protect" + "snyk-protect": "snyk protect", + "snyk-test": "snyk test", + "prepare": "npm run snyk-protect" }, "repository": { "type": "git", @@ -72,7 +74,8 @@ "winston": "2.3.1", "winston-daily-rotate-file": "1.4.6", "winston-graylog2": "0.6.0", - "winston-loggly": "1.3.1" + "winston-loggly": "1.3.1", + "snyk": "^1.33.0" }, "devDependencies": { "chai": "4.0.1", @@ -93,9 +96,8 @@ "proxyquire": "1.8.0", "sinon": "2.3.2", "sinon-chai": "2.10.0", - "snyk": "1.33.0", "supertest": "3.0.0", "swagger-ui": "3.0.13" }, "snyk": true -} +} \ No newline at end of file From 69839d5f788f186fee5740aa4fe25e56cc887ada Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 12 Jun 2017 07:43:11 +0200 Subject: [PATCH 06/95] Fixing spelling mistake --- src/rate-limit/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rate-limit/index.js b/src/rate-limit/index.js index 6f9246c..f96a8a7 100644 --- a/src/rate-limit/index.js +++ b/src/rate-limit/index.js @@ -49,7 +49,7 @@ function apiRateLimited(req, res, next, nextValidRequestDate) { } function loginRateLimited(req, res, next, nextValidRequestDate) { - return next(new Error(util.format('Not implemented. %s', nextValidRequestDate.toISOString()))); //todo need to look up how many types the rate limit has been reached and freeze the account untill a two-factor auth call is made. + return next(new Error(util.format('Not implemented. %s', nextValidRequestDate.toISOString()))); //todo need to look up how many types the rate limit has been reached and freeze the account until a two-factor auth call is made. } function initialise(instanceName) { From a48ea5e529d4491e1d0dbf9c3abcaf61b5717905 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 12 Jun 2017 19:49:43 +0200 Subject: [PATCH 07/95] adding tests for as-is code. --- src/crud/create.js | 4 +++ test/crud/create.unit.js | 72 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 test/crud/create.unit.js diff --git a/src/crud/create.js b/src/crud/create.js index 9c37dc1..87f65de 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -22,8 +22,12 @@ function addCreateRoute(router, crudMiddleware, maps) { .describe(router.metadata.creationDescription || description(router.metadata)); return router; } +addCreateRoute.getSteps = getSteps; +addCreateRoute.sendCreateResult = sendCreateResult; +addCreateRoute.description = description; addCreateRoute.setStatusIfApplicable = setStatusIfApplicable; addCreateRoute.setOwnerIfApplicable = setOwnerIfApplicable; + module.exports = addCreateRoute; function getSteps(router, crudMiddleware, maps) { diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js new file mode 100644 index 0000000..99d9a0f --- /dev/null +++ b/test/crud/create.unit.js @@ -0,0 +1,72 @@ +'use strict'; +require('../@util/init.js'); +const addCreateRoute = require('../../src/crud/create'); +const httpMocks = require('node-mocks-http'); +const events = require('events'); + +describe('Crud - create', function() { + describe('setStatusIfApplicable', function() { + it('Should not set req.body.status if the provided schema has no statuses', function(done) { + const metadata = buildMetadata(); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.status).to.not.be.ok(); + done(); + } + }); + it('Should set req.body.status to the first status in the schema', function(done) { + const metadata = buildMetadata([{ name: 'a' }, { name: 'b' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.status).to.equal('a'); + done(); + } + }); + }); +}); + +function buildMetadata(statuses) { + const metadata = { + schemas: { + core: {} + } + }; + if (statuses) { + metadata.schemas.core.statuses = statuses; + } + return metadata; +} + +function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallback) { + const req = httpMocks.createRequest(reqOptions); + const res = httpMocks.createResponse({ + eventEmitter: events.EventEmitter + }); + res.on('end', function() { + let resToReturn; + try { + resToReturn = { + statusCode: res._getStatusCode(), + body: JSON.parse(res._getData()), + headers: res._getHeaders(), + raw: res + }; + } catch (err) { + return responseCallback(err); + } + responseCallback(null, resToReturn); + }); + middlewareOrRouter(req, res, nextCallback); +} From ab5f71d600343e286837974ad2cf7e1c3141914e Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 12 Jun 2017 20:02:07 +0200 Subject: [PATCH 08/95] more assertions --- test/crud/create.unit.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 99d9a0f..f45f2c6 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -3,6 +3,7 @@ require('../@util/init.js'); const addCreateRoute = require('../../src/crud/create'); const httpMocks = require('node-mocks-http'); const events = require('events'); +const moment = require('moment'); describe('Crud - create', function() { describe('setStatusIfApplicable', function() { @@ -17,9 +18,12 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); expect(reqOptions.body.status).to.not.be.ok(); + expect(reqOptions.body.statusDate).to.not.be.ok(); + expect(reqOptions.body.statusLog).to.not.be.ok(); done(); } }); + it('Should set req.body.status to the first status in the schema', function(done) { const metadata = buildMetadata([{ name: 'a' }, { name: 'b' }]); const middleware = addCreateRoute.setStatusIfApplicable(metadata); @@ -34,6 +38,35 @@ describe('Crud - create', function() { done(); } }); + + it('Should set req.body.statusDate to now', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(moment(reqOptions.body.statusDate).diff(new Date())).to.be.lessThan(1); + done(); + } + }); + it('Should create a status log with one entry', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.statusLog).to.be.an('array').that.has.length(1); + done(); + } + }); }); }); From fb3f4b0e96e5f2c90e66d7be7257f4e01919a1fc Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 12 Jun 2017 20:06:40 +0200 Subject: [PATCH 09/95] More as-is analysis --- test/crud/create.unit.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index f45f2c6..3a0b6ec 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -53,6 +53,7 @@ describe('Crud - create', function() { done(); } }); + it('Should create a status log with one entry', function(done) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = addCreateRoute.setStatusIfApplicable(metadata); @@ -67,6 +68,36 @@ describe('Crud - create', function() { done(); } }); + + it('Should create a status log entry with the status set to the first one in the schema', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.statusLog[0].status).to.equal('a'); + done(); + } + }); + + it('Should create a status log entry with the statusDate set to now', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); + done(); + } + }); }); }); From 67581aa7effe377cf38288c632b583407a942aa2 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 12 Jun 2017 21:11:49 +0200 Subject: [PATCH 10/95] updating how status data is set on creation. --- src/crud/create.js | 48 ++++++++++------- test/crud/create.unit.js | 111 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 19 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index 87f65de..b9a10b2 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -88,9 +88,7 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + - metadata.title.toLowerCase() + - ' was successfully created.', + 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -104,21 +102,38 @@ function setStatusIfApplicable(metadata) { if (!statuses || statuses.length <= 0) { return next(); } - req.body.status = statuses[0].name; + const statusToSet = statuses[0]; + req.body.status = statusToSet.name; req.body.statusDate = moment.utc().toDate(); - req.body.statusLog = [ - { - status: req.body.status, - data: { - reason: 'Initial Status' //todo need to set this logically somehow - }, - statusDate: req.body.statusDate - } - ]; + const logEntry = { + status: req.body.status, + statusDate: req.body.statusDate + }; + if (statusToSet.initialData) { + const fromReq = getFromReqObject(statusToSet.initialData.fromReq, req); + logEntry.data = _.merge({}, statusToSet.initialData.static, fromReq); + } + req.body.statusLog = [logEntry]; return next(); }; } +function getFromReqObject(map, req) { + if (!map) { + return; + } + const data = {}; + Object.keys(map).forEach(function(key) { + const value = map[key]; + if (_.isObject(value)) { + data[key] = getFromReqObject(value, req); + return; + } + data[key] = _.get(req, value); + }); + return data; +} + function setOwnerIfApplicable(metadata) { return function _setOwnerIfApplicable(req, res, next) { let ownership = metadata.schemas.core.ownership; @@ -129,12 +144,7 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest( - util.format( - 'Owner from expression "%s" was blank', - ownership.setOwnerExpression - ) - ) + boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) ); } } else { diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 3a0b6ec..3169413 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -98,6 +98,117 @@ describe('Crud - create', function() { done(); } }); + + describe('Status log data', function() { + it('Should not exist if initialData was missing', function(done) { + const statusToSet = { + name: 'a' + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(data).to.not.be.ok(); + done(); + } + }); + + it('Should be an empty object if initialData was an empty object', function(done) { + const statusToSet = { + name: 'a', + initialData: {} + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(Object.keys(data)).to.have.lengthOf(0); + done(); + } + }); + + it('Should be an object that deep equals initialData.static if only initialData.static was set', function( + done + ) { + const statusToSet = { + name: 'a', + initialData: { + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: {} + } + } + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(data).to.deep.equal(statusToSet.initialData.static); + done(); + } + }); + it('Should be an object with properties taken from the request object if only initialData.fromReq was set', function( + done + ) { + const reqOptions = { + body: {}, + user: { + username: 'Bob' + } + }; + const statusToSet = { + name: 'a', + initialData: { + fromReq: { + username: 'user.username', + doesNotExist: 'a', + nested: { + initialUsername: 'user.username' + } + //TODO what if not a string or object value? i.e. [boolean, null, undefined, array, number] + //TODO what if value isn't found? should we use "asdasd: ['a','defaultValue']" to denote using defaults? or do we throw an error? + //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? + //TODO if fromReq and static are both set, it will merge in an order, what about conflicts? Error? + //TODO refactor this fromReq code with detailed logic into it's own describe block for getFromReqObject + } + } + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(data.username).to.equal('Bob'); + expect(data.doesNotExist).to.not.be.ok(); + expect(data.nested.initialUsername).to.equal('Bob'); + done(); + } + }); + }); }); }); From 82819d13e651df4c8f9e3da5b54d79d51971a5ab Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 16:55:38 +0200 Subject: [PATCH 11/95] Adding shared code. --- test/crud/create.unit.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 3169413..8b0850d 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -245,3 +245,27 @@ function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallb }); middlewareOrRouter(req, res, nextCallback); } + +function shouldNotCallNext(done) { + return function next(err) { + if (err) { + return done(err); + } + return done(new Error('Next should not have been called')); + }; +} + +function shouldCallNext(done) { + return function next(err) { + if (err) { + return done(err); + } + return done(); + }; +} + +function shouldNotReturnResponse(done) { + return function resComplete() { + done(new Error('res.end should not have been called')); + }; +} From 62f378d93165c9f45ba0ba6dafaa6d6852bdbf46 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:01:42 +0200 Subject: [PATCH 12/95] fixing bug in in lockfile --- package-lock.json | 1447 +++++++++++++++++---------------------------- 1 file changed, 541 insertions(+), 906 deletions(-) diff --git a/package-lock.json b/package-lock.json index 284fd65..2af8ef3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3,26 +3,6 @@ "version": "0.0.0", "lockfileVersion": 1, "dependencies": { - "@ava/babel-plugin-throws-helper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-plugin-throws-helper/-/babel-plugin-throws-helper-2.0.0.tgz", - "integrity": "sha1-L8H+PCEacQcaTsp7j3r1hCzRrnw=" - }, - "@ava/babel-preset-stage-4": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-stage-4/-/babel-preset-stage-4-1.0.0.tgz", - "integrity": "sha1-phO14VL1KTBUIlRrBy1H+s+yYpE=" - }, - "@ava/babel-preset-transform-test-files": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@ava/babel-preset-transform-test-files/-/babel-preset-transform-test-files-3.0.0.tgz", - "integrity": "sha1-ze0RlqjY2TgaUJJAq5LpGl7Aafc=" - }, - "@ava/pretty-format": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ava/pretty-format/-/pretty-format-1.1.0.tgz", - "integrity": "sha1-0KV9Jeua6rlkO90aAwZCuRwSPig=" - }, "@types/express": { "version": "4.0.35", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.35.tgz", @@ -136,7 +116,8 @@ "anymatch": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", - "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=" + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "dev": true }, "api-query-params": { "version": "4.4.0", @@ -420,35 +401,23 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=" }, - "argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", - "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=" - }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=" - }, - "arr-exclude": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/arr-exclude/-/arr-exclude-1.0.0.tgz", - "integrity": "sha1-38fC5VKicHI8zaBM8xKMjL/lxjE=" + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true }, "arr-flatten": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", - "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=" - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", + "dev": true }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true }, "array-flatten": { "version": "1.1.1", @@ -458,22 +427,26 @@ "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=" + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asap": { "version": "2.0.5", @@ -505,7 +478,8 @@ "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true }, "asynckit": { "version": "0.4.0", @@ -537,142 +511,90 @@ "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=" + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "dev": true }, "babel-core": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.24.1.tgz", - "integrity": "sha1-jEKFZNzh4fQfszfsNPTDsCK1rYM=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", + "dev": true, + "dependencies": { + "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 + }, + "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 + } + } }, "babel-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.1.tgz", - "integrity": "sha1-5xX0hsWN7SVknYiJRNUqoHxdlJc=" - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=" - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=" - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", + "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", + "dev": true, + "dependencies": { + "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 + } + } }, "babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=" + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true }, "babel-helper-get-function-arity": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=" - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=" - }, - "babel-helper-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", - "integrity": "sha1-024i+rEAjXnYhkjjIRaGgShFbOg=" + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=" + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=" + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true }, "babel-messages": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=" - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=" - }, - "babel-plugin-espower": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-espower/-/babel-plugin-espower-2.3.2.tgz", - "integrity": "sha1-VRa4/NsmyfDh2BYHSfbkxl5xJx4=" + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true }, "babel-plugin-transform-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=" - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=" - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=" - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", - "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=" - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=" - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=" - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=" - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=" - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=" - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=" + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true }, "babel-polyfill": { "version": "6.23.0", @@ -689,32 +611,52 @@ "babel-register": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", - "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=" + "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=", + "dev": true }, "babel-runtime": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz", - "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=" + "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=", + "dev": true }, "babel-template": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.24.1.tgz", - "integrity": "sha1-BK5RTx+Ts6JTfyoPYKWkX7gwgzM=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", + "dev": true, + "dependencies": { + "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 + }, + "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 + } + } }, "babel-traverse": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", - "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=" + "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=", + "dev": true }, "babel-types": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", - "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=" + "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=", + "dev": true }, "babylon": { "version": "6.17.2", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.2.tgz", - "integrity": "sha1-IB0l71+JLEG65JSIsI2w3Udun1w=" + "integrity": "sha1-IB0l71+JLEG65JSIsI2w3Udun1w=", + "dev": true }, "balanced-match": { "version": "0.4.2", @@ -771,7 +713,8 @@ "binary-extensions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", - "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=" + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", + "dev": true }, "bindings": { "version": "1.2.1", @@ -849,7 +792,8 @@ "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=" + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true }, "browser-stdout": { "version": "1.3.0", @@ -868,11 +812,6 @@ "integrity": "sha1-PkC4FmP4HS3WWWpMtxSo3BbPq+A=", "dev": true }, - "buf-compare": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", - "integrity": "sha1-/vKNqLgROgoNtEMLC2Rntpcws0o=" - }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -886,33 +825,19 @@ "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true }, "bytes": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" }, - "caching-transform": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=" - }, - "call-matcher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=" - }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" }, - "call-signature": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz", - "integrity": "sha1-qEq8glpV70yysCi9dOIFpluaSZY=" - }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", @@ -945,7 +870,8 @@ "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=" + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true }, "camelize": { "version": "1.0.0", @@ -955,7 +881,8 @@ "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true }, "caseless": { "version": "0.12.0", @@ -1015,12 +942,14 @@ "chokidar": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=" + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true }, "ci-info": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.0.0.tgz", - "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=" + "integrity": "sha1-3FKF8rTiUYIWg2gcOBwziPRuxTQ=", + "dev": true }, "circular-json": { "version": "0.3.1", @@ -1028,16 +957,6 @@ "integrity": "sha1-vos2rvzN6LPKeqLWr8B6NyQsDS0=", "dev": true }, - "clean-stack": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", - "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" - }, - "clean-yaml-object": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", - "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=" - }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -1047,7 +966,8 @@ "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true }, "cli-cursor": { "version": "1.0.2", @@ -1109,80 +1029,11 @@ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, - "co-with-promise": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co-with-promise/-/co-with-promise-4.6.0.tgz", - "integrity": "sha1-QT59tvWJOmC5Qs9JLEvsk9tBWrc=", - "dependencies": { - "pinkie": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", - "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=" - }, - "pinkie-promise": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", - "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=" - } - } - }, - "code-excerpt": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-2.1.0.tgz", - "integrity": "sha1-XcwIHoj0p+O1VOnjXX7yMtR/gUc=" - }, "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=" }, - "codecov": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/codecov/-/codecov-2.2.0.tgz", - "integrity": "sha1-LQaBfOuIkeymNog21Ptr9swE/9E=", - "dependencies": { - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=" - }, - "qs": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", - "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" - }, - "request": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=" - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" - }, - "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" - } - } - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=" - }, - "color-name": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz", - "integrity": "sha1-XIq3K2S9IhXWF66VWeuxSEdc+Y0=" - }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -1198,16 +1049,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=" }, - "common-path-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-1.0.0.tgz", - "integrity": "sha1-zVL28HEuC6q5fW+XModPIvR3UsA=" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -1318,12 +1159,8 @@ "convert-source-map": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=" - }, - "convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=" + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true }, "cookie": { "version": "0.3.1", @@ -1341,15 +1178,11 @@ "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", "dev": true }, - "core-assert": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", - "integrity": "sha1-+F4s+b/tKPdzzIs/pcW2m9wC/j8=" - }, "core-js": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", - "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=" + "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=", + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -1364,7 +1197,8 @@ "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=" + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true }, "create-react-class": { "version": "15.5.2", @@ -1372,15 +1206,11 @@ "integrity": "sha1-aodYNI32YLiDJqDnZNVp8nSq1oE=", "dev": true }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=" - }, "cross-spawn-async": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", - "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=" + "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", + "dev": true }, "cryptiles": { "version": "2.0.5", @@ -1397,12 +1227,14 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=" + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true }, "cycle": { "version": "1.0.3", @@ -1443,11 +1275,6 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, - "date-time": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-0.1.1.tgz", - "integrity": "sha1-7S9tk9l5DOL9ZtW1/z7dW7y/Owc=" - }, "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", @@ -1471,11 +1298,6 @@ "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=", "dev": true }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, "deep-extend": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", @@ -1581,12 +1403,8 @@ "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=" - }, - "diff-match-patch": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.0.tgz", - "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=" + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true }, "dirty-chai": { "version": "1.2.2", @@ -1679,7 +1497,8 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true }, "duplexify": { "version": "3.5.0", @@ -1709,11 +1528,6 @@ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", "dev": true }, - "empower-core": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/empower-core/-/empower-core-0.6.2.tgz", - "integrity": "sha1-Wt71ZgiOMfuoC6CjbfR9cJQWkUQ=" - }, "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", @@ -1745,11 +1559,6 @@ "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, - "equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=" - }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", @@ -1760,7 +1569,8 @@ "error-ex": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=" + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true }, "error-stack-parser": { "version": "1.3.6", @@ -1786,11 +1596,6 @@ "integrity": "sha512-YXTXSlZkJsVwMEVljp1Bh5P9+Raa3524OMl9kywGMp1aazKTCnAqORRL/8dkuqNHk+LRYe0LezuS8PlUt3+mOw==", "dev": true }, - "es6-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.0.2.tgz", - "integrity": "sha1-7sXHJurO9Rt/a3PCDbbhsTsGnJg=" - }, "es6-iterator": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", @@ -1957,11 +1762,6 @@ "integrity": "sha1-L7fiq5YfK2HSyM+RvBdxbKjFOGg=", "dev": true }, - "espower-location-detector": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", - "integrity": "sha1-oXt+zFnTDheeK+9z+0E3cEyzMbU=" - }, "espree": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/espree/-/espree-3.4.3.tgz", @@ -1973,11 +1773,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" }, - "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=" - }, "esquery": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", @@ -2001,12 +1796,14 @@ "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true }, "etag": { "version": "1.8.0", @@ -2060,12 +1857,14 @@ "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=" + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=" + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true }, "expect": { "version": "1.20.2", @@ -2155,7 +1954,8 @@ "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=" + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true }, "extsprintf": { "version": "1.0.2", @@ -2226,7 +2026,8 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true }, "fill-keys": { "version": "1.0.2", @@ -2237,7 +2038,8 @@ "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=" + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true }, "filled-array": { "version": "1.1.0", @@ -2262,15 +2064,11 @@ } } }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=" - }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true }, "flat-cache": { "version": "1.2.2", @@ -2278,20 +2076,17 @@ "integrity": "sha1-+oZxTnLCHbiGAXYezy9VXRq8a5Y=", "dev": true }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=" - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=" + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true }, "foreach": { "version": "2.0.5", @@ -2363,130 +2158,158 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.1.tgz", "integrity": "sha1-8Z/Sj0Pur3YWgOUZogPE0LPTGv8=", + "dev": true, "optional": true, "dependencies": { "abbrev": { "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, "optional": true }, "ansi-regex": { "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, "ansi-styles": { "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, "optional": true }, "aproba": { "version": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, "optional": true }, "are-we-there-yet": { "version": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", + "dev": true, "optional": true }, "asn1": { "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, "optional": true }, "assert-plus": { "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, "optional": true }, "asynckit": { "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, "optional": true }, "aws-sign2": { "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, "optional": true }, "aws4": { "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, "optional": true }, "balanced-match": { "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true }, "bcrypt-pbkdf": { "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, "optional": true }, "block-stream": { "version": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=" + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true }, "boom": { "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true }, "brace-expansion": { "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=" + "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=", + "dev": true }, "buffer-shims": { "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true }, "caseless": { "version": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, "optional": true }, "chalk": { "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, "optional": true }, "code-point-at": { "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true }, "combined-stream": { "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true }, "commander": { "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, "optional": true }, "concat-map": { "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "console-control-strings": { "version": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true }, "core-util-is": { "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cryptiles": { "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, "optional": true }, "dashdash": { "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, "optional": true } } @@ -2494,298 +2317,361 @@ "debug": { "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, "optional": true }, "deep-extend": { "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=", + "dev": true, "optional": true }, "delayed-stream": { "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "delegates": { "version": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, "optional": true }, "ecc-jsbn": { "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, "optional": true }, "escape-string-regexp": { "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, "optional": true }, "extend": { "version": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "dev": true, "optional": true }, "extsprintf": { "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true }, "forever-agent": { "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, "optional": true }, "form-data": { "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", + "dev": true, "optional": true }, "fs.realpath": { "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fstream": { "version": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", - "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=" + "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=", + "dev": true }, "fstream-ignore": { "version": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, "optional": true }, "gauge": { "version": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz", "integrity": "sha1-HCOFX5YvF7OtPQ3HRD8wRULt/gk=", + "dev": true, "optional": true }, "generate-function": { "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true, "optional": true }, "generate-object-property": { "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, "optional": true }, "getpass": { "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", + "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, "optional": true } } }, "glob": { "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=" + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true }, "graceful-fs": { "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "graceful-readlink": { "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true, "optional": true }, "har-validator": { "version": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, "optional": true }, "has-ansi": { "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, "optional": true }, "has-unicode": { "version": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, "optional": true }, "hawk": { "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, "optional": true }, "hoek": { "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true }, "http-signature": { "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, "optional": true }, "inflight": { "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true }, "inherits": { "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "ini": { "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, "optional": true }, "is-fullwidth-code-point": { "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true }, "is-my-json-valid": { "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", + "dev": true, "optional": true }, "is-property": { "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, "optional": true }, "is-typedarray": { "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, "optional": true }, "isarray": { "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isstream": { "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, "optional": true }, "jodid25519": { "version": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, "optional": true }, "jsbn": { "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, "optional": true }, "json-schema": { "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, "optional": true }, "json-stringify-safe": { "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, "optional": true }, "jsonpointer": { "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, "optional": true }, "jsprim": { "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", + "dev": true, "optional": true }, "mime-db": { "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", - "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=" + "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=", + "dev": true }, "mime-types": { "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", - "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=" + "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=", + "dev": true }, "minimatch": { "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=" + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "dev": true }, "minimist": { "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true }, "ms": { "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true, "optional": true }, "node-pre-gyp": { "version": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz", "integrity": "sha1-ZArFUZj2qSWXLgwWxKwmoDTV7Mk=", + "dev": true, "optional": true }, "nopt": { "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, "optional": true }, "npmlog": { "version": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", + "dev": true, "optional": true }, "number-is-nan": { "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true }, "oauth-sign": { "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, "optional": true }, "object-assign": { "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, "optional": true }, "once": { "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true }, "path-is-absolute": { "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "pinkie": { "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, "optional": true }, "pinkie-promise": { "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, "optional": true }, "process-nextick-args": { "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true }, "punycode": { "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, "optional": true }, "qs": { "version": "https://registry.npmjs.org/qs/-/qs-6.3.1.tgz", "integrity": "sha1-kYwLO802Z5dyuvE1say0wWUe150=", + "dev": true, "optional": true }, "rc": { "version": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", + "dev": true, "optional": true, "dependencies": { "minimist": { "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, "optional": true } } @@ -2793,93 +2679,112 @@ "readable-stream": { "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=", + "dev": true, "optional": true }, "request": { "version": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, "optional": true }, "rimraf": { "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=" + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", + "dev": true }, "semver": { "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, "optional": true }, "set-blocking": { "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, "optional": true }, "signal-exit": { "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, "optional": true }, "sntp": { "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, "optional": true }, "sshpk": { "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz", "integrity": "sha1-1agEziJpVRVjjnmNviMnPeBwpfo=", + "dev": true, "optional": true, "dependencies": { "assert-plus": { "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, "optional": true } } }, "string_decoder": { "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "string-width": { "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true }, "stringstream": { "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, "optional": true }, "strip-ansi": { "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true }, "strip-json-comments": { "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, "optional": true }, "supports-color": { "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, "optional": true }, "tar": { "version": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=" + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true }, "tar-pack": { "version": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", "integrity": "sha1-MJMYFkGPVa/E0hd1r91nIM7kXa4=", + "dev": true, "optional": true, "dependencies": { "once": { "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, "optional": true }, "readable-stream": { "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "dev": true, "optional": true } } @@ -2887,49 +2792,59 @@ "tough-cookie": { "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, "optional": true }, "tunnel-agent": { "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, "optional": true }, "tweetnacl": { "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, "optional": true }, "uid-number": { "version": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, "optional": true }, "util-deprecate": { "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, "optional": true }, "verror": { "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, "optional": true }, "wide-align": { "version": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", + "dev": true, "optional": true }, "wrappy": { "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "xtend": { "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true, "optional": true } } @@ -2985,7 +2900,8 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true }, "get-stream": { "version": "3.0.0", @@ -3026,12 +2942,14 @@ "glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=" + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true }, "glob-parent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=" + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true }, "global-modules": { "version": "0.2.3", @@ -3048,19 +2966,8 @@ "globals": { "version": "9.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", - "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=" - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" - } - } + "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=", + "dev": true }, "got": { "version": "5.7.1", @@ -3137,26 +3044,11 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "has-yarn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-1.0.0.tgz", - "integrity": "sha1-ieJdtgS3Jcj1l2//Ct3JIbgopac=" - }, "hasbin": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz", @@ -3235,7 +3127,8 @@ "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=" + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true }, "homedir-polyfill": { "version": "1.0.1", @@ -3246,7 +3139,8 @@ "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=" + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "dev": true }, "hpkp": { "version": "2.0.0", @@ -3274,74 +3168,32 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true - } - } - }, - "http-errors": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", - "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=" - }, - "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", - "dev": true, - "optional": 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=" - }, - "hullabaloo-config-manager": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.0.tgz", - "integrity": "sha512-Y73/Famlt4ZESK0x/qDhC/lmJ73A92kAIIDgvHgiQ+anSlf5nfdMMVaNrfFrh/X6R0BBjp3aE/bAYZdRtvVv6A==", - "dependencies": { - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" - }, - "indent-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", - "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" - }, - "md5-hex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-2.0.0.tgz", - "integrity": "sha1-0FiOnxx0lUSS7NJKwKxs6ZfZLjM=" - }, - "package-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-2.0.0.tgz", - "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=" - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=" - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true } } }, + "http-errors": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=" + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "optional": 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=" + }, "hyphenate-style-name": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", @@ -3373,7 +3225,8 @@ "ignore-by-default": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true }, "image-size": { "version": "0.5.4", @@ -3397,12 +3250,14 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=" + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true }, "infinity-agent": { "version": "2.0.3", @@ -3446,7 +3301,8 @@ "invariant": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=" + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true }, "invert-kv": { "version": "1.0.0", @@ -3458,15 +3314,11 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.3.0.tgz", "integrity": "sha1-HgOlL9rYOou7KyXL9JmLTP/NPew=" }, - "irregular-plurals": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.2.0.tgz", - "integrity": "sha1-OPKZg0uowAwwvpxVThNyaXUv86w=" - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-arrow-function": { "version": "2.0.3", @@ -3477,7 +3329,8 @@ "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=" + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true }, "is-boolean-object": { "version": "1.0.0", @@ -3488,12 +3341,14 @@ "is-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=" + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true }, "is-callable": { "version": "1.1.3", @@ -3504,7 +3359,8 @@ "is-ci": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=" + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true }, "is-date-object": { "version": "1.0.1", @@ -3515,7 +3371,8 @@ "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, "is-equal": { "version": "1.5.5", @@ -3526,12 +3383,8 @@ "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=" - }, - "is-error": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.1.tgz", - "integrity": "sha1-aEqW2EB2V3yY9M20DG0mpRI78Zw=" + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true }, "is-es2016-keyword": { "version": "1.0.0", @@ -3542,28 +3395,26 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true }, "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-finite": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" }, - "is-generator-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", - "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=" - }, "is-generator-function": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.6.tgz", @@ -3573,7 +3424,8 @@ "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=" + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true }, "is-my-json-valid": { "version": "2.16.0", @@ -3588,7 +3440,8 @@ "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=" + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true }, "is-number-object": { "version": "1.0.3", @@ -3599,7 +3452,8 @@ "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-object": { "version": "1.0.1", @@ -3607,11 +3461,6 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-observable": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-0.2.0.tgz", - "integrity": "sha1-s2ExHYPG5dcmyr9eJQsCNxBvWuI=" - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -3633,22 +3482,26 @@ "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true }, "is-property": { "version": "1.0.2", @@ -3658,7 +3511,8 @@ "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true }, "is-regex": { "version": "1.0.4", @@ -3675,12 +3529,14 @@ "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-string": { "version": "1.0.4", @@ -3699,15 +3555,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-url": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.2.tgz", - "integrity": "sha1-SYkFpZO/R8wtnn9zg3K792lsfyY=" - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-windows": { "version": "0.2.0", @@ -3728,12 +3580,14 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=" + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true }, "isomorphic-fetch": { "version": "2.2.1", @@ -3816,61 +3670,12 @@ } } }, - "jest-diff": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-19.0.0.tgz", - "integrity": "sha1-0VY8/FbItgIymI+8BdTRbtkPBjw=", - "dependencies": { - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" - } - } - }, "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 }, - "jest-file-exists": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jest-file-exists/-/jest-file-exists-19.0.0.tgz", - "integrity": "sha1-zKLlh6EeyS4kz+qz+KlNZX8/zrg=" - }, - "jest-matcher-utils": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz", - "integrity": "sha1-Xs2bY1ZdKwAfYfv37Ex/U3lkVk0=" - }, - "jest-message-util": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-19.0.0.tgz", - "integrity": "sha1-cheWuJwOTXYWBvm6jLgoo7YkZBY=" - }, - "jest-mock": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-19.0.0.tgz", - "integrity": "sha1-ZwOGQelgerLOCOxKjLg6q7yJnQE=" - }, - "jest-snapshot": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-19.0.2.tgz", - "integrity": "sha1-nBshYhT3GHw4v9XHCx76sWsP9Qs=" - }, - "jest-util": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-19.0.2.tgz", - "integrity": "sha1-4KAjKiq55rK1Nmi9s1NMK1l37UE=", - "dependencies": { - "jest-validate": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-19.0.2.tgz", - "integrity": "sha1-3FNN9fEnjVtj3zKxQkHU2/ckTAw=" - } - } - }, "jodid25519": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", @@ -3885,7 +3690,8 @@ "js-tokens": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", - "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=" + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "dev": true }, "js-yaml": { "version": "3.8.4", @@ -3901,7 +3707,8 @@ "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true }, "jshint": { "version": "2.9.4", @@ -3968,7 +3775,8 @@ "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true }, "jsonfile": { "version": "2.4.0", @@ -4023,7 +3831,8 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true }, "klaw": { "version": "1.3.1", @@ -4031,11 +3840,6 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true }, - "last-line-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz", - "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=" - }, "latest-version": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", @@ -4059,11 +3863,6 @@ "integrity": "sha1-bL/qIrO4MDBOml+zcdVPpIDJ188=", "dev": true }, - "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4079,7 +3878,8 @@ "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=", + "dev": true }, "loader-utils": { "version": "0.2.17", @@ -4087,18 +3887,6 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", @@ -4161,12 +3949,8 @@ "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.clonedeepwith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", - "integrity": "sha1-buMFc6A6GmDWcKYu8zwQzxr9vdQ=" + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true }, "lodash.create": { "version": "3.1.1", @@ -4174,11 +3958,6 @@ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" - }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", @@ -4191,21 +3970,6 @@ "integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=", "dev": true }, - "lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=" - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -4234,11 +3998,6 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true }, - "lodash.merge": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.0.tgz", - "integrity": "sha1-aYhLoUSsM/5plzemCG3v+t0PicU=" - }, "lodash.mergewith": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", @@ -4318,22 +4077,26 @@ "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=" + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=" + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true }, "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true }, "lru-cache": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=" + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", + "dev": true }, "lru-queue": { "version": "0.1.0", @@ -4344,12 +4107,14 @@ "make-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", - "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=" + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "dev": true }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true }, "map-stream": { "version": "0.1.0", @@ -4360,17 +4125,8 @@ "matcher": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/matcher/-/matcher-0.1.2.tgz", - "integrity": "sha1-7yDL3mTCTFDMYa9bg+4LG4/wAQE=" - }, - "md5-hex": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=" - }, - "md5-o-matic": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=" + "integrity": "sha1-7yDL3mTCTFDMYa9bg+4LG4/wAQE=", + "dev": true }, "media-typer": { "version": "0.3.0", @@ -4394,11 +4150,13 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -4421,7 +4179,8 @@ "micromatch": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=" + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true }, "mime": { "version": "1.3.4", @@ -4438,11 +4197,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4540,11 +4294,6 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz", "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=" }, - "ms": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", - "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=" - }, "multi-glob": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/multi-glob/-/multi-glob-0.4.0.tgz", @@ -4557,11 +4306,6 @@ } } }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=" - }, "mute-stream": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", @@ -4572,6 +4316,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "dev": true, "optional": true }, "native-promise-only": { @@ -4583,7 +4328,8 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true }, "nconf": { "version": "0.8.4", @@ -4769,12 +4515,14 @@ "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=" + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "dev": true }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=" + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true }, "npm-check": { "version": "5.4.4", @@ -4917,7 +4665,8 @@ "npm-run-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", - "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=" + "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", + "dev": true }, "npmlog": { "version": "4.1.0", @@ -5225,7 +4974,8 @@ "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=" + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true }, "on-finished": { "version": "2.3.0", @@ -5264,11 +5014,6 @@ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=" }, - "option-chain": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/option-chain/-/option-chain-0.1.1.tgz", - "integrity": "sha1-6bgR4AbxwPVIAvKClb/Ilw+Nz70=" - }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -5315,7 +5060,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "1.4.0", @@ -5331,7 +5077,8 @@ "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=" + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "osenv": { "version": "0.1.4", @@ -5359,26 +5106,6 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" - }, - "package-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-1.2.0.tgz", - "integrity": "sha1-AD5WzVe3NqbtYRTMK4FUJnJ3DkQ=" - }, "package-json": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", @@ -5388,17 +5115,14 @@ "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=" + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=" + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true }, "parse-passwd": { "version": "1.0.0", @@ -5434,7 +5158,8 @@ "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -5450,7 +5175,8 @@ "path-key": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", - "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=", + "dev": true }, "path-parse": { "version": "1.0.5", @@ -5466,7 +5192,8 @@ "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true }, "pathval": { "version": "1.1.0", @@ -5493,7 +5220,8 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true }, "pinkie": { "version": "2.0.4", @@ -5508,7 +5236,8 @@ "pkg-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=" + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true }, "pkginfo": { "version": "0.3.1", @@ -5588,11 +5317,6 @@ } } }, - "plur": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", - "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=" - }, "pluralize": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-5.0.0.tgz", @@ -5613,12 +5337,14 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true }, "prettier": { "version": "1.4.2", @@ -5626,34 +5352,11 @@ "integrity": "sha512-iJ8HPTHA/Amt9FDLrSRBWG+IWZo6Z4MJ/2oxJP4Rz6UWQUr4rM3MWYeFi6tG4d9kYGuvbnnZ/KYCGdTQ8sPubw==", "dev": true }, - "pretty-format": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-19.0.0.tgz", - "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", - "dependencies": { - "ansi-styles": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.0.0.tgz", - "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=" - } - } - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dependencies": { - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=" - } - } - }, "private": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz", - "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=" + "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE=", + "dev": true }, "process-nextick-args": { "version": "1.0.7", @@ -5724,7 +5427,8 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "punycode": { "version": "1.4.1", @@ -5770,7 +5474,8 @@ "randomatic": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", - "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=" + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", + "dev": true }, "range-parser": { "version": "1.2.0", @@ -5786,11 +5491,13 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -5915,12 +5622,14 @@ "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true }, "readable-stream": { "version": "2.1.5", @@ -5930,7 +5639,8 @@ "readdirp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=" + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true }, "readline2": { "version": "1.0.1", @@ -5955,7 +5665,8 @@ "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=" + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true }, "redis": { "version": "2.7.1", @@ -6003,20 +5714,17 @@ "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true }, "regex-cache": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=" + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true }, "regexp-quote": { "version": "0.0.0", @@ -6024,42 +5732,17 @@ "integrity": "sha1-Hg9GUMhi3L/tVP1CsUjpuxch/PI=", "dev": true }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=" - }, "registry-auth-token": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=" + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true }, "registry-url": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=" - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=" + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true }, "remarkable": { "version": "1.7.1", @@ -6084,22 +5767,26 @@ "remove-trailing-separator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", - "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=" + "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=", + "dev": true }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=" + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true }, "request": { "version": "2.81.0", @@ -6148,11 +5835,6 @@ "integrity": "sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk=", "dev": true }, - "require-precompiled": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", - "integrity": "sha1-WhtS63Dr7UPrmC6XTIWrWVceVvo=" - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -6185,11 +5867,6 @@ "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", "dev": true }, - "resolve-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-1.0.0.tgz", - "integrity": "sha1-Tq7qQe0EDRcCRX32SkKysH0kb58=" - }, "resolve-from": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", @@ -6314,7 +5991,8 @@ "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true }, "setimmediate": { "version": "1.0.5", @@ -6385,17 +6063,20 @@ "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true }, "slice-ansi": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true }, "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true }, "sntp": { "version": "1.0.9", @@ -6599,35 +6280,35 @@ } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=" - }, "source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true }, "source-map-support": { "version": "0.4.15", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", - "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=" + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "dev": true }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=" + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true }, "spdx-expression-parse": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true }, "spdx-license-ids": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true }, "split": { "version": "0.3.3", @@ -6722,22 +6403,20 @@ "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" - }, - "strip-bom-buf": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-1.0.0.tgz", - "integrity": "sha1-HLRar1dTD0yvhsf3UXnSyaUd1XI=" + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=" + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true }, "strip-json-comments": { "version": "2.0.1", @@ -6805,11 +6484,6 @@ } } }, - "symbol-observable": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-0.2.4.tgz", - "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=" - }, "table": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", @@ -6873,11 +6547,13 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", + "dev": true, "dependencies": { "execa": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", - "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=" + "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", + "dev": true } } }, @@ -6890,7 +6566,8 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true }, "then-fs": { "version": "2.0.0", @@ -6910,43 +6587,6 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=" - }, - "time-require": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/time-require/-/time-require-0.1.2.tgz", - "integrity": "sha1-+eEss3D8JgXhFARYK6VO9corLZg=", - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=" - }, - "parse-ms": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-0.1.2.tgz", - "integrity": "sha1-3T+iXtbC78e93hKtm0bBY6opIk4=" - }, - "pretty-ms": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-0.2.2.tgz", - "integrity": "sha1-2oeaaC/zOjcBEEbxPWJ/Z8c7hPY=" - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" - } - } - }, "timed-out": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", @@ -6973,7 +6613,8 @@ "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true }, "topo": { "version": "1.1.0", @@ -7002,12 +6643,14 @@ "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true }, "tryit": { "version": "1.0.3", @@ -7141,11 +6784,6 @@ "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" }, - "uid2": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", - "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" - }, "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", @@ -7166,12 +6804,8 @@ "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=" - }, - "unique-temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", - "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=" + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true }, "unpipe": { "version": "1.0.0", @@ -7207,12 +6841,8 @@ "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" - }, - "urlgrey": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", - "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=" + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true }, "user-home": { "version": "2.0.0", @@ -7253,7 +6883,8 @@ "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=" + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true }, "validator": { "version": "6.3.0", @@ -7333,7 +6964,8 @@ "which": { "version": "1.2.14", "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", - "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=" + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true }, "which-module": { "version": "1.0.0", @@ -7349,7 +6981,8 @@ "widest-line": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=" + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true }, "win-release": { "version": "1.1.1", @@ -7436,7 +7069,8 @@ "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true }, "x-xss-protection": { "version": "1.0.0", @@ -7468,7 +7102,8 @@ "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true }, "yaml-js": { "version": "0.1.5", From 17f4fa16406d2f9f31b908f9e92b9d11487594b2 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:09:36 +0200 Subject: [PATCH 13/95] Testing import statement babeling --- .babelrc | 8 +- package-lock.json | 274 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 2 +- src/app.js | 2 +- 4 files changed, 279 insertions(+), 7 deletions(-) diff --git a/.babelrc b/.babelrc index e4656b4..d6b82d2 100644 --- a/.babelrc +++ b/.babelrc @@ -1,3 +1,9 @@ { - "presets": ["es2017"] + "presets": [ + ["env", { + "targets": { + "node": "6.11.0" + } + }] + ] } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2af8ef3..7bbed6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -548,6 +548,30 @@ } } }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true + }, + "babel-helper-define-map": { + "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 + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true + }, "babel-helper-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", @@ -560,12 +584,36 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true + }, + "babel-helper-regex": { + "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 + }, "babel-helper-remap-async-to-generator": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true + }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", @@ -578,12 +626,24 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true + }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, "babel-plugin-syntax-trailing-function-commas": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", @@ -596,16 +656,166 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoping": { + "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 + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", + "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true + }, + "babel-plugin-transform-regenerator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "dev": true + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true + }, "babel-polyfill": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", "dev": true }, - "babel-preset-es2017": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2017/-/babel-preset-es2017-6.24.1.tgz", - "integrity": "sha1-WXvq37n38gi8/YoS6bKym4svFNE=", + "babel-preset-env": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", + "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", "dev": true }, "babel-register": { @@ -801,6 +1011,12 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "browserslist": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.5.tgz", + "integrity": "sha1-6IJVDfPRzW1IHBo+ADjyuvE6RxE=", + "dev": true + }, "bson": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", @@ -878,6 +1094,12 @@ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, + "caniuse-lite": { + "version": "1.0.30000684", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000684.tgz", + "integrity": "sha1-DBAy0LNuFNGsGZ+T7y0cQtPwP9c=", + "dev": true + }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", @@ -1522,6 +1744,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "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=", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -5714,12 +5942,24 @@ "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" }, + "regenerate": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", + "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "dev": true + }, "regenerator-runtime": { "version": "0.10.5", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", "dev": true }, + "regenerator-transform": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "dev": true + }, "regex-cache": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", @@ -5732,6 +5972,12 @@ "integrity": "sha1-Hg9GUMhi3L/tVP1CsUjpuxch/PI=", "dev": true }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true + }, "registry-auth-token": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", @@ -5744,6 +5990,26 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, "remarkable": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", diff --git a/package.json b/package.json index d19653b..b4e8264 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ }, "devDependencies": { "babel-cli": "6.24.1", - "babel-preset-es2017": "6.24.1", + "babel-preset-env": "1.5.2", "chai": "4.0.1", "dirty-chai": "1.2.2", "eslint": "3.19.0", diff --git a/src/app.js b/src/app.js index e899bfa..11cfbc7 100644 --- a/src/app.js +++ b/src/app.js @@ -1,5 +1,5 @@ 'use strict'; -const async = require('async'); +import * as async from 'async'; const express = require('express'); const bodyParser = require('body-parser'); const cors = require('cors'); From ed4254d6bc22bfd05e5f0a6ad132206d188da4d5 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:13:54 +0200 Subject: [PATCH 14/95] Updating tests to compile using babel. --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b4e8264..841d534 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "start": "node .", "build": "babel src -d dist -w --copy-files", "watch": "nodemon .", - "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\"", - "mocha": "node_modules/.bin/_mocha \"test/**/*.js\"", + "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\" --compilers=js:babel-core/register", + "mocha": "node_modules/.bin/_mocha \"test/**/*.js\" --compilers=js:babel-core/register", "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", "lint-ci": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js", From 2f4546be85af534468a5164711319185ef8763b9 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:15:27 +0200 Subject: [PATCH 15/95] updating istanbull to pass params to mocha --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 841d534..d9dc0c1 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "start": "node .", "build": "babel src -d dist -w --copy-files", "watch": "nodemon .", - "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\" --compilers=js:babel-core/register", + "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\" -- --compilers=js:babel-core/register", "mocha": "node_modules/.bin/_mocha \"test/**/*.js\" --compilers=js:babel-core/register", "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", From 0a79c42b19f1841b15262c19029cb128b9b3cf8d Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:34:28 +0200 Subject: [PATCH 16/95] refactoring code to be more reusable. --- src/crud/create.js | 25 ++++++++++++-------- test/crud/create.unit.js | 49 +++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index b9a10b2..22dbb8c 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -27,6 +27,7 @@ addCreateRoute.sendCreateResult = sendCreateResult; addCreateRoute.description = description; addCreateRoute.setStatusIfApplicable = setStatusIfApplicable; addCreateRoute.setOwnerIfApplicable = setOwnerIfApplicable; +addCreateRoute.getFromReqObject = getFromReqObject; module.exports = addCreateRoute; @@ -105,19 +106,25 @@ function setStatusIfApplicable(metadata) { const statusToSet = statuses[0]; req.body.status = statusToSet.name; req.body.statusDate = moment.utc().toDate(); - const logEntry = { - status: req.body.status, - statusDate: req.body.statusDate - }; - if (statusToSet.initialData) { - const fromReq = getFromReqObject(statusToSet.initialData.fromReq, req); - logEntry.data = _.merge({}, statusToSet.initialData.static, fromReq); - } - req.body.statusLog = [logEntry]; + req.body.statusLog = [ + { + status: req.body.status, + data: getData(statusToSet.initialData, req), + statusDate: req.body.statusDate + } + ]; return next(); }; } +function getData(rules, req) { + if (!rules) { + return; + } + const fromReq = getFromReqObject(rules.fromReq, req); + return _.merge({}, rules.static, fromReq); +} + function getFromReqObject(map, req) { if (!map) { return; diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 8b0850d..9b1ce60 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -210,6 +210,9 @@ describe('Crud - create', function() { }); }); }); + describe('getFromReqObject', function() { + + }); }); function buildMetadata(statuses) { @@ -246,26 +249,26 @@ function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallb middlewareOrRouter(req, res, nextCallback); } -function shouldNotCallNext(done) { - return function next(err) { - if (err) { - return done(err); - } - return done(new Error('Next should not have been called')); - }; -} - -function shouldCallNext(done) { - return function next(err) { - if (err) { - return done(err); - } - return done(); - }; -} - -function shouldNotReturnResponse(done) { - return function resComplete() { - done(new Error('res.end should not have been called')); - }; -} +// function shouldNotCallNext(done) { +// return function next(err) { +// if (err) { +// return done(err); +// } +// return done(new Error('Next should not have been called')); +// }; +// } +// +// function shouldCallNext(done) { +// return function next(err) { +// if (err) { +// return done(err); +// } +// return done(); +// }; +// } +// +// function shouldNotReturnResponse(done) { +// return function resComplete() { +// done(new Error('res.end should not have been called')); +// }; +// } From 5ac3e3c869dad4f1bb6f53169563b4e052aa9956 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:49:10 +0200 Subject: [PATCH 17/95] more tests --- src/crud/create.js | 1 + test/crud/create.unit.js | 61 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/crud/create.js b/src/crud/create.js index 22dbb8c..0d700fd 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -28,6 +28,7 @@ addCreateRoute.description = description; addCreateRoute.setStatusIfApplicable = setStatusIfApplicable; addCreateRoute.setOwnerIfApplicable = setOwnerIfApplicable; addCreateRoute.getFromReqObject = getFromReqObject; +addCreateRoute.getData = getData; module.exports = addCreateRoute; diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 9b1ce60..b7b5a7e 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -210,8 +210,69 @@ describe('Crud - create', function() { }); }); }); + + describe('getData', function() { + it('Should not exist if rules was falsy', function() { + const data = addCreateRoute.getData(null, {}); + expect(data).to.not.be.ok(); + }); + it('Should be an empty object if rules was an empty object', function() { + const data = addCreateRoute.getData({}, {}); + expect(data).to.be.ok(); + expect(Object.keys(data)).to.have.lengthOf(0); + }); + }); + describe('getFromReqObject', function() { + it('Should map shallow properties from the req using the map', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: 'a' + }; + const data = addCreateRoute.getFromReqObject(map, req); + expect(data.answer).to.equal('b'); + }); + it('Should map deep properties from the req using the map', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const data = addCreateRoute.getFromReqObject(map, req); + expect(data.answer).to.equal('c'); + }); + it('Should support a nested map structure', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + nested: { + answer: 'a' + } + }; + const data = addCreateRoute.getFromReqObject(map, req); + expect(data.nested.answer).to.equal('b'); + }); + it('Should support a nested map structure with a nested request object', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + nested: { + answer: 'a.b' + } + }; + const data = addCreateRoute.getFromReqObject(map, req); + expect(data.nested.answer).to.equal('c'); + }); }); }); From 9abef242393fef818482c4a5a84966ceacbc39a7 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:56:47 +0200 Subject: [PATCH 18/95] checking depth. --- package.json | 5 ++++- src/crud/create.js | 24 ++++++++++++++++++++---- test/crud/create.unit.js | 22 ++++++++++++++++++++-- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index c51e873..e54d0a0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,10 @@ { "name": "node-api-seed", "title": "Node Api Seed", - "version": "0.0.0", + "version": "0.0.1", + "engines": { + "node": ">=6.10.0" + }, "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", "main": "index.js", diff --git a/src/crud/create.js b/src/crud/create.js index 0d700fd..6b15738 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -90,7 +90,9 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', + 'Informs the caller that the ' + + metadata.title.toLowerCase() + + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -126,15 +128,24 @@ function getData(rules, req) { return _.merge({}, rules.static, fromReq); } -function getFromReqObject(map, req) { +const maxDepth = 10; +function getFromReqObject(map, req, depth = 0) { if (!map) { return; } + if (depth > maxDepth) { + throw new Error( + util.format( + 'Circular reference detected in map object after maximum depth (%s) reached', + maxDepth + ) + ); + } const data = {}; Object.keys(map).forEach(function(key) { const value = map[key]; if (_.isObject(value)) { - data[key] = getFromReqObject(value, req); + data[key] = getFromReqObject(value, req, depth + 1); return; } data[key] = _.get(req, value); @@ -152,7 +163,12 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) + boom.badRequest( + util.format( + 'Owner from expression "%s" was blank', + ownership.setOwnerExpression + ) + ) ); } } else { diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index b7b5a7e..6c56aab 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -69,7 +69,9 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function(done) { + it('Should create a status log entry with the status set to the first one in the schema', function( + done + ) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = addCreateRoute.setStatusIfApplicable(metadata); const reqOptions = { @@ -94,7 +96,9 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); + expect( + moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) + ).to.be.lessThan(1); done(); } }); @@ -273,6 +277,20 @@ describe('Crud - create', function() { const data = addCreateRoute.getFromReqObject(map, req); expect(data.nested.answer).to.equal('c'); }); + it('Should throw an error for circular reference maps', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + nested: {} + }; + map.nested.answer = map; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(/circular reference/i); + }); }); }); From aaf76d80d5b354b6652b387f6c2fd458a48c32b4 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 17:58:25 +0200 Subject: [PATCH 19/95] using util to inspect. --- src/crud/create.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index 6b15738..f2c0328 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -90,9 +90,7 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + - metadata.title.toLowerCase() + - ' was successfully created.', + 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -136,8 +134,9 @@ function getFromReqObject(map, req, depth = 0) { if (depth > maxDepth) { throw new Error( util.format( - 'Circular reference detected in map object after maximum depth (%s) reached', - maxDepth + 'Circular reference detected in map object after maximum depth (%s) reached. Partial map\n%j\n', + maxDepth, + util.inspect(map, true, maxDepth) ) ); } @@ -163,12 +162,7 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest( - util.format( - 'Owner from expression "%s" was blank', - ownership.setOwnerExpression - ) - ) + boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) ); } } else { From e5615021d7a396664c75dbe9305483bc5600f64e Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 18:16:24 +0200 Subject: [PATCH 20/95] Updating code to allow stubbing. --- src/crud/create.js | 2 +- test/crud/create.unit.js | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index f2c0328..da05f2f 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -122,7 +122,7 @@ function getData(rules, req) { if (!rules) { return; } - const fromReq = getFromReqObject(rules.fromReq, req); + const fromReq = addCreateRoute.getFromReqObject(rules.fromReq, req); return _.merge({}, rules.static, fromReq); } diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 6c56aab..9ce0beb 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -4,6 +4,7 @@ const addCreateRoute = require('../../src/crud/create'); const httpMocks = require('node-mocks-http'); const events = require('events'); const moment = require('moment'); +const sinon = require('sinon'); describe('Crud - create', function() { describe('setStatusIfApplicable', function() { @@ -69,9 +70,7 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function( - done - ) { + it('Should create a status log entry with the status set to the first one in the schema', function(done) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = addCreateRoute.setStatusIfApplicable(metadata); const reqOptions = { @@ -96,9 +95,7 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect( - moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) - ).to.be.lessThan(1); + expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); done(); } }); @@ -225,6 +222,34 @@ describe('Crud - create', function() { expect(data).to.be.ok(); expect(Object.keys(data)).to.have.lengthOf(0); }); + it('Should return an object that deep equals rules.static if only initialData.static was set', function() { + const req = {}; + const rules = { + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: {} + } + }; + const data = addCreateRoute.getData(rules, req); + expect(data).to.deep.equal(rules.static); + }); + it('Should merge the result from getFromReqObject if rules.fromReq existed', function() { + const req = {}; + const rules = { + fromReq: {} + }; + const stubbedData = { + bob: true + }; + const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + stub.returns(stubbedData); + const data = addCreateRoute.getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + }); }); describe('getFromReqObject', function() { @@ -263,6 +288,7 @@ describe('Crud - create', function() { const data = addCreateRoute.getFromReqObject(map, req); expect(data.nested.answer).to.equal('b'); }); + it('Should support a nested map structure with a nested request object', function() { const req = httpMocks.createRequest({ a: { @@ -277,6 +303,7 @@ describe('Crud - create', function() { const data = addCreateRoute.getFromReqObject(map, req); expect(data.nested.answer).to.equal('c'); }); + it('Should throw an error for circular reference maps', function() { const req = httpMocks.createRequest({ a: { From dc8ee407ad4d7cf0e3af5dfb28fec96d87c366dc Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 18:19:06 +0200 Subject: [PATCH 21/95] test for merging. --- test/crud/create.unit.js | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 9ce0beb..cd41982 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -217,11 +217,13 @@ describe('Crud - create', function() { const data = addCreateRoute.getData(null, {}); expect(data).to.not.be.ok(); }); + it('Should be an empty object if rules was an empty object', function() { const data = addCreateRoute.getData({}, {}); expect(data).to.be.ok(); expect(Object.keys(data)).to.have.lengthOf(0); }); + it('Should return an object that deep equals rules.static if only initialData.static was set', function() { const req = {}; const rules = { @@ -236,6 +238,7 @@ describe('Crud - create', function() { const data = addCreateRoute.getData(rules, req); expect(data).to.deep.equal(rules.static); }); + it('Should merge the result from getFromReqObject if rules.fromReq existed', function() { const req = {}; const rules = { @@ -250,6 +253,34 @@ describe('Crud - create', function() { stub.restore(); expect(data.bob).to.equal(true); }); + it('Should merge the result from getFromReqObject and static if both were set', function() { + const req = {}; + const rules = { + fromReq: {}, + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: { + subObject: {} + } + } + }; + const stubbedData = { + bob: true + }; + const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + stub.returns(stubbedData); + const data = addCreateRoute.getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + expect(data.number).to.equal(rules.static.number); + expect(data.string).to.equal(rules.static.string); + expect(data.bool).to.equal(rules.static.bool); + expect(data.array).to.deep.equal(rules.static.array); + expect(data.object).to.deep.equal(rules.static.object); + }); }); describe('getFromReqObject', function() { From 48fc9dfa0e0c5c9c332568279484bbb25180cb57 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 18:23:50 +0200 Subject: [PATCH 22/95] simplifying top level test. --- src/crud/create.js | 2 +- test/crud/create.unit.js | 70 +++++++++++----------------------------- 2 files changed, 20 insertions(+), 52 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index da05f2f..3cf7b51 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -110,7 +110,7 @@ function setStatusIfApplicable(metadata) { req.body.statusLog = [ { status: req.body.status, - data: getData(statusToSet.initialData, req), + data: addCreateRoute.getData(statusToSet.initialData, req), statusDate: req.body.statusDate } ]; diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index cd41982..1c45815 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -140,72 +140,32 @@ describe('Crud - create', function() { } }); - it('Should be an object that deep equals initialData.static if only initialData.static was set', function( - done - ) { + it('Should be merge the result from getData', function(done) { const statusToSet = { name: 'a', - initialData: { - static: { - number: 1, - string: 'test', - bool: true, - array: [2, 'test', true, null, {}, []], - object: {} - } - } + initialData: {} }; const metadata = buildMetadata([statusToSet]); const middleware = addCreateRoute.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; - mockRequest(middleware, reqOptions, null, next); - - function next(error) { - expect(error).to.not.be.ok(); - const data = reqOptions.body.statusLog[0].data; - expect(data).to.deep.equal(statusToSet.initialData.static); - done(); - } - }); - it('Should be an object with properties taken from the request object if only initialData.fromReq was set', function( - done - ) { - const reqOptions = { - body: {}, - user: { - username: 'Bob' - } - }; - const statusToSet = { - name: 'a', - initialData: { - fromReq: { - username: 'user.username', - doesNotExist: 'a', - nested: { - initialUsername: 'user.username' - } - //TODO what if not a string or object value? i.e. [boolean, null, undefined, array, number] - //TODO what if value isn't found? should we use "asdasd: ['a','defaultValue']" to denote using defaults? or do we throw an error? - //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? - //TODO if fromReq and static are both set, it will merge in an order, what about conflicts? Error? - //TODO refactor this fromReq code with detailed logic into it's own describe block for getFromReqObject - } + const stubbedData = { + bob: true, + asd: { + value: 1, + name: 'bob' } }; - const metadata = buildMetadata([statusToSet]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); - + const stub = sinon.stub(addCreateRoute, 'getData'); + stub.returns(stubbedData); mockRequest(middleware, reqOptions, null, next); function next(error) { + stub.restore(); expect(error).to.not.be.ok(); const data = reqOptions.body.statusLog[0].data; - expect(data.username).to.equal('Bob'); - expect(data.doesNotExist).to.not.be.ok(); - expect(data.nested.initialUsername).to.equal('Bob'); + expect(data).to.deep.equal(stubbedData); done(); } }); @@ -213,6 +173,8 @@ describe('Crud - create', function() { }); describe('getData', function() { + //TODO if fromReq and static are both set, it will merge in an order, what about conflicts? Error? + it('Should not exist if rules was falsy', function() { const data = addCreateRoute.getData(null, {}); expect(data).to.not.be.ok(); @@ -253,6 +215,7 @@ describe('Crud - create', function() { stub.restore(); expect(data.bob).to.equal(true); }); + it('Should merge the result from getFromReqObject and static if both were set', function() { const req = {}; const rules = { @@ -284,6 +247,10 @@ describe('Crud - create', function() { }); describe('getFromReqObject', function() { + //TODO what if not a string or object value? i.e. [boolean, null, undefined, array, number] + //TODO what if value isn't found? should we use "asdasd: ['a','defaultValue']" to denote using defaults? or do we throw an error? + //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? + it('Should map shallow properties from the req using the map', function() { const req = httpMocks.createRequest({ a: 'b' @@ -294,6 +261,7 @@ describe('Crud - create', function() { const data = addCreateRoute.getFromReqObject(map, req); expect(data.answer).to.equal('b'); }); + it('Should map deep properties from the req using the map', function() { const req = httpMocks.createRequest({ a: { From 1c47491b39bbeb5b2591b5ea5440c2f70fa8112f Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 18:42:06 +0200 Subject: [PATCH 23/95] test for merging --- test/crud/create.unit.js | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 1c45815..fcaa32f 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -173,8 +173,6 @@ describe('Crud - create', function() { }); describe('getData', function() { - //TODO if fromReq and static are both set, it will merge in an order, what about conflicts? Error? - it('Should not exist if rules was falsy', function() { const data = addCreateRoute.getData(null, {}); expect(data).to.not.be.ok(); @@ -244,6 +242,43 @@ describe('Crud - create', function() { expect(data.array).to.deep.equal(rules.static.array); expect(data.object).to.deep.equal(rules.static.object); }); + + it('Should prioritise fields from getFromReqObject over static if both were set', function() { + const req = {}; + const rules = { + fromReq: {}, + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: { + subObject: {} + } + } + }; + const stubbedData = { + bob: true, + number: 2, + string: 'test2', + bool: false, + array: [], + object: { + betterSubObject: {} + } + }; + const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + stub.returns(stubbedData); + const data = addCreateRoute.getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + expect(data.number).to.equal(stubbedData.number); + expect(data.string).to.equal(stubbedData.string); + expect(data.bool).to.equal(stubbedData.bool); + expect(data.array).to.deep.equal(rules.static.array); + expect(data.object.subObject).to.be.ok; + expect(data.object.betterSubObject).to.be.ok; + }); }); describe('getFromReqObject', function() { From cda4e7a9a825218ace5084e7add919154e40c6c6 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 20:07:11 +0200 Subject: [PATCH 24/95] More tests for formatting --- src/crud/create.js | 5 +++ test/crud/create.unit.js | 75 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/src/crud/create.js b/src/crud/create.js index 3cf7b51..aa0ce52 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -110,6 +110,7 @@ function setStatusIfApplicable(metadata) { req.body.statusLog = [ { status: req.body.status, + //we use 'addCreateRoute.' here to allow stubbing in the unit tests data: addCreateRoute.getData(statusToSet.initialData, req), statusDate: req.body.statusDate } @@ -122,6 +123,7 @@ function getData(rules, req) { if (!rules) { return; } + //we use 'addCreateRoute.' here to allow stubbing in the unit tests const fromReq = addCreateRoute.getFromReqObject(rules.fromReq, req); return _.merge({}, rules.static, fromReq); } @@ -147,6 +149,9 @@ function getFromReqObject(map, req, depth = 0) { data[key] = getFromReqObject(value, req, depth + 1); return; } + if (!_.isString(value)) { + throw new Error(util.format('Invalid map value, must be a string : \n%j\n', value)); + } data[key] = _.get(req, value); }); return data; diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index fcaa32f..28d5952 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -352,6 +352,81 @@ describe('Crud - create', function() { addCreateRoute.getFromReqObject(map, req); }).to.throw(/circular reference/i); }); + + const notAString = /must be a string/i; + + it('Should throw an error if the map was a number', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: 1 + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the map was a boolean', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: true + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should not throw an error if the map was an empty object', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: {} + }; + const data = addCreateRoute.getFromReqObject(map, req); + expect(data.answer).to.deep.equal({}); + }); + + it('Should throw an error if the map was null', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: null + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the map was undefined', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: undefined + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should if the map was a array', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + option1: ['asdasd', 12], //defaultValue? + option2: [], //throw error? + option3: ['a.doesNotExist', 'a.b'] // try get first one, if fails go onto next? + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); }); }); From 0de1824e1a139dd95ea3b413749a06523f4d125d Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 20:15:58 +0200 Subject: [PATCH 25/95] implementing default value logic. --- src/crud/create.js | 4 ++++ test/crud/create.unit.js | 14 +++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index aa0ce52..84fb0e5 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -145,6 +145,10 @@ function getFromReqObject(map, req, depth = 0) { const data = {}; Object.keys(map).forEach(function(key) { const value = map[key]; + if (_.isArray(value)) { + data[key] = _.get(req, value[0], value[1]); + return; + } if (_.isObject(value)) { data[key] = getFromReqObject(value, req, depth + 1); return; diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 28d5952..5ce38f0 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -282,8 +282,6 @@ describe('Crud - create', function() { }); describe('getFromReqObject', function() { - //TODO what if not a string or object value? i.e. [boolean, null, undefined, array, number] - //TODO what if value isn't found? should we use "asdasd: ['a','defaultValue']" to denote using defaults? or do we throw an error? //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? it('Should map shallow properties from the req using the map', function() { @@ -414,18 +412,16 @@ describe('Crud - create', function() { }).to.throw(notAString); }); - it('Should if the map was a array', function() { + //TODO what if value isn't found? should we use "asdasd: ['a','defaultValue']" to denote using defaults? or do we throw an error? + it('Should use the default value if one was supplied', function() { const req = httpMocks.createRequest({ a: 'b' }); const map = { - option1: ['asdasd', 12], //defaultValue? - option2: [], //throw error? - option3: ['a.doesNotExist', 'a.b'] // try get first one, if fails go onto next? + answer: ['c', 'd'] }; - expect(function() { - addCreateRoute.getFromReqObject(map, req); - }).to.throw(notAString); + const result = addCreateRoute.getFromReqObject(map, req); + expect(result.answer).to.equal('d'); }); }); }); From a4ba2c831e03b7354309bcbdce9c078db80f2ce1 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 20:21:56 +0200 Subject: [PATCH 26/95] Test for array value not being a string. --- src/crud/create.js | 10 +++++++--- test/crud/create.unit.js | 24 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index 84fb0e5..231ab70 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -146,6 +146,7 @@ function getFromReqObject(map, req, depth = 0) { Object.keys(map).forEach(function(key) { const value = map[key]; if (_.isArray(value)) { + ensureMapIsString(value[0]); data[key] = _.get(req, value[0], value[1]); return; } @@ -153,13 +154,16 @@ function getFromReqObject(map, req, depth = 0) { data[key] = getFromReqObject(value, req, depth + 1); return; } - if (!_.isString(value)) { - throw new Error(util.format('Invalid map value, must be a string : \n%j\n', value)); - } + ensureMapIsString(value); data[key] = _.get(req, value); }); return data; } +function ensureMapIsString(map){ + if (!_.isString(map)) { + throw new Error(util.format('Invalid map value, must be a string : \n%j\n', map)); + } +} function setOwnerIfApplicable(metadata) { return function _setOwnerIfApplicable(req, res, next) { diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 5ce38f0..c39c768 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -412,7 +412,6 @@ describe('Crud - create', function() { }).to.throw(notAString); }); - //TODO what if value isn't found? should we use "asdasd: ['a','defaultValue']" to denote using defaults? or do we throw an error? it('Should use the default value if one was supplied', function() { const req = httpMocks.createRequest({ a: 'b' @@ -423,6 +422,29 @@ describe('Crud - create', function() { const result = addCreateRoute.getFromReqObject(map, req); expect(result.answer).to.equal('d'); }); + + it('Should use the first value in the array for the map if only that is specified', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['a'] + }; + const result = addCreateRoute.getFromReqObject(map, req); + expect(result.answer).to.equal('b'); + }); + + it('Should throw an error if the first value in the array was not a string', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: [1] + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); }); }); From 47f9a84cf2c0b0eb546340d8de5cbdb1bb2f85e2 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 20:25:31 +0200 Subject: [PATCH 27/95] Check for too many items in the array. --- src/crud/create.js | 5 ++++- test/crud/create.unit.js | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/crud/create.js b/src/crud/create.js index 231ab70..fe3a566 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -147,6 +147,9 @@ function getFromReqObject(map, req, depth = 0) { const value = map[key]; if (_.isArray(value)) { ensureMapIsString(value[0]); + if (value.length > 2) { + throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); + } data[key] = _.get(req, value[0], value[1]); return; } @@ -159,7 +162,7 @@ function getFromReqObject(map, req, depth = 0) { }); return data; } -function ensureMapIsString(map){ +function ensureMapIsString(map) { if (!_.isString(map)) { throw new Error(util.format('Invalid map value, must be a string : \n%j\n', map)); } diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index c39c768..7cd9845 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -445,6 +445,30 @@ describe('Crud - create', function() { addCreateRoute.getFromReqObject(map, req); }).to.throw(notAString); }); + + it('Should throw an error if the array is empty', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: [] + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the array has more than 2 entries', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['a', 'a', 'a'] + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(/too many items in array/i); + }); }); }); From fa3e5fb0987694f714b4c5840b99b07c22e897db Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Wed, 14 Jun 2017 21:01:44 +0200 Subject: [PATCH 28/95] Implementing disallowedSuffixList --- src/crud/create.js | 16 +++++++++++++--- test/crud/create.unit.js | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index fe3a566..f94be6a 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -128,8 +128,9 @@ function getData(rules, req) { return _.merge({}, rules.static, fromReq); } +const defaultDisallowedSuffixList = ['password', 'passwordHash', 'passwordSalt']; const maxDepth = 10; -function getFromReqObject(map, req, depth = 0) { +function getFromReqObject(map, req, depth = 0, disallowedSuffixList = defaultDisallowedSuffixList) { if (!map) { return; } @@ -150,7 +151,7 @@ function getFromReqObject(map, req, depth = 0) { if (value.length > 2) { throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); } - data[key] = _.get(req, value[0], value[1]); + data[key] = getValue(req, value[0], value[1], disallowedSuffixList); return; } if (_.isObject(value)) { @@ -158,10 +159,19 @@ function getFromReqObject(map, req, depth = 0) { return; } ensureMapIsString(value); - data[key] = _.get(req, value); + data[key] = getValue(req, value, undefined, disallowedSuffixList); }); return data; } + +function getValue(req, map, defaultValue, disallowedSuffixList) { + const disallowed = disallowedSuffixList.find(suffix => map.endsWith(suffix)); + if (disallowed) { + throw new Error('Map is not allowed to end with ' + disallowed); + } + return _.get(req, map, defaultValue); +} + function ensureMapIsString(map) { if (!_.isString(map)) { throw new Error(util.format('Invalid map value, must be a string : \n%j\n', map)); diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 7cd9845..02a3b56 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -282,8 +282,6 @@ describe('Crud - create', function() { }); describe('getFromReqObject', function() { - //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? - it('Should map shallow properties from the req using the map', function() { const req = httpMocks.createRequest({ a: 'b' @@ -469,6 +467,37 @@ describe('Crud - create', function() { addCreateRoute.getFromReqObject(map, req); }).to.throw(/too many items in array/i); }); + + //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? + //todo const allowedPrefixList = ['user', 'process', 'body', 'params', 'query']; + it('Should not allow map values that end with something on the exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const disallowedSuffixList = ['.b']; + expect(function() { + addCreateRoute.getFromReqObject(map, req, 0, disallowedSuffixList); + }).to.throw(/Map is not allowed to end with/i); + }); + + it('Should not allow map values that end with something on the default exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.password' + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(/Map is not allowed to end with/i); + }); }); }); From ed44bc47f7896c2cadb68e5bcf66104e3cf399a5 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 07:55:23 +0200 Subject: [PATCH 29/95] Protecting the req object from accessing non specified properties. --- src/crud/create.js | 21 +++++++++++++---- test/crud/create.unit.js | 49 ++++++++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index f94be6a..cf80b4a 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -129,8 +129,15 @@ function getData(rules, req) { } const defaultDisallowedSuffixList = ['password', 'passwordHash', 'passwordSalt']; +const defaultAllowedPrefixList = ['user', 'process', 'body', 'params', 'query']; const maxDepth = 10; -function getFromReqObject(map, req, depth = 0, disallowedSuffixList = defaultDisallowedSuffixList) { +function getFromReqObject( + map, + req, + depth = 0, + disallowedSuffixList = defaultDisallowedSuffixList, + allowedPrefixList = defaultAllowedPrefixList +) { if (!map) { return; } @@ -151,24 +158,28 @@ function getFromReqObject(map, req, depth = 0, disallowedSuffixList = defaultDis if (value.length > 2) { throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); } - data[key] = getValue(req, value[0], value[1], disallowedSuffixList); + data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getFromReqObject(value, req, depth + 1); + data[key] = getFromReqObject(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); return; } ensureMapIsString(value); - data[key] = getValue(req, value, undefined, disallowedSuffixList); + data[key] = getValue(req, value, undefined, disallowedSuffixList, allowedPrefixList); }); return data; } -function getValue(req, map, defaultValue, disallowedSuffixList) { +function getValue(req, map, defaultValue, disallowedSuffixList, allowedPrefixList) { const disallowed = disallowedSuffixList.find(suffix => map.endsWith(suffix)); if (disallowed) { throw new Error('Map is not allowed to end with ' + disallowed); } + const allowed = allowedPrefixList.find(prefix => map.startsWith(prefix)); + if (!allowed) { + throw new Error(util.format('Map must start with one of %j', allowedPrefixList)); + } return _.get(req, map, defaultValue); } diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 02a3b56..5771066 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -289,7 +289,7 @@ describe('Crud - create', function() { const map = { answer: 'a' }; - const data = addCreateRoute.getFromReqObject(map, req); + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.answer).to.equal('b'); }); @@ -302,7 +302,7 @@ describe('Crud - create', function() { const map = { answer: 'a.b' }; - const data = addCreateRoute.getFromReqObject(map, req); + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.answer).to.equal('c'); }); @@ -315,7 +315,7 @@ describe('Crud - create', function() { answer: 'a' } }; - const data = addCreateRoute.getFromReqObject(map, req); + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.nested.answer).to.equal('b'); }); @@ -330,7 +330,7 @@ describe('Crud - create', function() { answer: 'a.b' } }; - const data = addCreateRoute.getFromReqObject(map, req); + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.nested.answer).to.equal('c'); }); @@ -417,7 +417,7 @@ describe('Crud - create', function() { const map = { answer: ['c', 'd'] }; - const result = addCreateRoute.getFromReqObject(map, req); + const result = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['c']); expect(result.answer).to.equal('d'); }); @@ -428,7 +428,7 @@ describe('Crud - create', function() { const map = { answer: ['a'] }; - const result = addCreateRoute.getFromReqObject(map, req); + const result = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); expect(result.answer).to.equal('b'); }); @@ -468,8 +468,7 @@ describe('Crud - create', function() { }).to.throw(/too many items in array/i); }); - //TODO security around retrieving things from request? Maybe only from certain parts of req? req.params? req.query? req.body? req.process? - //todo const allowedPrefixList = ['user', 'process', 'body', 'params', 'query']; + const invalidSuffix = /Map is not allowed to end with/i; it('Should not allow map values that end with something on the exception list', function() { const req = httpMocks.createRequest({ a: { @@ -482,7 +481,7 @@ describe('Crud - create', function() { const disallowedSuffixList = ['.b']; expect(function() { addCreateRoute.getFromReqObject(map, req, 0, disallowedSuffixList); - }).to.throw(/Map is not allowed to end with/i); + }).to.throw(invalidSuffix); }); it('Should not allow map values that end with something on the default exception list', function() { @@ -496,7 +495,37 @@ describe('Crud - create', function() { }; expect(function() { addCreateRoute.getFromReqObject(map, req); - }).to.throw(/Map is not allowed to end with/i); + }).to.throw(invalidSuffix); + }); + + const invalidPrefix = /Map must start with one of /i; + it('Should not allow access to req properties are not on the exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const allowedPrefixList = []; + expect(function() { + addCreateRoute.getFromReqObject(map, req, 0, undefined, allowedPrefixList); + }).to.throw(invalidPrefix); + }); + + it('Should not allow map values that end with something on the default exception list', function() { + const req = httpMocks.createRequest({ + body: { + b: 'c' + } + }); + const map = { + answer: 'body.password' + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(invalidSuffix); }); }); }); From 7af130baf989310b0bc6df1abceab820d8f7a2b1 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 16:42:57 +0200 Subject: [PATCH 30/95] Moving request-mocking to its own file. --- test/@util/request-mocking.js | 56 +++++++++++++++++++++++++++++++++++ test/crud/create.unit.js | 50 ++----------------------------- 2 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 test/@util/request-mocking.js diff --git a/test/@util/request-mocking.js b/test/@util/request-mocking.js new file mode 100644 index 0000000..d66bb17 --- /dev/null +++ b/test/@util/request-mocking.js @@ -0,0 +1,56 @@ +'use strict'; +const httpMocks = require('node-mocks-http'); +const events = require('events'); + +module.exports = { + mockRequest, + shouldNotCallNext, + shouldCallNext, + shouldNotReturnResponse +}; + +function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallback) { + const req = httpMocks.createRequest(reqOptions); + const res = httpMocks.createResponse({ + eventEmitter: events.EventEmitter + }); + res.on('end', function() { + let resToReturn; + try { + resToReturn = { + statusCode: res._getStatusCode(), + body: JSON.parse(res._getData()), + headers: res._getHeaders(), + raw: res + }; + } catch (err) { + return responseCallback(err); + } + responseCallback(null, resToReturn); + }); + middlewareOrRouter(req, res, nextCallback); +} + +function shouldNotCallNext(done) { + return function next(err) { + if (err) { + return done(err); + } + return done(new Error('Next should not have been called')); + }; +} + +function shouldCallNext(done) { + return function next(err) { + if (err) { + return done(err); + } + return done(); + }; +} + +function shouldNotReturnResponse(done) { + return function resComplete() { + done(new Error('res.end should not have been called')); + }; +} diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 5771066..253e934 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -1,10 +1,10 @@ 'use strict'; require('../@util/init.js'); const addCreateRoute = require('../../src/crud/create'); -const httpMocks = require('node-mocks-http'); -const events = require('events'); +const mockRequest = require('../@util/request-mocking').mockRequest; const moment = require('moment'); const sinon = require('sinon'); +const httpMocks = require('node-mocks-http'); describe('Crud - create', function() { describe('setStatusIfApplicable', function() { @@ -541,49 +541,3 @@ function buildMetadata(statuses) { } return metadata; } - -function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallback) { - const req = httpMocks.createRequest(reqOptions); - const res = httpMocks.createResponse({ - eventEmitter: events.EventEmitter - }); - res.on('end', function() { - let resToReturn; - try { - resToReturn = { - statusCode: res._getStatusCode(), - body: JSON.parse(res._getData()), - headers: res._getHeaders(), - raw: res - }; - } catch (err) { - return responseCallback(err); - } - responseCallback(null, resToReturn); - }); - middlewareOrRouter(req, res, nextCallback); -} - -// function shouldNotCallNext(done) { -// return function next(err) { -// if (err) { -// return done(err); -// } -// return done(new Error('Next should not have been called')); -// }; -// } -// -// function shouldCallNext(done) { -// return function next(err) { -// if (err) { -// return done(err); -// } -// return done(); -// }; -// } -// -// function shouldNotReturnResponse(done) { -// return function resComplete() { -// done(new Error('res.end should not have been called')); -// }; -// } From dbd468a91b80338d631269ee47135e55c11fa260 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 17:10:06 +0200 Subject: [PATCH 31/95] Updating todo's --- src/metadata/hydrate-schema.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/metadata/hydrate-schema.js b/src/metadata/hydrate-schema.js index 5e8432c..baa5249 100644 --- a/src/metadata/hydrate-schema.js +++ b/src/metadata/hydrate-schema.js @@ -45,9 +45,9 @@ function addStatusInfo(schema) { properties: { status: schema.properties.status, statusDate: schema.properties.statusDate, - data: schema.updateStatusSchema + data: schema.updateStatusSchema //todo anyof? }, - required: ['status', 'statusDate', 'data'], + required: ['status', 'statusDate', 'data'], //todo - data check schema anyof? additionalProperties: false }, additionalItems: false @@ -84,7 +84,7 @@ function addOwnerInfo(schema) { type: ['object', 'string'] //todo? } }, - required: ['owner', 'ownerDate', 'data'], + required: ['owner', 'ownerDate', 'data'], //todo - data check schema anyof? additionalProperties: false }, additionalItems: false From 7812249e1e7e8971895b36e048787f0ed0183e81 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 17:18:00 +0200 Subject: [PATCH 32/95] adding static inital data for user statuses. --- src/routes/users/user.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/routes/users/user.json b/src/routes/users/user.json index dbe8764..a65c7fc 100644 --- a/src/routes/users/user.json +++ b/src/routes/users/user.json @@ -7,7 +7,12 @@ "statuses": [ { "name": "active", - "description": "Default status, shows that the user is active and can login" + "description": "Default status, shows that the user is active and can login", + "initialData":{ + "static":{ + "reason":"testing" + } + } }, { "name": "inactive", From bfd721028e6b08ed5a661fc9e06c2384ea78157f Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 17:35:32 +0200 Subject: [PATCH 33/95] running lint step --- src/crud/create.js | 23 +++++++++++++++++++---- test/crud/create.unit.js | 8 ++++++-- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index cf80b4a..8a7c18f 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -90,7 +90,9 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', + 'Informs the caller that the ' + + metadata.title.toLowerCase() + + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -156,13 +158,21 @@ function getFromReqObject( if (_.isArray(value)) { ensureMapIsString(value[0]); if (value.length > 2) { - throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); + throw new Error( + util.format('Too many items in array, should be at most 2. %j', value) + ); } data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getFromReqObject(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); + data[key] = getFromReqObject( + value, + req, + depth + 1, + disallowedSuffixList, + allowedPrefixList + ); return; } ensureMapIsString(value); @@ -199,7 +209,12 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) + boom.badRequest( + util.format( + 'Owner from expression "%s" was blank', + ownership.setOwnerExpression + ) + ) ); } } else { diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 253e934..0af0c90 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -70,7 +70,9 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function(done) { + it('Should create a status log entry with the status set to the first one in the schema', function( + done + ) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = addCreateRoute.setStatusIfApplicable(metadata); const reqOptions = { @@ -95,7 +97,9 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); + expect( + moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) + ).to.be.lessThan(1); done(); } }); From f922b9afebd9f1775d5e4e212a1ff1e7b6e5ce4e Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 17:39:55 +0200 Subject: [PATCH 34/95] fixing wildcard issue --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e54d0a0..f35dea0 100644 --- a/package.json +++ b/package.json @@ -77,8 +77,7 @@ "winston": "2.3.1", "winston-daily-rotate-file": "1.4.6", "winston-graylog2": "0.6.0", - "winston-loggly": "1.3.1", - "snyk": "^1.33.0" + "winston-loggly": "1.3.1" }, "devDependencies": { "chai": "4.0.1", @@ -99,6 +98,7 @@ "proxyquire": "1.8.0", "sinon": "2.3.2", "sinon-chai": "2.10.0", + "snyk": "1.33.0", "supertest": "3.0.0", "swagger-ui": "3.0.13" }, From efb7e58dbfd77df64b0970185992e2b80b9dc7eb Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 17:44:24 +0200 Subject: [PATCH 35/95] Better creation with statuses (#11) * adding tests for as-is code. * more assertions * More as-is analysis * updating how status data is set on creation. * Adding shared code. * refactoring code to be more reusable. * more tests * checking depth. * using util to inspect. * Updating code to allow stubbing. * test for merging. * simplifying top level test. * test for merging * More tests for formatting * implementing default value logic. * Test for array value not being a string. * Check for too many items in the array. * Implementing disallowedSuffixList * Protecting the req object from accessing non specified properties. * Moving request-mocking to its own file. * Updating todo's * adding static inital data for user statuses. * running lint step * fixing wildcard issue --- package.json | 9 +- src/crud/create.js | 92 +++++- src/metadata/hydrate-schema.js | 6 +- src/routes/users/user.json | 7 +- test/@util/request-mocking.js | 56 ++++ test/crud/create.unit.js | 547 +++++++++++++++++++++++++++++++++ 6 files changed, 706 insertions(+), 11 deletions(-) create mode 100644 test/@util/request-mocking.js create mode 100644 test/crud/create.unit.js diff --git a/package.json b/package.json index c51e873..f35dea0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,10 @@ { "name": "node-api-seed", "title": "Node Api Seed", - "version": "0.0.0", + "version": "0.0.1", + "engines": { + "node": ">=6.10.0" + }, "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", "main": "index.js", @@ -74,8 +77,7 @@ "winston": "2.3.1", "winston-daily-rotate-file": "1.4.6", "winston-graylog2": "0.6.0", - "winston-loggly": "1.3.1", - "snyk": "^1.33.0" + "winston-loggly": "1.3.1" }, "devDependencies": { "chai": "4.0.1", @@ -96,6 +98,7 @@ "proxyquire": "1.8.0", "sinon": "2.3.2", "sinon-chai": "2.10.0", + "snyk": "1.33.0", "supertest": "3.0.0", "swagger-ui": "3.0.13" }, diff --git a/src/crud/create.js b/src/crud/create.js index 9c37dc1..8a7c18f 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -22,8 +22,14 @@ function addCreateRoute(router, crudMiddleware, maps) { .describe(router.metadata.creationDescription || description(router.metadata)); return router; } +addCreateRoute.getSteps = getSteps; +addCreateRoute.sendCreateResult = sendCreateResult; +addCreateRoute.description = description; addCreateRoute.setStatusIfApplicable = setStatusIfApplicable; addCreateRoute.setOwnerIfApplicable = setOwnerIfApplicable; +addCreateRoute.getFromReqObject = getFromReqObject; +addCreateRoute.getData = getData; + module.exports = addCreateRoute; function getSteps(router, crudMiddleware, maps) { @@ -100,14 +106,14 @@ function setStatusIfApplicable(metadata) { if (!statuses || statuses.length <= 0) { return next(); } - req.body.status = statuses[0].name; + const statusToSet = statuses[0]; + req.body.status = statusToSet.name; req.body.statusDate = moment.utc().toDate(); req.body.statusLog = [ { status: req.body.status, - data: { - reason: 'Initial Status' //todo need to set this logically somehow - }, + //we use 'addCreateRoute.' here to allow stubbing in the unit tests + data: addCreateRoute.getData(statusToSet.initialData, req), statusDate: req.body.statusDate } ]; @@ -115,6 +121,84 @@ function setStatusIfApplicable(metadata) { }; } +function getData(rules, req) { + if (!rules) { + return; + } + //we use 'addCreateRoute.' here to allow stubbing in the unit tests + const fromReq = addCreateRoute.getFromReqObject(rules.fromReq, req); + return _.merge({}, rules.static, fromReq); +} + +const defaultDisallowedSuffixList = ['password', 'passwordHash', 'passwordSalt']; +const defaultAllowedPrefixList = ['user', 'process', 'body', 'params', 'query']; +const maxDepth = 10; +function getFromReqObject( + map, + req, + depth = 0, + disallowedSuffixList = defaultDisallowedSuffixList, + allowedPrefixList = defaultAllowedPrefixList +) { + if (!map) { + return; + } + if (depth > maxDepth) { + throw new Error( + util.format( + 'Circular reference detected in map object after maximum depth (%s) reached. Partial map\n%j\n', + maxDepth, + util.inspect(map, true, maxDepth) + ) + ); + } + const data = {}; + Object.keys(map).forEach(function(key) { + const value = map[key]; + if (_.isArray(value)) { + ensureMapIsString(value[0]); + if (value.length > 2) { + throw new Error( + util.format('Too many items in array, should be at most 2. %j', value) + ); + } + data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); + return; + } + if (_.isObject(value)) { + data[key] = getFromReqObject( + value, + req, + depth + 1, + disallowedSuffixList, + allowedPrefixList + ); + return; + } + ensureMapIsString(value); + data[key] = getValue(req, value, undefined, disallowedSuffixList, allowedPrefixList); + }); + return data; +} + +function getValue(req, map, defaultValue, disallowedSuffixList, allowedPrefixList) { + const disallowed = disallowedSuffixList.find(suffix => map.endsWith(suffix)); + if (disallowed) { + throw new Error('Map is not allowed to end with ' + disallowed); + } + const allowed = allowedPrefixList.find(prefix => map.startsWith(prefix)); + if (!allowed) { + throw new Error(util.format('Map must start with one of %j', allowedPrefixList)); + } + return _.get(req, map, defaultValue); +} + +function ensureMapIsString(map) { + if (!_.isString(map)) { + throw new Error(util.format('Invalid map value, must be a string : \n%j\n', map)); + } +} + function setOwnerIfApplicable(metadata) { return function _setOwnerIfApplicable(req, res, next) { let ownership = metadata.schemas.core.ownership; diff --git a/src/metadata/hydrate-schema.js b/src/metadata/hydrate-schema.js index 5e8432c..baa5249 100644 --- a/src/metadata/hydrate-schema.js +++ b/src/metadata/hydrate-schema.js @@ -45,9 +45,9 @@ function addStatusInfo(schema) { properties: { status: schema.properties.status, statusDate: schema.properties.statusDate, - data: schema.updateStatusSchema + data: schema.updateStatusSchema //todo anyof? }, - required: ['status', 'statusDate', 'data'], + required: ['status', 'statusDate', 'data'], //todo - data check schema anyof? additionalProperties: false }, additionalItems: false @@ -84,7 +84,7 @@ function addOwnerInfo(schema) { type: ['object', 'string'] //todo? } }, - required: ['owner', 'ownerDate', 'data'], + required: ['owner', 'ownerDate', 'data'], //todo - data check schema anyof? additionalProperties: false }, additionalItems: false diff --git a/src/routes/users/user.json b/src/routes/users/user.json index dbe8764..a65c7fc 100644 --- a/src/routes/users/user.json +++ b/src/routes/users/user.json @@ -7,7 +7,12 @@ "statuses": [ { "name": "active", - "description": "Default status, shows that the user is active and can login" + "description": "Default status, shows that the user is active and can login", + "initialData":{ + "static":{ + "reason":"testing" + } + } }, { "name": "inactive", diff --git a/test/@util/request-mocking.js b/test/@util/request-mocking.js new file mode 100644 index 0000000..d66bb17 --- /dev/null +++ b/test/@util/request-mocking.js @@ -0,0 +1,56 @@ +'use strict'; +const httpMocks = require('node-mocks-http'); +const events = require('events'); + +module.exports = { + mockRequest, + shouldNotCallNext, + shouldCallNext, + shouldNotReturnResponse +}; + +function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallback) { + const req = httpMocks.createRequest(reqOptions); + const res = httpMocks.createResponse({ + eventEmitter: events.EventEmitter + }); + res.on('end', function() { + let resToReturn; + try { + resToReturn = { + statusCode: res._getStatusCode(), + body: JSON.parse(res._getData()), + headers: res._getHeaders(), + raw: res + }; + } catch (err) { + return responseCallback(err); + } + responseCallback(null, resToReturn); + }); + middlewareOrRouter(req, res, nextCallback); +} + +function shouldNotCallNext(done) { + return function next(err) { + if (err) { + return done(err); + } + return done(new Error('Next should not have been called')); + }; +} + +function shouldCallNext(done) { + return function next(err) { + if (err) { + return done(err); + } + return done(); + }; +} + +function shouldNotReturnResponse(done) { + return function resComplete() { + done(new Error('res.end should not have been called')); + }; +} diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js new file mode 100644 index 0000000..0af0c90 --- /dev/null +++ b/test/crud/create.unit.js @@ -0,0 +1,547 @@ +'use strict'; +require('../@util/init.js'); +const addCreateRoute = require('../../src/crud/create'); +const mockRequest = require('../@util/request-mocking').mockRequest; +const moment = require('moment'); +const sinon = require('sinon'); +const httpMocks = require('node-mocks-http'); + +describe('Crud - create', function() { + describe('setStatusIfApplicable', function() { + it('Should not set req.body.status if the provided schema has no statuses', function(done) { + const metadata = buildMetadata(); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.status).to.not.be.ok(); + expect(reqOptions.body.statusDate).to.not.be.ok(); + expect(reqOptions.body.statusLog).to.not.be.ok(); + done(); + } + }); + + it('Should set req.body.status to the first status in the schema', function(done) { + const metadata = buildMetadata([{ name: 'a' }, { name: 'b' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.status).to.equal('a'); + done(); + } + }); + + it('Should set req.body.statusDate to now', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(moment(reqOptions.body.statusDate).diff(new Date())).to.be.lessThan(1); + done(); + } + }); + + it('Should create a status log with one entry', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.statusLog).to.be.an('array').that.has.length(1); + done(); + } + }); + + it('Should create a status log entry with the status set to the first one in the schema', function( + done + ) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect(reqOptions.body.statusLog[0].status).to.equal('a'); + done(); + } + }); + + it('Should create a status log entry with the statusDate set to now', function(done) { + const metadata = buildMetadata([{ name: 'a' }]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + expect( + moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) + ).to.be.lessThan(1); + done(); + } + }); + + describe('Status log data', function() { + it('Should not exist if initialData was missing', function(done) { + const statusToSet = { + name: 'a' + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(data).to.not.be.ok(); + done(); + } + }); + + it('Should be an empty object if initialData was an empty object', function(done) { + const statusToSet = { + name: 'a', + initialData: {} + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(Object.keys(data)).to.have.lengthOf(0); + done(); + } + }); + + it('Should be merge the result from getData', function(done) { + const statusToSet = { + name: 'a', + initialData: {} + }; + const metadata = buildMetadata([statusToSet]); + const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const reqOptions = { + body: {} + }; + const stubbedData = { + bob: true, + asd: { + value: 1, + name: 'bob' + } + }; + const stub = sinon.stub(addCreateRoute, 'getData'); + stub.returns(stubbedData); + mockRequest(middleware, reqOptions, null, next); + + function next(error) { + stub.restore(); + expect(error).to.not.be.ok(); + const data = reqOptions.body.statusLog[0].data; + expect(data).to.deep.equal(stubbedData); + done(); + } + }); + }); + }); + + describe('getData', function() { + it('Should not exist if rules was falsy', function() { + const data = addCreateRoute.getData(null, {}); + expect(data).to.not.be.ok(); + }); + + it('Should be an empty object if rules was an empty object', function() { + const data = addCreateRoute.getData({}, {}); + expect(data).to.be.ok(); + expect(Object.keys(data)).to.have.lengthOf(0); + }); + + it('Should return an object that deep equals rules.static if only initialData.static was set', function() { + const req = {}; + const rules = { + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: {} + } + }; + const data = addCreateRoute.getData(rules, req); + expect(data).to.deep.equal(rules.static); + }); + + it('Should merge the result from getFromReqObject if rules.fromReq existed', function() { + const req = {}; + const rules = { + fromReq: {} + }; + const stubbedData = { + bob: true + }; + const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + stub.returns(stubbedData); + const data = addCreateRoute.getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + }); + + it('Should merge the result from getFromReqObject and static if both were set', function() { + const req = {}; + const rules = { + fromReq: {}, + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: { + subObject: {} + } + } + }; + const stubbedData = { + bob: true + }; + const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + stub.returns(stubbedData); + const data = addCreateRoute.getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + expect(data.number).to.equal(rules.static.number); + expect(data.string).to.equal(rules.static.string); + expect(data.bool).to.equal(rules.static.bool); + expect(data.array).to.deep.equal(rules.static.array); + expect(data.object).to.deep.equal(rules.static.object); + }); + + it('Should prioritise fields from getFromReqObject over static if both were set', function() { + const req = {}; + const rules = { + fromReq: {}, + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: { + subObject: {} + } + } + }; + const stubbedData = { + bob: true, + number: 2, + string: 'test2', + bool: false, + array: [], + object: { + betterSubObject: {} + } + }; + const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + stub.returns(stubbedData); + const data = addCreateRoute.getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + expect(data.number).to.equal(stubbedData.number); + expect(data.string).to.equal(stubbedData.string); + expect(data.bool).to.equal(stubbedData.bool); + expect(data.array).to.deep.equal(rules.static.array); + expect(data.object.subObject).to.be.ok; + expect(data.object.betterSubObject).to.be.ok; + }); + }); + + describe('getFromReqObject', function() { + it('Should map shallow properties from the req using the map', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: 'a' + }; + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + expect(data.answer).to.equal('b'); + }); + + it('Should map deep properties from the req using the map', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + expect(data.answer).to.equal('c'); + }); + + it('Should support a nested map structure', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + nested: { + answer: 'a' + } + }; + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + expect(data.nested.answer).to.equal('b'); + }); + + it('Should support a nested map structure with a nested request object', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + nested: { + answer: 'a.b' + } + }; + const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + expect(data.nested.answer).to.equal('c'); + }); + + it('Should throw an error for circular reference maps', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + nested: {} + }; + map.nested.answer = map; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(/circular reference/i); + }); + + const notAString = /must be a string/i; + + it('Should throw an error if the map was a number', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: 1 + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the map was a boolean', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: true + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should not throw an error if the map was an empty object', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: {} + }; + const data = addCreateRoute.getFromReqObject(map, req); + expect(data.answer).to.deep.equal({}); + }); + + it('Should throw an error if the map was null', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: null + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the map was undefined', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: undefined + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should use the default value if one was supplied', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['c', 'd'] + }; + const result = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['c']); + expect(result.answer).to.equal('d'); + }); + + it('Should use the first value in the array for the map if only that is specified', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['a'] + }; + const result = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + expect(result.answer).to.equal('b'); + }); + + it('Should throw an error if the first value in the array was not a string', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: [1] + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the array is empty', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: [] + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the array has more than 2 entries', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['a', 'a', 'a'] + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(/too many items in array/i); + }); + + const invalidSuffix = /Map is not allowed to end with/i; + it('Should not allow map values that end with something on the exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const disallowedSuffixList = ['.b']; + expect(function() { + addCreateRoute.getFromReqObject(map, req, 0, disallowedSuffixList); + }).to.throw(invalidSuffix); + }); + + it('Should not allow map values that end with something on the default exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.password' + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(invalidSuffix); + }); + + const invalidPrefix = /Map must start with one of /i; + it('Should not allow access to req properties are not on the exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const allowedPrefixList = []; + expect(function() { + addCreateRoute.getFromReqObject(map, req, 0, undefined, allowedPrefixList); + }).to.throw(invalidPrefix); + }); + + it('Should not allow map values that end with something on the default exception list', function() { + const req = httpMocks.createRequest({ + body: { + b: 'c' + } + }); + const map = { + answer: 'body.password' + }; + expect(function() { + addCreateRoute.getFromReqObject(map, req); + }).to.throw(invalidSuffix); + }); + }); +}); + +function buildMetadata(statuses) { + const metadata = { + schemas: { + core: {} + } + }; + if (statuses) { + metadata.schemas.core.statuses = statuses; + } + return metadata; +} From c6153f5bc8065e4f026c1dad5394fa7d541a52b7 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 17:52:25 +0200 Subject: [PATCH 36/95] updating libs --- package-lock.json | 195 ++++++++++++++++++++-------------------------- package.json | 13 ++-- 2 files changed, 93 insertions(+), 115 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27dc866..5991da4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-api-seed", - "version": "0.0.0", + "version": "0.0.1", "lockfileVersion": 1, "dependencies": { "@ava/babel-plugin-throws-helper": { @@ -892,7 +892,8 @@ "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true }, "caseless": { "version": "0.12.0", @@ -906,32 +907,10 @@ "dev": true }, "chai": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.0.1.tgz", - "integrity": "sha1-nkHoCOF6fxCAdyHirFpYnVuwkII=", - "dev": true, - "dependencies": { - "deep-eql": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", - "dev": true, - "dependencies": { - "type-detect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", - "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", - "dev": true - } - } - }, - "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", - "dev": true - } - } + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.0.2.tgz", + "integrity": "sha1-L3MnxN5vOF3XeHmZ4qsCaXoyuDs=", + "dev": true }, "chalk": { "version": "1.1.3", @@ -1281,7 +1260,8 @@ "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=" + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true }, "create-react-class": { "version": "15.5.2", @@ -1289,11 +1269,6 @@ "integrity": "sha1-aodYNI32YLiDJqDnZNVp8nSq1oE=", "dev": true }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=" - }, "cross-spawn-async": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", @@ -1314,7 +1289,8 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true }, "currently-unhandled": { "version": "0.4.1", @@ -1388,6 +1364,20 @@ "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=", "dev": true }, + "deep-eql": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "dev": true, + "dependencies": { + "type-detect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", + "dev": true + } + } + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -1601,7 +1591,8 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true }, "duplexify": { "version": "3.5.0", @@ -1874,9 +1865,9 @@ "dev": true }, "eslint-plugin-prettier": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.1.1.tgz", - "integrity": "sha1-L7fiq5YfK2HSyM+RvBdxbKjFOGg=", + "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 }, "espower-location-detector": { @@ -2234,8 +2225,7 @@ "formatio": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=" }, "formidable": { "version": "1.1.1", @@ -2911,7 +2901,8 @@ "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true }, "getbase": { "version": "2.8.2", @@ -3565,7 +3556,8 @@ "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true }, "is-regex": { "version": "1.0.4", @@ -3582,7 +3574,8 @@ "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -4199,8 +4192,7 @@ "lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", - "dev": true + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=" }, "long-timeout": { "version": "0.1.1", @@ -4226,7 +4218,8 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true }, "lru-cache": { "version": "4.0.2", @@ -4336,11 +4329,6 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4475,8 +4463,7 @@ "native-promise-only": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", - "dev": true + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=" }, "natural-compare": { "version": "1.4.0", @@ -5263,11 +5250,6 @@ } } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "p-limit": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", @@ -5539,7 +5521,8 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true }, "preserve": { "version": "0.2.0", @@ -5547,9 +5530,9 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "prettier": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.4.2.tgz", - "integrity": "sha512-iJ8HPTHA/Amt9FDLrSRBWG+IWZo6Z4MJ/2oxJP4Rz6UWQUr4rM3MWYeFi6tG4d9kYGuvbnnZ/KYCGdTQ8sPubw==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.4.4.tgz", + "integrity": "sha512-GuuPazIvjW1DG26yLQgO+nagmRF/h9M4RaCtZWqu/eFW7csdZkQEwPJUeXX10d+LzmCnR9DuIZndqIOn3p2YoA==", "dev": true }, "pretty-format": { @@ -5712,11 +5695,13 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -5958,12 +5943,14 @@ "registry-auth-token": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=" + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true }, "registry-url": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=" + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true }, "regjsgen": { "version": "0.2.0", @@ -6169,8 +6156,7 @@ "samsam": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", - "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=", - "dev": true + "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=" }, "sanitize-html": { "version": "1.14.1", @@ -6264,34 +6250,19 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "sinon": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.2.tgz", - "integrity": "sha1-xDqcVw8yuqwRWVBc/u0ZEIhV34k=", - "dev": true, + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.4.tgz", + "integrity": "sha1-RmrY0brobW21GqIYuS6Ze8Pl24g=", "dependencies": { - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "path-to-regexp": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true - }, - "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", - "dev": true + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=" } } }, @@ -6685,20 +6656,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, - "swagger-client": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.0.13.tgz", - "integrity": "sha1-BF3QsOgVEFd7kIID8kZ/Fd9HMZQ=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", - "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", - "dev": true - } - } - }, "swagger-schema-official": { "version": "2.0.0-bab6bed", "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", @@ -6710,9 +6667,9 @@ "integrity": "sha512-TZsCHjOUoOs3AYrZgD/di50yJnwPTlwiIH1TQDDxqydQKwpzppWIeu1cjf6Wq53lzgH4kmw0WPtecsebBvXe0Q==" }, "swagger-ui": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-3.0.13.tgz", - "integrity": "sha1-dmn+2awakqdXxBhQT2axTIyjmxY=", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-3.0.14.tgz", + "integrity": "sha1-a60Wb9Rqb9vlrUt0amixp38/J/s=", "dev": true, "dependencies": { "deep-extend": { @@ -6726,6 +6683,20 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", "integrity": "sha1-NKMFW6vgTOQkZ7YH1wAHLH/2v0I=", "dev": true + }, + "swagger-client": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.0.14.tgz", + "integrity": "sha1-3dvZbF9z6wYfGp2kc7OC6UC7bFw=", + "dev": true, + "dependencies": { + "lodash": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", + "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", + "dev": true + } + } } } }, @@ -6808,8 +6779,7 @@ "text-encoding": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=" }, "text-table": { "version": "0.2.0", @@ -6956,6 +6926,11 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=" + }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", @@ -7090,7 +7065,8 @@ "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=" + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true }, "unique-temp-dir": { "version": "1.0.0", @@ -7183,7 +7159,8 @@ "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true }, "user-home": { "version": "2.0.0", diff --git a/package.json b/package.json index f35dea0..10cabc0 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "password-generator": "2.1.0", "pluralize": "5.0.0", "request-id": "0.11.1", + "sinon": "2.3.4", "swagger-spec-express": "2.0.3", "winston": "2.3.1", "winston-daily-rotate-file": "1.4.6", @@ -80,12 +81,13 @@ "winston-loggly": "1.3.1" }, "devDependencies": { - "chai": "4.0.1", + "chai": "4.0.2", + "diff": "3.2.0", "dirty-chai": "1.2.2", "eslint": "3.19.0", "eslint-config-prettier": "2.1.1", "eslint-plugin-node": "5.0.0", - "eslint-plugin-prettier": "2.1.1", + "eslint-plugin-prettier": "2.1.2", "glob": "7.1.2", "istanbul": "0.4.5", "mocha": "3.4.2", @@ -94,13 +96,12 @@ "npm-check": "5.4.4", "nsp": "2.6.3", "plato": "1.7.0", - "prettier": "1.4.2", + "prettier": "1.4.4", "proxyquire": "1.8.0", - "sinon": "2.3.2", "sinon-chai": "2.10.0", "snyk": "1.33.0", "supertest": "3.0.0", - "swagger-ui": "3.0.13" + "swagger-ui": "3.0.14" }, "snyk": true -} \ No newline at end of file +} From 452b7c1247bfde7b73c5945fce8584dfdb8f16b8 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 19:42:42 +0200 Subject: [PATCH 37/95] Updating packages --- package-lock.json | 219 ++++++++++++++++++++++++++++++++-------------- package.json | 12 +-- 2 files changed, 160 insertions(+), 71 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5991da4..b70a5cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -726,9 +726,9 @@ } }, "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.1.0.tgz", + "integrity": "sha1-Awj6jpJM1tQtnDv0iDvcmPDnHfg=", "dependencies": { "hoek": { "version": "4.1.1", @@ -917,11 +917,6 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" }, - "chance": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/chance/-/chance-1.0.9.tgz", - "integrity": "sha1-ha5SwUXEM9afbx7/JPBWASt3pg8=" - }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -1475,11 +1470,6 @@ "integrity": "sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ=", "dev": true }, - "deref": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/deref/-/deref-0.6.4.tgz", - "integrity": "sha1-vVqW1F2+0wEbuBvfaN31S+jhvU4=" - }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -1501,9 +1491,9 @@ "integrity": "sha1-HMPIOkkNZ/ldkeOfatHy4Ia2MEg=" }, "dirty-chai": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-1.2.2.tgz", - "integrity": "sha1-eEleYZY19/5EIZqkyDeEm/GDFC4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-2.0.0.tgz", + "integrity": "sha512-1uLjgMcUCDt1UBglqRkpwv2102ox4+QpFsIzKlzCUGtR+ECZEPijmEv5O/ooPNN8Zd1Q6VjACA7C2uY8ZV40nA==", "dev": true }, "discontinuous-range": { @@ -1807,39 +1797,99 @@ "dev": true }, "eslint": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", - "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.0.0.tgz", + "integrity": "sha1-cnfAFDf99B3M0WjVqg5Jt1yh8mA=", "dev": true, "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + }, + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true + }, "doctrine": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true + }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.0.tgz", + "integrity": "sha512-JLl89yPOEoGohLjeGs3XCekeovADbrEw/WRJQYgPED6zeJWrpIsY9i9/rn+VltZox/9w94lVYqo94QfEmniB1w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true }, "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", + "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", "dev": true }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "dev": true + }, + "table": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", + "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", "dev": true } } @@ -1870,6 +1920,12 @@ "integrity": "sha1-S5D07n+Sv74ukmAX4cpA62KJZeo=", "dev": true }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true + }, "espower-location-detector": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/espower-location-detector/-/espower-location-detector-1.0.0.tgz", @@ -2065,6 +2121,20 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" }, + "external-editor": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", + "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", + "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", + "dev": true + } + } + }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -2080,11 +2150,6 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, - "faker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/faker/-/faker-3.0.1.tgz", - "integrity": "sha1-w2J4zUI/PFN1vCcEZqIjSFwOe7I=" - }, "fast-diff": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.1.tgz", @@ -3335,12 +3400,6 @@ "integrity": "sha1-6+OglIVxvMRszMvi+bzsJR6YS9A=", "dev": true }, - "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", - "dev": true - }, "invariant": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", @@ -3789,6 +3848,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, + "jschardet": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.4.2.tgz", + "integrity": "sha1-KqEH8UKvQSHRRWWdRPUIMJYeaZo=", + "dev": true + }, "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", @@ -3826,9 +3891,16 @@ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-faker": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.4.1.tgz", - "integrity": "sha1-PPsVqxNVuIwFufTMmFVSld6tPPk=" + "version": "0.5.0-rc6", + "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.0-rc6.tgz", + "integrity": "sha512-+0XdXBWL+xvCORLgxQyVNNPzMlwqO1SoLv07fmRjQIGOIOfgXeV4K67bsWP5sDTElsI/C3kVjF9zvcUEsvn/rg==", + "dependencies": { + "deref": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/deref/-/deref-0.7.0.tgz", + "integrity": "sha1-+GJIW5cfUemq1ZDRSbnrRtzAdME=" + } + } }, "json-schema-filter": { "version": "0.1.5", @@ -4329,6 +4401,12 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -5857,12 +5935,6 @@ } } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true - }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", @@ -6148,6 +6220,12 @@ "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true + }, "safe-buffer": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", @@ -6238,12 +6316,6 @@ "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "dev": true }, - "shelljs": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.7.tgz", - "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -6267,9 +6339,9 @@ } }, "sinon-chai": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.10.0.tgz", - "integrity": "sha1-arMAi7jK6ZKedE12ZXS0zzXzS1s=", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.11.0.tgz", + "integrity": "sha512-3kbzpr2q8N+M4CWkcym349ifwkXorsbw2YyVpEIvB3AKC/ebrLHXj3DySt8epKGA49zJBSgn1OvWHZ+O+aR0dA==", "dev": true }, "slash": { @@ -6293,9 +6365,9 @@ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" }, "snyk": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.33.0.tgz", - "integrity": "sha1-jjGoieJvWIGcpetbOflWAK+mesE=", + "version": "1.34.4", + "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.34.4.tgz", + "integrity": "sha1-nw1Qq08FRLEl+iHGfdFi3h586Rs=", "dev": true, "dependencies": { "configstore": { @@ -6420,6 +6492,12 @@ "integrity": "sha1-5BO2vUr2BQxeX0RSh5CeTpigmyI=", "dev": true }, + "snyk-python-plugin": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.0.0.tgz", + "integrity": "sha512-ES93Mr8h/u5EQXwMHQda8I/TnOHyvibENxJMdcAd7/fJEaZI2R4hgpFLcGRv4DzE3Y7Xz/mUPs8g0JpTIsGShQ==", + "dev": true + }, "snyk-recursive-readdir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/snyk-recursive-readdir/-/snyk-recursive-readdir-2.0.0.tgz", @@ -6864,6 +6942,12 @@ "integrity": "sha1-DFYkbzPzDaG409colauvFmYPOM8=", "dev": true }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", + "dev": true + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -6909,6 +6993,11 @@ "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", "dev": true }, + "tslib": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", + "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/package.json b/package.json index 10cabc0..ac33c6b 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "async": "2.4.1", "bcrypt": "1.0.2", "body-parser": "1.17.2", - "boom": "4.3.1", + "boom": "5.1.0", "cors": "2.8.3", "express": "4.15.3", "express-brute": "1.0.1", @@ -57,7 +57,7 @@ "express-sanitize-escape": "1.1.0", "get-parameter-names": "0.3.0", "helmet": "3.6.1", - "json-schema-faker": "0.4.1", + "json-schema-faker": "0.5.0-rc6", "json-schema-filter": "0.1.5", "json-schema-ref-parser": "3.1.2", "jsonwebtoken": "7.4.1", @@ -83,8 +83,8 @@ "devDependencies": { "chai": "4.0.2", "diff": "3.2.0", - "dirty-chai": "1.2.2", - "eslint": "3.19.0", + "dirty-chai": "2.0.0", + "eslint": "4.0.0", "eslint-config-prettier": "2.1.1", "eslint-plugin-node": "5.0.0", "eslint-plugin-prettier": "2.1.2", @@ -98,8 +98,8 @@ "plato": "1.7.0", "prettier": "1.4.4", "proxyquire": "1.8.0", - "sinon-chai": "2.10.0", - "snyk": "1.33.0", + "sinon-chai": "2.11.0", + "snyk": "1.34.4", "supertest": "3.0.0", "swagger-ui": "3.0.14" }, From a9dba3235aaf3ca045fc7e140593c72078e704e4 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Thu, 15 Jun 2017 19:51:33 +0200 Subject: [PATCH 38/95] allowing dashes in version numbers. --- utilities/check-dependencies-for-wildcards/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utilities/check-dependencies-for-wildcards/index.js b/utilities/check-dependencies-for-wildcards/index.js index b53e654..a8fca4b 100644 --- a/utilities/check-dependencies-for-wildcards/index.js +++ b/utilities/check-dependencies-for-wildcards/index.js @@ -12,7 +12,7 @@ function checkDependencySection(dependencySection) { console.warn(util.format('Http dependency detected (%s), skipping.', versionString)); return; } - const allowedCharacters = /^[a-zA-Z\d\.]{1,}$/; + const allowedCharacters = /^[a-zA-Z\d\.\-]{1,}$/; let valid = allowedCharacters.test(versionString); if (!valid) { throw new Error( From 5b0c9bb1914af774baee61a063a65dcc15cf3a00 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 11:49:20 +0200 Subject: [PATCH 39/95] node upgrade. --- package-lock.json | 2423 +++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 1242 insertions(+), 1183 deletions(-) diff --git a/package-lock.json b/package-lock.json index b70a5cb..3dc99f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,27 +36,27 @@ "integrity": "sha1-0KV9Jeua6rlkO90aAwZCuRwSPig=" }, "@types/express": { - "version": "4.0.35", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.35.tgz", - "integrity": "sha1-YmfHtgpR+sRzRns8SgLNHkQYBf4=", + "version": "4.0.36", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.36.tgz", + "integrity": "sha512-bT9q2eqH/E72AGBQKT50dh6AXzheTqigGZ1GwDiwmx7vfHff0bZOrvUWjvGpNWPNkRmX1vDF6wonG6rlpBHb1A==", "dev": true }, "@types/express-serve-static-core": { - "version": "4.0.45", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.45.tgz", - "integrity": "sha1-cbsfh9cYdILQ2IUfWylEWOHHhmc=", + "version": "4.0.47", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.47.tgz", + "integrity": "sha512-yDjDOiac4PRYQ3FUKoQmyTKpkRaux4E6xyAtoPcH2TBVa6eKZ3iE1nSdI1myUt5l6jyT1GoZmWWZOIA9C4o3Nw==", "dev": true }, "@types/mime": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz", - "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.0.tgz", + "integrity": "sha512-pZ3X4wf0T07Zcp383IJLTrPBDLo/s9DAQQ7QkDMLJpoDNosUkSRSkbXt8OExwWkK8OEPzwqzBz7XvBHofCXcsA==", "dev": true }, "@types/node": { - "version": "7.0.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.27.tgz", - "integrity": "sha512-2QMiuVOEye2yKmMwE1V96C9HSShmT0WSm6dv2WjacvePEjQNNJGAerTO5hdYhj5lpdK5MW+FVxmyzDhr4omIdw==", + "version": "7.0.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.31.tgz", + "integrity": "sha512-+KrE1LDddn97ip+gXZAnzNQ0pupKH/6tcKwTpo96BDVNpzmhIKGHug0Wd3H0dN4WEqYB1tXYI5m2mZuIZNI8tg==", "dev": true }, "@types/serve-static": { @@ -126,24 +126,12 @@ "ansi-align": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" - } - } + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=" }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", "dev": true }, "ansi-regex": { @@ -294,113 +282,12 @@ "ava": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/ava/-/ava-0.19.1.tgz", - "integrity": "sha1-Q92CQ1rRmzmA/8okiPBdqrlAsnM=", - "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=" - }, - "cli-spinners": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", - "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=" - }, - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=" - }, - "indent-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", - "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=" - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - } - } - } - } + "integrity": "sha1-Q92CQ1rRmzmA/8okiPBdqrlAsnM=" }, "ava-init": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/ava-init/-/ava-init-0.2.0.tgz", - "integrity": "sha1-kwTItMNX1m49/a4fv/R7EZnVxV0=", - "dependencies": { - "execa": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.5.1.tgz", - "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" - }, - "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=" - }, - "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=" - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" - }, - "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=" - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - } - } + "integrity": "sha1-kwTItMNX1m49/a4fv/R7EZnVxV0=" }, "aws-sign2": { "version": "0.6.0", @@ -420,30 +307,13 @@ "babel-core": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz", - "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=", - "dependencies": { - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" - } - } + "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=" }, "babel-generator": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz", "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=", "dependencies": { - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" - }, "jsesc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", @@ -595,39 +465,27 @@ "babel-template": { "version": "6.25.0", "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz", - "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=", - "dependencies": { - "babel-traverse": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", - "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" - }, - "babel-types": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", - "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" - } - } + "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=" }, "babel-traverse": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.24.1.tgz", - "integrity": "sha1-qzZnP9NW+aCUhlnnszjV/q2zFpU=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz", + "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=" }, "babel-types": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.24.1.tgz", - "integrity": "sha1-oTaHncFbNga9oNkMH8dDBML/CXU=" + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz", + "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=" }, "babylon": { - "version": "6.17.2", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.2.tgz", - "integrity": "sha1-IB0l71+JLEG65JSIsI2w3Udun1w=" + "version": "6.17.3", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.3.tgz", + "integrity": "sha512-mq0x3HCAGGmQyZXviOVe5TRsw37Ijy3D43jCqt/9WVf+onx2dUgW3PosnqCbScAFhRO9DGs8nxoMzU0iiosMqQ==" }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { "version": "1.2.0", @@ -695,6 +553,11 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, @@ -752,16 +615,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" } } }, @@ -772,9 +625,9 @@ "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=" + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=" }, "braces": { "version": "1.8.5", @@ -832,6 +685,11 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" } } }, @@ -892,8 +750,7 @@ "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" }, "caseless": { "version": "0.12.0", @@ -915,7 +772,14 @@ "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } }, "check-error": { "version": "1.0.2", @@ -961,33 +825,19 @@ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=" }, "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.0.0.tgz", + "integrity": "sha1-75h+09SDkaw9q5GAtAanQhgNbmo=" }, "cli-truncate": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.0.0.tgz", - "integrity": "sha1-IeuR9Hs/ZWDwBNt3p2m0Zo2cVRg=", - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" - } - } + "integrity": "sha1-IeuR9Hs/ZWDwBNt3p2m0Zo2cVRg=" }, "cli-width": { "version": "2.1.0", @@ -1007,6 +857,120 @@ "integrity": "sha1-p9iYJDrmIvertrtgTXQKdsalRhs=", "dev": true }, + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "configstore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", + "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "dev": true + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "got": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "latest-version": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", + "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", + "dev": true + }, + "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=", + "dev": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "dev": true + }, + "package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true + }, + "timed-out": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "dev": true + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true + }, "update-notifier": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.6.3.tgz", @@ -1019,18 +983,48 @@ "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", "dev": true }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "dev": true + }, "yargs": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "dev": true + }, + "yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "dev": true } } }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dependencies": { + "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=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "co": { "version": "4.6.0", @@ -1151,28 +1145,30 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, + "dev": true + }, + "configstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", + "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=" + }, + "connect": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz", + "integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=", "dependencies": { - "readable-stream": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.10.tgz", - "integrity": "sha512-HQEnnoV404e0EtwB9yNiuk2tJ+egeVC8Y9QBAxzDg8DBJt4BzRp+yQuIb/t3FIWkSTmIi+sgx7yVv/ZM0GNoqw==", - "dev": true + "debug": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", + "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "dev": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, - "configstore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", - "dev": true - }, "connect-history-api-fallback": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.1.0.tgz", @@ -1255,15 +1251,19 @@ "create-error-class": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=" }, "create-react-class": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.5.2.tgz", - "integrity": "sha1-aodYNI32YLiDJqDnZNVp8nSq1oE=", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.0.tgz", + "integrity": "sha1-q0SEl8JlZuHilBPogyB9V8/nvtQ=", "dev": true }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=" + }, "cross-spawn-async": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", @@ -1284,8 +1284,7 @@ "crypto-random-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", - "dev": true + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" }, "currently-unhandled": { "version": "0.4.1", @@ -1439,17 +1438,65 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "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=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true + }, "yargs": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true - }, - "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true } } }, @@ -1470,6 +1517,11 @@ "integrity": "sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ=", "dev": true }, + "deref": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/deref/-/deref-0.7.0.tgz", + "integrity": "sha1-+GJIW5cfUemq1ZDRSbnrRtzAdME=" + }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", @@ -1507,9 +1559,9 @@ "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" }, "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 }, "dom-serializer": { @@ -1556,10 +1608,9 @@ "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" }, "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" }, "double-ended-queue": { "version": "2.1.0-0", @@ -1581,8 +1632,7 @@ "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" }, "duplexify": { "version": "3.5.0", @@ -1684,9 +1734,9 @@ "dev": true }, "es5-ext": { - "version": "0.10.22", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.22.tgz", - "integrity": "sha512-YXTXSlZkJsVwMEVljp1Bh5P9+Raa3524OMl9kywGMp1aazKTCnAqORRL/8dkuqNHk+LRYe0LezuS8PlUt3+mOw==", + "version": "0.10.23", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.23.tgz", + "integrity": "sha1-dXi1G+l0IHpUh4IbVlOMIk5Oezg=", "dev": true }, "es6-error": { @@ -1769,128 +1819,44 @@ "escomplex-plugin-metrics-module": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-module/-/escomplex-plugin-metrics-module-0.0.10.tgz", - "integrity": "sha1-6pZ8sSwSOCDSTnrATkJ4oZvPzoM=", - "dev": true - }, - "escomplex-plugin-metrics-project": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-project/-/escomplex-plugin-metrics-project-0.0.10.tgz", - "integrity": "sha1-Z6Y1wctV4vO+y3dO/mpANOYjiqg=", - "dev": true - }, - "escomplex-plugin-syntax-babylon": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-babylon/-/escomplex-plugin-syntax-babylon-0.0.10.tgz", - "integrity": "sha1-sUcBSYHP57yKK0NJfmsyiRqD5yA=", - "dev": true - }, - "escomplex-plugin-syntax-estree": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-estree/-/escomplex-plugin-syntax-estree-0.0.10.tgz", - "integrity": "sha1-b1MfnZM/vB68lDjpwQGxtGNs/Gg=", - "dev": true - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true - }, - "eslint": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.0.0.tgz", - "integrity": "sha1-cnfAFDf99B3M0WjVqg5Jt1yh8mA=", - "dev": true, - "dependencies": { - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true - }, - "doctrine": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", - "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true - }, - "inquirer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.0.tgz", - "integrity": "sha512-JLl89yPOEoGohLjeGs3XCekeovADbrEw/WRJQYgPED6zeJWrpIsY9i9/rn+VltZox/9w94lVYqo94QfEmniB1w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true - }, + "integrity": "sha1-6pZ8sSwSOCDSTnrATkJ4oZvPzoM=", + "dev": true + }, + "escomplex-plugin-metrics-project": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/escomplex-plugin-metrics-project/-/escomplex-plugin-metrics-project-0.0.10.tgz", + "integrity": "sha1-Z6Y1wctV4vO+y3dO/mpANOYjiqg=", + "dev": true + }, + "escomplex-plugin-syntax-babylon": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-babylon/-/escomplex-plugin-syntax-babylon-0.0.10.tgz", + "integrity": "sha1-sUcBSYHP57yKK0NJfmsyiRqD5yA=", + "dev": true + }, + "escomplex-plugin-syntax-estree": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/escomplex-plugin-syntax-estree/-/escomplex-plugin-syntax-estree-0.0.10.tgz", + "integrity": "sha1-b1MfnZM/vB68lDjpwQGxtGNs/Gg=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true + }, + "eslint": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.0.0.tgz", + "integrity": "sha1-cnfAFDf99B3M0WjVqg5Jt1yh8mA=", + "dev": true, + "dependencies": { "pluralize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", "integrity": "sha1-WbcIwcAZCi9pLxx2GMRGsFL9F2I=", "dev": true - }, - "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", - "dev": true - }, - "table": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", - "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", - "dev": true } } }, @@ -2009,10 +1975,9 @@ "optional": true }, "execa": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.2.2.tgz", - "integrity": "sha1-4urUcsLDGq1vc/GslW7vReEjIMs=", - "dev": true + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.5.1.tgz", + "integrity": "sha1-3j+4XLjW6RyFvLzrFkWBeFy1ezY=" }, "exit": { "version": "0.1.2", @@ -2069,16 +2034,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "send": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.3.tgz", - "integrity": "sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk=" - }, - "serve-static": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", - "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=" } } }, @@ -2190,10 +2145,9 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=" }, "file-entry-cache": { "version": "2.0.0", @@ -2246,9 +2200,9 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=" }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" }, "flat-cache": { "version": "1.2.2", @@ -2331,577 +2285,545 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.1.tgz", - "integrity": "sha1-8Z/Sj0Pur3YWgOUZogPE0LPTGv8=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", "optional": true, "dependencies": { "abbrev": { - "version": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "version": "1.1.0", + "bundled": true, "optional": true }, - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ajv": { + "version": "4.11.8", + "bundled": true, "optional": true }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, "aproba": { - "version": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "version": "1.1.1", + "bundled": true, "optional": true }, "are-we-there-yet": { - "version": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz", - "integrity": "sha1-gORw6VoIR5T+GJkmLFZnxuiN4bM=", + "version": "1.1.4", + "bundled": true, "optional": true }, "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "version": "0.2.3", + "bundled": true, "optional": true }, "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "version": "0.2.0", + "bundled": true, "optional": true }, "asynckit": { - "version": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "version": "0.4.0", + "bundled": true, "optional": true }, "aws-sign2": { - "version": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "version": "0.6.0", + "bundled": true, "optional": true }, "aws4": { - "version": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "version": "1.6.0", + "bundled": true, "optional": true }, "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + "version": "0.4.2", + "bundled": true }, "bcrypt-pbkdf": { - "version": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "version": "1.0.1", + "bundled": true, "optional": true }, "block-stream": { - "version": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=" + "version": "0.0.9", + "bundled": true }, "boom": { - "version": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + "version": "2.10.1", + "bundled": true }, "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz", - "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=" + "version": "1.1.7", + "bundled": true }, "buffer-shims": { - "version": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + "version": "1.0.0", + "bundled": true }, "caseless": { - "version": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "version": "0.12.0", + "bundled": true, "optional": true }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "co": { + "version": "4.6.0", + "bundled": true, "optional": true }, "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "version": "1.1.0", + "bundled": true }, "combined-stream": { - "version": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" - }, - "commander": { - "version": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "optional": true + "version": "1.0.5", + "bundled": true }, "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "version": "0.0.1", + "bundled": true }, "console-control-strings": { - "version": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "version": "1.1.0", + "bundled": true }, "core-util-is": { - "version": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.2", + "bundled": true }, "cryptiles": { - "version": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "version": "2.0.5", + "bundled": true, "optional": true }, "dashdash": { - "version": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "version": "1.14.1", + "bundled": true, "optional": true, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "version": "1.0.0", + "bundled": true, "optional": true } } }, "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "version": "2.6.8", + "bundled": true, "optional": true }, "deep-extend": { - "version": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", - "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=", + "version": "0.4.2", + "bundled": true, "optional": true }, "delayed-stream": { - "version": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "version": "1.0.0", + "bundled": true }, "delegates": { - "version": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "version": "1.0.0", + "bundled": true, "optional": true }, "ecc-jsbn": { - "version": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true - }, - "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "version": "0.1.1", + "bundled": true, "optional": true }, "extend": { - "version": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", - "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "version": "3.0.1", + "bundled": true, "optional": true }, "extsprintf": { - "version": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + "version": "1.0.2", + "bundled": true }, "forever-agent": { - "version": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "version": "0.6.1", + "bundled": true, "optional": true }, "form-data": { - "version": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz", - "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=", + "version": "2.1.4", + "bundled": true, "optional": true }, "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "version": "1.0.0", + "bundled": true }, "fstream": { - "version": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz", - "integrity": "sha1-YE6Kkv4m/9n2+uMDmdSYThqyKCI=" + "version": "1.0.11", + "bundled": true }, "fstream-ignore": { - "version": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "version": "1.0.5", + "bundled": true, "optional": true }, "gauge": { - "version": "https://registry.npmjs.org/gauge/-/gauge-2.7.3.tgz", - "integrity": "sha1-HCOFX5YvF7OtPQ3HRD8wRULt/gk=", - "optional": true - }, - "generate-function": { - "version": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "optional": true - }, - "generate-object-property": { - "version": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "version": "2.7.4", + "bundled": true, "optional": true }, "getpass": { - "version": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", - "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", + "version": "0.1.7", + "bundled": true, "optional": true, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "version": "1.0.0", + "bundled": true, "optional": true } } }, "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=" + "version": "7.1.2", + "bundled": true }, "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.11", + "bundled": true }, - "graceful-readlink": { - "version": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "har-schema": { + "version": "1.0.5", + "bundled": true, "optional": true }, "har-validator": { - "version": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "optional": true - }, - "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "version": "4.2.1", + "bundled": true, "optional": true }, "has-unicode": { - "version": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "version": "2.0.1", + "bundled": true, "optional": true }, "hawk": { - "version": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "version": "3.1.3", + "bundled": true, "optional": true }, "hoek": { - "version": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + "version": "2.16.3", + "bundled": true }, "http-signature": { - "version": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.1.1", + "bundled": true, "optional": true }, "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "version": "1.0.6", + "bundled": true }, "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.3", + "bundled": true }, "ini": { - "version": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "version": "1.3.4", + "bundled": true, "optional": true }, "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" - }, - "is-my-json-valid": { - "version": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz", - "integrity": "sha1-k27do8o8IR/ZjzstPgjaQ/eykVs=", - "optional": true - }, - "is-property": { - "version": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "optional": true + "version": "1.0.0", + "bundled": true }, "is-typedarray": { - "version": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "version": "1.0.0", + "bundled": true, "optional": true }, "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "version": "1.0.0", + "bundled": true }, "isstream": { - "version": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "version": "0.1.2", + "bundled": true, "optional": true }, "jodid25519": { - "version": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "version": "1.0.2", + "bundled": true, "optional": true }, "jsbn": { - "version": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "version": "0.1.1", + "bundled": true, "optional": true }, "json-schema": { - "version": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, "optional": true }, "json-stringify-safe": { - "version": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "version": "5.0.1", + "bundled": true, "optional": true }, - "jsonpointer": { - "version": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "jsonify": { + "version": "0.0.0", + "bundled": true, "optional": true }, "jsprim": { - "version": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.1.tgz", - "integrity": "sha1-KnJW9wQSop7jZwqspiWZTE3P8lI=", - "optional": true + "version": "1.4.0", + "bundled": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } }, "mime-db": { - "version": "https://registry.npmjs.org/mime-db/-/mime-db-1.26.0.tgz", - "integrity": "sha1-6v/NDk/Gk1z4E02iRuLmw1MFrf8=" + "version": "1.27.0", + "bundled": true }, "mime-types": { - "version": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.14.tgz", - "integrity": "sha1-9+99l1g/yvO30oK2+LVnnaselO4=" + "version": "2.1.15", + "bundled": true }, "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=" + "version": "3.0.4", + "bundled": true }, "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "0.0.8", + "bundled": true }, "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" + "version": "0.5.1", + "bundled": true }, "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "version": "2.0.0", + "bundled": true, "optional": true }, "node-pre-gyp": { - "version": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz", - "integrity": "sha1-ZArFUZj2qSWXLgwWxKwmoDTV7Mk=", + "version": "0.6.36", + "bundled": true, "optional": true }, "nopt": { - "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "version": "4.0.1", + "bundled": true, "optional": true }, "npmlog": { - "version": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz", - "integrity": "sha1-0DlQ4OeM4VJ7om0qdZLpNIrD518=", + "version": "4.1.0", + "bundled": true, "optional": true }, "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + "version": "1.0.1", + "bundled": true }, "oauth-sign": { - "version": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.8.2", + "bundled": true, "optional": true }, "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "version": "4.1.1", + "bundled": true, "optional": true }, "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "version": "1.4.0", + "bundled": true }, - "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true }, - "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, "optional": true }, - "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, "optional": true }, "process-nextick-args": { - "version": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + "version": "1.0.7", + "bundled": true }, "punycode": { - "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "version": "1.4.1", + "bundled": true, "optional": true }, "qs": { - "version": "https://registry.npmjs.org/qs/-/qs-6.3.1.tgz", - "integrity": "sha1-kYwLO802Z5dyuvE1say0wWUe150=", + "version": "6.4.0", + "bundled": true, "optional": true }, "rc": { - "version": "https://registry.npmjs.org/rc/-/rc-1.1.7.tgz", - "integrity": "sha1-xepWS7B6/5/TpbMukGwdOmWUD+o=", + "version": "1.2.1", + "bundled": true, "optional": true, "dependencies": { "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.0", + "bundled": true, "optional": true } } }, "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.2.tgz", - "integrity": "sha1-qeb+w8fdqF+LsbO6cChgRVb8gl4=", - "optional": true + "version": "2.2.9", + "bundled": true }, "request": { - "version": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", - "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "version": "2.81.0", + "bundled": true, "optional": true }, "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=" + "version": "2.6.1", + "bundled": true + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "version": "5.3.0", + "bundled": true, "optional": true }, "set-blocking": { - "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "version": "2.0.0", + "bundled": true, "optional": true }, "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.2", + "bundled": true, "optional": true }, "sntp": { - "version": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "version": "1.0.9", + "bundled": true, "optional": true }, "sshpk": { - "version": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.2.tgz", - "integrity": "sha1-1agEziJpVRVjjnmNviMnPeBwpfo=", + "version": "1.13.0", + "bundled": true, "optional": true, "dependencies": { "assert-plus": { - "version": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "version": "1.0.0", + "bundled": true, "optional": true } } }, "string_decoder": { - "version": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.0.1", + "bundled": true }, "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + "version": "1.0.2", + "bundled": true }, "stringstream": { - "version": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "version": "0.0.5", + "bundled": true, "optional": true }, "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + "version": "3.0.1", + "bundled": true }, "strip-json-comments": { - "version": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "version": "2.0.1", + "bundled": true, "optional": true }, "tar": { - "version": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=" + "version": "2.2.1", + "bundled": true }, "tar-pack": { - "version": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.3.0.tgz", - "integrity": "sha1-MJMYFkGPVa/E0hd1r91nIM7kXa4=", - "optional": true, - "dependencies": { - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "optional": true - }, - "readable-stream": { - "version": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "optional": true - } - } + "version": "3.4.0", + "bundled": true, + "optional": true }, "tough-cookie": { - "version": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "version": "2.3.2", + "bundled": true, "optional": true }, "tunnel-agent": { - "version": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "version": "0.6.0", + "bundled": true, "optional": true }, "tweetnacl": { - "version": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "version": "0.14.5", + "bundled": true, "optional": true }, "uid-number": { - "version": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "version": "0.0.6", + "bundled": true, "optional": true }, "util-deprecate": { - "version": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "version": "1.0.2", + "bundled": true }, "uuid": { - "version": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "version": "3.0.1", + "bundled": true, "optional": true }, "verror": { - "version": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "version": "1.3.6", + "bundled": true, "optional": true }, "wide-align": { - "version": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz", - "integrity": "sha1-QO3egCpx/qHwcNo+YtzaLnrdlq0=", + "version": "1.1.2", + "bundled": true, "optional": true }, "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "optional": true + "version": "1.0.2", + "bundled": true } } }, @@ -2924,7 +2846,19 @@ "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=" + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "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=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "generate-function": { "version": "2.0.0", @@ -2964,10 +2898,9 @@ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=" }, "getbase": { "version": "2.8.2", @@ -3021,9 +2954,9 @@ "dev": true }, "globals": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz", - "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=" + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" }, "globby": { "version": "6.1.0", @@ -3031,10 +2964,16 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=" }, "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + } + } }, "graceful-fs": { "version": "4.1.11", @@ -3154,24 +3093,7 @@ "helmet": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.6.1.tgz", - "integrity": "sha1-kfOqf6TJRnFZX7Vo39jChImjiL4=", - "dependencies": { - "connect": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz", - "integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=" - }, - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } + "integrity": "sha1-kfOqf6TJRnFZX7Vo39jChImjiL4=" }, "helmet-csp": { "version": "2.4.0", @@ -3248,6 +3170,12 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, @@ -3273,21 +3201,6 @@ "resolved": "https://registry.npmjs.org/hullabaloo-config-manager/-/hullabaloo-config-manager-1.1.1.tgz", "integrity": "sha512-ztKnkZV0TmxnumCDHHgLGNiDnotu4EHCp9YMkznWuo4uTtCyJ+cu+RNcxUeXYKTllpvLFWnbfWry09yzszgg+A==", "dependencies": { - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" - }, - "indent-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", - "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" - }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", @@ -3334,9 +3247,9 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=" }, "image-size": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.4.tgz", - "integrity": "sha1-lOB77sBlk4bxrvuEsiIuiEBUhc0=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", "dev": true, "optional": true }, @@ -3363,9 +3276,9 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.1.0.tgz", + "integrity": "sha1-CP9DNGAziDmbMp5rlTjcejz13n0=" }, "infinity-agent": { "version": "2.0.3", @@ -3395,9 +3308,9 @@ "dev": true }, "inquirer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.0.3.tgz", - "integrity": "sha1-6+OglIVxvMRszMvi+bzsJR6YS9A=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.0.tgz", + "integrity": "sha512-JLl89yPOEoGohLjeGs3XCekeovADbrEw/WRJQYgPED6zeJWrpIsY9i9/rn+VltZox/9w94lVYqo94QfEmniB1w==", "dev": true }, "invariant": { @@ -3512,9 +3425,9 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=" }, "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=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-generator-fn": { "version": "1.0.0", @@ -3615,8 +3528,7 @@ "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" }, "is-regex": { "version": "1.0.4", @@ -3633,8 +3545,7 @@ "is-retry-allowed": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" }, "is-stream": { "version": "1.1.0", @@ -3749,24 +3660,12 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -3821,12 +3720,6 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-19.0.2.tgz", "integrity": "sha1-3FNN9fEnjVtj3zKxQkHU2/ckTAw=" }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "optional": true - }, "joi": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", @@ -3893,14 +3786,7 @@ "json-schema-faker": { "version": "0.5.0-rc6", "resolved": "https://registry.npmjs.org/json-schema-faker/-/json-schema-faker-0.5.0-rc6.tgz", - "integrity": "sha512-+0XdXBWL+xvCORLgxQyVNNPzMlwqO1SoLv07fmRjQIGOIOfgXeV4K67bsWP5sDTElsI/C3kVjF9zvcUEsvn/rg==", - "dependencies": { - "deref": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/deref/-/deref-0.7.0.tgz", - "integrity": "sha1-+GJIW5cfUemq1ZDRSbnrRtzAdME=" - } - } + "integrity": "sha512-+0XdXBWL+xvCORLgxQyVNNPzMlwqO1SoLv07fmRjQIGOIOfgXeV4K67bsWP5sDTElsI/C3kVjF9zvcUEsvn/rg==" }, "json-schema-filter": { "version": "0.1.5", @@ -4000,10 +3886,9 @@ "integrity": "sha1-0bZNafhv8kry0EiDos7uFFIKVgA=" }, "latest-version": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=" }, "lazy-cache": { "version": "1.0.4", @@ -4040,9 +3925,9 @@ "dev": true }, "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=" + "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=" }, "loader-utils": { "version": "0.2.17", @@ -4053,14 +3938,7 @@ "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" }, "lodash": { "version": "4.17.4", @@ -4116,9 +3994,9 @@ "dev": true }, "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", "dev": true }, "lodash.clonedeep": { @@ -4143,9 +4021,9 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", "dev": true }, "lodash.defaultsdeep": { @@ -4290,13 +4168,12 @@ "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", - "dev": true + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" }, "lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==" }, "lru-queue": { "version": "0.1.0", @@ -4358,10 +4235,45 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" + }, + "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=" + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" } } }, @@ -4404,8 +4316,7 @@ "mimic-fn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" }, "minimatch": { "version": "3.0.4", @@ -4434,12 +4345,6 @@ "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", "dev": true }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", @@ -4480,24 +4385,12 @@ "mongodb": { "version": "2.2.28", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.28.tgz", - "integrity": "sha1-2P9FdUNm4Dlz+iWb9PEUR4WNplc=", - "dependencies": { - "mongodb-core": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.12.tgz", - "integrity": "sha1-FTEZJRG8Fu8WCsauDMRndv/YRR0=" - }, - "readable-stream": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", - "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=" - }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=" - } - } + "integrity": "sha1-2P9FdUNm4Dlz+iWb9PEUR4WNplc=" + }, + "mongodb-core": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.12.tgz", + "integrity": "sha1-FTEZJRG8Fu8WCsauDMRndv/YRR0=" }, "morgan": { "version": "1.8.2", @@ -4512,14 +4405,7 @@ "multi-glob": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/multi-glob/-/multi-glob-0.4.0.tgz", - "integrity": "sha1-GqnQhdljeX8Xr5JziEDthDqY0HA=", - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" - } - } + "integrity": "sha1-GqnQhdljeX8Xr5JziEDthDqY0HA=" }, "multimatch": { "version": "2.1.0", @@ -4527,9 +4413,9 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=" }, "mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "nan": { @@ -4686,18 +4572,6 @@ "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=", "dev": true }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true - }, - "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true - }, "package-json": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", @@ -4721,6 +4595,18 @@ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", "integrity": "sha1-B7XcIGazYnqztPUwEw9+3doHpMw=", "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "dev": true } } }, @@ -4745,50 +4631,28 @@ "integrity": "sha1-znVOyfPtEux0osWmvnvG8TTyKO0=", "dev": true, "dependencies": { - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "dev": true, - "dependencies": { - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", - "dev": true - } - } - }, - "boxen": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz", - "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", - "dev": true, - "dependencies": { - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", - "dev": true - } - } + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true }, - "configstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", - "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=", + "execa": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.2.2.tgz", + "integrity": "sha1-4urUcsLDGq1vc/GslW7vReEjIMs=", "dev": true }, - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true }, "glob": { @@ -4803,12 +4667,6 @@ "integrity": "sha1-CA9UVJ7BuCpsYOYx/ILhIR2+lfg=", "dev": true }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true - }, "inquirer": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", @@ -4816,71 +4674,65 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true }, - "lazy-req": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", - "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=", + "npm-run-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", "dev": true }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "path-key": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=", "dev": true }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true }, - "update-notifier": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", - "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=", + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true } } }, "npm-run-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", - "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=" }, "npmlog": { "version": "4.1.0", @@ -5218,10 +5070,9 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" }, "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=" }, "ono": { "version": "2.2.5", @@ -5262,7 +5113,33 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "dev": true + "dev": true, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true + }, + "cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true + } + } }, "original": { "version": "1.0.0", @@ -5328,6 +5205,11 @@ } } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "p-limit": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", @@ -5344,10 +5226,9 @@ "integrity": "sha1-eK4ybIngWk2BO2hgGXevBcANKg0=" }, "package-json": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", - "dev": true + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=" }, "parse-glob": { "version": "3.0.4", @@ -5396,9 +5277,9 @@ "integrity": "sha1-11gEMpUbaYUePY0KmPsdxgtcVto=" }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -5412,9 +5293,9 @@ "dev": true }, "path-key": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", - "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { "version": "1.0.5", @@ -5428,9 +5309,9 @@ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" }, "pathval": { "version": "1.1.0", @@ -5472,30 +5353,25 @@ "pkg-conf": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.0.0.tgz", - "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=", + "integrity": "sha1-BxyHZQQDvM+5xif1h1G/5HwGcnk=" + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" - }, - "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=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" } } }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=" - }, "pkginfo": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", @@ -5512,12 +5388,42 @@ "integrity": "sha1-mQCltJEKoZDeCKRbrmF1M0/WRqc=", "dev": true, "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true + }, "eslint": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.0.1.tgz", "integrity": "sha1-/xLq/cBOpx0XOgmdRlihNucVeTQ=", "dev": true }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true + }, "file-entry-cache": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", @@ -5536,34 +5442,58 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, "lodash": { "version": "4.13.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.13.1.tgz", "integrity": "sha1-g+SxCRP0hJbU0W/sSlYK8u50S2g=", "dev": true }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, "pluralize": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", "dev": true }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true + }, "run-async": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true }, "strip-json-comments": { @@ -5571,6 +5501,26 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "dev": true + } + } } } }, @@ -5599,8 +5549,7 @@ "prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, "preserve": { "version": "0.2.0", @@ -5619,9 +5568,9 @@ "integrity": "sha1-VlMNMqy5ij+khRxOK503tCBoTIQ=", "dependencies": { "ansi-styles": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.0.0.tgz", - "integrity": "sha1-VATpOlRMT+x/BIJil3vr/jFV4ME=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz", + "integrity": "sha1-CcIC1ckX7CMYjKpcnLkXnNlUd1A=" } } }, @@ -5648,15 +5597,15 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", "dev": true }, "promise": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.1.1.tgz", - "integrity": "sha1-SJZUxpJha4qlWwck+oCbt9tJxb8=", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.2.0.tgz", + "integrity": "sha512-p0a1sxM7M6NQFdFiv9lkFsAkM4LKZO/OInzzaXAqaOKzeMTQFlQfoq7KGDAtHFnwpMCqd+ZlwVns8ykDDQOD3w==", "dev": true }, "promise-worker": { @@ -5755,9 +5704,28 @@ "integrity": "sha1-/+OoDD9mbNceawCOR35YTBoy/z4=" }, "randomatic": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", - "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=" + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=" + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=" + } + } }, "range-parser": { "version": "1.2.0", @@ -5773,20 +5741,18 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "react": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/react/-/react-15.5.4.tgz", - "integrity": "sha1-+oPrAVBqsjfNwcjDsc6o3gEr8Ec=", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react/-/react-15.6.1.tgz", + "integrity": "sha1-uqhDTsZ4C96ZfNw4C3nNM7ljk98=", "dev": true }, "react-addons-perf": { @@ -5802,9 +5768,9 @@ "dev": true }, "react-addons-test-utils": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.5.1.tgz", - "integrity": "sha1-4NJYzaKhIq0N/2n4OCYNDDlY9fc=", + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/react-addons-test-utils/-/react-addons-test-utils-15.6.0.tgz", + "integrity": "sha1-Bi02EX/o0Y87peBuszODsLhepbk=", "dev": true }, "react-collapse": { @@ -5814,9 +5780,9 @@ "dev": true }, "react-dom": { - "version": "15.5.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.5.4.tgz", - "integrity": "sha1-ugwoeG/VLtfk8hNf4CiNRirvk9o=", + "version": "15.6.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.1.tgz", + "integrity": "sha1-LLDtQZEDjlPCCes6eaI+Kkz5lHA=", "dev": true }, "react-height": { @@ -5825,6 +5791,12 @@ "integrity": "sha1-CQINnSKkgSGno4E14jRStH96mH8=", "dev": true, "dependencies": { + "create-react-class": { + "version": "15.5.2", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.5.2.tgz", + "integrity": "sha1-aodYNI32YLiDJqDnZNVp8nSq1oE=", + "dev": true + }, "prop-types": { "version": "15.5.8", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.5.8.tgz", @@ -5902,19 +5874,19 @@ "dev": true }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=" }, "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=" + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=" }, "readdirp": { "version": "2.1.0", @@ -5927,6 +5899,12 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, "mute-stream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", @@ -5938,7 +5916,14 @@ "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=" + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dependencies": { + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=" + } + } }, "redis": { "version": "2.7.1", @@ -6015,14 +6000,12 @@ "registry-auth-token": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", - "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", - "dev": true + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=" }, "registry-url": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=" }, "regjsgen": { "version": "0.2.0", @@ -6060,9 +6043,9 @@ } }, "remove-trailing-separator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", - "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz", + "integrity": "sha1-abBi2XhyetFNxrVrpKt3L9jXBRE=" }, "repeat-element": { "version": "1.1.2", @@ -6104,9 +6087,9 @@ } }, "require_optional": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.0.tgz", - "integrity": "sha1-UqhhN6hJco62ClVTNhf4+RT1mr8=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==" }, "require-directory": { "version": "2.1.1", @@ -6174,10 +6157,9 @@ "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=" }, "ret": { "version": "0.1.14", @@ -6193,14 +6175,7 @@ "rimraf": { "version": "2.5.4", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=", - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" - } - } + "integrity": "sha1-loAAk8vxoMhr2VtGJUZ1NcKd+gQ=" }, "run-async": { "version": "2.3.0", @@ -6215,9 +6190,9 @@ "dev": true }, "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", "dev": true }, "rx-lite-aggregates": { @@ -6227,9 +6202,9 @@ "dev": true }, "safe-buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.0.tgz", - "integrity": "sha512-aSLEDudu6OoRr/2rU609gRmnYboRLxgDG1z9o2Q0os7236FwvcqIOO8r8U5JUEwivZOhDaKlFO4SbPTJYyBEyQ==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=" }, "samsam": { "version": "1.2.1", @@ -6276,6 +6251,23 @@ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=" }, + "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=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "serialize-error": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.0.0.tgz", @@ -6289,6 +6281,11 @@ "dev": true, "optional": true }, + "serve-static": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.3.tgz", + "integrity": "sha1-n0uhni8wMMVH+K+ZEHg47DjVseI=" + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -6316,6 +6313,12 @@ "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", "dev": true }, + "shelljs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -6370,6 +6373,18 @@ "integrity": "sha1-nw1Qq08FRLEl+iHGfdFi3h586Rs=", "dev": true, "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true + }, "configstore": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", @@ -6384,6 +6399,12 @@ } } }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true + }, "got": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", @@ -6398,12 +6419,36 @@ } } }, + "inquirer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.0.3.tgz", + "integrity": "sha1-6+OglIVxvMRszMvi+bzsJR6YS9A=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, "latest-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=", "dev": true }, + "mute-stream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", + "dev": true + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, "package-json": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", @@ -6416,6 +6461,18 @@ "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", "dev": true }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + }, "timed-out": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", @@ -6433,6 +6490,18 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "dev": true } } }, @@ -6609,9 +6678,9 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "dependencies": { "assert-plus": { "version": "1.0.0", @@ -6661,9 +6730,9 @@ "dev": true }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.2.tgz", + "integrity": "sha1-sp4fThEl+pehA4K4pTNze3SR4Xk=" }, "string-length": { "version": "1.0.1", @@ -6672,9 +6741,9 @@ "dev": true }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=" }, "string.prototype.codepointat": { "version": "0.2.0", @@ -6693,9 +6762,9 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" }, "strip-bom-buf": { "version": "1.0.0", @@ -6730,9 +6799,30 @@ "dev": true }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + } + } + }, + "swagger-client": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.0.14.tgz", + "integrity": "sha1-3dvZbF9z6wYfGp2kc7OC6UC7bFw=", + "dev": true, + "dependencies": { + "lodash": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", + "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", + "dev": true + } + } }, "swagger-schema-official": { "version": "2.0.0-bab6bed", @@ -6761,20 +6851,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.2.tgz", "integrity": "sha1-NKMFW6vgTOQkZ7YH1wAHLH/2v0I=", "dev": true - }, - "swagger-client": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.0.14.tgz", - "integrity": "sha1-3dvZbF9z6wYfGp2kc7OC6UC7bFw=", - "dev": true, - "dependencies": { - "lodash": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.2.tgz", - "integrity": "sha1-PmJtuCcEimmSgaihJSJjJs/A5lI=", - "dev": true - } - } } } }, @@ -6784,9 +6860,9 @@ "integrity": "sha1-lag9smGG1q9+ehjb2XYKL4bQj0A=" }, "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.1.tgz", + "integrity": "sha1-qBFsEz+sLGH0pCCrbN9cTWHw5DU=", "dev": true, "dependencies": { "ajv": { @@ -6794,18 +6870,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", - "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", - "dev": true } } }, @@ -6833,6 +6897,16 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=" + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" } } }, @@ -6851,6 +6925,16 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=" + }, + "npm-run-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=" + }, + "path-key": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" } } }, @@ -6920,10 +7004,9 @@ } }, "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-ext": { "version": "0.1.2", @@ -7074,9 +7157,9 @@ "dev": true }, "uglify-js": { - "version": "2.8.28", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.28.tgz", - "integrity": "sha512-WqKNbmNJKzIdIEQu/U2ytgGBbhCy2PVks94GoetczOAJ/zCgVu2CuO7gguI5KPFGPtUtI1dmPQl6h0D4cPzypA==", + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "optional": true, "dependencies": { @@ -7154,8 +7237,7 @@ "unique-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "dev": true + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=" }, "unique-temp-dir": { "version": "1.0.0", @@ -7168,62 +7250,14 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" }, "update-notifier": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.2.0.tgz", - "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=", - "dependencies": { - "configstore": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", - "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=" - }, - "dot-prop": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", - "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=" - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=" - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=" - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=" - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - } - } + "integrity": "sha1-G1g3z5DAc22IYncytmHBOPht5y8=" }, "url": { "version": "0.11.0", @@ -7248,8 +7282,7 @@ "url-parse-lax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" }, "user-home": { "version": "2.0.0", @@ -7317,23 +7350,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.14.0.tgz", "integrity": "sha1-rON25XGoQWLyKbplmOkYD378nuw=", "dev": true, - "optional": true, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "optional": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "optional": true - } - } + "optional": true }, "websocket-driver": { "version": "0.6.5", @@ -7367,12 +7384,36 @@ "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==" + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dependencies": { + "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=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "widest-line": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=" + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dependencies": { + "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=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "win-release": { "version": "1.1.1", @@ -7443,7 +7484,19 @@ "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dependencies": { + "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=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "wrappy": { "version": "1.0.2", @@ -7457,9 +7510,9 @@ "dev": true }, "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", + "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" }, "write-json-file": { "version": "2.2.0", @@ -7470,11 +7523,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" - }, - "write-file-atomic": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", - "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==" } } }, @@ -7489,10 +7537,9 @@ "integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk=" }, "xdg-basedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, "xml": { "version": "1.0.1", @@ -7524,12 +7571,24 @@ "yargs": { "version": "3.32.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=" + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dependencies": { + "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=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", "dev": true, "dependencies": { "camelcase": { diff --git a/package.json b/package.json index ac33c6b..a8c5f30 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "title": "Node Api Seed", "version": "0.0.1", "engines": { - "node": ">=6.10.0" + "node": ">=8.1.2" }, "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", From d9eeca66483b7ebe718acafebe16a8020b535712 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 12:49:11 +0200 Subject: [PATCH 40/95] adding CHANGELOG.md --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..644c83e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,19 @@ +# Node Api Seed Change Log + +## [Unreleased][] + +## [1.1.0](https://github.com/eXigentCoder/node-api-seed/compare/v1.0.0...v1.1.0) (2017-06-16) + +Creating this initial `CHANGELOG.md` file to make upgrading easier. + +* [#13](https://github.com/eXigentCoder/node-api-seed/pull/13): Upgrading the running version of node to 8.1.2, deleted and reinstalled node_modules to upgrade the `package-lock.json` file. - [@eXigentCoder](https://github.com/eXigentCoder) +* [#12](https://github.com/eXigentCoder/node-api-seed/pull/12): Upgrading dependencies as part of routine maintenance. - [@eXigentCoder](https://github.com/eXigentCoder) +* [#11](https://github.com/eXigentCoder/node-api-seed/pull/11): Updating the code so that on creation of objects that use statuses you can either set some static data in the status log or get some data from the `req` object. These rules are specified in the schema file. - [@eXigentCoder](https://github.com/eXigentCoder) + * In your object's schema, on the **first** status in the `statuses` root property you can now add a property called `initialData`. This controls how the first status log entry will be generated. This can have both `static` data and data that comes from the request, specified in the `fromReq` property. If both are specified and there is a conflict merging the two objects, `fromReq` will take precedence. Subproperties specified in `fromReq` can either be: + * A string - the path to the value on the `req` object, using lodash's get method + * Array with a string and other entries - the first value is the path as above, the second is the default value if one is not found. + + +## 1.0.0 (2017-06-16) + +* Going forward i'd like to use releases and CHANGELOG.md to keep track of things, so for now i'm putting a take in the ground and saying that this is the start point. \ No newline at end of file From 3f7a59c21ed96945d946b62dc618cdcb7e4561f5 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 12:53:31 +0200 Subject: [PATCH 41/95] updating CHANGELOG to have the correct link to the unreleased code. --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 644c83e..993c6c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Node Api Seed Change Log -## [Unreleased][] +## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.0...HEAD) + +Check here for upcoming changes ## [1.1.0](https://github.com/eXigentCoder/node-api-seed/compare/v1.0.0...v1.1.0) (2017-06-16) From 802cb8be3e36780ac077af054c7ee2251f744963 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 12:56:15 +0200 Subject: [PATCH 42/95] upgrading package version number. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8c5f30..ba59bb2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-api-seed", "title": "Node Api Seed", - "version": "0.0.1", + "version": "1.1.0", "engines": { "node": ">=8.1.2" }, From dfea1c1fbafca82feae9c11b2d22007ede6c68c5 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 12:57:14 +0200 Subject: [PATCH 43/95] changing version number back to original to test script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba59bb2..7938a58 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-api-seed", "title": "Node Api Seed", - "version": "1.1.0", + "version": "1.0.0", "engines": { "node": ">=8.1.2" }, From a7021bf5fe0f56db4d2700fe9e3593ff2039d0a7 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 12:58:20 +0200 Subject: [PATCH 44/95] Integrating CHANGELOG.md file into project --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3dc99f7..198214d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-api-seed", - "version": "0.0.1", + "version": "1.1.0", "lockfileVersion": 1, "dependencies": { "@ava/babel-plugin-throws-helper": { diff --git a/package.json b/package.json index 7938a58..ba59bb2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-api-seed", "title": "Node Api Seed", - "version": "1.0.0", + "version": "1.1.0", "engines": { "node": ">=8.1.2" }, From f2759a6563c2312aea9c285e3a8656b2127c5534 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 13:22:43 +0200 Subject: [PATCH 45/95] Adding notes on how to create a release. --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 19f5a84..9acf576 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,12 @@ The seed for pretty much any api I write in node.js # Logging We use [winston](https://github.com/winstonjs/winston) to route our logs to various places as required, and override console.x as per [this article here](http://seanmonstar.com/post/56448644049/consolelog-all-the-things) to allow us to see what's happening with dependencies we may be using. + +# Creating a new release + +1. Merge in the pull request(s) on GitHub that make up the release. +1. Decide based on what is going into the release how the version number is going to change, see [Semantic Versioning](http://semver.org/) for more info. +1. The `CHANGELOG.md` file should have pending changes documented in the `Unreleased` section, create a new heading for this version and cut the relevant changes and paste them into the new section. +1. Run the npm command to increment the version number and tag it `npm version [major | minor | patch | premajor | preminor | prepatch | prerelease] -m "A message that makes sense"` +1. Push the updated branch & tag back to origin. +1. Run `chandler push` to push the notes from `CHANGELOG.md` to the GitHub release page. See [chandler](https://github.com/mattbrictson/chandler) for more \ No newline at end of file From 84e2ee11df17ee6f3f884002e8d43f7049cd9784 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 13:23:07 +0200 Subject: [PATCH 46/95] Adding notes on how to create a release. --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 198214d..7e16090 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "node-api-seed", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 1, "dependencies": { "@ava/babel-plugin-throws-helper": { diff --git a/package.json b/package.json index ba59bb2..b41e238 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "node-api-seed", "title": "Node Api Seed", - "version": "1.1.0", + "version": "1.1.1", "engines": { "node": ">=8.1.2" }, From c90c56827cfb5164cb71d8604cdb02172253fd0a Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 13:25:13 +0200 Subject: [PATCH 47/95] updating CHANGELOG.md --- CHANGELOG.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 993c6c0..e416bdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,12 @@ # Node Api Seed Change Log -## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.0...HEAD) +## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.1...HEAD) Check here for upcoming changes +## [1.1.1](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.0...v1.1.1) (2017-06-16) +* Adding instructions to the README of how to do a release + ## [1.1.0](https://github.com/eXigentCoder/node-api-seed/compare/v1.0.0...v1.1.0) (2017-06-16) Creating this initial `CHANGELOG.md` file to make upgrading easier. @@ -12,9 +15,9 @@ Creating this initial `CHANGELOG.md` file to make upgrading easier. * [#12](https://github.com/eXigentCoder/node-api-seed/pull/12): Upgrading dependencies as part of routine maintenance. - [@eXigentCoder](https://github.com/eXigentCoder) * [#11](https://github.com/eXigentCoder/node-api-seed/pull/11): Updating the code so that on creation of objects that use statuses you can either set some static data in the status log or get some data from the `req` object. These rules are specified in the schema file. - [@eXigentCoder](https://github.com/eXigentCoder) * In your object's schema, on the **first** status in the `statuses` root property you can now add a property called `initialData`. This controls how the first status log entry will be generated. This can have both `static` data and data that comes from the request, specified in the `fromReq` property. If both are specified and there is a conflict merging the two objects, `fromReq` will take precedence. Subproperties specified in `fromReq` can either be: - * A string - the path to the value on the `req` object, using lodash's get method + * A string - the path to the value on the `req` object, using lodash's get method * Array with a string and other entries - the first value is the path as above, the second is the default value if one is not found. - + ## 1.0.0 (2017-06-16) From eba58011ec1acfbb53bf76f463b88dd7c0f62b0a Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 13:29:24 +0200 Subject: [PATCH 48/95] Adding link to changelog parctices and justification --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9acf576..fcc4a1e 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ We use [winston](https://github.com/winstonjs/winston) to route our logs to vari # Creating a new release +See [http://keepachangelog.com/en/0.3.0/](http://keepachangelog.com/en/0.3.0/) for best parctices and justification on maintaining a changelog. + 1. Merge in the pull request(s) on GitHub that make up the release. 1. Decide based on what is going into the release how the version number is going to change, see [Semantic Versioning](http://semver.org/) for more info. 1. The `CHANGELOG.md` file should have pending changes documented in the `Unreleased` section, create a new heading for this version and cut the relevant changes and paste them into the new section. From 90bddac74210a87e902ef8095bba7ac9f0e6ae75 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 16 Jun 2017 11:31:03 +0000 Subject: [PATCH 49/95] fix: package.json & .snyk to reduce vulnerabilities The following vulnerabilities are fixed with a Snyk patch: - https://snyk.io/vuln/npm:moment:20161019 - https://snyk.io/vuln/npm:ms:20170412 Latest report for exigentcoder/node-api-seed: https://snyk.io/test/github/exigentcoder/node-api-seed --- .snyk | 6 ++++++ package.json | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.snyk b/.snyk index 1a1ffd3..11b791e 100644 --- a/.snyk +++ b/.snyk @@ -50,6 +50,8 @@ patch: 'npm:moment:20161019': - express-brute-mongo > moment: patched: '2017-06-11T17:33:32.049Z' + - express-brute-mongo > moment: + patched: '2017-06-16T11:31:02.941Z' 'npm:request:20160119': - nodejs-dashboard > blessed-contrib > picture-tube > request: patched: '2016-11-18T11:48:06.051Z' @@ -62,6 +64,10 @@ patch: patched: '2017-06-11T17:33:32.049Z' - bcrypt > node-pre-gyp > tar-pack > debug > ms: patched: '2017-06-11T17:33:32.049Z' + - api-query-params > ava > ms: + patched: '2017-06-16T11:31:02.941Z' + - bcrypt > node-pre-gyp > tar-pack > debug > ms: + patched: '2017-06-16T11:31:02.941Z' 'npm:qs:20170213': - babel-cli > chokidar > fsevents > node-pre-gyp > request > qs: patched: '2017-06-11T17:33:32.049Z' diff --git a/package.json b/package.json index b41e238..91c9947 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,8 @@ "winston": "2.3.1", "winston-daily-rotate-file": "1.4.6", "winston-graylog2": "0.6.0", - "winston-loggly": "1.3.1" + "winston-loggly": "1.3.1", + "snyk": "^1.34.4" }, "devDependencies": { "chai": "4.0.2", @@ -99,7 +100,6 @@ "prettier": "1.4.4", "proxyquire": "1.8.0", "sinon-chai": "2.11.0", - "snyk": "1.34.4", "supertest": "3.0.0", "swagger-ui": "3.0.14" }, From 9728d27f0b97b1e6666442c6116e85b8f7bca224 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 16 Jun 2017 13:32:15 +0200 Subject: [PATCH 50/95] removing wildcard from snyk --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 91c9947..180427b 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "winston-daily-rotate-file": "1.4.6", "winston-graylog2": "0.6.0", "winston-loggly": "1.3.1", - "snyk": "^1.34.4" + "snyk": "1.34.4" }, "devDependencies": { "chai": "4.0.2", From a8bdcf5bbccc511c556688fcd2cc941dad9a9d03 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:12:46 +0200 Subject: [PATCH 51/95] updating create code to be exported. --- src/crud/create.js | 53 +++++++---------- src/crud/router/add-standard-routes.js | 4 +- test/crud/create.unit.js | 78 +++++++++++++------------- 3 files changed, 62 insertions(+), 73 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index 8a7c18f..0d6fd50 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -14,6 +14,19 @@ const boom = require('boom'); const util = require('util'); const _ = require('lodash'); +module.exports = { + addCreateRoute, + getSteps, + sendCreateResult, + description, + setStatusIfApplicable, + getData, + getFromReqObject, + getValue, + ensureMapIsString, + setOwnerIfApplicable +}; + function addCreateRoute(router, crudMiddleware, maps) { ensureSchemaSet(router.metadata, schemaName, 'Input'); filterPropertiesForCreation(router.metadata.schemas[schemaName]); @@ -22,15 +35,6 @@ function addCreateRoute(router, crudMiddleware, maps) { .describe(router.metadata.creationDescription || description(router.metadata)); return router; } -addCreateRoute.getSteps = getSteps; -addCreateRoute.sendCreateResult = sendCreateResult; -addCreateRoute.description = description; -addCreateRoute.setStatusIfApplicable = setStatusIfApplicable; -addCreateRoute.setOwnerIfApplicable = setOwnerIfApplicable; -addCreateRoute.getFromReqObject = getFromReqObject; -addCreateRoute.getData = getData; - -module.exports = addCreateRoute; function getSteps(router, crudMiddleware, maps) { const steps = { @@ -90,9 +94,7 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + - metadata.title.toLowerCase() + - ' was successfully created.', + 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -112,8 +114,8 @@ function setStatusIfApplicable(metadata) { req.body.statusLog = [ { status: req.body.status, - //we use 'addCreateRoute.' here to allow stubbing in the unit tests - data: addCreateRoute.getData(statusToSet.initialData, req), + //we use 'module.exports.' here to allow stubbing in the unit tests + data: module.exports.getData(statusToSet.initialData, req), statusDate: req.body.statusDate } ]; @@ -125,8 +127,8 @@ function getData(rules, req) { if (!rules) { return; } - //we use 'addCreateRoute.' here to allow stubbing in the unit tests - const fromReq = addCreateRoute.getFromReqObject(rules.fromReq, req); + //we use 'module.exports.' here to allow stubbing in the unit tests + const fromReq = module.exports.getFromReqObject(rules.fromReq, req); return _.merge({}, rules.static, fromReq); } @@ -158,21 +160,13 @@ function getFromReqObject( if (_.isArray(value)) { ensureMapIsString(value[0]); if (value.length > 2) { - throw new Error( - util.format('Too many items in array, should be at most 2. %j', value) - ); + throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); } data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getFromReqObject( - value, - req, - depth + 1, - disallowedSuffixList, - allowedPrefixList - ); + data[key] = getFromReqObject(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); return; } ensureMapIsString(value); @@ -209,12 +203,7 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest( - util.format( - 'Owner from expression "%s" was blank', - ownership.setOwnerExpression - ) - ) + boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) ); } } else { diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index 24647ed..c356d99 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -31,10 +31,10 @@ module.exports = function addStandardRoutes(router) { router.create = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return create(router, router.crudMiddleware, crudMiddleware); + return create.addCreateRoute(router, router.crudMiddleware, crudMiddleware); } } - return create(router, crudMiddleware, maps); + return create.addCreateRoute(router, crudMiddleware, maps); }; router.update = function(crudMiddleware, maps) { if (router.crudMiddleware) { diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 0af0c90..27aee32 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -1,6 +1,6 @@ 'use strict'; require('../@util/init.js'); -const addCreateRoute = require('../../src/crud/create'); +const create = require('../../src/crud/create'); const mockRequest = require('../@util/request-mocking').mockRequest; const moment = require('moment'); const sinon = require('sinon'); @@ -10,7 +10,7 @@ describe('Crud - create', function() { describe('setStatusIfApplicable', function() { it('Should not set req.body.status if the provided schema has no statuses', function(done) { const metadata = buildMetadata(); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -27,7 +27,7 @@ describe('Crud - create', function() { it('Should set req.body.status to the first status in the schema', function(done) { const metadata = buildMetadata([{ name: 'a' }, { name: 'b' }]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -42,7 +42,7 @@ describe('Crud - create', function() { it('Should set req.body.statusDate to now', function(done) { const metadata = buildMetadata([{ name: 'a' }]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -57,7 +57,7 @@ describe('Crud - create', function() { it('Should create a status log with one entry', function(done) { const metadata = buildMetadata([{ name: 'a' }]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -74,7 +74,7 @@ describe('Crud - create', function() { done ) { const metadata = buildMetadata([{ name: 'a' }]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -89,7 +89,7 @@ describe('Crud - create', function() { it('Should create a status log entry with the statusDate set to now', function(done) { const metadata = buildMetadata([{ name: 'a' }]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -110,7 +110,7 @@ describe('Crud - create', function() { name: 'a' }; const metadata = buildMetadata([statusToSet]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -130,7 +130,7 @@ describe('Crud - create', function() { initialData: {} }; const metadata = buildMetadata([statusToSet]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -150,7 +150,7 @@ describe('Crud - create', function() { initialData: {} }; const metadata = buildMetadata([statusToSet]); - const middleware = addCreateRoute.setStatusIfApplicable(metadata); + const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { body: {} }; @@ -161,7 +161,7 @@ describe('Crud - create', function() { name: 'bob' } }; - const stub = sinon.stub(addCreateRoute, 'getData'); + const stub = sinon.stub(create, 'getData'); stub.returns(stubbedData); mockRequest(middleware, reqOptions, null, next); @@ -178,12 +178,12 @@ describe('Crud - create', function() { describe('getData', function() { it('Should not exist if rules was falsy', function() { - const data = addCreateRoute.getData(null, {}); + const data = create.getData(null, {}); expect(data).to.not.be.ok(); }); it('Should be an empty object if rules was an empty object', function() { - const data = addCreateRoute.getData({}, {}); + const data = create.getData({}, {}); expect(data).to.be.ok(); expect(Object.keys(data)).to.have.lengthOf(0); }); @@ -199,7 +199,7 @@ describe('Crud - create', function() { object: {} } }; - const data = addCreateRoute.getData(rules, req); + const data = create.getData(rules, req); expect(data).to.deep.equal(rules.static); }); @@ -211,9 +211,9 @@ describe('Crud - create', function() { const stubbedData = { bob: true }; - const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + const stub = sinon.stub(create, 'getFromReqObject'); stub.returns(stubbedData); - const data = addCreateRoute.getData(rules, req); + const data = create.getData(rules, req); stub.restore(); expect(data.bob).to.equal(true); }); @@ -235,9 +235,9 @@ describe('Crud - create', function() { const stubbedData = { bob: true }; - const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + const stub = sinon.stub(create, 'getFromReqObject'); stub.returns(stubbedData); - const data = addCreateRoute.getData(rules, req); + const data = create.getData(rules, req); stub.restore(); expect(data.bob).to.equal(true); expect(data.number).to.equal(rules.static.number); @@ -271,9 +271,9 @@ describe('Crud - create', function() { betterSubObject: {} } }; - const stub = sinon.stub(addCreateRoute, 'getFromReqObject'); + const stub = sinon.stub(create, 'getFromReqObject'); stub.returns(stubbedData); - const data = addCreateRoute.getData(rules, req); + const data = create.getData(rules, req); stub.restore(); expect(data.bob).to.equal(true); expect(data.number).to.equal(stubbedData.number); @@ -293,7 +293,7 @@ describe('Crud - create', function() { const map = { answer: 'a' }; - const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + const data = create.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.answer).to.equal('b'); }); @@ -306,7 +306,7 @@ describe('Crud - create', function() { const map = { answer: 'a.b' }; - const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + const data = create.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.answer).to.equal('c'); }); @@ -319,7 +319,7 @@ describe('Crud - create', function() { answer: 'a' } }; - const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + const data = create.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.nested.answer).to.equal('b'); }); @@ -334,7 +334,7 @@ describe('Crud - create', function() { answer: 'a.b' } }; - const data = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + const data = create.getFromReqObject(map, req, 0, undefined, ['a']); expect(data.nested.answer).to.equal('c'); }); @@ -349,7 +349,7 @@ describe('Crud - create', function() { }; map.nested.answer = map; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(/circular reference/i); }); @@ -363,7 +363,7 @@ describe('Crud - create', function() { answer: 1 }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(notAString); }); @@ -375,7 +375,7 @@ describe('Crud - create', function() { answer: true }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(notAString); }); @@ -386,7 +386,7 @@ describe('Crud - create', function() { const map = { answer: {} }; - const data = addCreateRoute.getFromReqObject(map, req); + const data = create.getFromReqObject(map, req); expect(data.answer).to.deep.equal({}); }); @@ -398,7 +398,7 @@ describe('Crud - create', function() { answer: null }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(notAString); }); @@ -410,7 +410,7 @@ describe('Crud - create', function() { answer: undefined }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(notAString); }); @@ -421,7 +421,7 @@ describe('Crud - create', function() { const map = { answer: ['c', 'd'] }; - const result = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['c']); + const result = create.getFromReqObject(map, req, 0, undefined, ['c']); expect(result.answer).to.equal('d'); }); @@ -432,7 +432,7 @@ describe('Crud - create', function() { const map = { answer: ['a'] }; - const result = addCreateRoute.getFromReqObject(map, req, 0, undefined, ['a']); + const result = create.getFromReqObject(map, req, 0, undefined, ['a']); expect(result.answer).to.equal('b'); }); @@ -444,7 +444,7 @@ describe('Crud - create', function() { answer: [1] }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(notAString); }); @@ -456,7 +456,7 @@ describe('Crud - create', function() { answer: [] }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(notAString); }); @@ -468,7 +468,7 @@ describe('Crud - create', function() { answer: ['a', 'a', 'a'] }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(/too many items in array/i); }); @@ -484,7 +484,7 @@ describe('Crud - create', function() { }; const disallowedSuffixList = ['.b']; expect(function() { - addCreateRoute.getFromReqObject(map, req, 0, disallowedSuffixList); + create.getFromReqObject(map, req, 0, disallowedSuffixList); }).to.throw(invalidSuffix); }); @@ -498,7 +498,7 @@ describe('Crud - create', function() { answer: 'a.password' }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(invalidSuffix); }); @@ -514,7 +514,7 @@ describe('Crud - create', function() { }; const allowedPrefixList = []; expect(function() { - addCreateRoute.getFromReqObject(map, req, 0, undefined, allowedPrefixList); + create.getFromReqObject(map, req, 0, undefined, allowedPrefixList); }).to.throw(invalidPrefix); }); @@ -528,7 +528,7 @@ describe('Crud - create', function() { answer: 'body.password' }; expect(function() { - addCreateRoute.getFromReqObject(map, req); + create.getFromReqObject(map, req); }).to.throw(invalidSuffix); }); }); From 89835dcd5792a19d7a0eb8427afa8d4164db6e07 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:15:13 +0200 Subject: [PATCH 52/95] updating deleteById code to be exported. --- src/crud/delete-by-id.js | 21 ++++++++++----------- src/crud/router/add-standard-routes.js | 4 ++-- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/crud/delete-by-id.js b/src/crud/delete-by-id.js index 6806f07..6b0c39e 100644 --- a/src/crud/delete-by-id.js +++ b/src/crud/delete-by-id.js @@ -6,12 +6,18 @@ const addModel = require('../swagger/add-model'); const config = require('nconf'); const permissions = require('../permissions'); -module.exports = function addDeleteByIdRoute(router, crudMiddleware, maps) { +module.exports = { + addDeleteByIdRoute, + getSteps, + description +}; + +function addDeleteByIdRoute(router, crudMiddleware, maps) { router .delete('/:' + router.metadata.identifierName, getSteps(router, crudMiddleware, maps)) .describe(router.metadata.getByIdDescription || description(router.metadata)); return router; -}; +} function getSteps(router, crudMiddleware, maps) { const steps = { @@ -30,19 +36,12 @@ function description(metadata) { return { security: true, summary: - 'Removes ' + - metadata.aOrAn + - ' ' + - metadata.title + - ' By ' + - _.startCase(metadata.identifierName) + - '.', + 'Removes ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName) + '.', tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: - 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index c356d99..1bf46a3 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -55,10 +55,10 @@ module.exports = function addStandardRoutes(router) { router.deleteById = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return deleteById(router, router.crudMiddleware, crudMiddleware); + return deleteById.addDeleteByIdRoute(router, router.crudMiddleware, crudMiddleware); } } - return deleteById(router, crudMiddleware, maps); + return deleteById.addDeleteByIdRoute(router, crudMiddleware, maps); }; router.getByIdAndUse = function(path, routerOrMiddleware, crudMiddleware, maps) { if (router.crudMiddleware) { From 4babe82d04c8c2f32297bc85ec865e73ed7acf63 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:16:09 +0200 Subject: [PATCH 53/95] updating getById code to be exported. --- src/crud/get-by-id.js | 16 ++++++++++------ src/crud/router/add-standard-routes.js | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/crud/get-by-id.js b/src/crud/get-by-id.js index 9ef4423..65b1e75 100644 --- a/src/crud/get-by-id.js +++ b/src/crud/get-by-id.js @@ -6,12 +6,18 @@ const addModel = require('../swagger/add-model'); const config = require('nconf'); const permissions = require('../permissions'); -module.exports = function addGetByIdRoute(router, crudMiddleware, maps) { +module.exports = { + addGetByIdRoute, + getSteps, + description +}; + +function addGetByIdRoute(router, crudMiddleware, maps) { router .get('/:' + router.metadata.identifierName, getSteps(router, crudMiddleware, maps)) .describe(router.metadata.getByIdDescription || description(router.metadata)); return router; -}; +} function getSteps(router, crudMiddleware, maps) { const steps = { @@ -39,8 +45,7 @@ function description(metadata) { parameters: [ { name: metadata.identifierName, - description: - 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' @@ -54,8 +59,7 @@ function description(metadata) { }, responses: { '200': { - description: - 'Returns the single ' + metadata.title + ' matching the provided parameters.', + description: 'Returns the single ' + metadata.title + ' matching the provided parameters.', model: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index 1bf46a3..273eb93 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -23,10 +23,10 @@ module.exports = function addStandardRoutes(router) { router.getById = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return getById(router, router.crudMiddleware, crudMiddleware); + return getById.addGetByIdRoute(router, router.crudMiddleware, crudMiddleware); } } - return getById(router, crudMiddleware, maps); + return getById.addGetByIdRoute(router, crudMiddleware, maps); }; router.create = function(crudMiddleware, maps) { if (router.crudMiddleware) { From 8edfbaf92834e8fd507ffd1831817204f6ed0ab6 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:17:38 +0200 Subject: [PATCH 54/95] updating getByIdAndUse code to be exported. --- src/crud/get-by-id-and-use.js | 15 +++++++-------- src/crud/router/add-standard-routes.js | 4 ++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/crud/get-by-id-and-use.js b/src/crud/get-by-id-and-use.js index 07582eb..9d383ee 100644 --- a/src/crud/get-by-id-and-use.js +++ b/src/crud/get-by-id-and-use.js @@ -5,13 +5,12 @@ const util = require('util'); const _ = require('lodash'); const permissions = require('../permissions'); -module.exports = function addGetByIdAndUseRoute( - router, - path, - routerOrMiddleware, - crudMiddleware, - maps -) { +module.exports = { + addGetByIdAndUseRoute, + getByIdAndUseSteps +}; + +function addGetByIdAndUseRoute(router, path, routerOrMiddleware, crudMiddleware, maps) { if (_.isObject(path)) { //path omitted, move all args up by one. maps = crudMiddleware; @@ -40,7 +39,7 @@ module.exports = function addGetByIdAndUseRoute( const steps = getByIdAndUseSteps(router, routerOrMiddleware, crudMiddleware, maps); router.use('/:' + router.metadata.identifierName + path, steps); return router; -}; +} function getByIdAndUseSteps(router, routerOrMiddleware, crudMiddleware, maps) { const steps = { diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index 273eb93..436e972 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -63,7 +63,7 @@ module.exports = function addStandardRoutes(router) { router.getByIdAndUse = function(path, routerOrMiddleware, crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return getByIdAndUse( + return getByIdAndUse.addGetByIdAndUseRoute( router, path, routerOrMiddleware, @@ -72,6 +72,6 @@ module.exports = function addStandardRoutes(router) { ); } } - return getByIdAndUse(router, path, routerOrMiddleware, crudMiddleware, maps); + return getByIdAndUse.addGetByIdAndUseRoute(router, path, routerOrMiddleware, crudMiddleware, maps); }; }; From 19ed0fa645dfdceb06c5bc81b86c42eac0998297 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:19:40 +0200 Subject: [PATCH 55/95] updating query code to be exported. --- src/crud/query.js | 15 +++++++++------ src/crud/router/add-standard-routes.js | 4 ++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/crud/query.js b/src/crud/query.js index 4af9de5..b62bb3b 100644 --- a/src/crud/query.js +++ b/src/crud/query.js @@ -5,12 +5,18 @@ const addModel = require('../swagger/add-model'); const config = require('nconf'); const permissions = require('../permissions'); -module.exports = function addQueryRoute(router, crudMiddleware, maps) { +module.exports = { + addQueryRoute, + getSteps, + description +}; + +function addQueryRoute(router, crudMiddleware, maps) { router .get('/', getSteps(router, crudMiddleware, maps)) .describe(router.metadata.queryDescription || description(router.metadata)); return router; -}; +} function getSteps(router, crudMiddleware, maps) { const steps = { @@ -44,10 +50,7 @@ function description(metadata) { }, responses: { 200: { - description: - 'Returns the list of ' + - metadata.titlePlural + - ' matching the supplied parameters.', + description: 'Returns the list of ' + metadata.titlePlural + ' matching the supplied parameters.', arrayOfModel: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index 436e972..35950bb 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -15,10 +15,10 @@ module.exports = function addStandardRoutes(router) { router.query = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return query(router, router.crudMiddleware, crudMiddleware); + return query.addQueryRoute(router, router.crudMiddleware, crudMiddleware); } } - return query(router, crudMiddleware, maps); + return query.addQueryRoute(router, crudMiddleware, maps); }; router.getById = function(crudMiddleware, maps) { if (router.crudMiddleware) { From f23227ec25aea7b91f9bf005dead70126f798520 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:20:51 +0200 Subject: [PATCH 56/95] updating update code to be exported. --- src/crud/router/add-standard-routes.js | 4 ++-- src/crud/update.js | 21 ++++++++++----------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index 35950bb..a77d643 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -39,10 +39,10 @@ module.exports = function addStandardRoutes(router) { router.update = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return update(router, router.crudMiddleware, crudMiddleware); + return update.addUpdateRoute(router, router.crudMiddleware, crudMiddleware); } } - return update(router, crudMiddleware, maps); + return update.addUpdateRoute(router, crudMiddleware, maps); }; router.updateStatus = function(crudMiddleware, maps) { if (router.crudMiddleware) { diff --git a/src/crud/update.js b/src/crud/update.js index 383f7f4..d8b6a7f 100644 --- a/src/crud/update.js +++ b/src/crud/update.js @@ -11,7 +11,13 @@ const versionInfo = require('../version-info'); const config = require('nconf'); const permissions = require('../permissions'); -module.exports = function addUpdateRoute(router, crudMiddleware, maps) { +module.exports = { + addUpdateRoute, + getSteps, + description +}; + +function addUpdateRoute(router, crudMiddleware, maps) { ensureSchemaSet(router.metadata, schemaName, 'Input'); filterPropertiesForUpdate(router.metadata.schemas[schemaName]); const routeName = '/:' + router.metadata.identifierName; @@ -22,7 +28,7 @@ module.exports = function addUpdateRoute(router, crudMiddleware, maps) { router.patch(routeName, routeAction).describe(_.cloneDeep(routeDescription)); return router; -}; +} function getSteps(router, crudMiddleware, maps) { const steps = { @@ -46,19 +52,12 @@ function description(metadata) { const correlationIdOptions = config.get('logging').correlationId; return { security: true, - summary: - 'Updates ' + - metadata.aOrAn + - ' ' + - metadata.title + - ' By ' + - _.startCase(metadata.identifierName), + summary: 'Updates ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName), tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: - 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' From d312c0f91c5308126ea498a4c98045b3a56250fa Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:22:04 +0200 Subject: [PATCH 57/95] updating updateStatus code to be exported. --- src/crud/router/add-standard-routes.js | 4 ++-- src/crud/update-status.js | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index a77d643..ffa4806 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -47,10 +47,10 @@ module.exports = function addStandardRoutes(router) { router.updateStatus = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return updateStatus(router, router.crudMiddleware, crudMiddleware); + return updateStatus.addUpdateStatusRoute(router, router.crudMiddleware, crudMiddleware); } } - return updateStatus(router, crudMiddleware, maps); + return updateStatus.addUpdateStatusRoute(router, crudMiddleware, maps); }; router.deleteById = function(crudMiddleware, maps) { if (router.crudMiddleware) { diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 0c53e3f..e0cd945 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -11,7 +11,14 @@ const boom = require('boom'); const util = require('util'); const permissions = require('../permissions'); -module.exports = function addUpdateStatusRoute(router, crudMiddleware, maps) { +module.exports = { + addUpdateStatusRoute, + getSteps, + description, + ensureStatusAllowed +}; + +function addUpdateStatusRoute(router, crudMiddleware, maps) { if (!router.metadata.schemas.core.statuses) { throw new Error('No statuses defined in metadata.schemas.core.statuses'); } @@ -23,9 +30,7 @@ module.exports = function addUpdateStatusRoute(router, crudMiddleware, maps) { } if (!router.metadata.schemas.updateStatus) { if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep( - router.metadata.schemas.core.updateStatusSchema - ); + router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); router.metadata.schemas.updateStatus.$id = router.metadata.schemas.core.$id.replace( '.json', '-updateStatus.json' @@ -36,13 +41,10 @@ module.exports = function addUpdateStatusRoute(router, crudMiddleware, maps) { } validator.addSchema(router.metadata.schemas.updateStatus); router - .put( - '/:' + router.metadata.identifierName + '/:newStatusName', - getSteps(router, crudMiddleware, maps) - ) + .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; -}; +} function getSteps(router, crudMiddleware, maps) { const steps = { From c4004cc407c55ea251bf0f3aeb9221bedd892f06 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:24:22 +0200 Subject: [PATCH 58/95] updating CHANGELOG. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e416bdf..35caa11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Node Api Seed Change Log ## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.1...HEAD) +* Refactoring generic CRUD functions to export all their functions as properties on an object rather than tacked on to the primary function. This will allow for easier unit testing Check here for upcoming changes From a839435b90afff8b8a2f89e6ec172fd1e5a959fc Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:32:44 +0200 Subject: [PATCH 59/95] Adding a step to just run unit tests with coverage. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 180427b..93f4476 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "start": "node .", "watch": "nodemon .", "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\"", - "mocha": "node_modules/.bin/_mocha \"test/**/*.js\"", + "unit-test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.unit.js\"", "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", "lint-ci": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js", From f8dd0e7cf70082b7dfde298717b4e73e40c082bf Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:33:23 +0200 Subject: [PATCH 60/95] running prettier. --- src/crud/create.js | 23 +++++++++++++++++++---- src/crud/delete-by-id.js | 11 +++++++++-- src/crud/get-by-id.js | 6 ++++-- src/crud/query.js | 5 ++++- src/crud/router/add-standard-routes.js | 14 ++++++++++++-- src/crud/update-status.js | 9 +++++++-- src/crud/update.js | 11 +++++++++-- 7 files changed, 64 insertions(+), 15 deletions(-) diff --git a/src/crud/create.js b/src/crud/create.js index 0d6fd50..32390f2 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -94,7 +94,9 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', + 'Informs the caller that the ' + + metadata.title.toLowerCase() + + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -160,13 +162,21 @@ function getFromReqObject( if (_.isArray(value)) { ensureMapIsString(value[0]); if (value.length > 2) { - throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); + throw new Error( + util.format('Too many items in array, should be at most 2. %j', value) + ); } data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getFromReqObject(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); + data[key] = getFromReqObject( + value, + req, + depth + 1, + disallowedSuffixList, + allowedPrefixList + ); return; } ensureMapIsString(value); @@ -203,7 +213,12 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) + boom.badRequest( + util.format( + 'Owner from expression "%s" was blank', + ownership.setOwnerExpression + ) + ) ); } } else { diff --git a/src/crud/delete-by-id.js b/src/crud/delete-by-id.js index 6b0c39e..e895ffe 100644 --- a/src/crud/delete-by-id.js +++ b/src/crud/delete-by-id.js @@ -36,12 +36,19 @@ function description(metadata) { return { security: true, summary: - 'Removes ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName) + '.', + 'Removes ' + + metadata.aOrAn + + ' ' + + metadata.title + + ' By ' + + _.startCase(metadata.identifierName) + + '.', tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: + 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' diff --git a/src/crud/get-by-id.js b/src/crud/get-by-id.js index 65b1e75..f4b1f4f 100644 --- a/src/crud/get-by-id.js +++ b/src/crud/get-by-id.js @@ -45,7 +45,8 @@ function description(metadata) { parameters: [ { name: metadata.identifierName, - description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: + 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' @@ -59,7 +60,8 @@ function description(metadata) { }, responses: { '200': { - description: 'Returns the single ' + metadata.title + ' matching the provided parameters.', + description: + 'Returns the single ' + metadata.title + ' matching the provided parameters.', model: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/query.js b/src/crud/query.js index b62bb3b..bcf231f 100644 --- a/src/crud/query.js +++ b/src/crud/query.js @@ -50,7 +50,10 @@ function description(metadata) { }, responses: { 200: { - description: 'Returns the list of ' + metadata.titlePlural + ' matching the supplied parameters.', + description: + 'Returns the list of ' + + metadata.titlePlural + + ' matching the supplied parameters.', arrayOfModel: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index ffa4806..ce44da3 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -47,7 +47,11 @@ module.exports = function addStandardRoutes(router) { router.updateStatus = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return updateStatus.addUpdateStatusRoute(router, router.crudMiddleware, crudMiddleware); + return updateStatus.addUpdateStatusRoute( + router, + router.crudMiddleware, + crudMiddleware + ); } } return updateStatus.addUpdateStatusRoute(router, crudMiddleware, maps); @@ -72,6 +76,12 @@ module.exports = function addStandardRoutes(router) { ); } } - return getByIdAndUse.addGetByIdAndUseRoute(router, path, routerOrMiddleware, crudMiddleware, maps); + return getByIdAndUse.addGetByIdAndUseRoute( + router, + path, + routerOrMiddleware, + crudMiddleware, + maps + ); }; }; diff --git a/src/crud/update-status.js b/src/crud/update-status.js index e0cd945..e588b89 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -30,7 +30,9 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { } if (!router.metadata.schemas.updateStatus) { if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); + router.metadata.schemas.updateStatus = _.cloneDeep( + router.metadata.schemas.core.updateStatusSchema + ); router.metadata.schemas.updateStatus.$id = router.metadata.schemas.core.$id.replace( '.json', '-updateStatus.json' @@ -41,7 +43,10 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { } validator.addSchema(router.metadata.schemas.updateStatus); router - .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) + .put( + '/:' + router.metadata.identifierName + '/:newStatusName', + getSteps(router, crudMiddleware, maps) + ) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; } diff --git a/src/crud/update.js b/src/crud/update.js index d8b6a7f..9a87a1f 100644 --- a/src/crud/update.js +++ b/src/crud/update.js @@ -52,12 +52,19 @@ function description(metadata) { const correlationIdOptions = config.get('logging').correlationId; return { security: true, - summary: 'Updates ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName), + summary: + 'Updates ' + + metadata.aOrAn + + ' ' + + metadata.title + + ' By ' + + _.startCase(metadata.identifierName), tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: + 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' From f32348cd993731c323370eff304c58961c9de192 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:45:14 +0200 Subject: [PATCH 61/95] Updating CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35caa11..f8ec037 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.1...HEAD) * Refactoring generic CRUD functions to export all their functions as properties on an object rather than tacked on to the primary function. This will allow for easier unit testing +* Creating a new npm script `unit-test` to run just the unit tests with coverage to get a better idea of where to add tests or where problems may lie. Check here for upcoming changes From 4e38a81f73d7cc9d59bec596ee78966f49532f99 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 14:52:20 +0200 Subject: [PATCH 62/95] Updating package-lock.json based on merged changes. --- package-lock.json | 694 ++++++++++++++++++++++++---------------------- package.json | 1 - 2 files changed, 370 insertions(+), 325 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e16090..8635ac0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,9 +42,9 @@ "dev": true }, "@types/express-serve-static-core": { - "version": "4.0.47", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.47.tgz", - "integrity": "sha512-yDjDOiac4PRYQ3FUKoQmyTKpkRaux4E6xyAtoPcH2TBVa6eKZ3iE1nSdI1myUt5l6jyT1GoZmWWZOIA9C4o3Nw==", + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.48.tgz", + "integrity": "sha512-+W+fHO/hUI6JX36H8FlgdMHU3Dk4a/Fn08fW5qdd7MjPP/wJlzq9fkCrgaH0gES8vohVeqwefHwPa4ylVKyYIg==", "dev": true }, "@types/mime": { @@ -114,8 +114,7 @@ "align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=" }, "amdefine": { "version": "1.0.1", @@ -129,10 +128,9 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=" }, "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" }, "ansi-regex": { "version": "2.1.1", @@ -147,8 +145,7 @@ "ansicolors": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", - "dev": true + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" }, "anymatch": { "version": "1.3.0", @@ -168,8 +165,7 @@ "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, "are-we-there-yet": { "version": "1.1.4", @@ -234,8 +230,7 @@ "asap": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.5.tgz", - "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=", - "dev": true + "integrity": "sha1-UidltQw1EEkOUtfc/ghe+bqWlY8=" }, "asn1": { "version": "0.2.3", @@ -299,6 +294,12 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" }, + "babel-cli": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.24.1.tgz", + "integrity": "sha1-IHzXBbumFImy6kG1MSNBz2rKIoM=", + "dev": true + }, "babel-code-frame": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", @@ -331,6 +332,12 @@ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=" }, + "babel-helper-define-map": { + "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 + }, "babel-helper-explode-assignable-expression": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", @@ -351,6 +358,12 @@ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=" }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true + }, "babel-helper-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz", @@ -361,6 +374,12 @@ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=" }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true + }, "babel-helpers": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", @@ -401,26 +420,104 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=" }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true + }, + "babel-plugin-transform-es2015-block-scoping": { + "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 + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true + }, "babel-plugin-transform-es2015-destructuring": { "version": "6.23.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=" }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true + }, "babel-plugin-transform-es2015-function-name": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=" }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true + }, "babel-plugin-transform-es2015-modules-commonjs": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz", "integrity": "sha1-0+MQtA72ZKNmIiAAl8bUQCmPK/4=" }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true + }, "babel-plugin-transform-es2015-parameters": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=" }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true + }, "babel-plugin-transform-es2015-spread": { "version": "6.22.0", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", @@ -431,6 +528,18 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=" }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true + }, "babel-plugin-transform-es2015-unicode-regex": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", @@ -441,6 +550,12 @@ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=" }, + "babel-plugin-transform-regenerator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz", + "integrity": "sha1-uNowWtQ8PJm0hI5P5AN7dw0jxBg=", + "dev": true + }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", @@ -452,6 +567,12 @@ "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", "dev": true }, + "babel-preset-env": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.5.2.tgz", + "integrity": "sha1-zUrpCm6Utwn5c3SzPl+LmDVWre8=", + "dev": true + }, "babel-register": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz", @@ -640,6 +761,12 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "browserslist": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.1.5.tgz", + "integrity": "sha1-6IJVDfPRzW1IHBo+ADjyuvE6RxE=", + "dev": true + }, "bson": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", @@ -747,6 +874,12 @@ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, + "caniuse-lite": { + "version": "1.0.30000686", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000686.tgz", + "integrity": "sha1-2dnsYRDlUzvlRKaJAD91llMsZ9M=", + "dev": true + }, "capture-stack-trace": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", @@ -760,8 +893,7 @@ "center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=" }, "chai": { "version": "4.0.2", @@ -842,170 +974,122 @@ "cli-width": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.1.0.tgz", - "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=", - "dev": true + "integrity": "sha1-sjTKIJsp72b8UY2bmNWEewDt8Ao=" }, "clite": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/clite/-/clite-0.3.0.tgz", "integrity": "sha1-5/y8jMW9Pn+LhO1I2xLpR0zHNEE=", - "dev": true, "dependencies": { "boxen": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.3.1.tgz", - "integrity": "sha1-p9iYJDrmIvertrtgTXQKdsalRhs=", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true + "integrity": "sha1-p9iYJDrmIvertrtgTXQKdsalRhs=" }, "configstore": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", - "dev": true + "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=" }, "dot-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=" }, "find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" }, "got": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", - "dev": true + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=" }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" }, "latest-version": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", - "dev": true + "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=" }, "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=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", - "dev": true + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" }, "package-json": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", - "dev": true + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=" }, "path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" }, "timed-out": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", - "dev": true + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=" }, "unzip-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", - "dev": true + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=" }, "update-notifier": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.6.3.tgz", - "integrity": "sha1-d23sjaoT6WKjQeih2YNUMGtnrgg=", - "dev": true + "integrity": "sha1-d23sjaoT6WKjQeih2YNUMGtnrgg=" }, "window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=", - "dev": true + "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" }, "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" }, "xdg-basedir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "dev": true + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=" }, "yargs": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", - "dev": true - }, - "yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", - "dev": true + "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=" } } }, @@ -1497,6 +1581,12 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", "dev": true + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true } } }, @@ -1626,8 +1716,7 @@ "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" }, "duplexer3": { "version": "0.1.4", @@ -1637,8 +1726,7 @@ "duplexify": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", - "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", - "dev": true + "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=" }, "ecc-jsbn": { "version": "0.1.1", @@ -1656,6 +1744,12 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "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=", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -1682,13 +1776,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", - "dev": true, "dependencies": { "once": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=" } } }, @@ -1852,6 +1944,24 @@ "integrity": "sha1-cnfAFDf99B3M0WjVqg5Jt1yh8mA=", "dev": true, "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", + "dev": true + }, + "inquirer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.0.tgz", + "integrity": "sha512-JLl89yPOEoGohLjeGs3XCekeovADbrEw/WRJQYgPED6zeJWrpIsY9i9/rn+VltZox/9w94lVYqo94QfEmniB1w==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, "pluralize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-4.0.0.tgz", @@ -1988,8 +2098,7 @@ "exit-hook": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" }, "expand-brackets": { "version": "0.1.5", @@ -2174,8 +2283,7 @@ "filled-array": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", - "dev": true + "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=" }, "finalhandler": { "version": "1.0.3", @@ -2279,6 +2387,12 @@ "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "dev": true }, + "fs-readdir-recursive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz", + "integrity": "sha1-jNF0XItPiinIyuw5JHaSG6GV9WA=", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2873,8 +2987,7 @@ "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" }, "get-func-name": { "version": "2.0.0", @@ -3068,13 +3181,11 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/hasbin/-/hasbin-1.2.3.tgz", "integrity": "sha1-eMWSaJPIAhXCtWiuH9P8q3omlrA=", - "dev": true, "dependencies": { "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" } } }, @@ -3283,8 +3394,7 @@ "infinity-agent": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz", - "integrity": "sha1-ReDi/3qesDCyfWK3SzdEt6esQhY=", - "dev": true + "integrity": "sha1-ReDi/3qesDCyfWK3SzdEt6esQhY=" }, "inflight": { "version": "1.0.6", @@ -3308,10 +3418,41 @@ "dev": true }, "inquirer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.1.0.tgz", - "integrity": "sha512-JLl89yPOEoGohLjeGs3XCekeovADbrEw/WRJQYgPED6zeJWrpIsY9i9/rn+VltZox/9w94lVYqo94QfEmniB1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.0.3.tgz", + "integrity": "sha1-6+OglIVxvMRszMvi+bzsJR6YS9A=", + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=" + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=" + }, + "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=" + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" + } + } }, "invariant": { "version": "2.2.2", @@ -3893,8 +4034,7 @@ "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" }, "lcid": { "version": "1.0.0", @@ -3994,10 +4134,9 @@ "dev": true }, "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" }, "lodash.clonedeep": { "version": "4.5.0", @@ -4021,16 +4160,14 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, "lodash.defaults": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" }, "lodash.defaultsdeep": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.0.tgz", - "integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=", - "dev": true + "integrity": "sha1-vsECT4WxvZbL6kBbI8FK1kQ6b4E=" }, "lodash.difference": { "version": "4.5.0", @@ -4083,8 +4220,7 @@ "lodash.mergewith": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz", - "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=", - "dev": true + "integrity": "sha1-FQzwoWeR9ZA7iJHqsVRgknS96lU=" }, "lodash.once": { "version": "4.1.1", @@ -4152,8 +4288,7 @@ "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, "loose-envify": { "version": "1.3.1", @@ -4413,10 +4548,9 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=" }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", + "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=" }, "nan": { "version": "2.6.2", @@ -4454,8 +4588,7 @@ "nested-error-stacks": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz", - "integrity": "sha1-GfYZWRUZ8JZ2mlupqG5u7sgjw88=", - "dev": true + "integrity": "sha1-GfYZWRUZ8JZ2mlupqG5u7sgjw88=" }, "net": { "version": "1.0.2", @@ -4532,8 +4665,7 @@ "node-status-codes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", - "dev": true + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=" }, "node-uuid": { "version": "1.4.8", @@ -4572,6 +4704,18 @@ "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=", "dev": true }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true + }, + "lodash.defaults": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", + "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "dev": true + }, "package-json": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", @@ -4631,12 +4775,6 @@ "integrity": "sha1-znVOyfPtEux0osWmvnvG8TTyKO0=", "dev": true, "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, "cli-cursor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", @@ -5082,8 +5220,7 @@ "open": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", - "dev": true + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=" }, "optimist": { "version": "0.6.1", @@ -5177,8 +5314,7 @@ "os-name": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", - "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=", - "dev": true + "integrity": "sha1-GzefZINa98Wn9JizV8uVIVwVnt8=" }, "os-tmpdir": { "version": "1.0.2", @@ -5188,23 +5324,26 @@ "osenv": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "dev": true + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=" }, "osx-release": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", "integrity": "sha1-8heRGigTaUmvG/kwiyQeJzfTzWw=", - "dev": true, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, + "output-file-sync": { + "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 + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -5394,12 +5533,6 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, "cli-cursor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", @@ -5521,6 +5654,12 @@ "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 } } }, @@ -5603,10 +5742,9 @@ "dev": true }, "promise": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.2.0.tgz", - "integrity": "sha512-p0a1sxM7M6NQFdFiv9lkFsAkM4LKZO/OInzzaXAqaOKzeMTQFlQfoq7KGDAtHFnwpMCqd+ZlwVns8ykDDQOD3w==", - "dev": true + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.0.tgz", + "integrity": "sha512-bzAZ0u9Kxa0FYyfISjr9/PK7sCclAzc5rP4UgynMWA2Qv/gpZLKynJmTEXYq2i/giYdjBfRONDhfbsMlGIgvjA==" }, "promise-worker": { "version": "1.1.1", @@ -5675,8 +5813,7 @@ "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" }, "querystringify": { "version": "1.0.0", @@ -5870,8 +6007,7 @@ "read-all-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", - "dev": true + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=" }, "read-pkg": { "version": "2.0.0", @@ -5941,9 +6077,9 @@ "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" }, "redux": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.6.0.tgz", - "integrity": "sha1-iHwrPQub2G7KK+cFccJ2VMGeGI0=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.0.tgz", + "integrity": "sha512-GHjaOkEQtQnnuLoYPFkRKHIqs1i1tdTlisu/xUHfk2juzCobSy4STxs4Lz5bPkc07Owb6BeGKx/r76c9IVTkOw==", "dev": true, "dependencies": { "symbol-observable": { @@ -5981,6 +6117,12 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" }, + "regenerator-transform": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.9.11.tgz", + "integrity": "sha1-On0GdSDLe3F2dp61/4aGkb7+EoM=", + "dev": true + }, "regex-cache": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", @@ -6068,9 +6210,9 @@ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dependencies": { "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" } } }, @@ -6080,9 +6222,9 @@ "integrity": "sha1-qTVoMIL+PdxmIGJ2e8/liQSnRoM=", "dependencies": { "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" } } }, @@ -6094,14 +6236,12 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "require-package-name": { "version": "2.0.1", @@ -6169,8 +6309,7 @@ "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=" }, "rimraf": { "version": "2.5.4", @@ -6180,14 +6319,12 @@ "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=" }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" }, "rx-lite": { "version": "4.0.8", @@ -6371,137 +6508,70 @@ "version": "1.34.4", "resolved": "https://registry.npmjs.org/snyk/-/snyk-1.34.4.tgz", "integrity": "sha1-nw1Qq08FRLEl+iHGfdFi3h586Rs=", - "dev": true, "dependencies": { - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true - }, "configstore": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", "integrity": "sha1-w1eB0FAdJowlxUuLF/YkDopPsCE=", - "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 + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" } } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true - }, "got": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", "integrity": "sha1-5dDtSvVfw+701WAHdp2YGSvLLso=", - "dev": true, "dependencies": { "object-assign": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" } } }, - "inquirer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-1.0.3.tgz", - "integrity": "sha1-6+OglIVxvMRszMvi+bzsJR6YS9A=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true - }, "latest-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", - "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=", - "dev": true - }, - "mute-stream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.6.tgz", - "integrity": "sha1-SJYrGeFp/R38JAs/HnMXYnu8R9s=", - "dev": true - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=" }, "package-json": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", - "integrity": "sha1-yOysCUInzfdqMWh07QXifMk5oOA=", - "dev": true + "integrity": "sha1-yOysCUInzfdqMWh07QXifMk5oOA=" }, "repeating": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=" }, "timed-out": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", - "dev": true + "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=" }, "update-notifier": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", - "integrity": "sha1-B7XcIGazYnqztPUwEw9+3doHpMw=", - "dev": true + "integrity": "sha1-B7XcIGazYnqztPUwEw9+3doHpMw=" }, "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", - "dev": true + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" }, "write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=" }, "xdg-basedir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "dev": true + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=" } } }, @@ -6509,109 +6579,92 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/snyk-config/-/snyk-config-1.0.1.tgz", "integrity": "sha1-8nrsJJiyQCescZIUAmUhWRERUI8=", - "dev": true, "dependencies": { "async": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" }, "camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=" }, "nconf": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.7.2.tgz", - "integrity": "sha1-oF/fItwBw3jdXE3yfy3JC5qouwA=", - "dev": true + "integrity": "sha1-oF/fItwBw3jdXE3yfy3JC5qouwA=" }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, "yargs": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.15.0.tgz", - "integrity": "sha1-PZRG7yH7N5GzmFaQZi5LloPH8YE=", - "dev": true + "integrity": "sha1-PZRG7yH7N5GzmFaQZi5LloPH8YE=" } } }, "snyk-module": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/snyk-module/-/snyk-module-1.8.1.tgz", - "integrity": "sha1-MdUID7HA39b6hWfdNKUj/QK/H8o=", - "dev": true + "integrity": "sha1-MdUID7HA39b6hWfdNKUj/QK/H8o=" }, "snyk-policy": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/snyk-policy/-/snyk-policy-1.7.1.tgz", - "integrity": "sha1-5BO2vUr2BQxeX0RSh5CeTpigmyI=", - "dev": true + "integrity": "sha1-5BO2vUr2BQxeX0RSh5CeTpigmyI=" }, "snyk-python-plugin": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/snyk-python-plugin/-/snyk-python-plugin-1.0.0.tgz", - "integrity": "sha512-ES93Mr8h/u5EQXwMHQda8I/TnOHyvibENxJMdcAd7/fJEaZI2R4hgpFLcGRv4DzE3Y7Xz/mUPs8g0JpTIsGShQ==", - "dev": true + "integrity": "sha512-ES93Mr8h/u5EQXwMHQda8I/TnOHyvibENxJMdcAd7/fJEaZI2R4hgpFLcGRv4DzE3Y7Xz/mUPs8g0JpTIsGShQ==" }, "snyk-recursive-readdir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/snyk-recursive-readdir/-/snyk-recursive-readdir-2.0.0.tgz", "integrity": "sha1-XLWelGmBaeAgWmDn1qUG0LTVL/M=", - "dev": true, "dependencies": { "minimatch": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz", - "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=", - "dev": true + "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=" } } }, "snyk-resolve": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/snyk-resolve/-/snyk-resolve-1.0.0.tgz", - "integrity": "sha1-u+kZbTf1fDklHmvnXM3Vsgl+maI=", - "dev": true + "integrity": "sha1-u+kZbTf1fDklHmvnXM3Vsgl+maI=" }, "snyk-resolve-deps": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/snyk-resolve-deps/-/snyk-resolve-deps-1.7.0.tgz", "integrity": "sha1-E3Q6BYQ33/iQuq9DfDM8lmp0PLY=", - "dev": true, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "snyk-tree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/snyk-tree/-/snyk-tree-1.0.0.tgz", - "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=", - "dev": true + "integrity": "sha1-D7cxdtvzLngvGRAClBYESPkRHMg=" }, "snyk-try-require": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/snyk-try-require/-/snyk-try-require-1.2.0.tgz", - "integrity": "sha1-MPwrEcBwZFke41eAyCa+kTEvIUQ=", - "dev": true + "integrity": "sha1-MPwrEcBwZFke41eAyCa+kTEvIUQ=" }, "sockjs": { "version": "0.3.18", @@ -6726,8 +6779,7 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, "string_decoder": { "version": "1.0.2", @@ -6737,8 +6789,7 @@ "string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", - "dev": true + "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=" }, "string-width": { "version": "2.0.0", @@ -6811,9 +6862,9 @@ } }, "swagger-client": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.0.14.tgz", - "integrity": "sha1-3dvZbF9z6wYfGp2kc7OC6UC7bFw=", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.0.15.tgz", + "integrity": "sha1-5k9LkeYpjsgoClnOCi0sSXOZPj4=", "dev": true, "dependencies": { "lodash": { @@ -6913,8 +6964,7 @@ "tempfile": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=" }, "term-size": { "version": "0.1.1", @@ -6951,8 +7001,7 @@ "then-fs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", - "dev": true + "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=" }, "throat": { "version": "2.0.2", @@ -6963,8 +7012,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { "version": "2.0.3", @@ -7220,8 +7268,7 @@ "undefsafe": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-0.0.3.tgz", - "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=", - "dev": true + "integrity": "sha1-7Mo6A+VrmvFzhbqsgSrIO5lKli8=" }, "underscore": { "version": "1.8.3", @@ -7263,13 +7310,11 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, "dependencies": { "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, @@ -7285,9 +7330,9 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=" }, "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, "util-deprecate": { @@ -7303,7 +7348,12 @@ "uuid": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true }, "validate-npm-package-license": { @@ -7378,8 +7428,7 @@ "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" }, "wide-align": { "version": "1.1.2", @@ -7418,8 +7467,7 @@ "win-release": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", - "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=", - "dev": true + "integrity": "sha1-X6VeAr58qTTt/BJmVjLoSbcuUgk=" }, "window-size": { "version": "0.1.4", @@ -7586,16 +7634,14 @@ } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", - "dev": true, + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "dependencies": { "camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" } } }, diff --git a/package.json b/package.json index e8b1f0e..3b09fb9 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,6 @@ "babel-cli": "6.24.1", "babel-preset-env": "1.5.2", "chai": "4.0.2", - "diff": "3.2.0", "dirty-chai": "2.0.0", "eslint": "4.0.0", "eslint-config-prettier": "2.1.1", From ba64b1f33c967494bb62ddc33cbc69dbc7142da1 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:03:09 +0200 Subject: [PATCH 63/95] adding a nodemon.json file to control how the watch works. --- nodemon.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 nodemon.json diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..31593db --- /dev/null +++ b/nodemon.json @@ -0,0 +1,8 @@ +{ + "watch": [ + "dist" + ], + "ignore": [ + "swagger.json" + ] +} \ No newline at end of file From 0579a83fbbb6988132ce8ce1705447acf7985b9e Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:06:28 +0200 Subject: [PATCH 64/95] Updating babel to output to lib instead of dist. --- .gitignore | 2 ++ nodemon.json | 2 +- package.json | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index cd45877..dd733f0 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ yarn.lock *.orig dist/* + +lib/* diff --git a/nodemon.json b/nodemon.json index 31593db..e3a690c 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,6 +1,6 @@ { "watch": [ - "dist" + "lib" ], "ignore": [ "swagger.json" diff --git a/package.json b/package.json index 3b09fb9..c39a198 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,10 @@ }, "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", - "main": "dist/index.js", + "main": "lib/index.js", "scripts": { "start": "node .", - "build": "babel src -d dist -w --copy-files", + "build": "babel src -d lib -w --copy-files", "watch": "nodemon .", "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\" -- --compilers=js:babel-core/register", "unit-test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.unit.js\"", From 0408bb6aff1a771ced86e06729d8b2e12b8c1558 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:19:11 +0200 Subject: [PATCH 65/95] Updating test + coverage logic to work with babel. --- .gitignore | 1 + package-lock.json | 1067 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 9 +- 3 files changed, 1073 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index dd733f0..94fbe4b 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ yarn.lock dist/* lib/* +/.nyc_output/ diff --git a/package-lock.json b/package-lock.json index 8635ac0..8e9ea37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5148,6 +5148,1073 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "nyc": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.0.2.tgz", + "integrity": "sha512-31rRd6ME9NM17w0oPKqi51a6fzJAqYarnzQXK+iL8XaX+3H6VH0BQut7qHIgrv2mBASRic4oNi2KRgcbFODrsQ==", + "dev": true, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "dev": true + }, + "archy": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "arr-flatten": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "async": { + "version": "1.5.2", + "bundled": true, + "dev": true + }, + "babel-code-frame": { + "version": "6.22.0", + "bundled": true, + "dev": true + }, + "babel-generator": { + "version": "6.24.1", + "bundled": true, + "dev": true + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true + }, + "babel-runtime": { + "version": "6.23.0", + "bundled": true, + "dev": true + }, + "babel-template": { + "version": "6.24.1", + "bundled": true, + "dev": true + }, + "babel-traverse": { + "version": "6.24.1", + "bundled": true, + "dev": true + }, + "babel-types": { + "version": "6.24.1", + "bundled": true, + "dev": true + }, + "babylon": { + "version": "6.17.2", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "bundled": true, + "dev": true + }, + "core-js": { + "version": "2.4.1", + "bundled": true, + "dev": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "dev": true + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true + }, + "debug-log": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "execa": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "dev": true + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "dev": true + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "for-in": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "for-own": { + "version": "0.1.5", + "bundled": true, + "dev": true + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "globals": { + "version": "9.17.0", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "handlebars": { + "version": "4.0.10", + "bundled": true, + "dev": true, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "dev": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "hosted-git-info": { + "version": "2.4.2", + "bundled": true, + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true, + "dev": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "invariant": { + "version": "2.2.2", + "bundled": true, + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "bundled": true, + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true, + "dev": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "istanbul-lib-coverage": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.7.2", + "bundled": true, + "dev": true + }, + "istanbul-lib-report": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "dev": true + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.1", + "bundled": true, + "dev": true + }, + "istanbul-reports": { + "version": "1.1.1", + "bundled": true, + "dev": true + }, + "js-tokens": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "bundled": true, + "dev": true + }, + "longest": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "4.0.2", + "bundled": true, + "dev": true + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true, + "dev": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "merge-source-map": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "dev": true + }, + "mimic-fn": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "normalize-package-data": { + "version": "2.3.8", + "bundled": true, + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-locale": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "pify": { + "version": "2.3.0", + "bundled": true, + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true + } + } + }, + "preserve": { + "version": "0.2.0", + "bundled": true, + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "randomatic": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "dev": true + } + } + }, + "regenerator-runtime": { + "version": "0.10.5", + "bundled": true, + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "bundled": true, + "dev": true + }, + "remove-trailing-separator": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slide": { + "version": "1.1.6", + "bundled": true, + "dev": true + }, + "source-map": { + "version": "0.5.6", + "bundled": true, + "dev": true + }, + "spawn-wrap": { + "version": "1.3.6", + "bundled": true, + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "bundled": true, + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "test-exclude": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "uglify-js": { + "version": "2.8.27", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "which": { + "version": "1.2.14", + "bundled": true, + "dev": true + }, + "which-module": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true, + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "dev": true + }, + "y18n": { + "version": "3.2.1", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "yargs": { + "version": "8.0.1", + "bundled": true, + "dev": true, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "cliui": { + "version": "3.2.0", + "bundled": true, + "dev": true, + "dependencies": { + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "load-json-file": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "path-type": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "read-pkg-up": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "yargs-parser": { + "version": "7.0.0", + "bundled": true, + "dev": true + } + } + }, + "yargs-parser": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "bundled": true, + "dev": true + } + } + } + } + }, "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", diff --git a/package.json b/package.json index c39a198..54a79ad 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "start": "node .", "build": "babel src -d lib -w --copy-files", "watch": "nodemon .", - "test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.js\" -- --compilers=js:babel-core/register", - "unit-test": "node_modules/.bin/istanbul --include-all-sources cover -x \"public/**\" -x \"report/**\" -x \"utilities/**\" node_modules/mocha/bin/_mocha \"test/**/*.unit.js\"", + "test": "nyc --require babel-core/register node_modules/.bin/_mocha \"test/**/*.unit.js\" \"test/**/*.integration.js\"", + "unit-test": "nyc --require babel-core/register node_modules/.bin/_mocha \"test/**/*.unit.js\"", "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", "lint-ci": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js", @@ -75,12 +75,12 @@ "pluralize": "5.0.0", "request-id": "0.11.1", "sinon": "2.3.4", + "snyk": "1.34.4", "swagger-spec-express": "2.0.3", "winston": "2.3.1", "winston-daily-rotate-file": "1.4.6", "winston-graylog2": "0.6.0", - "winston-loggly": "1.3.1", - "snyk": "1.34.4" + "winston-loggly": "1.3.1" }, "devDependencies": { "babel-cli": "6.24.1", @@ -98,6 +98,7 @@ "nodemon": "1.11.0", "npm-check": "5.4.4", "nsp": "2.6.3", + "nyc": "11.0.2", "plato": "1.7.0", "prettier": "1.4.4", "proxyquire": "1.8.0", From 88e79304cc0bf768cdcc634d9a69c3d689c5e531 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:30:32 +0200 Subject: [PATCH 66/95] Setting sourceMaps to inline for coverage. --- .babelrc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.babelrc b/.babelrc index d6b82d2..b881e5b 100644 --- a/.babelrc +++ b/.babelrc @@ -1,9 +1,13 @@ { "presets": [ - ["env", { - "targets": { - "node": "6.11.0" + [ + "env", + { + "targets": { + "node": "6.11.0" + } } - }] - ] + ] + ], + "sourceMaps": "inline" } \ No newline at end of file From 41d7ae6d5f5a7a28576e758e4101e2a8663c38fc Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:36:08 +0200 Subject: [PATCH 67/95] renaming test file. --- test/version-info/{index-test.js => index-test.unit.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/version-info/{index-test.js => index-test.unit.js} (100%) diff --git a/test/version-info/index-test.js b/test/version-info/index-test.unit.js similarity index 100% rename from test/version-info/index-test.js rename to test/version-info/index-test.unit.js From abb985a9407440081f459c6ce4b2cf5dc063a301 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:38:14 +0200 Subject: [PATCH 68/95] simplifying nyc commands. --- package.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 54a79ad..1383e3e 100644 --- a/package.json +++ b/package.json @@ -8,12 +8,17 @@ "deploymentDate": "2016-11-09T19:15:04.309Z", "description": "The seed for pretty much any api I write in node.js", "main": "lib/index.js", + "nyc": { + "require": [ + "babel-register" + ] + }, "scripts": { "start": "node .", "build": "babel src -d lib -w --copy-files", "watch": "nodemon .", - "test": "nyc --require babel-core/register node_modules/.bin/_mocha \"test/**/*.unit.js\" \"test/**/*.integration.js\"", - "unit-test": "nyc --require babel-core/register node_modules/.bin/_mocha \"test/**/*.unit.js\"", + "test": "nyc mocha \"test/**/*.unit.js\" \"test/**/*.integration.js\"", + "unit-test": "nyc mocha \"test/**/*.unit.js\"", "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", "lint-ci": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js", From b42bf9ee9d98f9707796f8625e90d2b44279a670 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:54:34 +0200 Subject: [PATCH 69/95] updating logs ignore pattern in .gitignore file. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 94fbe4b..69f9b5e 100644 --- a/.gitignore +++ b/.gitignore @@ -49,3 +49,5 @@ dist/* lib/* /.nyc_output/ + +logs/**/* From ad6f5b422750d7a973778dc00f33d1c14962a103 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:54:54 +0200 Subject: [PATCH 70/95] Setting up rules for nyc --- package.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/package.json b/package.json index 1383e3e..930797d 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,20 @@ "description": "The seed for pretty much any api I write in node.js", "main": "lib/index.js", "nyc": { + "reporter": [ + "lcov", + "text-summary" + ], + "all": true, + "exclude": [ + "config/**", + "coverage/**", + "lib/**", + "logs/**", + "public/**", + "report/**", + "test/**" + ], "require": [ "babel-register" ] From 54013dcd193a497562c5d9f53ca0414eab829f63 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 15:57:33 +0200 Subject: [PATCH 71/95] Setting thresholds for test coverage. --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index 930797d..d5f2e09 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,11 @@ "description": "The seed for pretty much any api I write in node.js", "main": "lib/index.js", "nyc": { + "check-coverage": true, + "lines": 64, + "functions": 74, + "branches": 54, + "statements": 64, "reporter": [ "lcov", "text-summary" From 0fdbd7081f6a600d0a1e4251a61231c6cbaf8749 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 16:02:43 +0200 Subject: [PATCH 72/95] Fix for debugging in webstorm --- .babelrc | 2 +- README.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.babelrc b/.babelrc index b881e5b..aa62491 100644 --- a/.babelrc +++ b/.babelrc @@ -9,5 +9,5 @@ } ] ], - "sourceMaps": "inline" + "sourceMaps": "both" } \ No newline at end of file diff --git a/README.md b/README.md index fcc4a1e..ec6fcc2 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ The seed for pretty much any api I write in node.js - Go through the todo's in the seed api and make decisions based on your needs. - metadata fields to move to their own file, update the hydrate to use this file instead - Adding the role to a newly created user. +- how to debug es6+ code in WebStorm - https://blog.jetbrains.com/webstorm/2015/05/ecmascript-6-in-webstorm-transpiling/ # Config [The Twelve-Factor App](https://12factor.net/config) Recommends **not** storing your config in files, there are some pretty good reasons for and against this which can be read [here.](https://gist.github.com/telent/9742059) In my personal experience and based on how my projects run, I find that the advantages of file-based far outweigh the downsides, feel free to disagree. If you would prefer pure env config, check out [dotenv](https://www.npmjs.com/package/dotenv) or simply update the config code here to not load from file. From 80c8ffef55ef022f488875714473e4a946d82dd3 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 16:32:32 +0200 Subject: [PATCH 73/95] Updating rules to match transpiling. --- .eslintrc | 57 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/.eslintrc b/.eslintrc index ff5c31b..f3d88ac 100644 --- a/.eslintrc +++ b/.eslintrc @@ -6,28 +6,61 @@ "mocha": true }, "parserOptions": { - "ecmaVersion": 6, - "sourceType": "script", + "ecmaVersion": 8, + "sourceType": "module", "ecmaFeatures": { "globalReturn": true, - "impliedStrict": false, + "impliedStrict": true, "jsx": false } }, - "plugins": ["node","prettier"], + "plugins": [ + "node", + "prettier" + ], "extends": [ "eslint:recommended", "plugin:node/recommended", "prettier" ], "rules": { - "indent": ["error", 4, {"SwitchCase": 1}], - "linebreak-style": ["error", "unix"], - "quotes": ["error", "single", { "avoidEscape": true }], - "semi": ["error", "always"], - "no-console": ["off"], - "node/exports-style": ["error", "module.exports"], - "strict": ["error", "global"], - "prettier/prettier": ["error", {"singleQuote": true, "tabWidth":4, "printWidth":100}] + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single", + { + "avoidEscape": true + } + ], + "semi": [ + "error", + "always" + ], + "no-console": [ + "off" + ], + "node/exports-style": [ + "error", + "module.exports" + ], + "node/no-unsupported-features": ["off"], + "node/no-missing-import": ["error"], + "node/no-extraneous-import": ["error"], + "node/no-unpublished-import": ["error"], + "strict": [ + "error", + "global" + ], + "prettier/prettier": [ + "error", + { + "singleQuote": true, + "tabWidth": 4, + "printWidth": 100 + } + ] } } \ No newline at end of file From 73effb66a35bdde69e81f5d071f383d38c49ea4a Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 16:33:05 +0200 Subject: [PATCH 74/95] Running lint with --fix to remove 'use strict' --- src/app.js | 1 - src/authentication/index.js | 1 - src/crud/create.js | 1 - src/crud/delete-by-id.js | 1 - src/crud/get-by-id-and-use.js | 1 - src/crud/get-by-id.js | 1 - src/crud/query.js | 1 - src/crud/router/add-standard-routes.js | 1 - src/crud/router/index.js | 1 - src/crud/shared/apply-maps.js | 1 - src/crud/shared/get-validate-function.js | 1 - src/crud/update-status.js | 1 - src/crud/update.js | 1 - src/error/index.js | 1 - src/index.js | 1 - src/logging/configure-morgan.js | 1 - src/logging/configure-request-id.js | 1 - src/logging/format-args.js | 1 - src/logging/index.js | 1 - src/metadata/ensure-schema-set.js | 1 - src/metadata/filter-properties-for-creation.js | 2 -- src/metadata/filter-properties-for-output.js | 2 -- src/metadata/filter-properties-for-update.js | 2 -- src/metadata/hydrate-schema.js | 1 - src/metadata/index.js | 1 - src/metadata/infer-names.js | 1 - src/mongo/crud.js | 1 - src/mongo/index.js | 1 - src/output/ensure-exists-on-req.js | 1 - src/output/index.js | 1 - src/output/object-path-validation.js | 1 - src/permissions/index.js | 1 - src/rate-limit/index.js | 1 - src/routes/authentication/index.js | 1 - src/routes/base.js | 1 - src/routes/index.js | 1 - src/routes/test-errors/index.js | 1 - src/routes/users/index.js | 1 - src/routes/users/items/index.js | 1 - src/swagger/add-common-items.js | 1 - src/swagger/add-model.js | 1 - src/swagger/generate-swagger-json.js | 1 - src/swagger/initialise-swagger.js | 1 - src/validate/custom-formats.js | 1 - src/validate/middleware.js | 1 - src/validate/validator.js | 1 - src/version-info/index.js | 1 - test/@data/drop-and-recreate.js | 1 - test/@data/drop-existing-data.js | 1 - test/@data/find-items-to-create.js | 1 - test/@data/insert-data.js | 1 - test/@data/items/belongs-to-admin.js | 1 - test/@data/items/belongs-to-admin2.js | 1 - test/@data/items/belongs-to-normal-user.js | 1 - test/@data/items/belongs-to-normal-user2.js | 1 - test/@data/items/does-not-belong-to-default.js | 1 - test/@data/items/for-deletion.js | 1 - test/@data/users/admin.js | 1 - test/@data/users/guest.js | 1 - test/@data/users/member.js | 1 - test/@util/expect.js | 1 - test/@util/generate-data-from-schema.js | 1 - test/@util/init.js | 1 - test/@util/integration-common.js | 1 - test/@util/request-mocking.js | 1 - test/@util/set.js | 1 - test/crud/create.unit.js | 1 - test/metadata/filter-properties-for-creation.unit.js | 1 - test/metadata/hydrate-schema.unit.js | 1 - test/roles/index.integration.js | 1 - test/routes/authentication/index.integration.js | 1 - test/routes/base/index.integration.js | 1 - test/routes/test-errors/test.integration.js | 1 - test/routes/users/index.integration.js | 1 - test/routes/users/items/index.integration.js | 1 - test/swagger/router/apply-maps/after.unit.js | 1 - test/swagger/router/apply-maps/before.unit.js | 1 - test/swagger/router/apply-maps/fake-steps.js | 2 -- test/swagger/router/apply-maps/replaceWith.unit.js | 1 - test/swagger/router/apply-maps/skip.unit.js | 1 - test/version-info/index-test.unit.js | 2 -- 81 files changed, 86 deletions(-) diff --git a/src/app.js b/src/app.js index 11cfbc7..bb2eb8a 100644 --- a/src/app.js +++ b/src/app.js @@ -1,4 +1,3 @@ -'use strict'; import * as async from 'async'; const express = require('express'); const bodyParser = require('body-parser'); diff --git a/src/authentication/index.js b/src/authentication/index.js index 1911734..08227b6 100644 --- a/src/authentication/index.js +++ b/src/authentication/index.js @@ -1,4 +1,3 @@ -'use strict'; const passport = require('passport'); const passportJWT = require('passport-jwt'); const mongo = require('../mongo'); diff --git a/src/crud/create.js b/src/crud/create.js index 32390f2..d65e5bb 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -1,4 +1,3 @@ -'use strict'; const output = require('../output'); const applyMaps = require('./shared/apply-maps'); const ensureSchemaSet = require('../metadata/ensure-schema-set'); diff --git a/src/crud/delete-by-id.js b/src/crud/delete-by-id.js index e895ffe..906269b 100644 --- a/src/crud/delete-by-id.js +++ b/src/crud/delete-by-id.js @@ -1,4 +1,3 @@ -'use strict'; const output = require('../output'); const applyMaps = require('./shared/apply-maps'); const _ = require('lodash'); diff --git a/src/crud/get-by-id-and-use.js b/src/crud/get-by-id-and-use.js index 9d383ee..892229c 100644 --- a/src/crud/get-by-id-and-use.js +++ b/src/crud/get-by-id-and-use.js @@ -1,4 +1,3 @@ -'use strict'; const ensureExistsOnReq = require('../output/ensure-exists-on-req'); const applyMaps = require('./shared/apply-maps'); const util = require('util'); diff --git a/src/crud/get-by-id.js b/src/crud/get-by-id.js index f4b1f4f..2c61c66 100644 --- a/src/crud/get-by-id.js +++ b/src/crud/get-by-id.js @@ -1,4 +1,3 @@ -'use strict'; const output = require('../output'); const applyMaps = require('./shared/apply-maps'); const _ = require('lodash'); diff --git a/src/crud/query.js b/src/crud/query.js index bcf231f..2529a31 100644 --- a/src/crud/query.js +++ b/src/crud/query.js @@ -1,4 +1,3 @@ -'use strict'; const output = require('../output'); const applyMaps = require('./shared/apply-maps'); const addModel = require('../swagger/add-model'); diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index ce44da3..e1ccfe2 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const create = require('../create'); const getById = require('../get-by-id'); diff --git a/src/crud/router/index.js b/src/crud/router/index.js index 537e3bf..1fc0d5a 100644 --- a/src/crud/router/index.js +++ b/src/crud/router/index.js @@ -1,4 +1,3 @@ -'use strict'; const swagger = require('swagger-spec-express'); const express = require('express'); const buildMetadata = require('../../metadata'); diff --git a/src/crud/shared/apply-maps.js b/src/crud/shared/apply-maps.js index 17dcfae..697b579 100644 --- a/src/crud/shared/apply-maps.js +++ b/src/crud/shared/apply-maps.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const util = require('util'); const paramNames = require('get-parameter-names'); diff --git a/src/crud/shared/get-validate-function.js b/src/crud/shared/get-validate-function.js index dd39428..7292113 100644 --- a/src/crud/shared/get-validate-function.js +++ b/src/crud/shared/get-validate-function.js @@ -1,4 +1,3 @@ -'use strict'; const util = require('util'); const boom = require('boom'); const validator = require('../../validate/validator'); diff --git a/src/crud/update-status.js b/src/crud/update-status.js index e588b89..71676ae 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -1,4 +1,3 @@ -'use strict'; const output = require('../output'); const applyMaps = require('./shared/apply-maps'); const getValidateFunction = require('./shared/get-validate-function'); diff --git a/src/crud/update.js b/src/crud/update.js index 9a87a1f..6f2f9c8 100644 --- a/src/crud/update.js +++ b/src/crud/update.js @@ -1,4 +1,3 @@ -'use strict'; const output = require('../output'); const applyMaps = require('./shared/apply-maps'); const ensureSchemaSet = require('../metadata/ensure-schema-set'); diff --git a/src/error/index.js b/src/error/index.js index 14b2dbf..8268da5 100644 --- a/src/error/index.js +++ b/src/error/index.js @@ -1,4 +1,3 @@ -'use strict'; const packageJson = require('../../package.json'); const boom = require('boom'); const _ = require('lodash'); diff --git a/src/index.js b/src/index.js index f6bcce5..147f0ba 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,3 @@ -'use strict'; require('./../config/init-nconf')('Api'); require('./logging/index'); const util = require('util'); diff --git a/src/logging/configure-morgan.js b/src/logging/configure-morgan.js index 40e3e9b..e4ea007 100644 --- a/src/logging/configure-morgan.js +++ b/src/logging/configure-morgan.js @@ -1,4 +1,3 @@ -'use strict'; const morgan = require('morgan'); const config = require('nconf'); const util = require('util'); diff --git a/src/logging/configure-request-id.js b/src/logging/configure-request-id.js index 86af9f6..924284a 100644 --- a/src/logging/configure-request-id.js +++ b/src/logging/configure-request-id.js @@ -1,4 +1,3 @@ -'use strict'; const requestId = require('request-id/express'); const config = require('nconf'); diff --git a/src/logging/format-args.js b/src/logging/format-args.js index 075818e..f94af40 100644 --- a/src/logging/format-args.js +++ b/src/logging/format-args.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const config = require('nconf'); const maxDepth = 10; diff --git a/src/logging/index.js b/src/logging/index.js index 8536bf7..900ef5c 100644 --- a/src/logging/index.js +++ b/src/logging/index.js @@ -1,4 +1,3 @@ -'use strict'; const winston = require('winston'); const packageJson = require('../../package.json'); require('winston-loggly'); diff --git a/src/metadata/ensure-schema-set.js b/src/metadata/ensure-schema-set.js index a219f6c..88273ee 100644 --- a/src/metadata/ensure-schema-set.js +++ b/src/metadata/ensure-schema-set.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const validator = require('../validate/validator'); diff --git a/src/metadata/filter-properties-for-creation.js b/src/metadata/filter-properties-for-creation.js index 8700426..56c3aad 100644 --- a/src/metadata/filter-properties-for-creation.js +++ b/src/metadata/filter-properties-for-creation.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = function filterPropertiesForCreation(schema) { if (!schema) { throw new Error('Schema is a required field'); diff --git a/src/metadata/filter-properties-for-output.js b/src/metadata/filter-properties-for-output.js index 186d82c..40b1d04 100644 --- a/src/metadata/filter-properties-for-output.js +++ b/src/metadata/filter-properties-for-output.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = function filterPropertiesForOutput(schema) { clearProperties(schema); if (schema.definitions) { diff --git a/src/metadata/filter-properties-for-update.js b/src/metadata/filter-properties-for-update.js index 696245b..6536857 100644 --- a/src/metadata/filter-properties-for-update.js +++ b/src/metadata/filter-properties-for-update.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = function filterPropertiesForUpdate(schema) { if (!schema) { throw new Error('Schema is a required field'); diff --git a/src/metadata/hydrate-schema.js b/src/metadata/hydrate-schema.js index baa5249..77c4a45 100644 --- a/src/metadata/hydrate-schema.js +++ b/src/metadata/hydrate-schema.js @@ -1,4 +1,3 @@ -'use strict'; module.exports = function hydrateOutputSchema(schema) { schema.properties = schema.properties || {}; schema.required = schema.required || []; diff --git a/src/metadata/index.js b/src/metadata/index.js index 5953fad..33e91e2 100644 --- a/src/metadata/index.js +++ b/src/metadata/index.js @@ -1,4 +1,3 @@ -'use strict'; const inferNames = require('./infer-names'); const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']; const _ = require('lodash'); diff --git a/src/metadata/infer-names.js b/src/metadata/infer-names.js index 5941b29..3982a39 100644 --- a/src/metadata/infer-names.js +++ b/src/metadata/infer-names.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const pluralize = require('pluralize'); diff --git a/src/mongo/crud.js b/src/mongo/crud.js index 7341141..65bc390 100644 --- a/src/mongo/crud.js +++ b/src/mongo/crud.js @@ -1,4 +1,3 @@ -'use strict'; const mongo = require('./'); const aqp = require('api-query-params').default; const boom = require('boom'); diff --git a/src/mongo/index.js b/src/mongo/index.js index d97eb41..d473627 100644 --- a/src/mongo/index.js +++ b/src/mongo/index.js @@ -1,4 +1,3 @@ -'use strict'; const mongo = require('mongodb'); const ObjectId = mongo.ObjectId; const config = require('nconf'); diff --git a/src/output/ensure-exists-on-req.js b/src/output/ensure-exists-on-req.js index 7b78bb9..46ad26d 100644 --- a/src/output/ensure-exists-on-req.js +++ b/src/output/ensure-exists-on-req.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const objectPathValidation = require('./object-path-validation'); const boom = require('boom'); diff --git a/src/output/index.js b/src/output/index.js index 8de6619..ce72e92 100644 --- a/src/output/index.js +++ b/src/output/index.js @@ -1,4 +1,3 @@ -'use strict'; const jsonSchemaFilter = require('json-schema-filter'); const _ = require('lodash'); const ensureExistsOnReq = require('./ensure-exists-on-req'); diff --git a/src/output/object-path-validation.js b/src/output/object-path-validation.js index ea6a284..0f1c9ea 100644 --- a/src/output/object-path-validation.js +++ b/src/output/object-path-validation.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const os = require('os'); const eol = os.EOL; diff --git a/src/permissions/index.js b/src/permissions/index.js index 9a99fc5..0ab9162 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -1,4 +1,3 @@ -'use strict'; const NodeAcl = require('acl'); const boom = require('boom'); const mongo = require('../mongo'); diff --git a/src/rate-limit/index.js b/src/rate-limit/index.js index f96a8a7..0390992 100644 --- a/src/rate-limit/index.js +++ b/src/rate-limit/index.js @@ -1,4 +1,3 @@ -'use strict'; const mongo = require('../mongo'); const MongoStore = require('express-brute-mongo'); const ExpressBrute = require('express-brute'); diff --git a/src/routes/authentication/index.js b/src/routes/authentication/index.js index ba1d295..e34d3e6 100644 --- a/src/routes/authentication/index.js +++ b/src/routes/authentication/index.js @@ -1,4 +1,3 @@ -'use strict'; const express = require('express'); const router = express.Router(); const boom = require('boom'); diff --git a/src/routes/base.js b/src/routes/base.js index 5657b72..de19e20 100644 --- a/src/routes/base.js +++ b/src/routes/base.js @@ -1,4 +1,3 @@ -'use strict'; const express = require('express'); const config = require('nconf'); const routerOptions = config.get('expressApp').routerOptions; diff --git a/src/routes/index.js b/src/routes/index.js index 8504039..6197436 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,4 +1,3 @@ -'use strict'; const express = require('express'); const config = require('nconf'); const expressOptions = config.get('expressApp'); diff --git a/src/routes/test-errors/index.js b/src/routes/test-errors/index.js index 245c98f..1e3fbf2 100644 --- a/src/routes/test-errors/index.js +++ b/src/routes/test-errors/index.js @@ -1,4 +1,3 @@ -'use strict'; const express = require('express'); const config = require('nconf'); const routerOptions = config.get('expressApp').routerOptions; diff --git a/src/routes/users/index.js b/src/routes/users/index.js index 883d1b7..8074048 100644 --- a/src/routes/users/index.js +++ b/src/routes/users/index.js @@ -1,4 +1,3 @@ -'use strict'; const schema = require('./user.json'); const bcrypt = require('bcrypt'); const config = require('nconf'); diff --git a/src/routes/users/items/index.js b/src/routes/users/items/index.js index 6b6d315..477ff9a 100644 --- a/src/routes/users/items/index.js +++ b/src/routes/users/items/index.js @@ -1,4 +1,3 @@ -'use strict'; const schema = require('./item.json'); const router = require('../../../crud/router')({ schemas: { diff --git a/src/swagger/add-common-items.js b/src/swagger/add-common-items.js index 16f66c7..e91b43b 100644 --- a/src/swagger/add-common-items.js +++ b/src/swagger/add-common-items.js @@ -1,4 +1,3 @@ -'use strict'; const swagger = require('swagger-spec-express'); const config = require('nconf'); diff --git a/src/swagger/add-model.js b/src/swagger/add-model.js index 3d56c0a..7be71e5 100644 --- a/src/swagger/add-model.js +++ b/src/swagger/add-model.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const swagger = require('swagger-spec-express'); const schemaKeys = Object.keys(require('swagger-spec-express/lib/schemas/schema.json').properties); diff --git a/src/swagger/generate-swagger-json.js b/src/swagger/generate-swagger-json.js index 7010565..796eab1 100644 --- a/src/swagger/generate-swagger-json.js +++ b/src/swagger/generate-swagger-json.js @@ -1,4 +1,3 @@ -'use strict'; const swagger = require('swagger-spec-express'); const config = require('nconf'); const os = require('os'); diff --git a/src/swagger/initialise-swagger.js b/src/swagger/initialise-swagger.js index 5500bd3..1ac5315 100644 --- a/src/swagger/initialise-swagger.js +++ b/src/swagger/initialise-swagger.js @@ -1,4 +1,3 @@ -'use strict'; const config = require('nconf'); const packageJson = require('../../package.json'); const swagger = require('swagger-spec-express'); diff --git a/src/validate/custom-formats.js b/src/validate/custom-formats.js index 2d592c7..47d46b7 100644 --- a/src/validate/custom-formats.js +++ b/src/validate/custom-formats.js @@ -1,4 +1,3 @@ -'use strict'; const mongo = require('../mongo'); const moment = require('moment'); const uuuid = require('node-uuid'); diff --git a/src/validate/middleware.js b/src/validate/middleware.js index 46fa233..ff536f5 100644 --- a/src/validate/middleware.js +++ b/src/validate/middleware.js @@ -1,4 +1,3 @@ -'use strict'; const validator = require('./validator'); const boom = require('boom'); diff --git a/src/validate/validator.js b/src/validate/validator.js index d03bf9e..ff68b49 100644 --- a/src/validate/validator.js +++ b/src/validate/validator.js @@ -1,4 +1,3 @@ -'use strict'; const _ = require('lodash'); const jsonSchemaFilter = require('json-schema-filter'); const customFormats = require('./custom-formats'); diff --git a/src/version-info/index.js b/src/version-info/index.js index dbb5af1..641e4e8 100644 --- a/src/version-info/index.js +++ b/src/version-info/index.js @@ -1,4 +1,3 @@ -'use strict'; const uuid = require('node-uuid'); const moment = require('moment'); const config = require('nconf'); diff --git a/test/@data/drop-and-recreate.js b/test/@data/drop-and-recreate.js index 19406e6..95ec261 100644 --- a/test/@data/drop-and-recreate.js +++ b/test/@data/drop-and-recreate.js @@ -1,4 +1,3 @@ -'use strict'; const async = require('async'); const dropExistingData = require('./drop-existing-data'); const findItemsToCreate = require('./find-items-to-create'); diff --git a/test/@data/drop-existing-data.js b/test/@data/drop-existing-data.js index aaf56f5..d01f556 100644 --- a/test/@data/drop-existing-data.js +++ b/test/@data/drop-existing-data.js @@ -1,4 +1,3 @@ -'use strict'; const mongo = require('../../src/mongo/index'); const async = require('async'); const util = require('util'); diff --git a/test/@data/find-items-to-create.js b/test/@data/find-items-to-create.js index ed17f08..c052d00 100644 --- a/test/@data/find-items-to-create.js +++ b/test/@data/find-items-to-create.js @@ -1,4 +1,3 @@ -'use strict'; const glob = require('glob'); const async = require('async'); const path = require('path'); diff --git a/test/@data/insert-data.js b/test/@data/insert-data.js index 4069950..bb14448 100644 --- a/test/@data/insert-data.js +++ b/test/@data/insert-data.js @@ -1,4 +1,3 @@ -'use strict'; const mongo = require('../../src/mongo/index'); const async = require('async'); diff --git a/test/@data/items/belongs-to-admin.js b/test/@data/items/belongs-to-admin.js index c3eb39b..eeee936 100644 --- a/test/@data/items/belongs-to-admin.js +++ b/test/@data/items/belongs-to-admin.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const moment = require('moment'); const uuid = require('node-uuid'); diff --git a/test/@data/items/belongs-to-admin2.js b/test/@data/items/belongs-to-admin2.js index d3399ad..ba82ff8 100644 --- a/test/@data/items/belongs-to-admin2.js +++ b/test/@data/items/belongs-to-admin2.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const moment = require('moment'); const uuid = require('node-uuid'); diff --git a/test/@data/items/belongs-to-normal-user.js b/test/@data/items/belongs-to-normal-user.js index 4136d9c..e3a14c8 100644 --- a/test/@data/items/belongs-to-normal-user.js +++ b/test/@data/items/belongs-to-normal-user.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const moment = require('moment'); const uuid = require('node-uuid'); diff --git a/test/@data/items/belongs-to-normal-user2.js b/test/@data/items/belongs-to-normal-user2.js index 7f9077e..7b6c33b 100644 --- a/test/@data/items/belongs-to-normal-user2.js +++ b/test/@data/items/belongs-to-normal-user2.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const moment = require('moment'); const uuid = require('node-uuid'); diff --git a/test/@data/items/does-not-belong-to-default.js b/test/@data/items/does-not-belong-to-default.js index aba62fb..ce461c8 100644 --- a/test/@data/items/does-not-belong-to-default.js +++ b/test/@data/items/does-not-belong-to-default.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const moment = require('moment'); const uuid = require('node-uuid'); diff --git a/test/@data/items/for-deletion.js b/test/@data/items/for-deletion.js index a75395a..f53f297 100644 --- a/test/@data/items/for-deletion.js +++ b/test/@data/items/for-deletion.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const moment = require('moment'); const uuid = require('node-uuid'); diff --git a/test/@data/users/admin.js b/test/@data/users/admin.js index 5347654..2740697 100644 --- a/test/@data/users/admin.js +++ b/test/@data/users/admin.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const bcrypt = require('bcrypt'); const config = require('nconf'); diff --git a/test/@data/users/guest.js b/test/@data/users/guest.js index bf97ec3..2278f0b 100644 --- a/test/@data/users/guest.js +++ b/test/@data/users/guest.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const bcrypt = require('bcrypt'); const config = require('nconf'); diff --git a/test/@data/users/member.js b/test/@data/users/member.js index eea2bec..1db576a 100644 --- a/test/@data/users/member.js +++ b/test/@data/users/member.js @@ -1,4 +1,3 @@ -'use strict'; const ObjectId = require('mongodb').ObjectId; const bcrypt = require('bcrypt'); const config = require('nconf'); diff --git a/test/@util/expect.js b/test/@util/expect.js index 82e65fe..ad7b3c0 100644 --- a/test/@util/expect.js +++ b/test/@util/expect.js @@ -1,4 +1,3 @@ -'use strict'; require('./init.js'); const swagger = require('swagger-spec-express'); const _ = require('lodash'); diff --git a/test/@util/generate-data-from-schema.js b/test/@util/generate-data-from-schema.js index aaed74a..15b4e87 100644 --- a/test/@util/generate-data-from-schema.js +++ b/test/@util/generate-data-from-schema.js @@ -1,4 +1,3 @@ -'use strict'; const jsf = require('json-schema-faker'); const customFormats = require('../../src/validate/custom-formats'); customFormats.addAllToJsf(jsf); diff --git a/test/@util/init.js b/test/@util/init.js index e03f957..9e087f7 100644 --- a/test/@util/init.js +++ b/test/@util/init.js @@ -1,4 +1,3 @@ -'use strict'; const chai = require('chai'); const dirtyChai = require('dirty-chai'); chai.use(dirtyChai); diff --git a/test/@util/integration-common.js b/test/@util/integration-common.js index dee5bd3..34e6b5a 100644 --- a/test/@util/integration-common.js +++ b/test/@util/integration-common.js @@ -1,4 +1,3 @@ -'use strict'; require('./init.js'); const createApp = require('../../src/app.js'); const async = require('async'); diff --git a/test/@util/request-mocking.js b/test/@util/request-mocking.js index d66bb17..16aa02d 100644 --- a/test/@util/request-mocking.js +++ b/test/@util/request-mocking.js @@ -1,4 +1,3 @@ -'use strict'; const httpMocks = require('node-mocks-http'); const events = require('events'); diff --git a/test/@util/set.js b/test/@util/set.js index a65fd1e..5cae6e1 100644 --- a/test/@util/set.js +++ b/test/@util/set.js @@ -1,4 +1,3 @@ -'use strict'; const url = require('url'); const authentication = require('../../src/authentication'); diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 27aee32..28dc7c3 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../@util/init.js'); const create = require('../../src/crud/create'); const mockRequest = require('../@util/request-mocking').mockRequest; diff --git a/test/metadata/filter-properties-for-creation.unit.js b/test/metadata/filter-properties-for-creation.unit.js index 6842712..2f0a098 100644 --- a/test/metadata/filter-properties-for-creation.unit.js +++ b/test/metadata/filter-properties-for-creation.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../@util/init.js'); const filterPropertiesForCreation = require('../../src/metadata/filter-properties-for-creation'); diff --git a/test/metadata/hydrate-schema.unit.js b/test/metadata/hydrate-schema.unit.js index cc14e8a..91cbc89 100644 --- a/test/metadata/hydrate-schema.unit.js +++ b/test/metadata/hydrate-schema.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../@util/init.js'); const hydrateSchema = require('../../src/metadata/hydrate-schema'); diff --git a/test/roles/index.integration.js b/test/roles/index.integration.js index a46ef98..1338e6f 100644 --- a/test/roles/index.integration.js +++ b/test/roles/index.integration.js @@ -1,4 +1,3 @@ -'use strict'; const common = require('../@util/integration-common'); const async = require('async'); const permissions = require('../../src/permissions'); diff --git a/test/routes/authentication/index.integration.js b/test/routes/authentication/index.integration.js index 03ffc23..44d08bc 100644 --- a/test/routes/authentication/index.integration.js +++ b/test/routes/authentication/index.integration.js @@ -1,4 +1,3 @@ -'use strict'; const common = require('../../@util/integration-common.js'); const config = require('nconf'); diff --git a/test/routes/base/index.integration.js b/test/routes/base/index.integration.js index 32c600d..19c9fcc 100644 --- a/test/routes/base/index.integration.js +++ b/test/routes/base/index.integration.js @@ -1,4 +1,3 @@ -'use strict'; const common = require('../../@util/integration-common'); /* ----========[ end of test file setup ]========---- */ diff --git a/test/routes/test-errors/test.integration.js b/test/routes/test-errors/test.integration.js index 5d9fb54..c35ea20 100644 --- a/test/routes/test-errors/test.integration.js +++ b/test/routes/test-errors/test.integration.js @@ -1,4 +1,3 @@ -'use strict'; const common = require('../../@util/integration-common'); const uncaughtErrorMessage = require('../../../src/routes/test-errors')._uncaughtErrorMessage; const config = require('nconf'); diff --git a/test/routes/users/index.integration.js b/test/routes/users/index.integration.js index 49738c1..ce41f6c 100644 --- a/test/routes/users/index.integration.js +++ b/test/routes/users/index.integration.js @@ -1,4 +1,3 @@ -'use strict'; const common = require('../../@util/integration-common.js'); const router = require('../../../src/routes/users/index.js'); const config = require('nconf'); diff --git a/test/routes/users/items/index.integration.js b/test/routes/users/items/index.integration.js index 6f7df16..0da064f 100644 --- a/test/routes/users/items/index.integration.js +++ b/test/routes/users/items/index.integration.js @@ -1,4 +1,3 @@ -'use strict'; const common = require('../../../@util/integration-common.js'); const router = require('../../../../src/routes/users/items/index.js'); const config = require('nconf'); diff --git a/test/swagger/router/apply-maps/after.unit.js b/test/swagger/router/apply-maps/after.unit.js index 3382854..c5c2bc1 100644 --- a/test/swagger/router/apply-maps/after.unit.js +++ b/test/swagger/router/apply-maps/after.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../../../@util/init.js'); const applyMaps = require('../../../../src/crud/shared/apply-maps'); const applyAfter = applyMaps._applyAfter; diff --git a/test/swagger/router/apply-maps/before.unit.js b/test/swagger/router/apply-maps/before.unit.js index 92203dc..96ac7e4 100644 --- a/test/swagger/router/apply-maps/before.unit.js +++ b/test/swagger/router/apply-maps/before.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../../../@util/init.js'); const applyMaps = require('../../../../src/crud/shared/apply-maps'); const applyBefore = applyMaps._applyBefore; diff --git a/test/swagger/router/apply-maps/fake-steps.js b/test/swagger/router/apply-maps/fake-steps.js index 3994bc9..bd0c5b7 100644 --- a/test/swagger/router/apply-maps/fake-steps.js +++ b/test/swagger/router/apply-maps/fake-steps.js @@ -1,5 +1,3 @@ -'use strict'; - module.exports = function Steps() { return { step1: doWork, diff --git a/test/swagger/router/apply-maps/replaceWith.unit.js b/test/swagger/router/apply-maps/replaceWith.unit.js index 1b3b4c7..7b127cb 100644 --- a/test/swagger/router/apply-maps/replaceWith.unit.js +++ b/test/swagger/router/apply-maps/replaceWith.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../../../@util/init.js'); const applyMaps = require('../../../../src/crud/shared/apply-maps'); const applyReplace = applyMaps._applyReplace; diff --git a/test/swagger/router/apply-maps/skip.unit.js b/test/swagger/router/apply-maps/skip.unit.js index 7c7f202..95bdf3b 100644 --- a/test/swagger/router/apply-maps/skip.unit.js +++ b/test/swagger/router/apply-maps/skip.unit.js @@ -1,4 +1,3 @@ -'use strict'; require('../../../@util/init.js'); const _ = require('lodash'); const util = require('util'); diff --git a/test/version-info/index-test.unit.js b/test/version-info/index-test.unit.js index f42eddc..9f32062 100644 --- a/test/version-info/index-test.unit.js +++ b/test/version-info/index-test.unit.js @@ -1,5 +1,3 @@ -'use strict'; - require('../@util/init.js'); const httpMocks = require('node-mocks-http'); const uuid = require('node-uuid'); From 8dfa7faa2e09ed331d1b4d442005fb5758a92487 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sat, 17 Jun 2017 16:38:28 +0200 Subject: [PATCH 75/95] Updating CHANGELOG. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8ec037..b3eb8d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.1...HEAD) * Refactoring generic CRUD functions to export all their functions as properties on an object rather than tacked on to the primary function. This will allow for easier unit testing * Creating a new npm script `unit-test` to run just the unit tests with coverage to get a better idea of where to add tests or where problems may lie. +* Adding `babel` for transpilation step. Updating eslint rules to cater for this. Adding nodemon config. Moving index file so that it gets transpiled as well. Adding nyc + config to cater for new coverage. Check here for upcoming changes From 82da0e191a898281a5ba0c3a7b4fc4e25bee1478 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 18 Jun 2017 18:00:04 +0200 Subject: [PATCH 76/95] Deprecating the doNotTrack field on ownership, no need for it to be there just don't specify ownership. Adding example of the full and complete schema with annotations for reference. --- README.md | 4 +- src/crud/create.js | 2 +- src/permissions/index.js | 4 +- test/@util/example-full-schema.js | 131 ++++++++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 5 deletions(-) create mode 100644 test/@util/example-full-schema.js diff --git a/README.md b/README.md index ec6fcc2..088b66f 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ The seed for pretty much any api I write in node.js ![Build status](https://travis-ci.org/eXigentCoder/node-api-seed.svg?branch=master) [![Known Vulnerabilities](https://snyk.io/test/github/exigentcoder/node-api-seed/badge.svg)](https://snyk.io/test/github/exigentcoder/node-api-seed) -# Global packages +# Schema explanation -> npm i pm2 -g +See the file : `./test/@util/example-full-schema.js` for an annotated description of what each schema can do # Scripts diff --git a/src/crud/create.js b/src/crud/create.js index d65e5bb..0b6139e 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -205,7 +205,7 @@ function ensureMapIsString(map) { function setOwnerIfApplicable(metadata) { return function _setOwnerIfApplicable(req, res, next) { let ownership = metadata.schemas.core.ownership; - if (!ownership || ownership.doNotTrack) { + if (!ownership) { return next(); } if (ownership.setOwnerExpression) { diff --git a/src/permissions/index.js b/src/permissions/index.js index 0ab9162..f72d9a7 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -77,7 +77,7 @@ function checkRoleAndOwner(resource, permissions, ownership) { if (isAllowed) { return next(); } - if (!ownership || ownership.doNotTrack || !ownership.permissions) { + if (!ownership || !ownership.permissions) { return next(boom.forbidden(missingPermissionsErrorMessage)); } //check if ownership confers the permission: @@ -123,7 +123,7 @@ function checkRoleAndOwnerToSetQuery(resource, permissions, ownership) { if (isAllowed) { return next(); } - if (!ownership || ownership.doNotTrack || !ownership.permissions) { + if (!ownership || !ownership.permissions) { return next(boom.forbidden(message)); } permissions.forEach(function(permission) { diff --git a/test/@util/example-full-schema.js b/test/@util/example-full-schema.js new file mode 100644 index 0000000..627fe57 --- /dev/null +++ b/test/@util/example-full-schema.js @@ -0,0 +1,131 @@ +// This file should serve as documentation as to the customisations you can use on top of JSON schema. + +module.exports = { + //Unique identifier for this schema, should be a url, I tend to use the path to the raw file on github. + $id: 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', + // The name of the entity, singular. + name: 'user', + // The name of the entity, plural. Not required, will be inferred in code, specify this if there is an issue with how it is being generated. + namePlural: 'users', + // The name of the entity, singular. Not required, will be inferred in code, specify this if there is an issue with how it is being generated. + title: 'User', + // The name of the entity, plural. Not required, will be inferred in code, specify this if there is an issue with how it is being generated. + titlePlural: 'Users', + // A description of what this entity is. + description: 'A user of the site', + // The JSON schema type, should always be object. + type: 'object', + // The name of the property that will be used to uniquely identify this entity. + identifierName: 'email', + // Optional, specifies the various statuses that this object can be in. If specified then extra properties will be added. The first status is (for now) the one that will be used on creation + statuses: [ + // The default status when creating an entity + { + // The unique name of this status + name: 'active', + // A description of what this status represents + description: 'Default status, shows that the user is active and can login', + // When creating an entitiy of this type, the initial data for the first status log data entry will be generated using this info. Only applies to the first status. + initialData: { + // Specifies the static data that should be included in the status log data entry + static: { + // some example data + reason: 'testing', + isAwesome: true + }, + // Specifies the data that should be fetched from the `req` object and stored in the status log data entry. If a field is specified here and in static, this one will take priority. + fromReq: { + userName: 'user.displayName', // an example of fetching the displayName field form the `req.user.displayName` property. + userRating: ['user.statistics.starRating', 'Unrated'] // An example of using a default value in case the value isn't found. + } + } + }, + // some other status + { + name: 'inactive', + description: "Shows that the user is inactive and can't login" + }, + // some other status + { + name: 'testStatus', + description: 'Some other status to be used for testing' + } + ], + // The JSON schema to use for the request when an update status request is received. The body of the request will be validated against this and then stored in the status log entry. + updateStatusSchema: { + type: 'object', + properties: { + reason: { + type: 'string', + minLength: 1 + } + }, + required: ['reason'], + additionalProperties: true + }, + //controls the rules for who own's this object + ownership: { + // controls where the inital owner comes from when creating an entity. If left off, will use req.user._id + setOwnerExpression: 'process.user._id', + permissions: ['create', 'update', 'updateStatus', 'deleteById'] + }, + // the JSON schema properties of this object, see http://json-schema.org/ for more info + properties: { + // Automatically added field, don't specify manually. + _id: {}, + // Some manually specified field + email: { + type: 'string', + format: 'email', + minLength: 1, + faker: 'internet.email' + }, + // Some manually specified field + firstName: { + type: 'string', + minLength: 1, + faker: 'name.firstName' + }, + // Some manually specified field + surname: { + type: 'string', + minLength: 1, + faker: 'name.lastName' + }, + // Automatically added field if statuses was set, don't specify manually. + status: {}, + // Automatically added field if statuses was set, don't specify manually. + statusDate: {}, + // Automatically added field if statuses was set, don't specify manually. + statusLog: {}, + // Automatically added field if ownership was set, don't specify manually. + owner: {}, + // Automatically added field if ownership was set, don't specify manually. + ownerDate: {}, + // Automatically added field if ownership was set, don't specify manually. + ownerLog: {} + }, + // controls if properties not specified in the entry above are allowed. See http://json-schema.org/ for more info + additionalProperties: false, + // Specifies if each time this entity is modified, a new history row should be created + trackHistory: true, + // Specifies which fields in the properties entry above are mandatory + required: ['email', 'firstName', 'surname'], + // Specifies the mongodb indexes to be created with the generate indexes script is executed + indexes: [ + { + // Name of the index. + name: 'email', + // Should the index enforce uniqueness constraints on the data in the collection. + unique: true, + // Should this index be initially created in the background so as to prevent locking the collection. + background: true, + // Should this index be included in the history collection for this entity to enable faster searching. + includeInHistory: true, + // The fields that should be included in the index. + fields: { + email: 1 + } + } + ] +}; From 77bbefc410166e820a1691501c57847638351f6d Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 18 Jun 2017 18:02:58 +0200 Subject: [PATCH 77/95] Updating schema example. --- test/@util/example-full-schema.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/@util/example-full-schema.js b/test/@util/example-full-schema.js index 627fe57..7cfa90d 100644 --- a/test/@util/example-full-schema.js +++ b/test/@util/example-full-schema.js @@ -67,6 +67,7 @@ module.exports = { ownership: { // controls where the inital owner comes from when creating an entity. If left off, will use req.user._id setOwnerExpression: 'process.user._id', + // A list of permissions to grant the owner of this particular entity. So for example if you don't have the role that allows you to delete but you are the owner then you can. permissions: ['create', 'update', 'updateStatus', 'deleteById'] }, // the JSON schema properties of this object, see http://json-schema.org/ for more info @@ -76,6 +77,8 @@ module.exports = { // Some manually specified field email: { type: 'string', + // Specifies that this property should not be returned in the response for this entity. + excludeOnOutput: true, format: 'email', minLength: 1, faker: 'internet.email' From d81a0218fdfd347472c4258c223bdb1c2138d0f0 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 18 Jun 2017 19:42:02 +0200 Subject: [PATCH 78/95] Splitting out functions for reuse. --- src/crud/create.js | 97 +---- src/crud/data-mapping/get-data-from-req.js | 64 +++ src/crud/data-mapping/get-data.js | 10 + test/crud/create.unit.js | 369 +----------------- .../data-mapping/get-data-from-req.unit.js | 251 ++++++++++++ test/crud/data-mapping/get-data.unit.js | 113 ++++++ 6 files changed, 446 insertions(+), 458 deletions(-) create mode 100644 src/crud/data-mapping/get-data-from-req.js create mode 100644 src/crud/data-mapping/get-data.js create mode 100644 test/crud/data-mapping/get-data-from-req.unit.js create mode 100644 test/crud/data-mapping/get-data.unit.js diff --git a/src/crud/create.js b/src/crud/create.js index 0b6139e..875f128 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -12,6 +12,7 @@ const permissions = require('../permissions'); const boom = require('boom'); const util = require('util'); const _ = require('lodash'); +import getData from './data-mapping/get-data'; module.exports = { addCreateRoute, @@ -19,10 +20,6 @@ module.exports = { sendCreateResult, description, setStatusIfApplicable, - getData, - getFromReqObject, - getValue, - ensureMapIsString, setOwnerIfApplicable }; @@ -93,9 +90,7 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + - metadata.title.toLowerCase() + - ' was successfully created.', + 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -115,8 +110,7 @@ function setStatusIfApplicable(metadata) { req.body.statusLog = [ { status: req.body.status, - //we use 'module.exports.' here to allow stubbing in the unit tests - data: module.exports.getData(statusToSet.initialData, req), + data: getData(statusToSet.initialData, req), statusDate: req.body.statusDate } ]; @@ -124,84 +118,6 @@ function setStatusIfApplicable(metadata) { }; } -function getData(rules, req) { - if (!rules) { - return; - } - //we use 'module.exports.' here to allow stubbing in the unit tests - const fromReq = module.exports.getFromReqObject(rules.fromReq, req); - return _.merge({}, rules.static, fromReq); -} - -const defaultDisallowedSuffixList = ['password', 'passwordHash', 'passwordSalt']; -const defaultAllowedPrefixList = ['user', 'process', 'body', 'params', 'query']; -const maxDepth = 10; -function getFromReqObject( - map, - req, - depth = 0, - disallowedSuffixList = defaultDisallowedSuffixList, - allowedPrefixList = defaultAllowedPrefixList -) { - if (!map) { - return; - } - if (depth > maxDepth) { - throw new Error( - util.format( - 'Circular reference detected in map object after maximum depth (%s) reached. Partial map\n%j\n', - maxDepth, - util.inspect(map, true, maxDepth) - ) - ); - } - const data = {}; - Object.keys(map).forEach(function(key) { - const value = map[key]; - if (_.isArray(value)) { - ensureMapIsString(value[0]); - if (value.length > 2) { - throw new Error( - util.format('Too many items in array, should be at most 2. %j', value) - ); - } - data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); - return; - } - if (_.isObject(value)) { - data[key] = getFromReqObject( - value, - req, - depth + 1, - disallowedSuffixList, - allowedPrefixList - ); - return; - } - ensureMapIsString(value); - data[key] = getValue(req, value, undefined, disallowedSuffixList, allowedPrefixList); - }); - return data; -} - -function getValue(req, map, defaultValue, disallowedSuffixList, allowedPrefixList) { - const disallowed = disallowedSuffixList.find(suffix => map.endsWith(suffix)); - if (disallowed) { - throw new Error('Map is not allowed to end with ' + disallowed); - } - const allowed = allowedPrefixList.find(prefix => map.startsWith(prefix)); - if (!allowed) { - throw new Error(util.format('Map must start with one of %j', allowedPrefixList)); - } - return _.get(req, map, defaultValue); -} - -function ensureMapIsString(map) { - if (!_.isString(map)) { - throw new Error(util.format('Invalid map value, must be a string : \n%j\n', map)); - } -} - function setOwnerIfApplicable(metadata) { return function _setOwnerIfApplicable(req, res, next) { let ownership = metadata.schemas.core.ownership; @@ -212,12 +128,7 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest( - util.format( - 'Owner from expression "%s" was blank', - ownership.setOwnerExpression - ) - ) + boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) ); } } else { diff --git a/src/crud/data-mapping/get-data-from-req.js b/src/crud/data-mapping/get-data-from-req.js new file mode 100644 index 0000000..fbbe554 --- /dev/null +++ b/src/crud/data-mapping/get-data-from-req.js @@ -0,0 +1,64 @@ +import util from 'util'; +import _ from 'lodash'; + +const defaultDisallowedSuffixList = ['password', 'passwordHash', 'passwordSalt']; +const defaultAllowedPrefixList = ['user', 'process', 'body', 'params', 'query']; +const maxDepth = 10; + +export default function getDataFromReq( + map, + req, + depth = 0, + disallowedSuffixList = defaultDisallowedSuffixList, + allowedPrefixList = defaultAllowedPrefixList +) { + if (!map) { + return; + } + if (depth > maxDepth) { + throw new Error( + util.format( + 'Circular reference detected in map object after maximum depth (%s) reached. Partial map\n%j\n', + maxDepth, + util.inspect(map, true, maxDepth) + ) + ); + } + const data = {}; + Object.keys(map).forEach(function(key) { + const value = map[key]; + if (_.isArray(value)) { + ensureMapIsString(value[0]); + if (value.length > 2) { + throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); + } + data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); + return; + } + if (_.isObject(value)) { + data[key] = getDataFromReq(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); + return; + } + ensureMapIsString(value); + data[key] = getValue(req, value, undefined, disallowedSuffixList, allowedPrefixList); + }); + return data; +} + +export function getValue(req, map, defaultValue, disallowedSuffixList, allowedPrefixList) { + const disallowed = disallowedSuffixList.find(suffix => map.endsWith(suffix)); + if (disallowed) { + throw new Error('Map is not allowed to end with ' + disallowed); + } + const allowed = allowedPrefixList.find(prefix => map.startsWith(prefix)); + if (!allowed) { + throw new Error(util.format('Map must start with one of %j', allowedPrefixList)); + } + return _.get(req, map, defaultValue); +} + +export function ensureMapIsString(map) { + if (!_.isString(map)) { + throw new Error(util.format('Invalid map value, must be a string : \n%j\n', map)); + } +} diff --git a/src/crud/data-mapping/get-data.js b/src/crud/data-mapping/get-data.js new file mode 100644 index 0000000..79ad191 --- /dev/null +++ b/src/crud/data-mapping/get-data.js @@ -0,0 +1,10 @@ +import _ from 'lodash'; +import getDataFromReq from './get-data-from-req'; + +export default function getData(rules, req) { + if (!rules) { + return; + } + const fromReq = getDataFromReq(rules.fromReq, req); + return _.merge({}, rules.static, fromReq); +} diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 28dc7c3..2ee9e68 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -1,9 +1,9 @@ require('../@util/init.js'); const create = require('../../src/crud/create'); +import * as dataFunctions from '../../src/crud/data-mapping/get-data'; const mockRequest = require('../@util/request-mocking').mockRequest; const moment = require('moment'); const sinon = require('sinon'); -const httpMocks = require('node-mocks-http'); describe('Crud - create', function() { describe('setStatusIfApplicable', function() { @@ -69,9 +69,7 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function( - done - ) { + it('Should create a status log entry with the status set to the first one in the schema', function(done) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { @@ -96,9 +94,7 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect( - moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) - ).to.be.lessThan(1); + expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); done(); } }); @@ -160,7 +156,7 @@ describe('Crud - create', function() { name: 'bob' } }; - const stub = sinon.stub(create, 'getData'); + const stub = sinon.stub(dataFunctions, 'default'); stub.returns(stubbedData); mockRequest(middleware, reqOptions, null, next); @@ -174,363 +170,6 @@ describe('Crud - create', function() { }); }); }); - - describe('getData', function() { - it('Should not exist if rules was falsy', function() { - const data = create.getData(null, {}); - expect(data).to.not.be.ok(); - }); - - it('Should be an empty object if rules was an empty object', function() { - const data = create.getData({}, {}); - expect(data).to.be.ok(); - expect(Object.keys(data)).to.have.lengthOf(0); - }); - - it('Should return an object that deep equals rules.static if only initialData.static was set', function() { - const req = {}; - const rules = { - static: { - number: 1, - string: 'test', - bool: true, - array: [2, 'test', true, null, {}, []], - object: {} - } - }; - const data = create.getData(rules, req); - expect(data).to.deep.equal(rules.static); - }); - - it('Should merge the result from getFromReqObject if rules.fromReq existed', function() { - const req = {}; - const rules = { - fromReq: {} - }; - const stubbedData = { - bob: true - }; - const stub = sinon.stub(create, 'getFromReqObject'); - stub.returns(stubbedData); - const data = create.getData(rules, req); - stub.restore(); - expect(data.bob).to.equal(true); - }); - - it('Should merge the result from getFromReqObject and static if both were set', function() { - const req = {}; - const rules = { - fromReq: {}, - static: { - number: 1, - string: 'test', - bool: true, - array: [2, 'test', true, null, {}, []], - object: { - subObject: {} - } - } - }; - const stubbedData = { - bob: true - }; - const stub = sinon.stub(create, 'getFromReqObject'); - stub.returns(stubbedData); - const data = create.getData(rules, req); - stub.restore(); - expect(data.bob).to.equal(true); - expect(data.number).to.equal(rules.static.number); - expect(data.string).to.equal(rules.static.string); - expect(data.bool).to.equal(rules.static.bool); - expect(data.array).to.deep.equal(rules.static.array); - expect(data.object).to.deep.equal(rules.static.object); - }); - - it('Should prioritise fields from getFromReqObject over static if both were set', function() { - const req = {}; - const rules = { - fromReq: {}, - static: { - number: 1, - string: 'test', - bool: true, - array: [2, 'test', true, null, {}, []], - object: { - subObject: {} - } - } - }; - const stubbedData = { - bob: true, - number: 2, - string: 'test2', - bool: false, - array: [], - object: { - betterSubObject: {} - } - }; - const stub = sinon.stub(create, 'getFromReqObject'); - stub.returns(stubbedData); - const data = create.getData(rules, req); - stub.restore(); - expect(data.bob).to.equal(true); - expect(data.number).to.equal(stubbedData.number); - expect(data.string).to.equal(stubbedData.string); - expect(data.bool).to.equal(stubbedData.bool); - expect(data.array).to.deep.equal(rules.static.array); - expect(data.object.subObject).to.be.ok; - expect(data.object.betterSubObject).to.be.ok; - }); - }); - - describe('getFromReqObject', function() { - it('Should map shallow properties from the req using the map', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: 'a' - }; - const data = create.getFromReqObject(map, req, 0, undefined, ['a']); - expect(data.answer).to.equal('b'); - }); - - it('Should map deep properties from the req using the map', function() { - const req = httpMocks.createRequest({ - a: { - b: 'c' - } - }); - const map = { - answer: 'a.b' - }; - const data = create.getFromReqObject(map, req, 0, undefined, ['a']); - expect(data.answer).to.equal('c'); - }); - - it('Should support a nested map structure', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - nested: { - answer: 'a' - } - }; - const data = create.getFromReqObject(map, req, 0, undefined, ['a']); - expect(data.nested.answer).to.equal('b'); - }); - - it('Should support a nested map structure with a nested request object', function() { - const req = httpMocks.createRequest({ - a: { - b: 'c' - } - }); - const map = { - nested: { - answer: 'a.b' - } - }; - const data = create.getFromReqObject(map, req, 0, undefined, ['a']); - expect(data.nested.answer).to.equal('c'); - }); - - it('Should throw an error for circular reference maps', function() { - const req = httpMocks.createRequest({ - a: { - b: 'c' - } - }); - const map = { - nested: {} - }; - map.nested.answer = map; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(/circular reference/i); - }); - - const notAString = /must be a string/i; - - it('Should throw an error if the map was a number', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: 1 - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(notAString); - }); - - it('Should throw an error if the map was a boolean', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: true - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(notAString); - }); - - it('Should not throw an error if the map was an empty object', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: {} - }; - const data = create.getFromReqObject(map, req); - expect(data.answer).to.deep.equal({}); - }); - - it('Should throw an error if the map was null', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: null - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(notAString); - }); - - it('Should throw an error if the map was undefined', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: undefined - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(notAString); - }); - - it('Should use the default value if one was supplied', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: ['c', 'd'] - }; - const result = create.getFromReqObject(map, req, 0, undefined, ['c']); - expect(result.answer).to.equal('d'); - }); - - it('Should use the first value in the array for the map if only that is specified', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: ['a'] - }; - const result = create.getFromReqObject(map, req, 0, undefined, ['a']); - expect(result.answer).to.equal('b'); - }); - - it('Should throw an error if the first value in the array was not a string', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: [1] - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(notAString); - }); - - it('Should throw an error if the array is empty', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: [] - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(notAString); - }); - - it('Should throw an error if the array has more than 2 entries', function() { - const req = httpMocks.createRequest({ - a: 'b' - }); - const map = { - answer: ['a', 'a', 'a'] - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(/too many items in array/i); - }); - - const invalidSuffix = /Map is not allowed to end with/i; - it('Should not allow map values that end with something on the exception list', function() { - const req = httpMocks.createRequest({ - a: { - b: 'c' - } - }); - const map = { - answer: 'a.b' - }; - const disallowedSuffixList = ['.b']; - expect(function() { - create.getFromReqObject(map, req, 0, disallowedSuffixList); - }).to.throw(invalidSuffix); - }); - - it('Should not allow map values that end with something on the default exception list', function() { - const req = httpMocks.createRequest({ - a: { - b: 'c' - } - }); - const map = { - answer: 'a.password' - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(invalidSuffix); - }); - - const invalidPrefix = /Map must start with one of /i; - it('Should not allow access to req properties are not on the exception list', function() { - const req = httpMocks.createRequest({ - a: { - b: 'c' - } - }); - const map = { - answer: 'a.b' - }; - const allowedPrefixList = []; - expect(function() { - create.getFromReqObject(map, req, 0, undefined, allowedPrefixList); - }).to.throw(invalidPrefix); - }); - - it('Should not allow map values that end with something on the default exception list', function() { - const req = httpMocks.createRequest({ - body: { - b: 'c' - } - }); - const map = { - answer: 'body.password' - }; - expect(function() { - create.getFromReqObject(map, req); - }).to.throw(invalidSuffix); - }); - }); }); function buildMetadata(statuses) { diff --git a/test/crud/data-mapping/get-data-from-req.unit.js b/test/crud/data-mapping/get-data-from-req.unit.js new file mode 100644 index 0000000..eea5a76 --- /dev/null +++ b/test/crud/data-mapping/get-data-from-req.unit.js @@ -0,0 +1,251 @@ +require('../../@util/init.js'); +import getDataFromReq from '../../../src/crud/data-mapping/get-data-from-req'; +const httpMocks = require('node-mocks-http'); + +describe('getFromReqObject', function() { + it('Should map shallow properties from the req using the map', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: 'a' + }; + const data = getDataFromReq(map, req, 0, undefined, ['a']); + expect(data.answer).to.equal('b'); + }); + + it('Should map deep properties from the req using the map', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const data = getDataFromReq(map, req, 0, undefined, ['a']); + expect(data.answer).to.equal('c'); + }); + + it('Should support a nested map structure', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + nested: { + answer: 'a' + } + }; + const data = getDataFromReq(map, req, 0, undefined, ['a']); + expect(data.nested.answer).to.equal('b'); + }); + + it('Should support a nested map structure with a nested request object', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + nested: { + answer: 'a.b' + } + }; + const data = getDataFromReq(map, req, 0, undefined, ['a']); + expect(data.nested.answer).to.equal('c'); + }); + + it('Should throw an error for circular reference maps', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + nested: {} + }; + map.nested.answer = map; + expect(function() { + getDataFromReq(map, req); + }).to.throw(/circular reference/i); + }); + + const notAString = /must be a string/i; + + it('Should throw an error if the map was a number', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: 1 + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the map was a boolean', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: true + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(notAString); + }); + + it('Should not throw an error if the map was an empty object', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: {} + }; + const data = getDataFromReq(map, req); + expect(data.answer).to.deep.equal({}); + }); + + it('Should throw an error if the map was null', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: null + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the map was undefined', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: undefined + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(notAString); + }); + + it('Should use the default value if one was supplied', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['c', 'd'] + }; + const result = getDataFromReq(map, req, 0, undefined, ['c']); + expect(result.answer).to.equal('d'); + }); + + it('Should use the first value in the array for the map if only that is specified', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['a'] + }; + const result = getDataFromReq(map, req, 0, undefined, ['a']); + expect(result.answer).to.equal('b'); + }); + + it('Should throw an error if the first value in the array was not a string', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: [1] + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the array is empty', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: [] + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(notAString); + }); + + it('Should throw an error if the array has more than 2 entries', function() { + const req = httpMocks.createRequest({ + a: 'b' + }); + const map = { + answer: ['a', 'a', 'a'] + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(/too many items in array/i); + }); + + const invalidSuffix = /Map is not allowed to end with/i; + it('Should not allow map values that end with something on the exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const disallowedSuffixList = ['.b']; + expect(function() { + getDataFromReq(map, req, 0, disallowedSuffixList); + }).to.throw(invalidSuffix); + }); + + it('Should not allow map values that end with something on the default exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.password' + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(invalidSuffix); + }); + + const invalidPrefix = /Map must start with one of /i; + it('Should not allow access to req properties are not on the exception list', function() { + const req = httpMocks.createRequest({ + a: { + b: 'c' + } + }); + const map = { + answer: 'a.b' + }; + const allowedPrefixList = []; + expect(function() { + getDataFromReq(map, req, 0, undefined, allowedPrefixList); + }).to.throw(invalidPrefix); + }); + + it('Should not allow map values that end with something on the default exception list', function() { + const req = httpMocks.createRequest({ + body: { + b: 'c' + } + }); + const map = { + answer: 'body.password' + }; + expect(function() { + getDataFromReq(map, req); + }).to.throw(invalidSuffix); + }); +}); diff --git a/test/crud/data-mapping/get-data.unit.js b/test/crud/data-mapping/get-data.unit.js new file mode 100644 index 0000000..01f5405 --- /dev/null +++ b/test/crud/data-mapping/get-data.unit.js @@ -0,0 +1,113 @@ +require('../../@util/init.js'); +import getData from '../../../src/crud/data-mapping/get-data'; +import * as getDataFromReq from '../../../src/crud/data-mapping/get-data-from-req'; +const sinon = require('sinon'); + +describe('getData', function() { + it('Should not exist if rules was falsy', function() { + const data = getData(null, {}); + expect(data).to.not.be.ok(); + }); + + it('Should be an empty object if rules was an empty object', function() { + const data = getData({}, {}); + expect(data).to.be.ok(); + expect(Object.keys(data)).to.have.lengthOf(0); + }); + + it('Should return an object that deep equals rules.static if only initialData.static was set', function() { + const req = {}; + const rules = { + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: {} + } + }; + const data = getData(rules, req); + expect(data).to.deep.equal(rules.static); + }); + + it('Should merge the result from getFromReqObject if rules.fromReq existed', function() { + const req = {}; + const rules = { + fromReq: {} + }; + const stubbedData = { + bob: true + }; + const stub = sinon.stub(getDataFromReq, 'default'); + stub.returns(stubbedData); + const data = getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + }); + + it('Should merge the result from getFromReqObject and static if both were set', function() { + const req = {}; + const rules = { + fromReq: {}, + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: { + subObject: {} + } + } + }; + const stubbedData = { + bob: true + }; + const stub = sinon.stub(getDataFromReq, 'default'); + stub.returns(stubbedData); + const data = getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + expect(data.number).to.equal(rules.static.number); + expect(data.string).to.equal(rules.static.string); + expect(data.bool).to.equal(rules.static.bool); + expect(data.array).to.deep.equal(rules.static.array); + expect(data.object).to.deep.equal(rules.static.object); + }); + + it('Should prioritise fields from getFromReqObject over static if both were set', function() { + const req = {}; + const rules = { + fromReq: {}, + static: { + number: 1, + string: 'test', + bool: true, + array: [2, 'test', true, null, {}, []], + object: { + subObject: {} + } + } + }; + const stubbedData = { + bob: true, + number: 2, + string: 'test2', + bool: false, + array: [], + object: { + betterSubObject: {} + } + }; + const stub = sinon.stub(getDataFromReq, 'default'); + stub.returns(stubbedData); + const data = getData(rules, req); + stub.restore(); + expect(data.bob).to.equal(true); + expect(data.number).to.equal(stubbedData.number); + expect(data.string).to.equal(stubbedData.string); + expect(data.bool).to.equal(stubbedData.bool); + expect(data.array).to.deep.equal(rules.static.array); + expect(data.object.subObject).to.be.ok; + expect(data.object.betterSubObject).to.be.ok; + }); +}); From d60c7b7d3c555ff590afb60776f0066309aee64b Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 18 Jun 2017 20:13:27 +0200 Subject: [PATCH 79/95] tests for existing update-status code. --- test/crud/update-status.unit.js | 70 +++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 test/crud/update-status.unit.js diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js new file mode 100644 index 0000000..9678d3b --- /dev/null +++ b/test/crud/update-status.unit.js @@ -0,0 +1,70 @@ +require('../@util/init.js'); +const updateStatusFunctions = require('../../src/crud/update-status'); +const mockRequest = require('../@util/request-mocking').mockRequest; +const moment = require('moment'); +const sinon = require('sinon'); +const validator = require('../../src/validate/validator'); + +describe('Crud - updateStatus', function() { + describe('addUpdateStatusRoute', function() { + it('Should throw an error if the core schema does not have a status object', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter()); + }).to.throw(/No statuses defined/i); + }); + + it('Should throw an error if the core schema has a status value that is not an array', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter({})); + }).to.throw(/must be an array/i); + }); + + it('Should throw an error if the core schema has a status value that is an array but is empty', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter([])); + }).to.throw(/must have at least one item in it/i); + }); + + it('Should use the updateStatus schema if one was specified', function() { + const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + const spy = sinon.spy(validator, 'addSchema'); + updateStatusFunctions.addUpdateStatusRoute(fakeRouter(['ssd'], fakeUpdateSchema), fakeCrudMiddleware()); + assert(spy.calledWith(fakeUpdateSchema)); + }); + }); +}); + +function fakeRouter(statuses, updateStatusSchema) { + const router = { + metadata: { + schemas: { + core: {} + }, + updateStatusDescription: 'Fake' + }, + put: function() { + return router; + }, + describe: sinon.stub() + }; + if (statuses) { + router.metadata.schemas.core.statuses = statuses; + } + if (updateStatusSchema) { + router.metadata.schemas.updateStatus = updateStatusSchema; + } + return router; +} + +function fakeCrudMiddleware() { + return { + query: sinon.stub(), + findByIdentifier: sinon.stub(), + create: sinon.stub(), + update: sinon.stub(), + updateStatus: sinon.stub(), + getExistingMetadata: sinon.stub(), + writeHistoryItem: sinon.stub(), + deleteByIdentifier: sinon.stub() + }; +} From ca9e8c6ed08380ff2658c86ebe2b6491bc737a93 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 18 Jun 2017 20:23:34 +0200 Subject: [PATCH 80/95] more tests --- test/crud/update-status.unit.js | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 9678d3b..11aa2fc 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -25,11 +25,27 @@ describe('Crud - updateStatus', function() { }).to.throw(/must have at least one item in it/i); }); + const addSchemaSpy = sinon.spy(validator, 'addSchema'); it('Should use the updateStatus schema if one was specified', function() { const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; - const spy = sinon.spy(validator, 'addSchema'); updateStatusFunctions.addUpdateStatusRoute(fakeRouter(['ssd'], fakeUpdateSchema), fakeCrudMiddleware()); - assert(spy.calledWith(fakeUpdateSchema)); + assert(addSchemaSpy.calledWith(fakeUpdateSchema)); + }); + + it('Should use the updateStatusSchema value on the core schema if there was no updateStatus schema spcified', function() { + const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + const router = fakeRouter(['ssd'], null); + router.metadata.schemas.core.updateStatusSchema = fakeUpdateSchema; + updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); + assert(addSchemaSpy.calledWith(fakeUpdateSchema)); + }); + it('Should use the updateStatus schema if one was specified', function() { + const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + const fakeUpdateSchema2 = { $id: 'test-update-schema2', bob: true }; + const router = fakeRouter(['ssd'], fakeUpdateSchema); + router.metadata.schemas.core.updateStatusSchema = fakeUpdateSchema2; + updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); + assert(addSchemaSpy.calledWith(fakeUpdateSchema)); }); }); }); @@ -38,7 +54,9 @@ function fakeRouter(statuses, updateStatusSchema) { const router = { metadata: { schemas: { - core: {} + core: { + $id: 'fake-core-schema-id' + } }, updateStatusDescription: 'Fake' }, From c5aed837fc5b73c9b2e30b809333c1335aaff9bb Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Sun, 18 Jun 2017 20:26:20 +0200 Subject: [PATCH 81/95] test for if no schema passed in. --- test/crud/update-status.unit.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 11aa2fc..a0ee5c3 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -39,7 +39,8 @@ describe('Crud - updateStatus', function() { updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); assert(addSchemaSpy.calledWith(fakeUpdateSchema)); }); - it('Should use the updateStatus schema if one was specified', function() { + + it('Should use the updateStatus schema if both it and updateStatusSchema were set', function() { const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; const fakeUpdateSchema2 = { $id: 'test-update-schema2', bob: true }; const router = fakeRouter(['ssd'], fakeUpdateSchema); @@ -47,6 +48,12 @@ describe('Crud - updateStatus', function() { updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); assert(addSchemaSpy.calledWith(fakeUpdateSchema)); }); + + it('Should throw an error if both the updateStatus schema and updateStatusSchema were not set', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter(['asd'])); + }).to.throw(/No update status schema set./i); + }); }); }); From 0896ce211966e1afbc2d88a55147ce0c7c03a40b Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 07:57:05 +0200 Subject: [PATCH 82/95] Adding some more validation. --- src/crud/update-status.js | 25 +++++++++++++++------ test/crud/update-status.unit.js | 39 +++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 71676ae..747c010 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -18,6 +18,7 @@ module.exports = { }; function addUpdateStatusRoute(router, crudMiddleware, maps) { + /* Todo all this validation logic is very noisy, maybe try using assert? */ if (!router.metadata.schemas.core.statuses) { throw new Error('No statuses defined in metadata.schemas.core.statuses'); } @@ -27,11 +28,24 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { if (router.metadata.schemas.core.statuses.length <= 0) { throw new Error('metadata.schemas.core.statuses array must have at least one item in it.'); } + router.metadata.schemas.core.statuses.forEach(function(status) { + if (!_.isObject(status)) { + throw new Error('items in metadata.schemas.core.statuses array must be an object.'); + } + if (!status.name) { + throw new Error( + 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name"' + ); + } + if (!_.isString(status.name)) { + throw new Error( + 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name" which must be a string' + ); + } + }); if (!router.metadata.schemas.updateStatus) { if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep( - router.metadata.schemas.core.updateStatusSchema - ); + router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); router.metadata.schemas.updateStatus.$id = router.metadata.schemas.core.$id.replace( '.json', '-updateStatus.json' @@ -42,10 +56,7 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { } validator.addSchema(router.metadata.schemas.updateStatus); router - .put( - '/:' + router.metadata.identifierName + '/:newStatusName', - getSteps(router, crudMiddleware, maps) - ) + .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; } diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index a0ee5c3..3784231 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -25,16 +25,37 @@ describe('Crud - updateStatus', function() { }).to.throw(/must have at least one item in it/i); }); + it('Should throw an error if the items in the status array are not objects', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter(['ssd'])); + }).to.throw(/must be an object/i); + }); + + it('Should throw an error if the items in the status array are not objects with a name property on them', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter([{}])); + }).to.throw(/must have a property called "name"/i); + }); + + it('Should throw an error if the items in the status array are not objects with a name property on them that is a string', function() { + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(fakeRouter([{ name: 1 }])); + }).to.throw(/must be a string/i); + }); + const addSchemaSpy = sinon.spy(validator, 'addSchema'); it('Should use the updateStatus schema if one was specified', function() { const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; - updateStatusFunctions.addUpdateStatusRoute(fakeRouter(['ssd'], fakeUpdateSchema), fakeCrudMiddleware()); + updateStatusFunctions.addUpdateStatusRoute( + fakeRouter([{ name: 'test' }], fakeUpdateSchema), + fakeCrudMiddleware() + ); assert(addSchemaSpy.calledWith(fakeUpdateSchema)); }); it('Should use the updateStatusSchema value on the core schema if there was no updateStatus schema spcified', function() { const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; - const router = fakeRouter(['ssd'], null); + const router = fakeRouter([{ name: 'test' }], null); router.metadata.schemas.core.updateStatusSchema = fakeUpdateSchema; updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); assert(addSchemaSpy.calledWith(fakeUpdateSchema)); @@ -43,7 +64,7 @@ describe('Crud - updateStatus', function() { it('Should use the updateStatus schema if both it and updateStatusSchema were set', function() { const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; const fakeUpdateSchema2 = { $id: 'test-update-schema2', bob: true }; - const router = fakeRouter(['ssd'], fakeUpdateSchema); + const router = fakeRouter([{ name: 'test' }], fakeUpdateSchema); router.metadata.schemas.core.updateStatusSchema = fakeUpdateSchema2; updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); assert(addSchemaSpy.calledWith(fakeUpdateSchema)); @@ -51,9 +72,19 @@ describe('Crud - updateStatus', function() { it('Should throw an error if both the updateStatus schema and updateStatusSchema were not set', function() { expect(function() { - updateStatusFunctions.addUpdateStatusRoute(fakeRouter(['asd'])); + updateStatusFunctions.addUpdateStatusRoute(fakeRouter([{ name: 'test' }])); }).to.throw(/No update status schema set./i); }); + + // it('Should use the specific status schema if one was specified', function() { + // const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + // const fakeUpdateSchema2 = { $id: 'test-update-schema2', bob: true }; + // const status = [] + // const router = fakeRouter(['ssd'], fakeUpdateSchema); + // router.metadata.schemas.core.updateStatusSchema = fakeUpdateSchema2; + // updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); + // assert(addSchemaSpy.calledWith(fakeUpdateSchema)); + // }); }); }); From 0043d58f32a8795ff7b6a3d642a90de8b1a33300 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 08:03:20 +0200 Subject: [PATCH 83/95] refactoring validation. --- src/crud/update-status.js | 47 ++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 747c010..d331eff 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -9,6 +9,7 @@ const validator = require('../validate/validator'); const boom = require('boom'); const util = require('util'); const permissions = require('../permissions'); +const assert = require('assert'); module.exports = { addUpdateStatusRoute, @@ -18,31 +19,7 @@ module.exports = { }; function addUpdateStatusRoute(router, crudMiddleware, maps) { - /* Todo all this validation logic is very noisy, maybe try using assert? */ - if (!router.metadata.schemas.core.statuses) { - throw new Error('No statuses defined in metadata.schemas.core.statuses'); - } - if (!_.isArray(router.metadata.schemas.core.statuses)) { - throw new Error('metadata.schemas.core.statuses must be an array'); - } - if (router.metadata.schemas.core.statuses.length <= 0) { - throw new Error('metadata.schemas.core.statuses array must have at least one item in it.'); - } - router.metadata.schemas.core.statuses.forEach(function(status) { - if (!_.isObject(status)) { - throw new Error('items in metadata.schemas.core.statuses array must be an object.'); - } - if (!status.name) { - throw new Error( - 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name"' - ); - } - if (!_.isString(status.name)) { - throw new Error( - 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name" which must be a string' - ); - } - }); + ensureRouterValid(router); if (!router.metadata.schemas.updateStatus) { if (router.metadata.schemas.core.updateStatusSchema) { router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); @@ -61,6 +38,26 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { return router; } +function ensureRouterValid(router) { + assert(router.metadata.schemas.core.statuses, 'No statuses defined in metadata.schemas.core.statuses'); + assert(_.isArray(router.metadata.schemas.core.statuses), 'metadata.schemas.core.statuses must be an array'); + assert( + router.metadata.schemas.core.statuses.length > 0, + 'metadata.schemas.core.statuses array must have at least one item in it.' + ); + router.metadata.schemas.core.statuses.forEach(function(status) { + assert(_.isObject(status), 'items in metadata.schemas.core.statuses array must be an object.'); + assert( + status.name, + 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name"' + ); + assert( + _.isString(status.name), + 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name" which must be a string' + ); + }); +} + function getSteps(router, crudMiddleware, maps) { const steps = { validate: getValidateFunction(schemaName), From efb80f25fffbc5228dfb3b6e990be8913a749139 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 08:05:12 +0200 Subject: [PATCH 84/95] updating prettier tab-width. --- .eslintrc | 2 +- src/crud/create.js | 11 ++++++++-- src/crud/data-mapping/get-data-from-req.js | 12 +++++++++-- src/crud/update-status.js | 24 +++++++++++++++++----- test/@util/example-full-schema.js | 3 ++- test/crud/create.unit.js | 8 ++++++-- 6 files changed, 47 insertions(+), 13 deletions(-) diff --git a/.eslintrc b/.eslintrc index f3d88ac..3afa727 100644 --- a/.eslintrc +++ b/.eslintrc @@ -59,7 +59,7 @@ { "singleQuote": true, "tabWidth": 4, - "printWidth": 100 + "printWidth": 120 } ] } diff --git a/src/crud/create.js b/src/crud/create.js index 875f128..977a671 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -90,7 +90,9 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', + 'Informs the caller that the ' + + metadata.title.toLowerCase() + + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -128,7 +130,12 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) + boom.badRequest( + util.format( + 'Owner from expression "%s" was blank', + ownership.setOwnerExpression + ) + ) ); } } else { diff --git a/src/crud/data-mapping/get-data-from-req.js b/src/crud/data-mapping/get-data-from-req.js index fbbe554..9cb9ddb 100644 --- a/src/crud/data-mapping/get-data-from-req.js +++ b/src/crud/data-mapping/get-data-from-req.js @@ -30,13 +30,21 @@ export default function getDataFromReq( if (_.isArray(value)) { ensureMapIsString(value[0]); if (value.length > 2) { - throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); + throw new Error( + util.format('Too many items in array, should be at most 2. %j', value) + ); } data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getDataFromReq(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); + data[key] = getDataFromReq( + value, + req, + depth + 1, + disallowedSuffixList, + allowedPrefixList + ); return; } ensureMapIsString(value); diff --git a/src/crud/update-status.js b/src/crud/update-status.js index d331eff..f9a70b3 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -22,7 +22,9 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { ensureRouterValid(router); if (!router.metadata.schemas.updateStatus) { if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); + router.metadata.schemas.updateStatus = _.cloneDeep( + router.metadata.schemas.core.updateStatusSchema + ); router.metadata.schemas.updateStatus.$id = router.metadata.schemas.core.$id.replace( '.json', '-updateStatus.json' @@ -33,20 +35,32 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { } validator.addSchema(router.metadata.schemas.updateStatus); router - .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) + .put( + '/:' + router.metadata.identifierName + '/:newStatusName', + getSteps(router, crudMiddleware, maps) + ) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; } function ensureRouterValid(router) { - assert(router.metadata.schemas.core.statuses, 'No statuses defined in metadata.schemas.core.statuses'); - assert(_.isArray(router.metadata.schemas.core.statuses), 'metadata.schemas.core.statuses must be an array'); + assert( + router.metadata.schemas.core.statuses, + 'No statuses defined in metadata.schemas.core.statuses' + ); + assert( + _.isArray(router.metadata.schemas.core.statuses), + 'metadata.schemas.core.statuses must be an array' + ); assert( router.metadata.schemas.core.statuses.length > 0, 'metadata.schemas.core.statuses array must have at least one item in it.' ); router.metadata.schemas.core.statuses.forEach(function(status) { - assert(_.isObject(status), 'items in metadata.schemas.core.statuses array must be an object.'); + assert( + _.isObject(status), + 'items in metadata.schemas.core.statuses array must be an object.' + ); assert( status.name, 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name"' diff --git a/test/@util/example-full-schema.js b/test/@util/example-full-schema.js index 7cfa90d..ed40975 100644 --- a/test/@util/example-full-schema.js +++ b/test/@util/example-full-schema.js @@ -2,7 +2,8 @@ module.exports = { //Unique identifier for this schema, should be a url, I tend to use the path to the raw file on github. - $id: 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', + $id: + 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', // The name of the entity, singular. name: 'user', // The name of the entity, plural. Not required, will be inferred in code, specify this if there is an issue with how it is being generated. diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 2ee9e68..bf9fa90 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -69,7 +69,9 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function(done) { + it('Should create a status log entry with the status set to the first one in the schema', function( + done + ) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { @@ -94,7 +96,9 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); + expect( + moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) + ).to.be.lessThan(1); done(); } }); From 56f3f9527bb549c631c990a9b7ed46ec6911caf5 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 08:07:11 +0200 Subject: [PATCH 85/95] updating prettier tab-width. --- package.json | 2 +- src/authentication/index.js | 11 +--- src/crud/create.js | 11 +--- src/crud/data-mapping/get-data-from-req.js | 12 +--- src/crud/delete-by-id.js | 11 +--- src/crud/get-by-id.js | 6 +- src/crud/query.js | 5 +- src/crud/router/add-standard-routes.js | 14 +---- src/crud/shared/apply-maps.js | 16 ++--- src/crud/shared/get-validate-function.js | 4 +- src/crud/update-status.js | 24 ++------ src/crud/update.js | 11 +--- src/index.js | 9 +-- src/logging/configure-request-id.js | 3 +- src/metadata/infer-names.js | 7 +-- src/mongo/crud.js | 8 +-- src/output/ensure-exists-on-req.js | 4 +- src/output/index.js | 5 +- src/output/object-path-validation.js | 6 +- src/permissions/index.js | 15 +---- src/rate-limit/index.js | 11 ++-- src/routes/test-errors/index.js | 3 +- src/swagger/add-common-items.js | 3 +- src/swagger/generate-swagger-json.js | 4 +- src/swagger/initialise-swagger.js | 4 +- src/validate/custom-formats.js | 54 ++--------------- src/validate/middleware.js | 7 +-- test/@data/users/admin.js | 6 +- test/@data/users/guest.js | 6 +- test/@data/users/member.js | 6 +- test/@util/example-full-schema.js | 3 +- test/@util/expect.js | 42 +++---------- test/@util/integration-common.js | 13 +--- test/crud/create.unit.js | 8 +-- test/routes/base/index.integration.js | 6 +- test/routes/users/items/index.integration.js | 60 +++++-------------- test/swagger/router/apply-maps/skip.unit.js | 5 +- test/version-info/index-test.unit.js | 4 +- utilities/create-indexes/create.js | 13 +--- .../generate-test/get-swagger-route-data.js | 5 +- utilities/generate-test/index.js | 14 +---- 41 files changed, 95 insertions(+), 366 deletions(-) diff --git a/package.json b/package.json index d5f2e09..b844c9e 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "watch": "nodemon .", "test": "nyc mocha \"test/**/*.unit.js\" \"test/**/*.integration.js\"", "unit-test": "nyc mocha \"test/**/*.unit.js\"", - "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", + "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=120 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", "lint-ci": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js", "report": "plato -r -d report -e .eslintrc src", diff --git a/src/authentication/index.js b/src/authentication/index.js index 08227b6..7fb3e94 100644 --- a/src/authentication/index.js +++ b/src/authentication/index.js @@ -15,10 +15,7 @@ module.exports = { }; function initialise(app, callback) { - const strategy = new passportJWT.Strategy( - _.omit(config.get('authenticationOptions').jwt, 'sign'), - findUserById - ); + const strategy = new passportJWT.Strategy(_.omit(config.get('authenticationOptions').jwt, 'sign'), findUserById); passport.use(strategy); callback(null, app); } @@ -38,11 +35,7 @@ function findUserById(req, payload, callback) { return callback(err); } if (!user) { - return callback( - boom.notFound( - util.format('A user with the _id field of "%s" was not found.', parsedId) - ) - ); + return callback(boom.notFound(util.format('A user with the _id field of "%s" was not found.', parsedId))); } callback(null, user); } diff --git a/src/crud/create.js b/src/crud/create.js index 977a671..875f128 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -90,9 +90,7 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + - metadata.title.toLowerCase() + - ' was successfully created.', + 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -130,12 +128,7 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest( - util.format( - 'Owner from expression "%s" was blank', - ownership.setOwnerExpression - ) - ) + boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) ); } } else { diff --git a/src/crud/data-mapping/get-data-from-req.js b/src/crud/data-mapping/get-data-from-req.js index 9cb9ddb..fbbe554 100644 --- a/src/crud/data-mapping/get-data-from-req.js +++ b/src/crud/data-mapping/get-data-from-req.js @@ -30,21 +30,13 @@ export default function getDataFromReq( if (_.isArray(value)) { ensureMapIsString(value[0]); if (value.length > 2) { - throw new Error( - util.format('Too many items in array, should be at most 2. %j', value) - ); + throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); } data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getDataFromReq( - value, - req, - depth + 1, - disallowedSuffixList, - allowedPrefixList - ); + data[key] = getDataFromReq(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); return; } ensureMapIsString(value); diff --git a/src/crud/delete-by-id.js b/src/crud/delete-by-id.js index 906269b..17d3dff 100644 --- a/src/crud/delete-by-id.js +++ b/src/crud/delete-by-id.js @@ -35,19 +35,12 @@ function description(metadata) { return { security: true, summary: - 'Removes ' + - metadata.aOrAn + - ' ' + - metadata.title + - ' By ' + - _.startCase(metadata.identifierName) + - '.', + 'Removes ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName) + '.', tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: - 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' diff --git a/src/crud/get-by-id.js b/src/crud/get-by-id.js index 2c61c66..132484f 100644 --- a/src/crud/get-by-id.js +++ b/src/crud/get-by-id.js @@ -44,8 +44,7 @@ function description(metadata) { parameters: [ { name: metadata.identifierName, - description: - 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' @@ -59,8 +58,7 @@ function description(metadata) { }, responses: { '200': { - description: - 'Returns the single ' + metadata.title + ' matching the provided parameters.', + description: 'Returns the single ' + metadata.title + ' matching the provided parameters.', model: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/query.js b/src/crud/query.js index 2529a31..7efef28 100644 --- a/src/crud/query.js +++ b/src/crud/query.js @@ -49,10 +49,7 @@ function description(metadata) { }, responses: { 200: { - description: - 'Returns the list of ' + - metadata.titlePlural + - ' matching the supplied parameters.', + description: 'Returns the list of ' + metadata.titlePlural + ' matching the supplied parameters.', arrayOfModel: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index e1ccfe2..a854581 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -46,11 +46,7 @@ module.exports = function addStandardRoutes(router) { router.updateStatus = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return updateStatus.addUpdateStatusRoute( - router, - router.crudMiddleware, - crudMiddleware - ); + return updateStatus.addUpdateStatusRoute(router, router.crudMiddleware, crudMiddleware); } } return updateStatus.addUpdateStatusRoute(router, crudMiddleware, maps); @@ -75,12 +71,6 @@ module.exports = function addStandardRoutes(router) { ); } } - return getByIdAndUse.addGetByIdAndUseRoute( - router, - path, - routerOrMiddleware, - crudMiddleware, - maps - ); + return getByIdAndUse.addGetByIdAndUseRoute(router, path, routerOrMiddleware, crudMiddleware, maps); }; }; diff --git a/src/crud/shared/apply-maps.js b/src/crud/shared/apply-maps.js index 697b579..729c0c5 100644 --- a/src/crud/shared/apply-maps.js +++ b/src/crud/shared/apply-maps.js @@ -84,9 +84,7 @@ function _skip(options) { function skipStep(stepName) { if (!options.steps[stepName] && options.throw) { throw new Error( - 'No step by the name of ' + - stepName + - ' was found, please check the spelling and try again' + 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' ); } delete options.steps[stepName]; @@ -141,9 +139,7 @@ function applyAfter(addAfter, steps, throwIfStepNotFound) { return; } throw new Error( - 'No step by the name of ' + - stepName + - ' was found, please check the spelling and try again' + 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' ); } let addOnNext = false; @@ -218,9 +214,7 @@ function applyBefore(addBefore, steps, throwIfStepNotFound) { return; } throw new Error( - 'No step by the name of ' + - stepName + - ' was found, please check the spelling and try again' + 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' ); } _.forIn(steps, function(value, key) { @@ -287,9 +281,7 @@ function applyReplace(replaceWith, steps, throwIfStepNotFound) { return; } throw new Error( - 'No step by the name of ' + - stepName + - ' was found, please check the spelling and try again' + 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' ); } _.forIn(steps, function(value, key) { diff --git a/src/crud/shared/get-validate-function.js b/src/crud/shared/get-validate-function.js index 7292113..40c6550 100644 --- a/src/crud/shared/get-validate-function.js +++ b/src/crud/shared/get-validate-function.js @@ -14,9 +14,7 @@ module.exports = function getValidateFunction(schemaName) { return next( new Error( util.format( - 'req.process.metadata.schemas.' + - schemaName + - '.id was null. Schema was %j ', + 'req.process.metadata.schemas.' + schemaName + '.id was null. Schema was %j ', req.process.metadata.schemas[schemaName] ) ) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index f9a70b3..d331eff 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -22,9 +22,7 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { ensureRouterValid(router); if (!router.metadata.schemas.updateStatus) { if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep( - router.metadata.schemas.core.updateStatusSchema - ); + router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); router.metadata.schemas.updateStatus.$id = router.metadata.schemas.core.$id.replace( '.json', '-updateStatus.json' @@ -35,32 +33,20 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { } validator.addSchema(router.metadata.schemas.updateStatus); router - .put( - '/:' + router.metadata.identifierName + '/:newStatusName', - getSteps(router, crudMiddleware, maps) - ) + .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; } function ensureRouterValid(router) { - assert( - router.metadata.schemas.core.statuses, - 'No statuses defined in metadata.schemas.core.statuses' - ); - assert( - _.isArray(router.metadata.schemas.core.statuses), - 'metadata.schemas.core.statuses must be an array' - ); + assert(router.metadata.schemas.core.statuses, 'No statuses defined in metadata.schemas.core.statuses'); + assert(_.isArray(router.metadata.schemas.core.statuses), 'metadata.schemas.core.statuses must be an array'); assert( router.metadata.schemas.core.statuses.length > 0, 'metadata.schemas.core.statuses array must have at least one item in it.' ); router.metadata.schemas.core.statuses.forEach(function(status) { - assert( - _.isObject(status), - 'items in metadata.schemas.core.statuses array must be an object.' - ); + assert(_.isObject(status), 'items in metadata.schemas.core.statuses array must be an object.'); assert( status.name, 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name"' diff --git a/src/crud/update.js b/src/crud/update.js index 6f2f9c8..ce03fda 100644 --- a/src/crud/update.js +++ b/src/crud/update.js @@ -51,19 +51,12 @@ function description(metadata) { const correlationIdOptions = config.get('logging').correlationId; return { security: true, - summary: - 'Updates ' + - metadata.aOrAn + - ' ' + - metadata.title + - ' By ' + - _.startCase(metadata.identifierName), + summary: 'Updates ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName), tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: - 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' diff --git a/src/index.js b/src/index.js index 147f0ba..7557334 100644 --- a/src/index.js +++ b/src/index.js @@ -11,13 +11,6 @@ createApp(function(err, app) { throw err; } app.listen(port, function() { - console.info( - util.format( - '%s is listening at http://%s:%s', - packageJson.name, - config.get('host'), - port - ) - ); + console.info(util.format('%s is listening at http://%s:%s', packageJson.name, config.get('host'), port)); }); }); diff --git a/src/logging/configure-request-id.js b/src/logging/configure-request-id.js index 924284a..780ed20 100644 --- a/src/logging/configure-request-id.js +++ b/src/logging/configure-request-id.js @@ -5,8 +5,7 @@ module.exports = function configureRequestId(app) { const correlationIdOptions = config.get('logging').correlationId; app.use(requestId(correlationIdOptions)); app.use(function(req, res, next) { - req.headers[correlationIdOptions.reqHeader.toLowerCase()] = - req[correlationIdOptions.paramName]; + req.headers[correlationIdOptions.reqHeader.toLowerCase()] = req[correlationIdOptions.paramName]; return next(); }); }; diff --git a/src/metadata/infer-names.js b/src/metadata/infer-names.js index 3982a39..c1ab31e 100644 --- a/src/metadata/infer-names.js +++ b/src/metadata/infer-names.js @@ -13,8 +13,7 @@ function inferName(metadata) { } function inferNamePlural(metadata) { - metadata.namePlural = - metadata.namePlural || metadata.schemas.core.namePlural || pluralize.plural(metadata.name); + metadata.namePlural = metadata.namePlural || metadata.schemas.core.namePlural || pluralize.plural(metadata.name); } function inferTitle(metadata) { @@ -23,7 +22,5 @@ function inferTitle(metadata) { function inferTitlePlural(metadata) { metadata.titlePlural = - metadata.titlePlural || - metadata.schemas.core.titlePlural || - pluralize.plural(metadata.title); + metadata.titlePlural || metadata.schemas.core.titlePlural || pluralize.plural(metadata.title); } diff --git a/src/mongo/crud.js b/src/mongo/crud.js index 65bc390..dbda386 100644 --- a/src/mongo/crud.js +++ b/src/mongo/crud.js @@ -206,9 +206,7 @@ function writeHistoryItem(metadata) { } req.process.originalItem.historyId = req.process.originalItem._id; delete req.process.originalItem._id; - mongo.db - .collection(metadata.collectionName + '-history') - .insertOne(req.process.originalItem, next); + mongo.db.collection(metadata.collectionName + '-history').insertOne(req.process.originalItem, next); }; } @@ -227,9 +225,7 @@ function getExistingMetadata(metadata, targetObjectPath) { options.fields[field] = 1; }); const parsedQuery = parseQueryWithDefaults(mongoQuery, metadata.schemas.core); - mongo.db - .collection(metadata.collectionName) - .findOne(parsedQuery.filter, options, dataRetrieved); + mongo.db.collection(metadata.collectionName).findOne(parsedQuery.filter, options, dataRetrieved); function dataRetrieved(err, document) { if (err) { return next(err); diff --git a/src/output/ensure-exists-on-req.js b/src/output/ensure-exists-on-req.js index 46ad26d..664352c 100644 --- a/src/output/ensure-exists-on-req.js +++ b/src/output/ensure-exists-on-req.js @@ -34,9 +34,7 @@ module.exports = function ensureExistsOnReq(path, options) { ' could not be found'; return next(boom.notFound(message)); } - throw new Error( - 'Should not be possible due to the ensureExactly1KeyTruthy method in validate, called above' - ); + throw new Error('Should not be possible due to the ensureExactly1KeyTruthy method in validate, called above'); }; }; diff --git a/src/output/index.js b/src/output/index.js index ce72e92..87d76ec 100644 --- a/src/output/index.js +++ b/src/output/index.js @@ -33,10 +33,7 @@ function filterOutput(req, res, next) { req.process.output[index] = jsonSchemaFilter(req.process.metadata.schemas.output, item); }); } else { - req.process.output = jsonSchemaFilter( - req.process.metadata.schemas.output, - req.process.output - ); + req.process.output = jsonSchemaFilter(req.process.metadata.schemas.output, req.process.output); } return next(); } diff --git a/src/output/object-path-validation.js b/src/output/object-path-validation.js index 0f1c9ea..a14ec39 100644 --- a/src/output/object-path-validation.js +++ b/src/output/object-path-validation.js @@ -21,11 +21,7 @@ function validate(object, paths, checkType, methodName) { } if (!_.isString(checkType) || checkTypes.indexOf(checkType) < 0) { throw new Error( - util.format( - 'checkType must be one of the following strings %j when calling %s', - checkTypes, - methodName - ) + util.format('checkType must be one of the following strings %j when calling %s', checkTypes, methodName) ); } } diff --git a/src/permissions/index.js b/src/permissions/index.js index f72d9a7..cd11a83 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -49,9 +49,7 @@ function checkRoleOnly(resource, permissions) { if (isAllowed) { return next(); } - return next( - boom.forbidden(util.format(messageTemplate, userIdString, permissions, resource)) - ); + return next(boom.forbidden(util.format(messageTemplate, userIdString, permissions, resource))); } }; } @@ -62,12 +60,7 @@ function checkRoleAndOwner(resource, permissions, ownership) { permissions = [permissions]; } const userIdString = req.user._id.toString(); - const missingPermissionsErrorMessage = util.format( - messageTemplate, - userIdString, - permissions, - resource - ); + const missingPermissionsErrorMessage = util.format(messageTemplate, userIdString, permissions, resource); nodeAcl.isAllowed(userIdString, resource, permissions, roleChecked); function roleChecked(err, isAllowed) { @@ -93,9 +86,7 @@ function checkRoleAndOwner(resource, permissions, ownership) { } if (!owner) { return next( - boom.badImplementation( - 'Owner was null, make sure you have called getExistingMetadata first' - ) + boom.badImplementation('Owner was null, make sure you have called getExistingMetadata first') ); } //check if owner matches current user diff --git a/src/rate-limit/index.js b/src/rate-limit/index.js index 0390992..12de305 100644 --- a/src/rate-limit/index.js +++ b/src/rate-limit/index.js @@ -11,13 +11,10 @@ const _ = require('lodash'); module.exports = { initialise: function(app, callback) { - async.parallel( - [initialise('api'), initialise('loginUsername'), initialise('loginIp')], - function(err) { - console.log('Rate limits initialised'); - return callback(err, app); - } - ); + async.parallel([initialise('api'), initialise('loginUsername'), initialise('loginIp')], function(err) { + console.log('Rate limits initialised'); + return callback(err, app); + }); }, api: function(req, res, next) { return instances.api.prevent(req, res, next); diff --git a/src/routes/test-errors/index.js b/src/routes/test-errors/index.js index 1e3fbf2..034fae4 100644 --- a/src/routes/test-errors/index.js +++ b/src/routes/test-errors/index.js @@ -14,8 +14,7 @@ router.get('/client', function(req, res, next) { return next(boom.badRequest('Client error - should see details')); }); -const uncaughtErrorMessage = - "Testing the uncaught process error, should kill the server, don't expose on live"; +const uncaughtErrorMessage = "Testing the uncaught process error, should kill the server, don't expose on live"; router.get('/process', function() { process.nextTick(function() { throw new Error(uncaughtErrorMessage); diff --git a/src/swagger/add-common-items.js b/src/swagger/add-common-items.js index e91b43b..207f369 100644 --- a/src/swagger/add-common-items.js +++ b/src/swagger/add-common-items.js @@ -105,8 +105,7 @@ module.exports = function(app, callback) { }); swagger.common.addResponse({ name: '204', - description: - 'The server successfully processed the request, but is not returning any content.' + description: 'The server successfully processed the request, but is not returning any content.' }); const correlationIdOptions = config.get('logging').correlationId; swagger.common.addResponseHeader({ diff --git a/src/swagger/generate-swagger-json.js b/src/swagger/generate-swagger-json.js index 796eab1..1b758fa 100644 --- a/src/swagger/generate-swagger-json.js +++ b/src/swagger/generate-swagger-json.js @@ -26,9 +26,7 @@ module.exports = function generateSwaggerJson(app, callback) { }; function writeSwaggerFileToDisk(app, callback) { - fs.writeFile('./src/swagger/swagger.json', JSON.stringify(swagger.json(), null, 4), function( - err - ) { + fs.writeFile('./src/swagger/swagger.json', JSON.stringify(swagger.json(), null, 4), function(err) { return callback(err, app); }); } diff --git a/src/swagger/initialise-swagger.js b/src/swagger/initialise-swagger.js index 1ac5315..a9ed047 100644 --- a/src/swagger/initialise-swagger.js +++ b/src/swagger/initialise-swagger.js @@ -38,9 +38,7 @@ function buildBaseDocument(swaggerConfig) { contact: contactInfo, license: { name: _.get(swaggerConfig, 'license.name') || packageJson.license, - url: - _.get(swaggerConfig, 'license.url') || - 'https://spdx.org/licenses/' + packageJson.license + '.html' + url: _.get(swaggerConfig, 'license.url') || 'https://spdx.org/licenses/' + packageJson.license + '.html' } }, host: host, diff --git a/src/validate/custom-formats.js b/src/validate/custom-formats.js index 47d46b7..917e7d5 100644 --- a/src/validate/custom-formats.js +++ b/src/validate/custom-formats.js @@ -21,14 +21,7 @@ function isValidMongoId(input) { return mongo.isValidObjectId(input); } -function validateAndCoerceToMongoId( - isMongoId, - input, - schema, - currentDataPath, - parentDataObject, - propName -) { +function validateAndCoerceToMongoId(isMongoId, input, schema, currentDataPath, parentDataObject, propName) { if (!isMongoId) { return true; } @@ -39,49 +32,21 @@ function validateAndCoerceToMongoId( return valid; } -function validateAndCoerceFromDateFormat( - dateFormat, - input, - schema, - currentDataPath, - parentDataObject, - propName -) { +function validateAndCoerceFromDateFormat(dateFormat, input, schema, currentDataPath, parentDataObject, propName) { dateFormat = dateFormat.toLowerCase(); const allowedValues = ['date', 'time']; if (allowedValues.indexOf(dateFormat) < 0) { return false; } if (dateFormat === 'date') { - return validateAndCoerceToDate( - dateFormat, - input, - schema, - currentDataPath, - parentDataObject, - propName - ); + return validateAndCoerceToDate(dateFormat, input, schema, currentDataPath, parentDataObject, propName); } if (dateFormat === 'time') { - return validateAndCoerceToTime( - dateFormat, - input, - schema, - currentDataPath, - parentDataObject, - propName - ); + return validateAndCoerceToTime(dateFormat, input, schema, currentDataPath, parentDataObject, propName); } } -function validateAndCoerceToDate( - dateFormat, - input, - schema, - currentDataPath, - parentDataObject, - propName -) { +function validateAndCoerceToDate(dateFormat, input, schema, currentDataPath, parentDataObject, propName) { const format = 'YYYY-MM-DD'; const dateValue = moment.utc(new Date(input)); const valid = dateValue.isValid(); @@ -91,14 +56,7 @@ function validateAndCoerceToDate( return valid; } -function validateAndCoerceToTime( - dateFormat, - input, - schema, - currentDataPath, - parentDataObject, - propName -) { +function validateAndCoerceToTime(dateFormat, input, schema, currentDataPath, parentDataObject, propName) { const dateValue = moment.utc(new Date(input)); const valid = dateValue.isValid(); if (valid) { diff --git a/src/validate/middleware.js b/src/validate/middleware.js index ff536f5..6aceb06 100644 --- a/src/validate/middleware.js +++ b/src/validate/middleware.js @@ -6,12 +6,7 @@ module.exports = function(schema) { return function validateSchema(req, res, next) { const result = validator.validate(schema, req.body); if (!result.valid) { - return next( - boom.badRequest( - 'The data was not in the correct format. ' + result.message, - result.errors - ) - ); + return next(boom.badRequest('The data was not in the correct format. ' + result.message, result.errors)); } return next(); }; diff --git a/test/@data/users/admin.js b/test/@data/users/admin.js index 2740697..2513f8e 100644 --- a/test/@data/users/admin.js +++ b/test/@data/users/admin.js @@ -6,11 +6,7 @@ const uuid = require('node-uuid'); const permissions = require('../../../src/permissions'); module.exports = function(callback) { const adminUser = config.get('tests').adminUser; - bcrypt.hash( - adminUser.password, - config.get('authenticationOptions').password.saltRounds, - hashCalculated - ); + bcrypt.hash(adminUser.password, config.get('authenticationOptions').password.saltRounds, hashCalculated); function hashCalculated(hashErr, hash) { if (hashErr) { diff --git a/test/@data/users/guest.js b/test/@data/users/guest.js index 2278f0b..3066c5d 100644 --- a/test/@data/users/guest.js +++ b/test/@data/users/guest.js @@ -7,11 +7,7 @@ const permissions = require('../../../src/permissions'); module.exports = function(callback) { const guestUser = config.get('tests').guestUser; const adminUser = config.get('tests').adminUser; - bcrypt.hash( - guestUser.password, - config.get('authenticationOptions').password.saltRounds, - hashCalculated - ); + bcrypt.hash(guestUser.password, config.get('authenticationOptions').password.saltRounds, hashCalculated); function hashCalculated(hashErr, hash) { if (hashErr) { diff --git a/test/@data/users/member.js b/test/@data/users/member.js index 1db576a..77a0da1 100644 --- a/test/@data/users/member.js +++ b/test/@data/users/member.js @@ -7,11 +7,7 @@ const permissions = require('../../../src/permissions'); module.exports = function(callback) { const normalUser = config.get('tests').normalUser; const adminUser = config.get('tests').adminUser; - bcrypt.hash( - normalUser.password, - config.get('authenticationOptions').password.saltRounds, - hashCalculated - ); + bcrypt.hash(normalUser.password, config.get('authenticationOptions').password.saltRounds, hashCalculated); function hashCalculated(hashErr, hash) { if (hashErr) { diff --git a/test/@util/example-full-schema.js b/test/@util/example-full-schema.js index ed40975..7cfa90d 100644 --- a/test/@util/example-full-schema.js +++ b/test/@util/example-full-schema.js @@ -2,8 +2,7 @@ module.exports = { //Unique identifier for this schema, should be a url, I tend to use the path to the raw file on github. - $id: - 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', + $id: 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', // The name of the entity, singular. name: 'user', // The name of the entity, plural. Not required, will be inferred in code, specify this if there is an issue with how it is being generated. diff --git a/test/@util/expect.js b/test/@util/expect.js index ad7b3c0..f74a22c 100644 --- a/test/@util/expect.js +++ b/test/@util/expect.js @@ -39,12 +39,7 @@ function success(code) { return checkSuccessfulResponse(code); } return function(res) { - const message = - 'Expected a status code of ' + - code + - ' but got ' + - res.statusCode + - endMessageBody(res); + const message = 'Expected a status code of ' + code + ' but got ' + res.statusCode + endMessageBody(res); expect(res.statusCode, message).to.equal(code); checkSuccessfulResponse(res); }; @@ -59,13 +54,8 @@ function messageBody(res) { } function checkSuccessfulResponse(res) { - expect(res.statusType, 'Expected a status code in the 2xx range. ' + messageBody(res)).to.equal( - 2 - ); - expect( - res.error, - util.format('The response body contained an error : %j', res.error) - ).to.not.be.ok(); + expect(res.statusType, 'Expected a status code in the 2xx range. ' + messageBody(res)).to.equal(2); + expect(res.error, util.format('The response body contained an error : %j', res.error)).to.not.be.ok(); } function error(code) { @@ -73,22 +63,14 @@ function error(code) { return checkErrorResponse(code); } return function(res) { - const message = - 'Expected a status code of ' + - code + - ' but got ' + - res.statusCode + - endMessageBody(res); + const message = 'Expected a status code of ' + code + ' but got ' + res.statusCode + endMessageBody(res); expect(res.statusCode, message).to.equal(code); checkErrorResponse(res); }; } function checkErrorResponse(res) { - expect( - res.statusType, - 'Expected a status code not in the 2xx range. ' + messageBody(res) - ).to.not.equal(2); + expect(res.statusType, 'Expected a status code not in the 2xx range. ' + messageBody(res)).to.not.equal(2); expect(res.error, 'Expected an error in the response but there was not one').to.be.ok(); } @@ -120,20 +102,14 @@ function matchesSwaggerHeaders(res) { function matchesSwaggerHeader(res, headerName, headerDefinition) { if (!res.headers) { throw new Error( - 'Expected response to have header ' + - headerName + - ' but there were no headers. ' + - operationString(res) + 'Expected response to have header ' + headerName + ' but there were no headers. ' + operationString(res) ); } const superTestName = headerName.toLowerCase(); let headerValue = res.headers[superTestName]; if (!headerValue) { throw new Error( - 'Expected response to have header ' + - headerName + - ' but it was missing. ' + - operationString(res) + 'Expected response to have header ' + headerName + ' but it was missing. ' + operationString(res) ); } const actualType = typeof headerValue; @@ -212,9 +188,7 @@ function getDefinitionObject(res, name) { function getSwaggerResponseObject(res) { const operation = getSwaggerOperation(res); if (!operation.responses) { - throw new Error( - 'Swagger document does not have any responses for operation ' + operationString(res) - ); + throw new Error('Swagger document does not have any responses for operation ' + operationString(res)); } if (!operation.responses[res.statusCode]) { throw new Error( diff --git a/test/@util/integration-common.js b/test/@util/integration-common.js index 34e6b5a..7b48b3f 100644 --- a/test/@util/integration-common.js +++ b/test/@util/integration-common.js @@ -13,10 +13,7 @@ before(function(done) { } initialised = true; this.timeout(10000); - async.waterfall( - [dropAndRecreate, createApp, createDataObject, expect.initialise], - waterfallComplete - ); + async.waterfall([dropAndRecreate, createApp, createDataObject, expect.initialise], waterfallComplete); function waterfallComplete(err, data) { if (err) { @@ -61,18 +58,14 @@ module.exports = { Object.keys(expect).forEach(function(key) { if (module.exports[key]) { - throw new Error( - "Can't add a the property " + key + ' to module.exports because it already exists' - ); + throw new Error("Can't add a the property " + key + ' to module.exports because it already exists'); } module.exports[key] = expect[key]; }); Object.keys(set).forEach(function(key) { if (module.exports[key]) { - throw new Error( - "Can't add a the property " + key + ' to module.exports because it already exists' - ); + throw new Error("Can't add a the property " + key + ' to module.exports because it already exists'); } module.exports[key] = set[key]; }); diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index bf9fa90..2ee9e68 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -69,9 +69,7 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function( - done - ) { + it('Should create a status log entry with the status set to the first one in the schema', function(done) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { @@ -96,9 +94,7 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect( - moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) - ).to.be.lessThan(1); + expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); done(); } }); diff --git a/test/routes/base/index.integration.js b/test/routes/base/index.integration.js index 19c9fcc..2dae611 100644 --- a/test/routes/base/index.integration.js +++ b/test/routes/base/index.integration.js @@ -4,10 +4,6 @@ const common = require('../../@util/integration-common'); describe('Root', function() { this.timeout(common.defaultTimeout); it('Get', function(done) { - common.request - .get('/') - .expect(common.success(200)) - .expect(common.matchesSwaggerSchema) - .end(done); + common.request.get('/').expect(common.success(200)).expect(common.matchesSwaggerSchema).end(done); }); }); diff --git a/test/routes/users/items/index.integration.js b/test/routes/users/items/index.integration.js index 0da064f..aadc234 100644 --- a/test/routes/users/items/index.integration.js +++ b/test/routes/users/items/index.integration.js @@ -48,9 +48,7 @@ describe('Items', function() { it('Happy case', function(done) { common.request .get('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(200)) .expect(common.matchesSwaggerSchema) @@ -59,9 +57,7 @@ describe('Items', function() { it('No Authentication', function(done) { common.request .get('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .expect(common.error(401)) .expect(common.matchesSwaggerSchema) .end(common.logResponse(done)); @@ -83,9 +79,7 @@ describe('Items', function() { it('No guest access', function(done) { common.request .get('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').guestUser })) .expect(common.error(403)) .expect(common.matchesSwaggerSchema) @@ -94,9 +88,7 @@ describe('Items', function() { it('Normal users can get by id', function(done) { common.request .get('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').normalUser })) .expect(common.success(200)) .expect(common.matchesSwaggerSchema) @@ -170,9 +162,7 @@ describe('Items', function() { it('Happy case', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(204)) @@ -181,9 +171,7 @@ describe('Items', function() { it('No Authentication', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .expect(common.error(401)) .end(common.logResponse(done)); @@ -191,9 +179,7 @@ describe('Items', function() { it('No Data', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .send({}) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.error(400)) @@ -202,9 +188,7 @@ describe('Items', function() { it('No guest access', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').guestUser })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .expect(common.error(403)) @@ -213,9 +197,7 @@ describe('Items', function() { it('Normal users can not update other peoples items', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').normalUser })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .expect(common.error(403)) @@ -224,9 +206,7 @@ describe('Items', function() { it('Normal users can update their own items', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item4', email: config.get('tests').normalUser._id }) - ) + .use(common.urlTemplate({ name: 'item4', email: config.get('tests').normalUser._id })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(204)) @@ -238,9 +218,7 @@ describe('Items', function() { it('Happy case', function(done) { common.request .delete('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(204)) .end(common.logResponse(done)); @@ -248,9 +226,7 @@ describe('Items', function() { it('No Authentication', function(done) { common.request .delete('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id })) .expect(common.error(401)) .expect(common.matchesSwaggerSchema) .end(common.logResponse(done)); @@ -272,9 +248,7 @@ describe('Items', function() { it('No guest access', function(done) { common.request .delete('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').guestUser })) .expect(common.error(403)) .expect(common.matchesSwaggerSchema) @@ -284,9 +258,7 @@ describe('Items', function() { it('Normal users can not delete other peoples items', function(done) { common.request .delete('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id }) - ) + .use(common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id })) .set(common.authentication({ user: config.get('tests').normalUser })) .expect(common.error(403)) .expect(common.matchesSwaggerSchema) @@ -295,9 +267,7 @@ describe('Items', function() { it('Normal users can delete their own items', function(done) { common.request .put('/users/:email/items/:name') - .use( - common.urlTemplate({ name: 'item6', email: config.get('tests').normalUser._id }) - ) + .use(common.urlTemplate({ name: 'item6', email: config.get('tests').normalUser._id })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .set(common.authentication({ user: config.get('tests').normalUser })) .expect(common.success(204)) diff --git a/test/swagger/router/apply-maps/skip.unit.js b/test/swagger/router/apply-maps/skip.unit.js index 95bdf3b..2e15fd4 100644 --- a/test/swagger/router/apply-maps/skip.unit.js +++ b/test/swagger/router/apply-maps/skip.unit.js @@ -105,10 +105,7 @@ describe('apply-map._applySkip', function() { if (testCase.throws) { let statement = 'Should throw an error if ' + condition; it(statement, function() { - expect( - callSkip(testCase.skip, testCase.steps), - 'Should have thrown because ' + condition - ).to.throw(); + expect(callSkip(testCase.skip, testCase.steps), 'Should have thrown because ' + condition).to.throw(); }); } else { let statement = 'Should not throw an error if ' + condition; diff --git a/test/version-info/index-test.unit.js b/test/version-info/index-test.unit.js index 9f32062..507bb2c 100644 --- a/test/version-info/index-test.unit.js +++ b/test/version-info/index-test.unit.js @@ -95,9 +95,7 @@ describe('when setting the version info of requests', function() { }); it('should update the version tag, to a new uuid', function() { - expect(validUUIDRegexPattern.test(request.body.versionInfo.versionTag)).to.not.equal( - existingVersionTag - ); + expect(validUUIDRegexPattern.test(request.body.versionInfo.versionTag)).to.not.equal(existingVersionTag); expect(validUUIDRegexPattern.test(request.body.versionInfo.versionTag)).to.equal(true); }); diff --git a/utilities/create-indexes/create.js b/utilities/create-indexes/create.js index 95a6ffd..0ef7608 100644 --- a/utilities/create-indexes/create.js +++ b/utilities/create-indexes/create.js @@ -1,10 +1,7 @@ 'use strict'; require('../../config/init-nconf')('Script-CreateIndexes'); const async = require('async'); -const schemas = [ - require('../../src/routes/users/user.json'), - require('../../src/routes/users/items/item.json') -]; +const schemas = [require('../../src/routes/users/user.json'), require('../../src/routes/users/items/item.json')]; const mongo = require('../../src/mongo'); const pluralize = require('pluralize'); const _ = require('lodash'); @@ -96,9 +93,7 @@ function processIndex(item, indexToCreate, callback) { } let existingIndex = findExistingIndex(indexToCreate, item.existingIndexes); if (!existingIndex) { - return mongo.db - .collection(item.collectionName) - .createIndex(indexToCreate.fields, indexOptions, callback); + return mongo.db.collection(item.collectionName).createIndex(indexToCreate.fields, indexOptions, callback); } if (!shouldDropAndCreate(indexToCreate, item.existingIndexes)) { return callback(); @@ -107,9 +102,7 @@ function processIndex(item, indexToCreate, callback) { if (err) { return callback(err); } - return mongo.db - .collection(item.collectionName) - .createIndex(indexToCreate.fields, indexOptions, callback); + return mongo.db.collection(item.collectionName).createIndex(indexToCreate.fields, indexOptions, callback); }); } diff --git a/utilities/generate-test/get-swagger-route-data.js b/utilities/generate-test/get-swagger-route-data.js index 0e03c5d..dfed264 100644 --- a/utilities/generate-test/get-swagger-route-data.js +++ b/utilities/generate-test/get-swagger-route-data.js @@ -18,10 +18,7 @@ module.exports = function getSwaggerDataFromRouteStack(stack, pathPrefix) { }); routerRoutes.forEach(function(middleware) { const newPrefix = getPathFromMiddleware(middleware); - const subRoutes = getSwaggerDataFromRouteStack( - middleware.handle.stack, - pathPrefix + newPrefix - ); + const subRoutes = getSwaggerDataFromRouteStack(middleware.handle.stack, pathPrefix + newPrefix); routes = routes.concat(subRoutes); }); return routes; diff --git a/utilities/generate-test/index.js b/utilities/generate-test/index.js index c82a3cb..d449c69 100644 --- a/utilities/generate-test/index.js +++ b/utilities/generate-test/index.js @@ -68,11 +68,7 @@ function writeRoutesAsTest(data) { let outputContent = ''; let indent = 0; addLine("'use strict';"); - addLine( - "var common = require('" + - relativePath(data.outputPath, './test/@util/integration-common.js') + - "');" - ); + addLine("var common = require('" + relativePath(data.outputPath, './test/@util/integration-common.js') + "');"); addLine("var router = require('" + relativePath(data.outputPath, data.routerPath) + "');"); addLine("var config = require('nconf');"); addLine(); @@ -212,9 +208,7 @@ function writeRoutesAsTest(data) { addLine("common.request.get('" + foundRoute.fullPath + "')"); indent++; addLine( - '.use(common.urlTemplate(' + - JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + - '))' + '.use(common.urlTemplate(' + JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + '))' ); addLine(".set(common.authentication({user: config.get('tests').adminUser}))"); addLine('.expect(common.error(404))'); @@ -436,9 +430,7 @@ function writeRoutesAsTest(data) { addLine("common.request.delete('" + foundRoute.fullPath + "')"); indent++; addLine( - '.use(common.urlTemplate(' + - JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + - '))' + '.use(common.urlTemplate(' + JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + '))' ); addLine(".set(common.authentication({user: config.get('tests').adminUser}))"); addLine('.expect(common.error(404))'); From 1601ad664ab6b4bc554278213334321e52e1885e Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 08:36:34 +0200 Subject: [PATCH 86/95] Updating logic so that individual status schemas get added. --- src/crud/update-status.js | 43 ++++++++++++++++++++++++--------- test/crud/update-status.unit.js | 23 +++++++++++------- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index d331eff..8449635 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -20,24 +20,43 @@ module.exports = { function addUpdateStatusRoute(router, crudMiddleware, maps) { ensureRouterValid(router); - if (!router.metadata.schemas.updateStatus) { - if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); - router.metadata.schemas.updateStatus.$id = router.metadata.schemas.core.$id.replace( - '.json', - '-updateStatus.json' - ); - } else { - throw new Error('No update status schema set.'); - } - } - validator.addSchema(router.metadata.schemas.updateStatus); + addIndividualStatusSchemas(router); + addDefaultStatusSchemaIfApplicable(router); router .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; } +function addIndividualStatusSchemas(router) { + router.metadata.schemas.core.statuses.forEach(function(status) { + if (status.schema) { + const coreSchemaId = router.metadata.schemas.core.$id; + setStatusSchemaId(status, coreSchemaId); + } + }); +} + +function setStatusSchemaId(status, coreSchemaId) { + status.schema.$id = coreSchemaId.replace('.json', `-${schemaName}-${_.kebabCase(status.name)}.json`); +} + +function addDefaultStatusSchemaIfApplicable(router) { + if (router.metadata.schemas.updateStatus) { + return validator.addSchema(router.metadata.schemas.updateStatus); + } + if (router.metadata.schemas.core.updateStatusSchema) { + router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); + const coreSchemaId = router.metadata.schemas.core.$id; + router.metadata.schemas.updateStatus.$id = coreSchemaId.replace('.json', `-${schemaName}.json`); + return validator.addSchema(router.metadata.schemas.updateStatus); + } + const numberOfStatusesWithASchema = router.metadata.schemas.core.statuses.filter(status => status.schema).length; + if (numberOfStatusesWithASchema !== router.metadata.schemas.core.statuses.length) { + throw new Error('No update status schema set.'); + } +} + function ensureRouterValid(router) { assert(router.metadata.schemas.core.statuses, 'No statuses defined in metadata.schemas.core.statuses'); assert(_.isArray(router.metadata.schemas.core.statuses), 'metadata.schemas.core.statuses must be an array'); diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 3784231..36a7922 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -76,15 +76,20 @@ describe('Crud - updateStatus', function() { }).to.throw(/No update status schema set./i); }); - // it('Should use the specific status schema if one was specified', function() { - // const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; - // const fakeUpdateSchema2 = { $id: 'test-update-schema2', bob: true }; - // const status = [] - // const router = fakeRouter(['ssd'], fakeUpdateSchema); - // router.metadata.schemas.core.updateStatusSchema = fakeUpdateSchema2; - // updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); - // assert(addSchemaSpy.calledWith(fakeUpdateSchema)); - // }); + it('Should use the specific status schema if one was specified', function() { + const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + const statuses = [ + { + name: 'test', + schema: fakeUpdateSchema + } + ]; + const router = fakeRouter(statuses); + updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); + assert(addSchemaSpy.calledWith(fakeUpdateSchema)); + }); + + //should thrown an error if neither updateStatus or updateStatusSchema were set and not every status specifies its own schema }); }); From cdacf57f8656f6b6c588997b06b4ada8d9c4ba98 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 09:13:55 +0200 Subject: [PATCH 87/95] Updating status message to make more sense. --- src/crud/update-status.js | 2 +- test/crud/update-status.unit.js | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 8449635..9f8bf5f 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -53,7 +53,7 @@ function addDefaultStatusSchemaIfApplicable(router) { } const numberOfStatusesWithASchema = router.metadata.schemas.core.statuses.filter(status => status.schema).length; if (numberOfStatusesWithASchema !== router.metadata.schemas.core.statuses.length) { - throw new Error('No update status schema set.'); + throw new Error('No update status schema set or not every status has a schema.'); } } diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 36a7922..2975288 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -89,7 +89,22 @@ describe('Crud - updateStatus', function() { assert(addSchemaSpy.calledWith(fakeUpdateSchema)); }); - //should thrown an error if neither updateStatus or updateStatusSchema were set and not every status specifies its own schema + it('should thrown an error if neither updateStatus or updateStatusSchema were set and not every status specifies its own schema', function() { + const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + const statuses = [ + { + name: 'test', + schema: fakeUpdateSchema + }, + { + name: 'test2' + } + ]; + const router = fakeRouter(statuses); + expect(function() { + updateStatusFunctions.addUpdateStatusRoute(router, fakeCrudMiddleware()); + }).to.throw(/No update status schema set./i); + }); }); }); From 5dd293f78d80e4bbe153bbe14270556f54ec236f Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Mon, 19 Jun 2017 09:22:33 +0200 Subject: [PATCH 88/95] swaping orderof steps to validate the status before calling validate. --- src/crud/update-status.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 9f8bf5f..16f132c 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -79,8 +79,8 @@ function ensureRouterValid(router) { function getSteps(router, crudMiddleware, maps) { const steps = { - validate: getValidateFunction(schemaName), ensureStatusAllowed: ensureStatusAllowed(router.metadata), + validate: getValidateFunction(schemaName), getExistingMetadata: crudMiddleware.getExistingMetadata, checkPermissions: permissions.checkRoleAndOwner( router.metadata.namePlural, From 374243152286638531b1921d3af7c528c8ffd091 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 19:26:13 +0200 Subject: [PATCH 89/95] Tests for ensureStatusAllowed. Adding newStatus onto req.process --- src/crud/update-status.js | 16 +++--- test/@util/request-mocking.js | 19 ++++++- test/crud/update-status.unit.js | 92 ++++++++++++++++++++++++++++----- 3 files changed, 103 insertions(+), 24 deletions(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 16f132c..29bc42d 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -147,16 +147,10 @@ function description(metadata) { function ensureStatusAllowed(metadata) { return function _ensureStatusAllowed(req, res, next) { - const statusNames = metadata.schemas.core.statuses.map(function(statusObj) { - return statusObj.name; - }); - let foundStatus = statusNames.some(function(statusName) { - if (statusName.toLowerCase() === req.params.newStatusName.toLowerCase()) { - req.params.newStatusName = statusName; - return true; - } - return false; - }); + const statusNames = metadata.schemas.core.statuses.map(status => status.name); + let foundStatus = metadata.schemas.core.statuses.find( + status => status.name.toLowerCase() === req.params.newStatusName.toLowerCase() + ); if (!foundStatus) { return next( boom.badRequest( @@ -168,6 +162,8 @@ function ensureStatusAllowed(metadata) { ) ); } + req.params.newStatusName = foundStatus.name; + req.process.newStatus = foundStatus; return next(); }; } diff --git a/test/@util/request-mocking.js b/test/@util/request-mocking.js index 16aa02d..6775069 100644 --- a/test/@util/request-mocking.js +++ b/test/@util/request-mocking.js @@ -5,10 +5,15 @@ module.exports = { mockRequest, shouldNotCallNext, shouldCallNext, + shouldCallNextWithError, shouldNotReturnResponse }; function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallback) { + reqOptions = reqOptions || {}; + if (!reqOptions.process) { + reqOptions.process = {}; + } const req = httpMocks.createRequest(reqOptions); const res = httpMocks.createResponse({ eventEmitter: events.EventEmitter @@ -27,7 +32,10 @@ function mockRequest(middlewareOrRouter, reqOptions, responseCallback, nextCallb } responseCallback(null, resToReturn); }); - middlewareOrRouter(req, res, nextCallback); + middlewareOrRouter(req, res, next); + function next(err) { + nextCallback(err, req, res); + } } function shouldNotCallNext(done) { @@ -48,6 +56,15 @@ function shouldCallNext(done) { }; } +function shouldCallNextWithError(done) { + return function next(err) { + if (!err) { + return done(new Error('Should have called next with an error')); + } + return done(); + }; +} + function shouldNotReturnResponse(done) { return function resComplete() { done(new Error('res.end should not have been called')); diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 2975288..39b960d 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -1,7 +1,6 @@ require('../@util/init.js'); const updateStatusFunctions = require('../../src/crud/update-status'); -const mockRequest = require('../@util/request-mocking').mockRequest; -const moment = require('moment'); +const requestMocking = require('../@util/request-mocking'); const sinon = require('sinon'); const validator = require('../../src/validate/validator'); @@ -106,30 +105,97 @@ describe('Crud - updateStatus', function() { }).to.throw(/No update status schema set./i); }); }); + + describe('ensureStatusAllowed', function() { + it('Should throw an error if the newStatusName was not found in the allowed status list', function(done) { + const statuses = [ + { + name: 'test' + } + ]; + const metadata = fakeMetadata(statuses); + const middleware = updateStatusFunctions.ensureStatusAllowed(metadata); + const reqOptions = { + body: {}, + params: { + newStatusName: 'notTest' + } + }; + requestMocking.mockRequest(middleware, reqOptions, null, requestMocking.shouldCallNextWithError(done)); + }); + + it('Should not throw an error if the newStatusName was found in the allowed status list', function(done) { + const statuses = [ + { + name: 'test' + } + ]; + const metadata = fakeMetadata(statuses); + const middleware = updateStatusFunctions.ensureStatusAllowed(metadata); + const reqOptions = { + body: {}, + params: { + newStatusName: 'test' + } + }; + requestMocking.mockRequest(middleware, reqOptions, null, requestMocking.shouldCallNext(done)); + }); + + it('Should set the newStatus on the req.process', function(done) { + const statuses = [ + { + name: 'test', + bob: true + } + ]; + const metadata = fakeMetadata(statuses); + const middleware = updateStatusFunctions.ensureStatusAllowed(metadata); + const reqOptions = { + body: {}, + params: { + newStatusName: 'test' + } + }; + requestMocking.mockRequest(middleware, reqOptions, null, next); + function next(err, req) { + if (err) { + return done(err); + } + expect(req.process.newStatus).to.deep.equal(statuses[0]); + done(); + } + }); + }); }); function fakeRouter(statuses, updateStatusSchema) { const router = { - metadata: { - schemas: { - core: { - $id: 'fake-core-schema-id' - } - }, - updateStatusDescription: 'Fake' - }, + metadata: fakeMetadata(statuses, updateStatusSchema), put: function() { return router; }, describe: sinon.stub() }; + + return router; +} + +function fakeMetadata(statuses, updateStatusSchema) { + const metadata = { + schemas: { + core: { + $id: 'fake-core-schema-id' + } + }, + updateStatusDescription: 'Fake' + }; if (statuses) { - router.metadata.schemas.core.statuses = statuses; + metadata.schemas.core.statuses = statuses; } if (updateStatusSchema) { - router.metadata.schemas.updateStatus = updateStatusSchema; + metadata.schemas.updateStatus = updateStatusSchema; } - return router; + return metadata; } function fakeCrudMiddleware() { From 7f39627b751d933239574d32b0a4bd05fdbc0cf3 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 20:39:30 +0200 Subject: [PATCH 90/95] check for validation. --- src/crud/update-status.js | 20 ++++++++- test/crud/update-status.unit.js | 72 +++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 29bc42d..24ccca9 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -15,7 +15,9 @@ module.exports = { addUpdateStatusRoute, getSteps, description, - ensureStatusAllowed + ensureStatusAllowed, + validate, + schemaName }; function addUpdateStatusRoute(router, crudMiddleware, maps) { @@ -80,7 +82,7 @@ function ensureRouterValid(router) { function getSteps(router, crudMiddleware, maps) { const steps = { ensureStatusAllowed: ensureStatusAllowed(router.metadata), - validate: getValidateFunction(schemaName), + validate: validate(), getExistingMetadata: crudMiddleware.getExistingMetadata, checkPermissions: permissions.checkRoleAndOwner( router.metadata.namePlural, @@ -167,3 +169,17 @@ function ensureStatusAllowed(metadata) { return next(); }; } + +function validate() { + const defaultValidationFunction = getValidateFunction(schemaName); + return function(req, res, next) { + if (req.process.newStatus.schema) { + const result = validator.validate(req.process.newStatus.schema.$id, req.body); + if (!result.valid) { + return next(boom.badRequest(result.message, result.errors)); + } + return next(); + } + defaultValidationFunction(req, res, next); + }; +} diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 39b960d..67389b1 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -166,6 +166,78 @@ describe('Crud - updateStatus', function() { } }); }); + describe('validate', function() { + let validateSchemaStub; + beforeEach(function() { + validateSchemaStub = sinon.stub(validator, 'validate'); + }); + it("Should use the default validation function if the newStatus didn't have a schema", function(done) { + const metadata = fakeMetadata(); + const schemaId = 'asd'; + metadata.schemas[updateStatusFunctions.schemaName] = { + $id: schemaId + }; + const middleware = updateStatusFunctions.validate(); + const reqOptions = { + body: {}, + params: { + newStatusName: 'test' + }, + process: { + metadata, + newStatus: {} + } + }; + validateSchemaStub.returns({ valid: true }); + requestMocking.mockRequest(middleware, reqOptions, null, next); + function next(err) { + if (err) { + return done(err); + } + assert(validateSchemaStub.calledWith(schemaId)); + done(); + } + }); + it('Should use the individual status schema for validation if the newStatus did have a schema', function(done) { + const schemaId = 'specific-status-schema-id'; + const statuses = [ + { + name: 'test', + bob: true, + schema: { + $id: schemaId + } + } + ]; + const metadata = fakeMetadata(statuses); + metadata.schemas[updateStatusFunctions.schemaName] = { + $id: 'asd' + }; + const middleware = updateStatusFunctions.validate(); + const reqOptions = { + body: {}, + params: { + newStatusName: 'test' + }, + process: { + metadata, + newStatus: statuses[0] + } + }; + validateSchemaStub.returns({ valid: true }); + requestMocking.mockRequest(middleware, reqOptions, null, next); + function next(err) { + if (err) { + return done(err); + } + assert(validateSchemaStub.calledWith(schemaId)); + done(); + } + }); + afterEach(function() { + validateSchemaStub.restore(); + }); + }); }); function fakeRouter(statuses, updateStatusSchema) { From 85ec490e3468a495adc83c2c707b02a805e6a03b Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 20:51:32 +0200 Subject: [PATCH 91/95] Adding failing integration test for updating the statuses. --- src/routes/users/user.json | 19 +++++++++++++++---- test/routes/users/index.integration.js | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/routes/users/user.json b/src/routes/users/user.json index a65c7fc..4026a85 100644 --- a/src/routes/users/user.json +++ b/src/routes/users/user.json @@ -8,15 +8,26 @@ { "name": "active", "description": "Default status, shows that the user is active and can login", - "initialData":{ - "static":{ - "reason":"testing" + "initialData": { + "static": { + "reason": "testing" } } }, { "name": "inactive", - "description": "Shows that the user is inactive and can't login" + "description": "Shows that the user is inactive and can't login", + "schema": { + "properties": { + "potatoes": { + "type": "number" + } + }, + "required": [ + "potatoes" + ], + "additionalProperties": false + } }, { "name": "testStatus", diff --git a/test/routes/users/index.integration.js b/test/routes/users/index.integration.js index ce41f6c..5e52b63 100644 --- a/test/routes/users/index.integration.js +++ b/test/routes/users/index.integration.js @@ -125,6 +125,20 @@ describe('Users', function() { .expect(common.success(204)) .end(common.logResponse(done)); }); + it('Happy case - custom status schema', function(done) { + common.request + .put('/users/:email/:newStatusName') + .use( + common.urlTemplate({ + email: config.get('tests').adminUser._id, + newStatusName: 'inactive' + }) + ) + .send({ potatoes: 4 }) + .set(common.authentication({ user: config.get('tests').adminUser })) + .expect(common.success(204)) + .end(common.logResponse(done)); + }); it('No Authentication', function(done) { common.request .put('/users/:email/:newStatusName') From dff8ac6dd7967a0e1ddc110c72ecda8ef281385f Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 21:01:53 +0200 Subject: [PATCH 92/95] fixing bug in update-status --- src/crud/update-status.js | 1 + test/crud/update-status.unit.js | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 24ccca9..5d17e6b 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -35,6 +35,7 @@ function addIndividualStatusSchemas(router) { if (status.schema) { const coreSchemaId = router.metadata.schemas.core.$id; setStatusSchemaId(status, coreSchemaId); + validator.addSchema(status.schema); } }); } diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 67389b1..9a59581 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -76,7 +76,7 @@ describe('Crud - updateStatus', function() { }); it('Should use the specific status schema if one was specified', function() { - const fakeUpdateSchema = { $id: 'test-update-schema', bob: true }; + const fakeUpdateSchema = { $id: 'test-specific-update-schema', bob: false }; const statuses = [ { name: 'test', @@ -166,6 +166,7 @@ describe('Crud - updateStatus', function() { } }); }); + describe('validate', function() { let validateSchemaStub; beforeEach(function() { From 3fd7930d1edee6c40f9d186cac267dfae8353b08 Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 21:05:59 +0200 Subject: [PATCH 93/95] fix for bug where history indexes could be unique. --- utilities/create-indexes/create.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/utilities/create-indexes/create.js b/utilities/create-indexes/create.js index 0ef7608..fa2fbde 100644 --- a/utilities/create-indexes/create.js +++ b/utilities/create-indexes/create.js @@ -46,7 +46,10 @@ function createHistoryIndexItem(item) { if (!index.includeInHistory) { return; } - newItem.indexes.push(index); + const indexCopy = _.cloneDeep(index); + //If we are going to write multiple copies to the history table, they can't be unique. + indexCopy.unique = false; + newItem.indexes.push(indexCopy); }); return newItem; } From 056acf61bae5ba55a5c3e22715395d956d6774db Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 21:23:48 +0200 Subject: [PATCH 94/95] reverting prettier to 100 char width --- .eslintrc | 2 +- CHANGELOG.md | 2 +- package.json | 2 +- src/authentication/index.js | 11 +++- src/crud/create.js | 11 +++- src/crud/data-mapping/get-data-from-req.js | 12 +++- src/crud/delete-by-id.js | 11 +++- src/crud/get-by-id.js | 6 +- src/crud/query.js | 5 +- src/crud/router/add-standard-routes.js | 14 ++++- src/crud/shared/apply-maps.js | 16 +++-- src/crud/shared/get-validate-function.js | 4 +- src/crud/update-status.js | 38 +++++++++--- src/crud/update.js | 11 +++- src/index.js | 9 ++- src/logging/configure-request-id.js | 3 +- src/metadata/infer-names.js | 7 ++- src/mongo/crud.js | 8 ++- src/output/ensure-exists-on-req.js | 4 +- src/output/index.js | 5 +- src/output/object-path-validation.js | 6 +- src/permissions/index.js | 15 ++++- src/rate-limit/index.js | 11 ++-- src/routes/test-errors/index.js | 3 +- src/swagger/add-common-items.js | 3 +- src/swagger/generate-swagger-json.js | 4 +- src/swagger/initialise-swagger.js | 4 +- src/validate/custom-formats.js | 54 +++++++++++++++-- src/validate/middleware.js | 7 ++- test/@data/users/admin.js | 6 +- test/@data/users/guest.js | 6 +- test/@data/users/member.js | 6 +- test/@util/example-full-schema.js | 3 +- test/@util/expect.js | 42 ++++++++++--- test/@util/integration-common.js | 13 +++- test/crud/create.unit.js | 8 ++- test/crud/update-status.unit.js | 30 ++++++++-- test/routes/base/index.integration.js | 6 +- test/routes/users/items/index.integration.js | 60 ++++++++++++++----- test/swagger/router/apply-maps/skip.unit.js | 5 +- test/version-info/index-test.unit.js | 4 +- utilities/create-indexes/create.js | 13 +++- .../generate-test/get-swagger-route-data.js | 5 +- utilities/generate-test/index.js | 14 ++++- 44 files changed, 403 insertions(+), 106 deletions(-) diff --git a/.eslintrc b/.eslintrc index 3afa727..f3d88ac 100644 --- a/.eslintrc +++ b/.eslintrc @@ -59,7 +59,7 @@ { "singleQuote": true, "tabWidth": 4, - "printWidth": 120 + "printWidth": 100 } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index b3eb8d7..81b59a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ * Refactoring generic CRUD functions to export all their functions as properties on an object rather than tacked on to the primary function. This will allow for easier unit testing * Creating a new npm script `unit-test` to run just the unit tests with coverage to get a better idea of where to add tests or where problems may lie. * Adding `babel` for transpilation step. Updating eslint rules to cater for this. Adding nodemon config. Moving index file so that it gets transpiled as well. Adding nyc + config to cater for new coverage. - +* Adding the Check here for upcoming changes ## [1.1.1](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.0...v1.1.1) (2017-06-16) diff --git a/package.json b/package.json index b844c9e..d5f2e09 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "watch": "nodemon .", "test": "nyc mocha \"test/**/*.unit.js\" \"test/**/*.integration.js\"", "unit-test": "nyc mocha \"test/**/*.unit.js\"", - "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=120 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", + "prettier": "node_modules/.bin/prettier --write --tab-width=4 --single-quote=true --print-width=100 \"{src,test,utilities,config}/**/*.js\" \"{index.js,get-opportunities.js,worker.js}\"", "lint": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js --fix", "lint-ci": "node_modules/.bin/eslint \"src/**/*.js\" \"test/**/*.js\" index.js", "report": "plato -r -d report -e .eslintrc src", diff --git a/src/authentication/index.js b/src/authentication/index.js index 7fb3e94..08227b6 100644 --- a/src/authentication/index.js +++ b/src/authentication/index.js @@ -15,7 +15,10 @@ module.exports = { }; function initialise(app, callback) { - const strategy = new passportJWT.Strategy(_.omit(config.get('authenticationOptions').jwt, 'sign'), findUserById); + const strategy = new passportJWT.Strategy( + _.omit(config.get('authenticationOptions').jwt, 'sign'), + findUserById + ); passport.use(strategy); callback(null, app); } @@ -35,7 +38,11 @@ function findUserById(req, payload, callback) { return callback(err); } if (!user) { - return callback(boom.notFound(util.format('A user with the _id field of "%s" was not found.', parsedId))); + return callback( + boom.notFound( + util.format('A user with the _id field of "%s" was not found.', parsedId) + ) + ); } callback(null, user); } diff --git a/src/crud/create.js b/src/crud/create.js index 875f128..977a671 100644 --- a/src/crud/create.js +++ b/src/crud/create.js @@ -90,7 +90,9 @@ function description(metadata) { responses: { '201': { description: - 'Informs the caller that the ' + metadata.title.toLowerCase() + ' was successfully created.', + 'Informs the caller that the ' + + metadata.title.toLowerCase() + + ' was successfully created.', commonHeaders: [correlationIdOptions.resHeader], model: metadata.schemas.output.name } @@ -128,7 +130,12 @@ function setOwnerIfApplicable(metadata) { req.body.owner = _.get(req, ownership.setOwnerExpression); if (!req.body.owner) { return next( - boom.badRequest(util.format('Owner from expression "%s" was blank', ownership.setOwnerExpression)) + boom.badRequest( + util.format( + 'Owner from expression "%s" was blank', + ownership.setOwnerExpression + ) + ) ); } } else { diff --git a/src/crud/data-mapping/get-data-from-req.js b/src/crud/data-mapping/get-data-from-req.js index fbbe554..9cb9ddb 100644 --- a/src/crud/data-mapping/get-data-from-req.js +++ b/src/crud/data-mapping/get-data-from-req.js @@ -30,13 +30,21 @@ export default function getDataFromReq( if (_.isArray(value)) { ensureMapIsString(value[0]); if (value.length > 2) { - throw new Error(util.format('Too many items in array, should be at most 2. %j', value)); + throw new Error( + util.format('Too many items in array, should be at most 2. %j', value) + ); } data[key] = getValue(req, value[0], value[1], disallowedSuffixList, allowedPrefixList); return; } if (_.isObject(value)) { - data[key] = getDataFromReq(value, req, depth + 1, disallowedSuffixList, allowedPrefixList); + data[key] = getDataFromReq( + value, + req, + depth + 1, + disallowedSuffixList, + allowedPrefixList + ); return; } ensureMapIsString(value); diff --git a/src/crud/delete-by-id.js b/src/crud/delete-by-id.js index 17d3dff..906269b 100644 --- a/src/crud/delete-by-id.js +++ b/src/crud/delete-by-id.js @@ -35,12 +35,19 @@ function description(metadata) { return { security: true, summary: - 'Removes ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName) + '.', + 'Removes ' + + metadata.aOrAn + + ' ' + + metadata.title + + ' By ' + + _.startCase(metadata.identifierName) + + '.', tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: + 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' diff --git a/src/crud/get-by-id.js b/src/crud/get-by-id.js index 132484f..2c61c66 100644 --- a/src/crud/get-by-id.js +++ b/src/crud/get-by-id.js @@ -44,7 +44,8 @@ function description(metadata) { parameters: [ { name: metadata.identifierName, - description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: + 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' @@ -58,7 +59,8 @@ function description(metadata) { }, responses: { '200': { - description: 'Returns the single ' + metadata.title + ' matching the provided parameters.', + description: + 'Returns the single ' + metadata.title + ' matching the provided parameters.', model: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/query.js b/src/crud/query.js index 7efef28..2529a31 100644 --- a/src/crud/query.js +++ b/src/crud/query.js @@ -49,7 +49,10 @@ function description(metadata) { }, responses: { 200: { - description: 'Returns the list of ' + metadata.titlePlural + ' matching the supplied parameters.', + description: + 'Returns the list of ' + + metadata.titlePlural + + ' matching the supplied parameters.', arrayOfModel: metadata.schemas.output.name, commonHeaders: [correlationIdOptions.resHeader] } diff --git a/src/crud/router/add-standard-routes.js b/src/crud/router/add-standard-routes.js index a854581..e1ccfe2 100644 --- a/src/crud/router/add-standard-routes.js +++ b/src/crud/router/add-standard-routes.js @@ -46,7 +46,11 @@ module.exports = function addStandardRoutes(router) { router.updateStatus = function(crudMiddleware, maps) { if (router.crudMiddleware) { if (_.isNil(maps)) { - return updateStatus.addUpdateStatusRoute(router, router.crudMiddleware, crudMiddleware); + return updateStatus.addUpdateStatusRoute( + router, + router.crudMiddleware, + crudMiddleware + ); } } return updateStatus.addUpdateStatusRoute(router, crudMiddleware, maps); @@ -71,6 +75,12 @@ module.exports = function addStandardRoutes(router) { ); } } - return getByIdAndUse.addGetByIdAndUseRoute(router, path, routerOrMiddleware, crudMiddleware, maps); + return getByIdAndUse.addGetByIdAndUseRoute( + router, + path, + routerOrMiddleware, + crudMiddleware, + maps + ); }; }; diff --git a/src/crud/shared/apply-maps.js b/src/crud/shared/apply-maps.js index 729c0c5..697b579 100644 --- a/src/crud/shared/apply-maps.js +++ b/src/crud/shared/apply-maps.js @@ -84,7 +84,9 @@ function _skip(options) { function skipStep(stepName) { if (!options.steps[stepName] && options.throw) { throw new Error( - 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' + 'No step by the name of ' + + stepName + + ' was found, please check the spelling and try again' ); } delete options.steps[stepName]; @@ -139,7 +141,9 @@ function applyAfter(addAfter, steps, throwIfStepNotFound) { return; } throw new Error( - 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' + 'No step by the name of ' + + stepName + + ' was found, please check the spelling and try again' ); } let addOnNext = false; @@ -214,7 +218,9 @@ function applyBefore(addBefore, steps, throwIfStepNotFound) { return; } throw new Error( - 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' + 'No step by the name of ' + + stepName + + ' was found, please check the spelling and try again' ); } _.forIn(steps, function(value, key) { @@ -281,7 +287,9 @@ function applyReplace(replaceWith, steps, throwIfStepNotFound) { return; } throw new Error( - 'No step by the name of ' + stepName + ' was found, please check the spelling and try again' + 'No step by the name of ' + + stepName + + ' was found, please check the spelling and try again' ); } _.forIn(steps, function(value, key) { diff --git a/src/crud/shared/get-validate-function.js b/src/crud/shared/get-validate-function.js index 40c6550..7292113 100644 --- a/src/crud/shared/get-validate-function.js +++ b/src/crud/shared/get-validate-function.js @@ -14,7 +14,9 @@ module.exports = function getValidateFunction(schemaName) { return next( new Error( util.format( - 'req.process.metadata.schemas.' + schemaName + '.id was null. Schema was %j ', + 'req.process.metadata.schemas.' + + schemaName + + '.id was null. Schema was %j ', req.process.metadata.schemas[schemaName] ) ) diff --git a/src/crud/update-status.js b/src/crud/update-status.js index 5d17e6b..afe5296 100644 --- a/src/crud/update-status.js +++ b/src/crud/update-status.js @@ -25,7 +25,10 @@ function addUpdateStatusRoute(router, crudMiddleware, maps) { addIndividualStatusSchemas(router); addDefaultStatusSchemaIfApplicable(router); router - .put('/:' + router.metadata.identifierName + '/:newStatusName', getSteps(router, crudMiddleware, maps)) + .put( + '/:' + router.metadata.identifierName + '/:newStatusName', + getSteps(router, crudMiddleware, maps) + ) .describe(router.metadata.updateStatusDescription || description(router.metadata)); return router; } @@ -41,7 +44,10 @@ function addIndividualStatusSchemas(router) { } function setStatusSchemaId(status, coreSchemaId) { - status.schema.$id = coreSchemaId.replace('.json', `-${schemaName}-${_.kebabCase(status.name)}.json`); + status.schema.$id = coreSchemaId.replace( + '.json', + `-${schemaName}-${_.kebabCase(status.name)}.json` + ); } function addDefaultStatusSchemaIfApplicable(router) { @@ -49,26 +55,42 @@ function addDefaultStatusSchemaIfApplicable(router) { return validator.addSchema(router.metadata.schemas.updateStatus); } if (router.metadata.schemas.core.updateStatusSchema) { - router.metadata.schemas.updateStatus = _.cloneDeep(router.metadata.schemas.core.updateStatusSchema); + router.metadata.schemas.updateStatus = _.cloneDeep( + router.metadata.schemas.core.updateStatusSchema + ); const coreSchemaId = router.metadata.schemas.core.$id; - router.metadata.schemas.updateStatus.$id = coreSchemaId.replace('.json', `-${schemaName}.json`); + router.metadata.schemas.updateStatus.$id = coreSchemaId.replace( + '.json', + `-${schemaName}.json` + ); return validator.addSchema(router.metadata.schemas.updateStatus); } - const numberOfStatusesWithASchema = router.metadata.schemas.core.statuses.filter(status => status.schema).length; + const numberOfStatusesWithASchema = router.metadata.schemas.core.statuses.filter( + status => status.schema + ).length; if (numberOfStatusesWithASchema !== router.metadata.schemas.core.statuses.length) { throw new Error('No update status schema set or not every status has a schema.'); } } function ensureRouterValid(router) { - assert(router.metadata.schemas.core.statuses, 'No statuses defined in metadata.schemas.core.statuses'); - assert(_.isArray(router.metadata.schemas.core.statuses), 'metadata.schemas.core.statuses must be an array'); + assert( + router.metadata.schemas.core.statuses, + 'No statuses defined in metadata.schemas.core.statuses' + ); + assert( + _.isArray(router.metadata.schemas.core.statuses), + 'metadata.schemas.core.statuses must be an array' + ); assert( router.metadata.schemas.core.statuses.length > 0, 'metadata.schemas.core.statuses array must have at least one item in it.' ); router.metadata.schemas.core.statuses.forEach(function(status) { - assert(_.isObject(status), 'items in metadata.schemas.core.statuses array must be an object.'); + assert( + _.isObject(status), + 'items in metadata.schemas.core.statuses array must be an object.' + ); assert( status.name, 'items in metadata.schemas.core.statuses array must be an object which must have a property called "name"' diff --git a/src/crud/update.js b/src/crud/update.js index ce03fda..6f2f9c8 100644 --- a/src/crud/update.js +++ b/src/crud/update.js @@ -51,12 +51,19 @@ function description(metadata) { const correlationIdOptions = config.get('logging').correlationId; return { security: true, - summary: 'Updates ' + metadata.aOrAn + ' ' + metadata.title + ' By ' + _.startCase(metadata.identifierName), + summary: + 'Updates ' + + metadata.aOrAn + + ' ' + + metadata.title + + ' By ' + + _.startCase(metadata.identifierName), tags: [metadata.tag.name], parameters: [ { name: metadata.identifierName, - description: 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', + description: + 'The field to uniquely identify this ' + metadata.title.toLowerCase() + '.', required: true, in: 'path', type: 'string' diff --git a/src/index.js b/src/index.js index 7557334..147f0ba 100644 --- a/src/index.js +++ b/src/index.js @@ -11,6 +11,13 @@ createApp(function(err, app) { throw err; } app.listen(port, function() { - console.info(util.format('%s is listening at http://%s:%s', packageJson.name, config.get('host'), port)); + console.info( + util.format( + '%s is listening at http://%s:%s', + packageJson.name, + config.get('host'), + port + ) + ); }); }); diff --git a/src/logging/configure-request-id.js b/src/logging/configure-request-id.js index 780ed20..924284a 100644 --- a/src/logging/configure-request-id.js +++ b/src/logging/configure-request-id.js @@ -5,7 +5,8 @@ module.exports = function configureRequestId(app) { const correlationIdOptions = config.get('logging').correlationId; app.use(requestId(correlationIdOptions)); app.use(function(req, res, next) { - req.headers[correlationIdOptions.reqHeader.toLowerCase()] = req[correlationIdOptions.paramName]; + req.headers[correlationIdOptions.reqHeader.toLowerCase()] = + req[correlationIdOptions.paramName]; return next(); }); }; diff --git a/src/metadata/infer-names.js b/src/metadata/infer-names.js index c1ab31e..3982a39 100644 --- a/src/metadata/infer-names.js +++ b/src/metadata/infer-names.js @@ -13,7 +13,8 @@ function inferName(metadata) { } function inferNamePlural(metadata) { - metadata.namePlural = metadata.namePlural || metadata.schemas.core.namePlural || pluralize.plural(metadata.name); + metadata.namePlural = + metadata.namePlural || metadata.schemas.core.namePlural || pluralize.plural(metadata.name); } function inferTitle(metadata) { @@ -22,5 +23,7 @@ function inferTitle(metadata) { function inferTitlePlural(metadata) { metadata.titlePlural = - metadata.titlePlural || metadata.schemas.core.titlePlural || pluralize.plural(metadata.title); + metadata.titlePlural || + metadata.schemas.core.titlePlural || + pluralize.plural(metadata.title); } diff --git a/src/mongo/crud.js b/src/mongo/crud.js index dbda386..65bc390 100644 --- a/src/mongo/crud.js +++ b/src/mongo/crud.js @@ -206,7 +206,9 @@ function writeHistoryItem(metadata) { } req.process.originalItem.historyId = req.process.originalItem._id; delete req.process.originalItem._id; - mongo.db.collection(metadata.collectionName + '-history').insertOne(req.process.originalItem, next); + mongo.db + .collection(metadata.collectionName + '-history') + .insertOne(req.process.originalItem, next); }; } @@ -225,7 +227,9 @@ function getExistingMetadata(metadata, targetObjectPath) { options.fields[field] = 1; }); const parsedQuery = parseQueryWithDefaults(mongoQuery, metadata.schemas.core); - mongo.db.collection(metadata.collectionName).findOne(parsedQuery.filter, options, dataRetrieved); + mongo.db + .collection(metadata.collectionName) + .findOne(parsedQuery.filter, options, dataRetrieved); function dataRetrieved(err, document) { if (err) { return next(err); diff --git a/src/output/ensure-exists-on-req.js b/src/output/ensure-exists-on-req.js index 664352c..46ad26d 100644 --- a/src/output/ensure-exists-on-req.js +++ b/src/output/ensure-exists-on-req.js @@ -34,7 +34,9 @@ module.exports = function ensureExistsOnReq(path, options) { ' could not be found'; return next(boom.notFound(message)); } - throw new Error('Should not be possible due to the ensureExactly1KeyTruthy method in validate, called above'); + throw new Error( + 'Should not be possible due to the ensureExactly1KeyTruthy method in validate, called above' + ); }; }; diff --git a/src/output/index.js b/src/output/index.js index 87d76ec..ce72e92 100644 --- a/src/output/index.js +++ b/src/output/index.js @@ -33,7 +33,10 @@ function filterOutput(req, res, next) { req.process.output[index] = jsonSchemaFilter(req.process.metadata.schemas.output, item); }); } else { - req.process.output = jsonSchemaFilter(req.process.metadata.schemas.output, req.process.output); + req.process.output = jsonSchemaFilter( + req.process.metadata.schemas.output, + req.process.output + ); } return next(); } diff --git a/src/output/object-path-validation.js b/src/output/object-path-validation.js index a14ec39..0f1c9ea 100644 --- a/src/output/object-path-validation.js +++ b/src/output/object-path-validation.js @@ -21,7 +21,11 @@ function validate(object, paths, checkType, methodName) { } if (!_.isString(checkType) || checkTypes.indexOf(checkType) < 0) { throw new Error( - util.format('checkType must be one of the following strings %j when calling %s', checkTypes, methodName) + util.format( + 'checkType must be one of the following strings %j when calling %s', + checkTypes, + methodName + ) ); } } diff --git a/src/permissions/index.js b/src/permissions/index.js index cd11a83..f72d9a7 100644 --- a/src/permissions/index.js +++ b/src/permissions/index.js @@ -49,7 +49,9 @@ function checkRoleOnly(resource, permissions) { if (isAllowed) { return next(); } - return next(boom.forbidden(util.format(messageTemplate, userIdString, permissions, resource))); + return next( + boom.forbidden(util.format(messageTemplate, userIdString, permissions, resource)) + ); } }; } @@ -60,7 +62,12 @@ function checkRoleAndOwner(resource, permissions, ownership) { permissions = [permissions]; } const userIdString = req.user._id.toString(); - const missingPermissionsErrorMessage = util.format(messageTemplate, userIdString, permissions, resource); + const missingPermissionsErrorMessage = util.format( + messageTemplate, + userIdString, + permissions, + resource + ); nodeAcl.isAllowed(userIdString, resource, permissions, roleChecked); function roleChecked(err, isAllowed) { @@ -86,7 +93,9 @@ function checkRoleAndOwner(resource, permissions, ownership) { } if (!owner) { return next( - boom.badImplementation('Owner was null, make sure you have called getExistingMetadata first') + boom.badImplementation( + 'Owner was null, make sure you have called getExistingMetadata first' + ) ); } //check if owner matches current user diff --git a/src/rate-limit/index.js b/src/rate-limit/index.js index 12de305..0390992 100644 --- a/src/rate-limit/index.js +++ b/src/rate-limit/index.js @@ -11,10 +11,13 @@ const _ = require('lodash'); module.exports = { initialise: function(app, callback) { - async.parallel([initialise('api'), initialise('loginUsername'), initialise('loginIp')], function(err) { - console.log('Rate limits initialised'); - return callback(err, app); - }); + async.parallel( + [initialise('api'), initialise('loginUsername'), initialise('loginIp')], + function(err) { + console.log('Rate limits initialised'); + return callback(err, app); + } + ); }, api: function(req, res, next) { return instances.api.prevent(req, res, next); diff --git a/src/routes/test-errors/index.js b/src/routes/test-errors/index.js index 034fae4..1e3fbf2 100644 --- a/src/routes/test-errors/index.js +++ b/src/routes/test-errors/index.js @@ -14,7 +14,8 @@ router.get('/client', function(req, res, next) { return next(boom.badRequest('Client error - should see details')); }); -const uncaughtErrorMessage = "Testing the uncaught process error, should kill the server, don't expose on live"; +const uncaughtErrorMessage = + "Testing the uncaught process error, should kill the server, don't expose on live"; router.get('/process', function() { process.nextTick(function() { throw new Error(uncaughtErrorMessage); diff --git a/src/swagger/add-common-items.js b/src/swagger/add-common-items.js index 207f369..e91b43b 100644 --- a/src/swagger/add-common-items.js +++ b/src/swagger/add-common-items.js @@ -105,7 +105,8 @@ module.exports = function(app, callback) { }); swagger.common.addResponse({ name: '204', - description: 'The server successfully processed the request, but is not returning any content.' + description: + 'The server successfully processed the request, but is not returning any content.' }); const correlationIdOptions = config.get('logging').correlationId; swagger.common.addResponseHeader({ diff --git a/src/swagger/generate-swagger-json.js b/src/swagger/generate-swagger-json.js index 1b758fa..796eab1 100644 --- a/src/swagger/generate-swagger-json.js +++ b/src/swagger/generate-swagger-json.js @@ -26,7 +26,9 @@ module.exports = function generateSwaggerJson(app, callback) { }; function writeSwaggerFileToDisk(app, callback) { - fs.writeFile('./src/swagger/swagger.json', JSON.stringify(swagger.json(), null, 4), function(err) { + fs.writeFile('./src/swagger/swagger.json', JSON.stringify(swagger.json(), null, 4), function( + err + ) { return callback(err, app); }); } diff --git a/src/swagger/initialise-swagger.js b/src/swagger/initialise-swagger.js index a9ed047..1ac5315 100644 --- a/src/swagger/initialise-swagger.js +++ b/src/swagger/initialise-swagger.js @@ -38,7 +38,9 @@ function buildBaseDocument(swaggerConfig) { contact: contactInfo, license: { name: _.get(swaggerConfig, 'license.name') || packageJson.license, - url: _.get(swaggerConfig, 'license.url') || 'https://spdx.org/licenses/' + packageJson.license + '.html' + url: + _.get(swaggerConfig, 'license.url') || + 'https://spdx.org/licenses/' + packageJson.license + '.html' } }, host: host, diff --git a/src/validate/custom-formats.js b/src/validate/custom-formats.js index 917e7d5..47d46b7 100644 --- a/src/validate/custom-formats.js +++ b/src/validate/custom-formats.js @@ -21,7 +21,14 @@ function isValidMongoId(input) { return mongo.isValidObjectId(input); } -function validateAndCoerceToMongoId(isMongoId, input, schema, currentDataPath, parentDataObject, propName) { +function validateAndCoerceToMongoId( + isMongoId, + input, + schema, + currentDataPath, + parentDataObject, + propName +) { if (!isMongoId) { return true; } @@ -32,21 +39,49 @@ function validateAndCoerceToMongoId(isMongoId, input, schema, currentDataPath, p return valid; } -function validateAndCoerceFromDateFormat(dateFormat, input, schema, currentDataPath, parentDataObject, propName) { +function validateAndCoerceFromDateFormat( + dateFormat, + input, + schema, + currentDataPath, + parentDataObject, + propName +) { dateFormat = dateFormat.toLowerCase(); const allowedValues = ['date', 'time']; if (allowedValues.indexOf(dateFormat) < 0) { return false; } if (dateFormat === 'date') { - return validateAndCoerceToDate(dateFormat, input, schema, currentDataPath, parentDataObject, propName); + return validateAndCoerceToDate( + dateFormat, + input, + schema, + currentDataPath, + parentDataObject, + propName + ); } if (dateFormat === 'time') { - return validateAndCoerceToTime(dateFormat, input, schema, currentDataPath, parentDataObject, propName); + return validateAndCoerceToTime( + dateFormat, + input, + schema, + currentDataPath, + parentDataObject, + propName + ); } } -function validateAndCoerceToDate(dateFormat, input, schema, currentDataPath, parentDataObject, propName) { +function validateAndCoerceToDate( + dateFormat, + input, + schema, + currentDataPath, + parentDataObject, + propName +) { const format = 'YYYY-MM-DD'; const dateValue = moment.utc(new Date(input)); const valid = dateValue.isValid(); @@ -56,7 +91,14 @@ function validateAndCoerceToDate(dateFormat, input, schema, currentDataPath, par return valid; } -function validateAndCoerceToTime(dateFormat, input, schema, currentDataPath, parentDataObject, propName) { +function validateAndCoerceToTime( + dateFormat, + input, + schema, + currentDataPath, + parentDataObject, + propName +) { const dateValue = moment.utc(new Date(input)); const valid = dateValue.isValid(); if (valid) { diff --git a/src/validate/middleware.js b/src/validate/middleware.js index 6aceb06..ff536f5 100644 --- a/src/validate/middleware.js +++ b/src/validate/middleware.js @@ -6,7 +6,12 @@ module.exports = function(schema) { return function validateSchema(req, res, next) { const result = validator.validate(schema, req.body); if (!result.valid) { - return next(boom.badRequest('The data was not in the correct format. ' + result.message, result.errors)); + return next( + boom.badRequest( + 'The data was not in the correct format. ' + result.message, + result.errors + ) + ); } return next(); }; diff --git a/test/@data/users/admin.js b/test/@data/users/admin.js index 2513f8e..2740697 100644 --- a/test/@data/users/admin.js +++ b/test/@data/users/admin.js @@ -6,7 +6,11 @@ const uuid = require('node-uuid'); const permissions = require('../../../src/permissions'); module.exports = function(callback) { const adminUser = config.get('tests').adminUser; - bcrypt.hash(adminUser.password, config.get('authenticationOptions').password.saltRounds, hashCalculated); + bcrypt.hash( + adminUser.password, + config.get('authenticationOptions').password.saltRounds, + hashCalculated + ); function hashCalculated(hashErr, hash) { if (hashErr) { diff --git a/test/@data/users/guest.js b/test/@data/users/guest.js index 3066c5d..2278f0b 100644 --- a/test/@data/users/guest.js +++ b/test/@data/users/guest.js @@ -7,7 +7,11 @@ const permissions = require('../../../src/permissions'); module.exports = function(callback) { const guestUser = config.get('tests').guestUser; const adminUser = config.get('tests').adminUser; - bcrypt.hash(guestUser.password, config.get('authenticationOptions').password.saltRounds, hashCalculated); + bcrypt.hash( + guestUser.password, + config.get('authenticationOptions').password.saltRounds, + hashCalculated + ); function hashCalculated(hashErr, hash) { if (hashErr) { diff --git a/test/@data/users/member.js b/test/@data/users/member.js index 77a0da1..1db576a 100644 --- a/test/@data/users/member.js +++ b/test/@data/users/member.js @@ -7,7 +7,11 @@ const permissions = require('../../../src/permissions'); module.exports = function(callback) { const normalUser = config.get('tests').normalUser; const adminUser = config.get('tests').adminUser; - bcrypt.hash(normalUser.password, config.get('authenticationOptions').password.saltRounds, hashCalculated); + bcrypt.hash( + normalUser.password, + config.get('authenticationOptions').password.saltRounds, + hashCalculated + ); function hashCalculated(hashErr, hash) { if (hashErr) { diff --git a/test/@util/example-full-schema.js b/test/@util/example-full-schema.js index 7cfa90d..ed40975 100644 --- a/test/@util/example-full-schema.js +++ b/test/@util/example-full-schema.js @@ -2,7 +2,8 @@ module.exports = { //Unique identifier for this schema, should be a url, I tend to use the path to the raw file on github. - $id: 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', + $id: + 'https://raw.githubusercontent.com/eXigentCoder/node-api-seed/master/src/routes/users/user.json', // The name of the entity, singular. name: 'user', // The name of the entity, plural. Not required, will be inferred in code, specify this if there is an issue with how it is being generated. diff --git a/test/@util/expect.js b/test/@util/expect.js index f74a22c..ad7b3c0 100644 --- a/test/@util/expect.js +++ b/test/@util/expect.js @@ -39,7 +39,12 @@ function success(code) { return checkSuccessfulResponse(code); } return function(res) { - const message = 'Expected a status code of ' + code + ' but got ' + res.statusCode + endMessageBody(res); + const message = + 'Expected a status code of ' + + code + + ' but got ' + + res.statusCode + + endMessageBody(res); expect(res.statusCode, message).to.equal(code); checkSuccessfulResponse(res); }; @@ -54,8 +59,13 @@ function messageBody(res) { } function checkSuccessfulResponse(res) { - expect(res.statusType, 'Expected a status code in the 2xx range. ' + messageBody(res)).to.equal(2); - expect(res.error, util.format('The response body contained an error : %j', res.error)).to.not.be.ok(); + expect(res.statusType, 'Expected a status code in the 2xx range. ' + messageBody(res)).to.equal( + 2 + ); + expect( + res.error, + util.format('The response body contained an error : %j', res.error) + ).to.not.be.ok(); } function error(code) { @@ -63,14 +73,22 @@ function error(code) { return checkErrorResponse(code); } return function(res) { - const message = 'Expected a status code of ' + code + ' but got ' + res.statusCode + endMessageBody(res); + const message = + 'Expected a status code of ' + + code + + ' but got ' + + res.statusCode + + endMessageBody(res); expect(res.statusCode, message).to.equal(code); checkErrorResponse(res); }; } function checkErrorResponse(res) { - expect(res.statusType, 'Expected a status code not in the 2xx range. ' + messageBody(res)).to.not.equal(2); + expect( + res.statusType, + 'Expected a status code not in the 2xx range. ' + messageBody(res) + ).to.not.equal(2); expect(res.error, 'Expected an error in the response but there was not one').to.be.ok(); } @@ -102,14 +120,20 @@ function matchesSwaggerHeaders(res) { function matchesSwaggerHeader(res, headerName, headerDefinition) { if (!res.headers) { throw new Error( - 'Expected response to have header ' + headerName + ' but there were no headers. ' + operationString(res) + 'Expected response to have header ' + + headerName + + ' but there were no headers. ' + + operationString(res) ); } const superTestName = headerName.toLowerCase(); let headerValue = res.headers[superTestName]; if (!headerValue) { throw new Error( - 'Expected response to have header ' + headerName + ' but it was missing. ' + operationString(res) + 'Expected response to have header ' + + headerName + + ' but it was missing. ' + + operationString(res) ); } const actualType = typeof headerValue; @@ -188,7 +212,9 @@ function getDefinitionObject(res, name) { function getSwaggerResponseObject(res) { const operation = getSwaggerOperation(res); if (!operation.responses) { - throw new Error('Swagger document does not have any responses for operation ' + operationString(res)); + throw new Error( + 'Swagger document does not have any responses for operation ' + operationString(res) + ); } if (!operation.responses[res.statusCode]) { throw new Error( diff --git a/test/@util/integration-common.js b/test/@util/integration-common.js index 7b48b3f..34e6b5a 100644 --- a/test/@util/integration-common.js +++ b/test/@util/integration-common.js @@ -13,7 +13,10 @@ before(function(done) { } initialised = true; this.timeout(10000); - async.waterfall([dropAndRecreate, createApp, createDataObject, expect.initialise], waterfallComplete); + async.waterfall( + [dropAndRecreate, createApp, createDataObject, expect.initialise], + waterfallComplete + ); function waterfallComplete(err, data) { if (err) { @@ -58,14 +61,18 @@ module.exports = { Object.keys(expect).forEach(function(key) { if (module.exports[key]) { - throw new Error("Can't add a the property " + key + ' to module.exports because it already exists'); + throw new Error( + "Can't add a the property " + key + ' to module.exports because it already exists' + ); } module.exports[key] = expect[key]; }); Object.keys(set).forEach(function(key) { if (module.exports[key]) { - throw new Error("Can't add a the property " + key + ' to module.exports because it already exists'); + throw new Error( + "Can't add a the property " + key + ' to module.exports because it already exists' + ); } module.exports[key] = set[key]; }); diff --git a/test/crud/create.unit.js b/test/crud/create.unit.js index 2ee9e68..bf9fa90 100644 --- a/test/crud/create.unit.js +++ b/test/crud/create.unit.js @@ -69,7 +69,9 @@ describe('Crud - create', function() { } }); - it('Should create a status log entry with the status set to the first one in the schema', function(done) { + it('Should create a status log entry with the status set to the first one in the schema', function( + done + ) { const metadata = buildMetadata([{ name: 'a' }]); const middleware = create.setStatusIfApplicable(metadata); const reqOptions = { @@ -94,7 +96,9 @@ describe('Crud - create', function() { function next(error) { expect(error).to.not.be.ok(); - expect(moment(reqOptions.body.statusLog[0].statusDate).diff(new Date())).to.be.lessThan(1); + expect( + moment(reqOptions.body.statusLog[0].statusDate).diff(new Date()) + ).to.be.lessThan(1); done(); } }); diff --git a/test/crud/update-status.unit.js b/test/crud/update-status.unit.js index 9a59581..bb9fe24 100644 --- a/test/crud/update-status.unit.js +++ b/test/crud/update-status.unit.js @@ -107,7 +107,9 @@ describe('Crud - updateStatus', function() { }); describe('ensureStatusAllowed', function() { - it('Should throw an error if the newStatusName was not found in the allowed status list', function(done) { + it('Should throw an error if the newStatusName was not found in the allowed status list', function( + done + ) { const statuses = [ { name: 'test' @@ -121,10 +123,17 @@ describe('Crud - updateStatus', function() { newStatusName: 'notTest' } }; - requestMocking.mockRequest(middleware, reqOptions, null, requestMocking.shouldCallNextWithError(done)); + requestMocking.mockRequest( + middleware, + reqOptions, + null, + requestMocking.shouldCallNextWithError(done) + ); }); - it('Should not throw an error if the newStatusName was found in the allowed status list', function(done) { + it('Should not throw an error if the newStatusName was found in the allowed status list', function( + done + ) { const statuses = [ { name: 'test' @@ -138,7 +147,12 @@ describe('Crud - updateStatus', function() { newStatusName: 'test' } }; - requestMocking.mockRequest(middleware, reqOptions, null, requestMocking.shouldCallNext(done)); + requestMocking.mockRequest( + middleware, + reqOptions, + null, + requestMocking.shouldCallNext(done) + ); }); it('Should set the newStatus on the req.process', function(done) { @@ -172,7 +186,9 @@ describe('Crud - updateStatus', function() { beforeEach(function() { validateSchemaStub = sinon.stub(validator, 'validate'); }); - it("Should use the default validation function if the newStatus didn't have a schema", function(done) { + it("Should use the default validation function if the newStatus didn't have a schema", function( + done + ) { const metadata = fakeMetadata(); const schemaId = 'asd'; metadata.schemas[updateStatusFunctions.schemaName] = { @@ -199,7 +215,9 @@ describe('Crud - updateStatus', function() { done(); } }); - it('Should use the individual status schema for validation if the newStatus did have a schema', function(done) { + it('Should use the individual status schema for validation if the newStatus did have a schema', function( + done + ) { const schemaId = 'specific-status-schema-id'; const statuses = [ { diff --git a/test/routes/base/index.integration.js b/test/routes/base/index.integration.js index 2dae611..19c9fcc 100644 --- a/test/routes/base/index.integration.js +++ b/test/routes/base/index.integration.js @@ -4,6 +4,10 @@ const common = require('../../@util/integration-common'); describe('Root', function() { this.timeout(common.defaultTimeout); it('Get', function(done) { - common.request.get('/').expect(common.success(200)).expect(common.matchesSwaggerSchema).end(done); + common.request + .get('/') + .expect(common.success(200)) + .expect(common.matchesSwaggerSchema) + .end(done); }); }); diff --git a/test/routes/users/items/index.integration.js b/test/routes/users/items/index.integration.js index aadc234..0da064f 100644 --- a/test/routes/users/items/index.integration.js +++ b/test/routes/users/items/index.integration.js @@ -48,7 +48,9 @@ describe('Items', function() { it('Happy case', function(done) { common.request .get('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(200)) .expect(common.matchesSwaggerSchema) @@ -57,7 +59,9 @@ describe('Items', function() { it('No Authentication', function(done) { common.request .get('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .expect(common.error(401)) .expect(common.matchesSwaggerSchema) .end(common.logResponse(done)); @@ -79,7 +83,9 @@ describe('Items', function() { it('No guest access', function(done) { common.request .get('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').guestUser })) .expect(common.error(403)) .expect(common.matchesSwaggerSchema) @@ -88,7 +94,9 @@ describe('Items', function() { it('Normal users can get by id', function(done) { common.request .get('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').normalUser })) .expect(common.success(200)) .expect(common.matchesSwaggerSchema) @@ -162,7 +170,9 @@ describe('Items', function() { it('Happy case', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(204)) @@ -171,7 +181,9 @@ describe('Items', function() { it('No Authentication', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .expect(common.error(401)) .end(common.logResponse(done)); @@ -179,7 +191,9 @@ describe('Items', function() { it('No Data', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .send({}) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.error(400)) @@ -188,7 +202,9 @@ describe('Items', function() { it('No guest access', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item1', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').guestUser })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .expect(common.error(403)) @@ -197,7 +213,9 @@ describe('Items', function() { it('Normal users can not update other peoples items', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').normalUser })) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .expect(common.error(403)) @@ -206,7 +224,9 @@ describe('Items', function() { it('Normal users can update their own items', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item4', email: config.get('tests').normalUser._id })) + .use( + common.urlTemplate({ name: 'item4', email: config.get('tests').normalUser._id }) + ) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(204)) @@ -218,7 +238,9 @@ describe('Items', function() { it('Happy case', function(done) { common.request .delete('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').adminUser })) .expect(common.success(204)) .end(common.logResponse(done)); @@ -226,7 +248,9 @@ describe('Items', function() { it('No Authentication', function(done) { common.request .delete('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id }) + ) .expect(common.error(401)) .expect(common.matchesSwaggerSchema) .end(common.logResponse(done)); @@ -248,7 +272,9 @@ describe('Items', function() { it('No guest access', function(done) { common.request .delete('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item3', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').guestUser })) .expect(common.error(403)) .expect(common.matchesSwaggerSchema) @@ -258,7 +284,9 @@ describe('Items', function() { it('Normal users can not delete other peoples items', function(done) { common.request .delete('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id })) + .use( + common.urlTemplate({ name: 'item5', email: config.get('tests').adminUser._id }) + ) .set(common.authentication({ user: config.get('tests').normalUser })) .expect(common.error(403)) .expect(common.matchesSwaggerSchema) @@ -267,7 +295,9 @@ describe('Items', function() { it('Normal users can delete their own items', function(done) { common.request .put('/users/:email/items/:name') - .use(common.urlTemplate({ name: 'item6', email: config.get('tests').normalUser._id })) + .use( + common.urlTemplate({ name: 'item6', email: config.get('tests').normalUser._id }) + ) .send(common.generateDataFromSchema(router.metadata.schemas.update)) .set(common.authentication({ user: config.get('tests').normalUser })) .expect(common.success(204)) diff --git a/test/swagger/router/apply-maps/skip.unit.js b/test/swagger/router/apply-maps/skip.unit.js index 2e15fd4..95bdf3b 100644 --- a/test/swagger/router/apply-maps/skip.unit.js +++ b/test/swagger/router/apply-maps/skip.unit.js @@ -105,7 +105,10 @@ describe('apply-map._applySkip', function() { if (testCase.throws) { let statement = 'Should throw an error if ' + condition; it(statement, function() { - expect(callSkip(testCase.skip, testCase.steps), 'Should have thrown because ' + condition).to.throw(); + expect( + callSkip(testCase.skip, testCase.steps), + 'Should have thrown because ' + condition + ).to.throw(); }); } else { let statement = 'Should not throw an error if ' + condition; diff --git a/test/version-info/index-test.unit.js b/test/version-info/index-test.unit.js index 507bb2c..9f32062 100644 --- a/test/version-info/index-test.unit.js +++ b/test/version-info/index-test.unit.js @@ -95,7 +95,9 @@ describe('when setting the version info of requests', function() { }); it('should update the version tag, to a new uuid', function() { - expect(validUUIDRegexPattern.test(request.body.versionInfo.versionTag)).to.not.equal(existingVersionTag); + expect(validUUIDRegexPattern.test(request.body.versionInfo.versionTag)).to.not.equal( + existingVersionTag + ); expect(validUUIDRegexPattern.test(request.body.versionInfo.versionTag)).to.equal(true); }); diff --git a/utilities/create-indexes/create.js b/utilities/create-indexes/create.js index fa2fbde..d538c46 100644 --- a/utilities/create-indexes/create.js +++ b/utilities/create-indexes/create.js @@ -1,7 +1,10 @@ 'use strict'; require('../../config/init-nconf')('Script-CreateIndexes'); const async = require('async'); -const schemas = [require('../../src/routes/users/user.json'), require('../../src/routes/users/items/item.json')]; +const schemas = [ + require('../../src/routes/users/user.json'), + require('../../src/routes/users/items/item.json') +]; const mongo = require('../../src/mongo'); const pluralize = require('pluralize'); const _ = require('lodash'); @@ -96,7 +99,9 @@ function processIndex(item, indexToCreate, callback) { } let existingIndex = findExistingIndex(indexToCreate, item.existingIndexes); if (!existingIndex) { - return mongo.db.collection(item.collectionName).createIndex(indexToCreate.fields, indexOptions, callback); + return mongo.db + .collection(item.collectionName) + .createIndex(indexToCreate.fields, indexOptions, callback); } if (!shouldDropAndCreate(indexToCreate, item.existingIndexes)) { return callback(); @@ -105,7 +110,9 @@ function processIndex(item, indexToCreate, callback) { if (err) { return callback(err); } - return mongo.db.collection(item.collectionName).createIndex(indexToCreate.fields, indexOptions, callback); + return mongo.db + .collection(item.collectionName) + .createIndex(indexToCreate.fields, indexOptions, callback); }); } diff --git a/utilities/generate-test/get-swagger-route-data.js b/utilities/generate-test/get-swagger-route-data.js index dfed264..0e03c5d 100644 --- a/utilities/generate-test/get-swagger-route-data.js +++ b/utilities/generate-test/get-swagger-route-data.js @@ -18,7 +18,10 @@ module.exports = function getSwaggerDataFromRouteStack(stack, pathPrefix) { }); routerRoutes.forEach(function(middleware) { const newPrefix = getPathFromMiddleware(middleware); - const subRoutes = getSwaggerDataFromRouteStack(middleware.handle.stack, pathPrefix + newPrefix); + const subRoutes = getSwaggerDataFromRouteStack( + middleware.handle.stack, + pathPrefix + newPrefix + ); routes = routes.concat(subRoutes); }); return routes; diff --git a/utilities/generate-test/index.js b/utilities/generate-test/index.js index d449c69..c82a3cb 100644 --- a/utilities/generate-test/index.js +++ b/utilities/generate-test/index.js @@ -68,7 +68,11 @@ function writeRoutesAsTest(data) { let outputContent = ''; let indent = 0; addLine("'use strict';"); - addLine("var common = require('" + relativePath(data.outputPath, './test/@util/integration-common.js') + "');"); + addLine( + "var common = require('" + + relativePath(data.outputPath, './test/@util/integration-common.js') + + "');" + ); addLine("var router = require('" + relativePath(data.outputPath, data.routerPath) + "');"); addLine("var config = require('nconf');"); addLine(); @@ -208,7 +212,9 @@ function writeRoutesAsTest(data) { addLine("common.request.get('" + foundRoute.fullPath + "')"); indent++; addLine( - '.use(common.urlTemplate(' + JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + '))' + '.use(common.urlTemplate(' + + JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + + '))' ); addLine(".set(common.authentication({user: config.get('tests').adminUser}))"); addLine('.expect(common.error(404))'); @@ -430,7 +436,9 @@ function writeRoutesAsTest(data) { addLine("common.request.delete('" + foundRoute.fullPath + "')"); indent++; addLine( - '.use(common.urlTemplate(' + JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + '))' + '.use(common.urlTemplate(' + + JSON.stringify(getPathParameterObject(foundRoute, { fake: true })) + + '))' ); addLine(".set(common.authentication({user: config.get('tests').adminUser}))"); addLine('.expect(common.error(404))'); From e5228e12daa3fe59ed25d705dee134ad3cff591f Mon Sep 17 00:00:00 2001 From: Ryan Kotzen Date: Fri, 23 Jun 2017 21:30:52 +0200 Subject: [PATCH 95/95] Updating release notes. --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b59a3..7a51602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,13 @@ # Node Api Seed Change Log ## [Unreleased](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.1...HEAD) + * Refactoring generic CRUD functions to export all their functions as properties on an object rather than tacked on to the primary function. This will allow for easier unit testing * Creating a new npm script `unit-test` to run just the unit tests with coverage to get a better idea of where to add tests or where problems may lie. * Adding `babel` for transpilation step. Updating eslint rules to cater for this. Adding nodemon config. Moving index file so that it gets transpiled as well. Adding nyc + config to cater for new coverage. -* Adding the -Check here for upcoming changes +* Deprecating the `ownership.doNotTrack` field, just don't include ownership at all. +* Adding the ability to specify schemas on a per-status basis. +* Adding an annotated example of what the full schema looks like ## [1.1.1](https://github.com/eXigentCoder/node-api-seed/compare/v1.1.0...v1.1.1) (2017-06-16) * Adding instructions to the README of how to do a release