diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fa26e6aa5..f5a6ddbae 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -17,6 +17,12 @@ "from": "accepts@>=1.3.3 <1.4.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz" }, + "acorn": { + "version": "4.0.11", + "from": "acorn@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.11.tgz", + "dev": true + }, "addressparser": { "version": "0.3.2", "from": "addressparser@>=0.3.2 <0.4.0", @@ -27,6 +33,24 @@ "from": "ajv@>=4.9.1 <5.0.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.4.tgz" }, + "align-text": { + "version": "0.1.4", + "from": "align-text@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "from": "alphanum-sort@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "from": "amdefine@>=0.0.4", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "dev": true + }, "ansi-regex": { "version": "2.1.1", "from": "ansi-regex@>=2.0.0 <3.0.0", @@ -42,11 +66,69 @@ "from": "aproba@^1.0.3", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz" }, + "archiver": { + "version": "1.3.0", + "from": "archiver@latest", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "from": "archiver-utils@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@^2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, + "archy": { + "version": "1.0.0", + "from": "archy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "dev": true + }, "are-we-there-yet": { "version": "1.1.2", "from": "are-we-there-yet@~1.1.2", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz" }, + "argparse": { + "version": "1.0.9", + "from": "argparse@>=1.0.7 <2.0.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "from": "arr-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "dev": true + }, + "arr-flatten": { + "version": "1.0.1", + "from": "arr-flatten@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "dev": true + }, "array-differ": { "version": "1.0.0", "from": "array-differ@>=1.0.0 <2.0.0", @@ -62,11 +144,23 @@ "from": "array-flatten@1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, + "array-union": { + "version": "1.0.2", + "from": "array-union@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "dev": true + }, "array-uniq": { "version": "1.0.3", "from": "array-uniq@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" }, + "array-unique": { + "version": "0.2.1", + "from": "array-unique@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "dev": true + }, "asn1": { "version": "0.2.3", "from": "asn1@>=0.2.3 <0.3.0", @@ -77,6 +171,12 @@ "from": "assert-plus@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz" }, + "assertion-error": { + "version": "1.0.2", + "from": "assertion-error@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "dev": true + }, "async": { "version": "2.1.5", "from": "async@>=2.1.4 <3.0.0", @@ -92,6 +192,44 @@ "from": "asynckit@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" }, + "atob": { + "version": "1.1.3", + "from": "atob@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz", + "dev": true + }, + "autoprefixer": { + "version": "6.7.6", + "from": "autoprefixer@>=6.3.1 <7.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.6.tgz", + "dev": true, + "dependencies": { + "browserslist": { + "version": "1.7.6", + "from": "browserslist@>=1.7.5 <2.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.6.tgz", + "dev": true + }, + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.2.15 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "autoprefixer-core": { + "version": "5.2.1", + "from": "autoprefixer-core@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer-core/-/autoprefixer-core-5.2.1.tgz", + "dev": true + }, "aws-sdk": { "version": "2.20.0", "from": "aws-sdk@>=2.1.46 <3.0.0", @@ -197,16 +335,50 @@ "from": "boom@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz" }, + "bootstrap-sass": { + "version": "3.3.7", + "from": "bootstrap-sass@>=3.3.3 <4.0.0", + "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.3.7.tgz", + "dev": true + }, "brace-expansion": { "version": "1.1.6", "from": "brace-expansion@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz" }, + "braces": { + "version": "1.8.5", + "from": "braces@>=1.8.2 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "from": "browser-stdout@1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "dev": true + }, + "browserify-zlib": { + "version": "0.1.4", + "from": "browserify-zlib@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz" + }, + "browserslist": { + "version": "0.4.0", + "from": "browserslist@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-0.4.0.tgz", + "dev": true + }, "buffer": { "version": "4.9.1", "from": "buffer@4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz" }, + "buffer-crc32": { + "version": "0.2.13", + "from": "buffer-crc32@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + }, "buffer-shims": { "version": "1.0.0", "from": "buffer-shims@>=1.0.0 <2.0.0", @@ -279,25 +451,53 @@ "from": "camelcase-keys@^2.0.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" }, + "caniuse-api": { + "version": "1.5.3", + "from": "caniuse-api@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.5.3.tgz", + "dev": true, + "dependencies": { + "browserslist": { + "version": "1.7.6", + "from": "browserslist@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.6.tgz", + "dev": true + } + } + }, + "caniuse-db": { + "version": "1.0.30000634", + "from": "caniuse-db@>=1.0.30000214 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000634.tgz", + "dev": true + }, "caseless": { "version": "0.12.0", "from": "caseless@>=0.12.0 <0.13.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" }, + "center-align": { + "version": "0.1.3", + "from": "center-align@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "dev": true + }, + "chai": { + "version": "3.5.0", + "from": "chai@>=1.9.2 <4.0.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "dev": true + }, "chalk": { "version": "1.1.3", "from": "chalk@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" }, - "checksum": { - "version": "0.1.1", - "from": "checksum@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/checksum/-/checksum-0.1.1.tgz" - }, - "chownr": { - "version": "1.0.1", - "from": "chownr@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz" + "clap": { + "version": "1.1.2", + "from": "clap@>=1.0.9 <2.0.0", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.1.2.tgz", + "dev": true }, "cliui": { "version": "3.2.0", @@ -309,11 +509,23 @@ "from": "clone@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" }, + "clone-buffer": { + "version": "1.0.0", + "from": "clone-buffer@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "dev": true + }, "clone-stats": { "version": "0.0.1", "from": "clone-stats@>=0.0.1 <0.0.2", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz" }, + "cloneable-readable": { + "version": "1.0.0", + "from": "cloneable-readable@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "dev": true + }, "cloudron-manifestformat": { "version": "2.8.0", "from": "cloudron-manifestformat@2.8.0", @@ -336,11 +548,47 @@ "from": "co@>=4.6.0 <5.0.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz" }, + "coa": { + "version": "1.0.1", + "from": "coa@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.1.tgz", + "dev": true + }, "code-point-at": { "version": "1.1.0", "from": "code-point-at@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" }, + "color": { + "version": "0.11.4", + "from": "color@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "from": "color-convert@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "dev": true + }, + "color-name": { + "version": "1.1.1", + "from": "color-name@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "dev": true + }, + "color-string": { + "version": "0.3.0", + "from": "color-string@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", + "dev": true + }, + "colormin": { + "version": "1.1.2", + "from": "colormin@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", + "dev": true + }, "colors": { "version": "1.1.2", "from": "colors@>=1.1.2 <2.0.0", @@ -351,16 +599,59 @@ "from": "combined-stream@>=1.0.5 <1.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz" }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <3.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "dev": true + }, "component-emitter": { "version": "1.2.1", "from": "component-emitter@>=1.2.0 <1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" }, + "compress-commons": { + "version": "1.2.0", + "from": "compress-commons@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@^2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" }, + "concat-with-sourcemaps": { + "version": "1.0.4", + "from": "concat-with-sourcemaps@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.0.4.tgz", + "dev": true + }, + "connect": { + "version": "3.6.0", + "from": "connect@>=3.4.1 <4.0.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.0.tgz", + "dev": true, + "dependencies": { + "finalhandler": { + "version": "1.0.0", + "from": "finalhandler@1.0.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.0.tgz", + "dev": true + } + } + }, "connect-ensure-login": { "version": "0.1.1", "from": "connect-ensure-login@>=0.1.1 <0.2.0", @@ -403,6 +694,12 @@ "from": "content-type@>=1.0.2 <1.1.0", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz" }, + "convert-source-map": { + "version": "1.4.0", + "from": "convert-source-map@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz", + "dev": true + }, "cookie": { "version": "0.3.1", "from": "cookie@0.3.1", @@ -455,6 +752,23 @@ "from": "crc@3.4.4", "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz" }, + "crc32-stream": { + "version": "2.0.0", + "from": "crc32-stream@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@^2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, "cron": { "version": "1.2.1", "from": "cron@>=1.0.9 <2.0.0", @@ -499,6 +813,58 @@ "from": "csrf@>=3.0.3 <3.1.0", "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.4.tgz" }, + "css": { + "version": "2.2.1", + "from": "css@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.38 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "dev": true + } + } + }, + "css-color-names": { + "version": "0.0.4", + "from": "css-color-names@0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "dev": true + }, + "cssnano": { + "version": "3.10.0", + "from": "cssnano@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", + "dev": true, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "from": "object-assign@^4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "dev": true + }, + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "csso": { + "version": "2.3.2", + "from": "csso@>=2.3.1 <2.4.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", + "dev": true + }, "csurf": { "version": "1.9.0", "from": "csurf@>=1.6.6 <2.0.0", @@ -563,21 +929,85 @@ "from": "db-migrate-shared@>=1.1.2 <2.0.0", "resolved": "https://registry.npmjs.org/db-migrate-shared/-/db-migrate-shared-1.1.3.tgz" }, + "deap": { + "version": "1.0.0", + "from": "deap@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/deap/-/deap-1.0.0.tgz", + "dev": true + }, "debug": { "version": "2.6.1", "from": "debug@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.1.tgz" }, + "debug-fabulous": { + "version": "0.0.4", + "from": "debug-fabulous@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-0.0.4.tgz", + "dev": true, + "dependencies": { + "object-assign": { + "version": "4.1.0", + "from": "object-assign@4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "dev": true + } + } + }, "decamelize": { "version": "1.2.0", "from": "decamelize@>=1.1.2 <2.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" }, + "deep-eql": { + "version": "0.1.3", + "from": "deep-eql@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "dev": true, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "from": "type-detect@0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "dev": true + } + } + }, "deep-equal": { "version": "0.2.2", "from": "deep-equal@>=0.2.1 <0.3.0", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz" }, + "deep-extend": { + "version": "0.4.1", + "from": "deep-extend@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "from": "deep-is@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "from": "defaults@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "dev": true + }, + "defined": { + "version": "1.0.0", + "from": "defined@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "dev": true + }, + "del": { + "version": "1.2.1", + "from": "del@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-1.2.1.tgz", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "from": "delayed-stream@>=1.0.0 <1.1.0", @@ -593,11 +1023,35 @@ "from": "depd@>=1.1.0 <1.2.0", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz" }, + "deprecated": { + "version": "0.0.1", + "from": "deprecated@>=0.0.1 <0.0.2", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "dev": true + }, "destroy": { "version": "1.0.4", "from": "destroy@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, + "detect-file": { + "version": "0.1.0", + "from": "detect-file@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", + "dev": true + }, + "detect-newline": { + "version": "2.1.0", + "from": "detect-newline@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "dev": true + }, + "diff": { + "version": "1.4.0", + "from": "diff@1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "dev": true + }, "docker-modem": { "version": "0.3.4", "from": "docker-modem@>=0.3.0 <0.4.0", @@ -636,6 +1090,39 @@ "from": "duplexer2@0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz" }, + "duplexify": { + "version": "3.5.0", + "from": "duplexify@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", + "dependencies": { + "end-of-stream": { + "version": "1.0.0", + "from": "end-of-stream@1.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz" + }, + "once": { + "version": "1.3.3", + "from": "once@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + }, + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, + "each-async": { + "version": "1.1.1", + "from": "each-async@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "dev": true + }, "ecc-jsbn": { "version": "0.1.1", "from": "ecc-jsbn@>=0.1.1 <0.2.0", @@ -689,16 +1176,42 @@ } } }, + "electron-to-chromium": { + "version": "1.2.6", + "from": "electron-to-chromium@>=1.2.5 <2.0.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.2.6.tgz", + "dev": true + }, "encodeurl": { "version": "1.0.1", "from": "encodeurl@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz" }, + "end-of-stream": { + "version": "0.1.5", + "from": "end-of-stream@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "dev": true, + "dependencies": { + "once": { + "version": "1.3.3", + "from": "once@>=1.3.0 <1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "dev": true + } + } + }, "error-ex": { "version": "1.3.0", "from": "error-ex@^1.2.0", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.0.tgz" }, + "es6-promise": { + "version": "2.3.0", + "from": "es6-promise@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", + "dev": true + }, "escape-html": { "version": "1.0.3", "from": "escape-html@>=1.0.3 <1.1.0", @@ -709,6 +1222,39 @@ "from": "escape-string-regexp@>=1.0.2 <2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" }, + "escodegen": { + "version": "1.8.1", + "from": "escodegen@>=1.8.0 <1.9.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.2.0", + "from": "source-map@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "dev": true, + "optional": true + } + } + }, + "esprima": { + "version": "2.7.3", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "from": "estraverse@>=1.9.1 <2.0.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "from": "esutils@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "dev": true + }, "etag": { "version": "1.7.0", "from": "etag@>=1.7.0 <1.8.0", @@ -726,6 +1272,30 @@ } } }, + "expand-brackets": { + "version": "0.1.5", + "from": "expand-brackets@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "dev": true + }, + "expand-tilde": { + "version": "1.2.2", + "from": "expand-tilde@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", + "dev": true + }, + "expect.js": { + "version": "0.3.1", + "from": "expect.js@*", + "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz", + "dev": true + }, "express": { "version": "4.14.1", "from": "express@>=4.12.4 <5.0.0", @@ -758,6 +1328,12 @@ "from": "extend@>=3.0.0 <3.1.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz" }, + "extglob": { + "version": "0.3.2", + "from": "extglob@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "dev": true + }, "extsprintf": { "version": "1.0.2", "from": "extsprintf@1.0.2", @@ -773,11 +1349,29 @@ "from": "fancy-log@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz" }, + "fast-levenshtein": { + "version": "2.0.6", + "from": "fast-levenshtein@>=2.0.4 <2.1.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "dev": true + }, "fd-slicer": { "version": "1.0.1", "from": "fd-slicer@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz" }, + "filename-regex": { + "version": "2.0.0", + "from": "filename-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "dev": true + }, "final-fs": { "version": "1.6.1", "from": "final-fs@>=1.6.0 <2.0.0", @@ -800,11 +1394,59 @@ } } }, + "find-index": { + "version": "0.1.1", + "from": "find-index@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "dev": true + }, "find-up": { "version": "1.1.2", "from": "find-up@^1.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" }, + "findup-sync": { + "version": "0.4.3", + "from": "findup-sync@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", + "dev": true + }, + "fined": { + "version": "1.0.2", + "from": "fined@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.0.2.tgz", + "dev": true + }, + "first-chunk-stream": { + "version": "1.0.0", + "from": "first-chunk-stream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "dev": true + }, + "flagged-respawn": { + "version": "0.3.2", + "from": "flagged-respawn@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-0.3.2.tgz", + "dev": true + }, + "flatten": { + "version": "1.0.2", + "from": "flatten@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "from": "for-in@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "from": "for-own@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "dev": true + }, "forever-agent": { "version": "0.6.1", "from": "forever-agent@>=0.6.1 <0.7.0", @@ -830,6 +1472,12 @@ "from": "fresh@0.3.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz" }, + "fs-exists-sync": { + "version": "0.1.0", + "from": "fs-exists-sync@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "from": "fs.realpath@^1.0.0", @@ -840,6 +1488,12 @@ "from": "fstream@^1.0.0", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz" }, + "function-bind": { + "version": "1.1.0", + "from": "function-bind@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", + "dev": true + }, "gauge": { "version": "2.7.3", "from": "gauge@~2.7.1", @@ -852,6 +1506,12 @@ } } }, + "gaze": { + "version": "0.5.2", + "from": "gaze@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "dev": true + }, "get-caller-file": { "version": "1.0.2", "from": "get-caller-file@^1.0.1", @@ -879,6 +1539,138 @@ "from": "glob@>=7.0.5 <8.0.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz" }, + "glob-base": { + "version": "0.3.0", + "from": "glob-base@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "from": "glob-parent@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "dev": true + }, + "glob-stream": { + "version": "3.1.18", + "from": "glob-stream@>=3.1.5 <4.0.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "dev": true, + "dependencies": { + "glob": { + "version": "4.5.3", + "from": "glob@>=4.3.1 <5.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "from": "minimatch@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "dev": true + }, + "through2": { + "version": "0.6.5", + "from": "through2@^0.6.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "dev": true + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "from": "glob-watcher@>=0.0.6 <0.0.7", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "dev": true + }, + "glob2base": { + "version": "0.0.12", + "from": "glob2base@>=0.0.12 <0.0.13", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "dev": true + }, + "global-modules": { + "version": "0.2.3", + "from": "global-modules@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", + "dev": true + }, + "global-prefix": { + "version": "0.1.5", + "from": "global-prefix@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", + "dev": true + }, + "globby": { + "version": "2.1.0", + "from": "globby@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-2.1.0.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "dev": true + }, + "glob": { + "version": "5.0.15", + "from": "glob@>=5.0.3 <6.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "dev": true + } + } + }, + "globule": { + "version": "0.1.0", + "from": "globule@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "dev": true, + "dependencies": { + "glob": { + "version": "3.1.21", + "from": "glob@>=3.1.21 <3.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "dev": true + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "from": "inherits@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "from": "lodash@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@>=0.2.11 <0.3.0", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "dev": true + } + } + }, "glogg": { "version": "1.0.0", "from": "glogg@>=1.0.0 <2.0.0", @@ -889,6 +1681,160 @@ "from": "graceful-fs@>=4.1.2 <5.0.0", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" }, + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "dev": true + }, + "growl": { + "version": "1.9.2", + "from": "growl@1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "from": "gulp@>=3.8.11 <4.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "dev": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + } + } + }, + "gulp-autoprefixer": { + "version": "2.3.1", + "from": "gulp-autoprefixer@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/gulp-autoprefixer/-/gulp-autoprefixer-2.3.1.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "dev": true + }, + "object-assign": { + "version": "2.1.1", + "from": "object-assign@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.39 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "dev": true + }, + "through2": { + "version": "0.6.5", + "from": "through2@^0.6.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "dev": true + }, + "vinyl-sourcemaps-apply": { + "version": "0.1.4", + "from": "vinyl-sourcemaps-apply@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.1.4.tgz", + "dev": true + } + } + }, + "gulp-concat": { + "version": "2.6.1", + "from": "gulp-concat@>=2.4.3 <3.0.0", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "dev": true, + "dependencies": { + "clone-stats": { + "version": "1.0.0", + "from": "clone-stats@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "from": "replace-ext@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "dev": true + }, + "vinyl": { + "version": "2.0.1", + "from": "vinyl@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.1.tgz", + "dev": true + } + } + }, + "gulp-cssnano": { + "version": "2.1.2", + "from": "gulp-cssnano@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/gulp-cssnano/-/gulp-cssnano-2.1.2.tgz", + "dev": true, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "from": "object-assign@^4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "dev": true + } + } + }, + "gulp-ejs": { + "version": "1.2.2", + "from": "gulp-ejs@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/gulp-ejs/-/gulp-ejs-1.2.2.tgz", + "dev": true, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "from": "dateformat@>=1.0.11 <2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "dev": true + }, + "ejs": { + "version": "2.3.4", + "from": "ejs@2.3.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.3.4.tgz", + "dev": true + }, + "gulp-util": { + "version": "3.0.7", + "from": "gulp-util@3.0.7", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.7.tgz", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "from": "readable-stream@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "dev": true + }, + "through2": { + "version": "2.0.0", + "from": "through2@2.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.0.tgz", + "dev": true + } + } + }, "gulp-sass": { "version": "3.1.0", "from": "gulp-sass@>=3.0.0 <4.0.0", @@ -916,6 +1862,32 @@ } } }, + "gulp-serve": { + "version": "1.4.0", + "from": "gulp-serve@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/gulp-serve/-/gulp-serve-1.4.0.tgz", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.11.1", + "from": "gulp-sourcemaps@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.11.1.tgz", + "dev": true, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "from": "vinyl@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "dev": true + } + } + }, + "gulp-uglify": { + "version": "1.5.4", + "from": "gulp-uglify@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-1.5.4.tgz", + "dev": true + }, "gulp-util": { "version": "3.0.8", "from": "gulp-util@>=3.0.0 <4.0.0", @@ -933,6 +1905,37 @@ "from": "gulplog@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz" }, + "gunzip-maybe": { + "version": "1.4.0", + "from": "gunzip-maybe@latest", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz" + }, + "handlebars": { + "version": "4.0.6", + "from": "handlebars@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.6.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "from": "optimist@>=0.6.1 <0.7.0", + "resolved": "http://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "from": "source-map@^0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "dev": true + } + } + }, "har-schema": { "version": "1.0.5", "from": "har-schema@>=1.0.5 <2.0.0", @@ -943,11 +1946,23 @@ "from": "har-validator@>=4.2.0 <4.3.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz" }, + "has": { + "version": "1.0.1", + "from": "has@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "dev": true + }, "has-ansi": { "version": "2.0.0", "from": "has-ansi@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" }, + "has-flag": { + "version": "1.0.0", + "from": "has-flag@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "dev": true + }, "has-gulplog": { "version": "0.1.0", "from": "has-gulplog@>=0.1.0 <0.2.0", @@ -968,16 +1983,42 @@ "from": "hawk@>=3.1.3 <3.2.0", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz" }, + "hock": { + "version": "1.2.0", + "from": "hock@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/hock/-/hock-1.2.0.tgz", + "dev": true, + "dependencies": { + "deep-equal": { + "version": "0.2.1", + "from": "deep-equal@0.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.1.tgz", + "dev": true + } + } + }, "hoek": { "version": "2.16.3", "from": "hoek@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz" }, + "homedir-polyfill": { + "version": "1.0.1", + "from": "homedir-polyfill@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "dev": true + }, "hosted-git-info": { "version": "2.2.0", "from": "hosted-git-info@>=2.1.4 <3.0.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.2.0.tgz" }, + "html-comment-regex": { + "version": "1.1.1", + "from": "html-comment-regex@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", + "dev": true + }, "http-errors": { "version": "1.5.1", "from": "http-errors@>=1.5.0 <1.6.0", @@ -1013,6 +2054,12 @@ "from": "indent-string@^2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz" }, + "indexes-of": { + "version": "1.0.1", + "from": "indexes-of@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "dev": true + }, "inflection": { "version": "1.12.0", "from": "inflection@>=1.10.0 <2.0.0", @@ -1028,6 +2075,18 @@ "from": "inherits@2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, + "ini": { + "version": "1.3.4", + "from": "ini@>=1.3.4 <2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "dev": true + }, + "interpret": { + "version": "1.0.1", + "from": "interpret@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.1.tgz", + "dev": true + }, "invert-kv": { "version": "1.0.0", "from": "invert-kv@>=1.0.0 <2.0.0", @@ -1038,16 +2097,63 @@ "from": "ipaddr.js@1.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.2.0.tgz" }, + "is-absolute": { + "version": "0.2.6", + "from": "is-absolute@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "from": "is-absolute-url@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "dev": true + }, "is-arrayish": { "version": "0.2.1", "from": "is-arrayish@^0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" }, + "is-buffer": { + "version": "1.1.4", + "from": "is-buffer@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.4.tgz", + "dev": true + }, "is-builtin-module": { "version": "1.0.0", "from": "is-builtin-module@^1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz" }, + "is-deflate": { + "version": "1.0.0", + "from": "is-deflate@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz" + }, + "is-dotfile": { + "version": "1.0.2", + "from": "is-dotfile@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "from": "is-extendable@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "dev": true + }, "is-finite": { "version": "1.0.2", "from": "is-finite@^1.0.0", @@ -1058,16 +2164,99 @@ "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" }, + "is-glob": { + "version": "2.0.1", + "from": "is-glob@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "dev": true + }, + "is-gzip": { + "version": "1.0.0", + "from": "is-gzip@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz" + }, + "is-number": { + "version": "2.1.0", + "from": "is-number@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "from": "is-path-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "from": "is-path-in-cwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "from": "is-path-inside@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "from": "is-plain-obj@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "from": "is-posix-bracket@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "from": "is-primitive@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "dev": true + }, + "is-relative": { + "version": "0.2.1", + "from": "is-relative@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "from": "is-stream@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "dev": true + }, + "is-svg": { + "version": "2.1.0", + "from": "is-svg@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "from": "is-typedarray@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" }, + "is-unc-path": { + "version": "0.1.2", + "from": "is-unc-path@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", + "dev": true + }, "is-utf8": { "version": "0.2.1", "from": "is-utf8@^0.2.0", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" }, + "is-windows": { + "version": "0.2.0", + "from": "is-windows@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", + "dev": true + }, "isarray": { "version": "1.0.0", "from": "isarray@>=1.0.0 <2.0.0", @@ -1078,11 +2267,55 @@ "from": "isexe@^1.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz" }, + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "dev": true + }, "isstream": { "version": "0.1.2", "from": "isstream@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, + "istanbul": { + "version": "0.4.5", + "from": "istanbul@*", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "1.5.2", + "from": "async@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "dev": true + }, + "glob": { + "version": "5.0.15", + "from": "glob@>=5.0.15 <6.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "from": "resolve@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "from": "wordwrap@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "dev": true + } + } + }, "java-packagename-regex": { "version": "1.0.0", "from": "java-packagename-regex@>=1.0.0 <2.0.0", @@ -1099,6 +2332,24 @@ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", "optional": true }, + "js-base64": { + "version": "2.1.9", + "from": "js-base64@>=2.1.8 <2.2.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", + "dev": true + }, + "js-yaml": { + "version": "3.7.0", + "from": "js-yaml@>=3.7.0 <3.8.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", + "dev": true + }, + "js2xmlparser": { + "version": "1.0.0", + "from": "js2xmlparser@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-1.0.0.tgz", + "dev": true + }, "jsbn": { "version": "0.1.1", "from": "jsbn@>=0.1.0 <0.2.0", @@ -1125,6 +2376,12 @@ "from": "json-stringify-safe@>=5.0.1 <5.1.0", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, + "json3": { + "version": "3.3.2", + "from": "json3@3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "dev": true + }, "jsonify": { "version": "0.0.0", "from": "jsonify@>=0.0.0 <0.1.0", @@ -1150,6 +2407,41 @@ "from": "keygrip@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.1.tgz" }, + "kind-of": { + "version": "3.1.0", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "from": "lazy-cache@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "dev": true + }, + "lazy-debug-legacy": { + "version": "0.0.1", + "from": "lazy-debug-legacy@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "from": "lazystream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@^2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, "lcid": { "version": "1.0.0", "from": "lcid@>=1.0.0 <2.0.0", @@ -1189,6 +2481,12 @@ } } }, + "levn": { + "version": "0.3.0", + "from": "levn@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "dev": true + }, "libbase64": { "version": "0.1.0", "from": "libbase64@>=0.1.0 <0.2.0", @@ -1204,6 +2502,12 @@ "from": "libqp@>=1.1.0 <2.0.0", "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz" }, + "liftoff": { + "version": "2.3.0", + "from": "liftoff@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", + "dev": true + }, "load-json-file": { "version": "1.1.0", "from": "load-json-file@^1.0.0", @@ -1214,11 +2518,23 @@ "from": "lodash@>=4.14.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" }, + "lodash._baseassign": { + "version": "3.2.0", + "from": "lodash._baseassign@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "dev": true + }, "lodash._basecopy": { "version": "3.0.1", "from": "lodash._basecopy@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" }, + "lodash._basecreate": { + "version": "3.0.3", + "from": "lodash._basecreate@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "dev": true + }, "lodash._basetostring": { "version": "3.0.1", "from": "lodash._basetostring@>=3.0.0 <4.0.0", @@ -1264,11 +2580,23 @@ "from": "lodash.assign@^4.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" }, + "lodash.assignwith": { + "version": "4.2.0", + "from": "lodash.assignwith@>=4.0.7 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", + "dev": true + }, "lodash.clonedeep": { "version": "4.5.0", "from": "lodash.clonedeep@>=4.3.2 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" }, + "lodash.create": { + "version": "3.1.1", + "from": "lodash.create@3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "dev": true + }, "lodash.defaults": { "version": "4.2.0", "from": "lodash.defaults@>=4.1.0 <5.0.0", @@ -1289,16 +2617,52 @@ "from": "lodash.isarray@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" }, + "lodash.isempty": { + "version": "4.4.0", + "from": "lodash.isempty@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "from": "lodash.isplainobject@>=4.0.4 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "from": "lodash.isstring@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "dev": true + }, "lodash.keys": { "version": "3.1.2", "from": "lodash.keys@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" }, + "lodash.mapvalues": { + "version": "4.6.0", + "from": "lodash.mapvalues@>=4.4.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "from": "lodash.memoize@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "dev": true + }, "lodash.mergewith": { "version": "4.6.0", "from": "lodash.mergewith@>=4.6.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz" }, + "lodash.pick": { + "version": "4.4.0", + "from": "lodash.pick@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "dev": true + }, "lodash.restparam": { "version": "3.6.1", "from": "lodash.restparam@>=3.0.0 <4.0.0", @@ -1314,6 +2678,18 @@ "from": "lodash.templatesettings@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz" }, + "lodash.uniq": { + "version": "4.5.0", + "from": "lodash.uniq@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "dev": true + }, + "longest": { + "version": "1.0.1", + "from": "longest@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "dev": true + }, "loud-rejection": { "version": "1.6.0", "from": "loud-rejection@^1.0.0", @@ -1324,16 +2700,34 @@ "from": "lru-cache@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" }, + "macaddress": { + "version": "0.2.8", + "from": "macaddress@>=0.2.8 <0.3.0", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", + "dev": true + }, "mailcomposer": { "version": "2.1.0", "from": "mailcomposer@>=2.1.0 <3.0.0", "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-2.1.0.tgz" }, + "map-cache": { + "version": "0.2.2", + "from": "map-cache@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "dev": true + }, "map-obj": { "version": "1.0.1", "from": "map-obj@^1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" }, + "math-expression-evaluator": { + "version": "1.2.16", + "from": "math-expression-evaluator@>=1.2.14 <2.0.0", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.16.tgz", + "dev": true + }, "media-typer": { "version": "0.3.0", "from": "media-typer@0.3.0", @@ -1366,6 +2760,12 @@ "from": "methods@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, + "micromatch": { + "version": "2.3.11", + "from": "micromatch@>=2.3.7 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "dev": true + }, "mime": { "version": "1.3.4", "from": "mime@>=1.3.4 <2.0.0", @@ -1396,6 +2796,38 @@ "from": "mkdirp@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, + "mocha": { + "version": "3.2.0", + "from": "mocha@*", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.2.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.2.0", + "from": "debug@2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dev": true + }, + "glob": { + "version": "7.0.5", + "from": "glob@7.0.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz", + "dev": true + }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "from": "supports-color@3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "dev": true + } + } + }, "moment": { "version": "2.17.1", "from": "moment@>=2.6.0", @@ -1494,6 +2926,12 @@ "from": "native-dns-packet@>=0.1.1 <0.2.0", "resolved": "http://registry.npmjs.org/native-dns-packet/-/native-dns-packet-0.1.1.tgz" }, + "natives": { + "version": "1.1.0", + "from": "natives@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", + "dev": true + }, "ncp": { "version": "1.0.1", "from": "ncp@>=1.0.0 <1.1.0", @@ -1509,6 +2947,20 @@ "from": "negotiator@0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" }, + "nock": { + "version": "9.0.9", + "from": "nock@>=9.0.2 <10.0.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.0.9.tgz", + "dev": true, + "dependencies": { + "deep-equal": { + "version": "1.0.1", + "from": "deep-equal@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "dev": true + } + } + }, "node-fs": { "version": "0.1.7", "from": "node-fs@>=0.1.5 <0.2.0", @@ -1519,6 +2971,32 @@ "from": "node-gyp@^3.3.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.5.0.tgz" }, + "node-sass": { + "version": "3.13.1", + "from": "node-sass@>=3.0.0-alpha.0 <4.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz", + "dev": true, + "dependencies": { + "gaze": { + "version": "1.1.2", + "from": "gaze@^1.0.0", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "dev": true + }, + "globule": { + "version": "1.1.0", + "from": "globule@^1.0.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.1.0.tgz", + "dev": true + }, + "lodash": { + "version": "4.16.6", + "from": "lodash@~4.16.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.16.6.tgz", + "dev": true + } + } + }, "node-uuid": { "version": "1.4.7", "from": "node-uuid@>=1.4.3 <2.0.0", @@ -1554,6 +3032,31 @@ "from": "normalize-package-data@^2.3.4", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz" }, + "normalize-path": { + "version": "2.0.1", + "from": "normalize-path@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz" + }, + "normalize-range": { + "version": "0.1.2", + "from": "normalize-range@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "dev": true + }, + "normalize-url": { + "version": "1.9.0", + "from": "normalize-url@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.0.tgz", + "dev": true, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "from": "object-assign@^4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "dev": true + } + } + }, "npm-run-path": { "version": "1.0.0", "from": "npm-run-path@>=1.0.0 <2.0.0", @@ -1564,6 +3067,12 @@ "from": "npmlog@^4.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.0.2.tgz" }, + "num2fraction": { + "version": "1.2.2", + "from": "num2fraction@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "dev": true + }, "number-is-nan": { "version": "1.0.1", "from": "number-is-nan@>=1.0.0 <2.0.0", @@ -1584,6 +3093,12 @@ "from": "object-assign@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz" }, + "object.omit": { + "version": "2.0.1", + "from": "object.omit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "dev": true + }, "on-finished": { "version": "2.3.0", "from": "on-finished@>=2.3.0 <2.4.0", @@ -1599,10 +3114,37 @@ "from": "once@>=1.3.2 <2.0.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" }, - "optimist": { - "version": "0.3.7", - "from": "optimist@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz" + "onetime": { + "version": "1.1.0", + "from": "onetime@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "from": "optionator@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "dev": true, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "from": "wordwrap@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "dev": true + } + } + }, + "orchestrator": { + "version": "0.3.8", + "from": "orchestrator@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "dev": true + }, + "ordered-read-streams": { + "version": "0.1.0", + "from": "ordered-read-streams@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "dev": true }, "os-homedir": { "version": "1.0.2", @@ -1624,11 +3166,28 @@ "from": "osenv@0", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz" }, + "pako": { + "version": "0.2.9", + "from": "pako@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" + }, "parse-database-url": { "version": "0.3.0", "from": "parse-database-url@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/parse-database-url/-/parse-database-url-0.3.0.tgz" }, + "parse-filepath": { + "version": "1.0.1", + "from": "parse-filepath@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "dev": true + }, "parse-json": { "version": "2.2.0", "from": "parse-json@^2.2.0", @@ -1639,6 +3198,12 @@ "from": "parse-links@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/parse-links/-/parse-links-0.1.0.tgz" }, + "parse-passwd": { + "version": "1.0.0", + "from": "parse-passwd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "dev": true + }, "parseurl": { "version": "1.3.1", "from": "parseurl@>=1.3.1 <1.4.0", @@ -1708,6 +3273,12 @@ "from": "path-is-absolute@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" }, + "path-is-inside": { + "version": "1.0.2", + "from": "path-is-inside@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "dev": true + }, "path-key": { "version": "1.0.0", "from": "path-key@>=1.0.0 <2.0.0", @@ -1718,6 +3289,18 @@ "from": "path-parse@>=1.0.5 <2.0.0", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz" }, + "path-root": { + "version": "0.1.1", + "from": "path-root@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "dev": true + }, + "path-root-regex": { + "version": "0.1.2", + "from": "path-root-regex@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "dev": true + }, "path-to-regexp": { "version": "0.1.7", "from": "path-to-regexp@0.1.7", @@ -1733,6 +3316,11 @@ "from": "pause@0.0.1", "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" }, + "peek-stream": { + "version": "1.1.2", + "from": "peek-stream@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.2.tgz" + }, "pend": { "version": "1.2.0", "from": "pend@>=1.2.0 <1.3.0", @@ -1763,11 +3351,579 @@ "from": "pkginfo@>=0.4.0 <0.5.0", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.0.tgz" }, + "postcss": { + "version": "4.1.16", + "from": "postcss@>=4.1.5 <5.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-4.1.16.tgz", + "dev": true, + "dependencies": { + "source-map": { + "version": "0.4.4", + "from": "source-map@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "dev": true + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "from": "postcss-calc@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.2 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-colormin": { + "version": "2.2.2", + "from": "postcss-colormin@>=2.1.8 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.13 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "2.6.1", + "from": "postcss-convert-values@>=2.3.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.11 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "2.0.4", + "from": "postcss-discard-comments@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "from": "postcss-discard-duplicates@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-discard-empty": { + "version": "2.1.0", + "from": "postcss-discard-empty@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "from": "postcss-discard-overridden@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.16 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-discard-unused": { + "version": "2.2.3", + "from": "postcss-discard-unused@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "from": "postcss-filter-plugins@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-merge-idents": { + "version": "2.1.7", + "from": "postcss-merge-idents@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.10 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "2.1.2", + "from": "postcss-merge-rules@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", + "dev": true, + "dependencies": { + "browserslist": { + "version": "1.7.6", + "from": "browserslist@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.6.tgz", + "dev": true + }, + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-message-helpers": { + "version": "2.0.0", + "from": "postcss-message-helpers@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", + "dev": true + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "from": "postcss-minify-font-values@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", + "dev": true, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "from": "object-assign@^4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "dev": true + }, + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "from": "postcss-minify-gradients@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.12 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "1.2.2", + "from": "postcss-minify-params@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.2 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "from": "postcss-normalize-charset@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.5 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "3.0.8", + "from": "postcss-normalize-url@>=3.0.7 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "2.2.3", + "from": "postcss-ordered-values@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "from": "postcss-reduce-initial@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "from": "postcss-reduce-transforms@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.8 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "from": "postcss-selector-parser@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "dev": true + }, + "postcss-svgo": { + "version": "2.1.6", + "from": "postcss-svgo@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.14 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "from": "postcss-unique-selectors@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "from": "postcss-value-parser@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "dev": true + }, + "postcss-zindex": { + "version": "2.2.0", + "from": "postcss-zindex@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", + "dev": true, + "dependencies": { + "postcss": { + "version": "5.2.16", + "from": "postcss@>=5.0.4 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.16.tgz", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "dev": true + } + } + }, "precond": { "version": "0.2.3", "from": "precond@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz" }, + "prelude-ls": { + "version": "1.1.2", + "from": "prelude-ls@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "from": "prepend-http@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "from": "preserve@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "from": "pretty-hrtime@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "dev": true + }, "process-nextick-args": { "version": "1.0.7", "from": "process-nextick-args@>=1.0.6 <1.1.0", @@ -1778,6 +3934,12 @@ "from": "prompt@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz" }, + "propagate": { + "version": "0.4.0", + "from": "propagate@0.4.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.4.0.tgz", + "dev": true + }, "proxy-addr": { "version": "1.1.3", "from": "proxy-addr@>=1.1.3 <1.2.0", @@ -1805,16 +3967,41 @@ } } }, + "pumpify": { + "version": "1.3.5", + "from": "pumpify@>=1.3.3 <2.0.0", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz" + }, "punycode": { "version": "1.3.2", "from": "punycode@1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" }, + "q": { + "version": "1.4.1", + "from": "q@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "dev": true + }, "qs": { "version": "6.2.1", "from": "qs@6.2.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz" }, + "query-string": { + "version": "4.3.2", + "from": "query-string@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.2.tgz", + "dev": true, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "from": "object-assign@^4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "dev": true + } + } + }, "querystring": { "version": "0.2.0", "from": "querystring@0.2.0", @@ -1825,6 +4012,12 @@ "from": "random-bytes@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" }, + "randomatic": { + "version": "1.1.6", + "from": "randomatic@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", + "dev": true + }, "range-parser": { "version": "1.2.0", "from": "range-parser@>=1.2.0 <1.3.0", @@ -1862,6 +4055,29 @@ } } }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@latest", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } + }, + "rechoir": { + "version": "0.6.2", + "from": "rechoir@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "dev": true + }, "redent": { "version": "1.0.0", "from": "redent@^1.0.0", @@ -1872,6 +4088,42 @@ "from": "reduce-component@1.0.1", "resolved": "http://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz" }, + "reduce-css-calc": { + "version": "1.3.0", + "from": "reduce-css-calc@>=1.2.6 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", + "dev": true + }, + "reduce-function-call": { + "version": "1.0.2", + "from": "reduce-function-call@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", + "dev": true + }, + "regex-cache": { + "version": "0.4.3", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.0.1", + "from": "remove-trailing-separator@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "from": "repeat-element@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "from": "repeat-string@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "dev": true + }, "repeating": { "version": "2.0.1", "from": "repeating@^2.0.0", @@ -1914,11 +4166,29 @@ "from": "resolve@>=1.1.6 <2.0.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.1.tgz" }, + "resolve-dir": { + "version": "0.1.1", + "from": "resolve-dir@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "from": "resolve-url@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "dev": true + }, "revalidator": { "version": "0.1.8", "from": "revalidator@>=0.1.0 <0.2.0", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" }, + "right-align": { + "version": "0.1.3", + "from": "right-align@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "dev": true + }, "rimraf": { "version": "2.6.1", "from": "rimraf@>=2.0.0 <3.0.0", @@ -1991,6 +4261,12 @@ } } }, + "sequencify": { + "version": "0.0.7", + "from": "sequencify@>=0.0.7 <0.1.0", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "dev": true + }, "serve-static": { "version": "1.11.2", "from": "serve-static@>=1.11.2 <1.12.0", @@ -2001,6 +4277,11 @@ "from": "set-blocking@~2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" }, + "set-immediate-shim": { + "version": "1.0.1", + "from": "set-immediate-shim@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + }, "setprototypeof": { "version": "1.0.2", "from": "setprototypeof@1.0.2", @@ -2048,11 +4329,29 @@ "from": "sntp@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz" }, + "sort-keys": { + "version": "1.1.2", + "from": "sort-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "dev": true + }, "source-map": { "version": "0.5.6", "from": "source-map@>=0.5.1 <0.6.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" }, + "source-map-resolve": { + "version": "0.3.1", + "from": "source-map-resolve@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz", + "dev": true + }, + "source-map-url": { + "version": "0.3.0", + "from": "source-map-url@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "dev": true + }, "sparkles": { "version": "1.0.0", "from": "sparkles@>=1.0.0 <2.0.0", @@ -2083,6 +4382,12 @@ "from": "split-ca@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/split-ca/-/split-ca-1.0.1.tgz" }, + "sprintf-js": { + "version": "1.0.3", + "from": "sprintf-js@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "dev": true + }, "sqlstring": { "version": "2.2.0", "from": "sqlstring@2.2.0", @@ -2139,11 +4444,28 @@ } } }, + "stream-consume": { + "version": "0.1.0", + "from": "stream-consume@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "from": "stream-shift@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz" + }, "streamsearch": { "version": "0.1.2", "from": "streamsearch@>=0.1.2 <0.2.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" }, + "strict-uri-encode": { + "version": "1.1.0", + "from": "strict-uri-encode@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "dev": true + }, "string_decoder": { "version": "0.10.31", "from": "string_decoder@>=0.10.0 <0.11.0", @@ -2238,6 +4560,20 @@ "from": "supports-color@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" }, + "svgo": { + "version": "0.7.2", + "from": "svgo@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", + "dev": true, + "dependencies": { + "sax": { + "version": "1.2.2", + "from": "sax@>=1.2.1 <1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.2.tgz", + "dev": true + } + } + }, "tar": { "version": "2.2.1", "from": "tar@^2.0.0", @@ -2255,7 +4591,7 @@ "dependencies": { "end-of-stream": { "version": "1.4.0", - "from": "end-of-stream@^1.0.0", + "from": "end-of-stream@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz" }, "readable-stream": { @@ -2287,6 +4623,12 @@ } } }, + "tildify": { + "version": "1.2.0", + "from": "tildify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "dev": true + }, "time-stamp": { "version": "1.0.1", "from": "time-stamp@>=1.0.0 <2.0.0", @@ -2354,11 +4696,73 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "optional": true }, + "type-check": { + "version": "0.3.2", + "from": "type-check@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "dev": true + }, + "type-detect": { + "version": "1.0.0", + "from": "type-detect@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "dev": true + }, "type-is": { "version": "1.6.14", "from": "type-is@>=1.6.13 <1.7.0", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.14.tgz" }, + "uglify-js": { + "version": "2.6.4", + "from": "uglify-js@2.6.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.2.10", + "from": "async@>=0.2.6 <0.3.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "from": "camelcase@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "from": "cliui@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "from": "yargs@>=3.10.0 <3.11.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "dev": true + } + } + }, + "uglify-save-license": { + "version": "0.4.1", + "from": "uglify-save-license@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/uglify-save-license/-/uglify-save-license-0.4.1.tgz", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "from": "uglify-to-browserify@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "dev": true + }, "uid-safe": { "version": "2.1.3", "from": "uid-safe@2.1.3", @@ -2369,21 +4773,63 @@ "from": "uid2@>=0.0.0 <0.1.0", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz" }, + "unc-path-regex": { + "version": "0.1.2", + "from": "unc-path-regex@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "dev": true + }, "underscore": { "version": "1.8.3", "from": "underscore@>=1.7.0 <2.0.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz" }, + "uniq": { + "version": "1.0.1", + "from": "uniq@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "dev": true + }, + "uniqid": { + "version": "4.1.1", + "from": "uniqid@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "from": "uniqs@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "dev": true + }, + "unique-stream": { + "version": "1.0.0", + "from": "unique-stream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "dev": true + }, "unpipe": { "version": "1.0.0", "from": "unpipe@1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" }, + "urix": { + "version": "0.1.0", + "from": "urix@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "dev": true + }, "url": { "version": "0.10.3", "from": "url@0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz" }, + "user-home": { + "version": "1.1.1", + "from": "user-home@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "from": "util-deprecate@>=1.0.1 <1.1.0", @@ -2406,6 +4852,12 @@ "from": "utils-merge@1.0.0", "resolved": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" }, + "v8flags": { + "version": "2.0.11", + "from": "v8flags@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.11.tgz", + "dev": true + }, "valid-url": { "version": "1.0.9", "from": "valid-url@>=1.0.9 <2.0.0", @@ -2443,6 +4895,12 @@ } } }, + "vendors": { + "version": "1.0.1", + "from": "vendors@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", + "dev": true + }, "verror": { "version": "1.3.6", "from": "verror@1.3.6", @@ -2453,16 +4911,77 @@ "from": "vinyl@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz" }, + "vinyl-fs": { + "version": "0.3.14", + "from": "vinyl-fs@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "dev": true, + "dependencies": { + "clone": { + "version": "0.2.0", + "from": "clone@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "from": "graceful-fs@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "dev": true + }, + "strip-bom": { + "version": "1.0.0", + "from": "strip-bom@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "dev": true + }, + "through2": { + "version": "0.6.5", + "from": "through2@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "from": "vinyl@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "dev": true + } + } + }, "vinyl-sourcemaps-apply": { "version": "0.2.1", "from": "vinyl-sourcemaps-apply@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz" }, + "walkdir": { + "version": "0.0.11", + "from": "walkdir@>=0.0.11 <0.0.12", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz" + }, "when": { "version": "2.0.1", "from": "when@>=2.0.1 <2.1.0", "resolved": "http://registry.npmjs.org/when/-/when-2.0.1.tgz" }, + "whet.extend": { + "version": "0.9.9", + "from": "whet.extend@>=0.9.9 <0.10.0", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "dev": true + }, "which": { "version": "1.2.12", "from": "which@^1.2.12", @@ -2478,6 +4997,12 @@ "from": "wide-align@^1.1.0", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz" }, + "window-size": { + "version": "0.1.0", + "from": "window-size@0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "dev": true + }, "winston": { "version": "2.1.1", "from": "winston@>=2.1.0 <2.2.0", @@ -2547,6 +5072,20 @@ "from": "yallist@^2.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz" }, + "yargs": { + "version": "3.32.0", + "from": "yargs@>=3.15.0 <4.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "dev": true, + "dependencies": { + "window-size": { + "version": "0.1.4", + "from": "window-size@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "dev": true + } + } + }, "yargs-parser": { "version": "2.4.1", "from": "yargs-parser@^2.4.1", @@ -2558,6 +5097,23 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" } } + }, + "zip-stream": { + "version": "1.1.1", + "from": "zip-stream@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.1.1.tgz", + "dependencies": { + "readable-stream": { + "version": "2.2.9", + "from": "readable-stream@^2.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz" + }, + "string_decoder": { + "version": "1.0.0", + "from": "string_decoder@~1.0.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.0.tgz" + } + } } } } diff --git a/package.json b/package.json index 0949f6675..65ff936c6 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,10 @@ ], "dependencies": { "@sindresorhus/df": "^2.1.0", + "archiver": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", "async": "^2.1.4", "aws-sdk": "^2.1.46", "body-parser": "^1.13.1", - "checksum": "^0.1.1", "cloudron-manifestformat": "^2.8.0", "connect-ensure-login": "^0.1.1", "connect-lastmile": "^0.1.0", @@ -63,7 +63,7 @@ "split": "^1.0.0", "superagent": "^1.8.3", "supererror": "^0.7.1", - "tar-fs": "^1.15.2", + "tar-fs": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.15.2.tgz", "tldjs": "^1.6.2", "underscore": "^1.7.0", "valid-url": "^1.0.9", diff --git a/src/backups.js b/src/backups.js index 5d8b91999..5d0de949b 100644 --- a/src/backups.js +++ b/src/backups.js @@ -8,7 +8,8 @@ exports = module.exports = { getPaged: getPaged, getByAppIdPaged: getByAppIdPaged, - getRestoreUrl: getRestoreUrl, + getDownloadStream: getDownloadStream, + getRestoreConfig: getRestoreConfig, ensureBackup: ensureBackup, @@ -19,8 +20,6 @@ exports = module.exports = { backupBoxAndApps: backupBoxAndApps, - getLocalDownloadPath: getLocalDownloadPath, - removeBackup: removeBackup }; @@ -147,30 +146,6 @@ function getRestoreConfig(backupId, callback) { }); } -function getRestoreUrl(backupId, callback) { - assert.strictEqual(typeof backupId, 'string'); - assert.strictEqual(typeof callback, 'function'); - - settings.getBackupConfig(function (error, backupConfig) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - api(backupConfig.provider).getRestoreUrl(backupConfig, backupId, function (error, result) { - if (error) return callback(error); - - var obj = { - id: backupId, - url: result.url, - backupKey: backupConfig.key, - sha1: result.sha1 || null // not supported by all backends - }; - - debug('getRestoreUrl: id:%s url:%s backupKey:%s sha1:%s', obj.id, obj.url, obj.backupKey, obj.sha1); - - callback(null, obj); - }); - }); -} - function copyLastBackup(app, manifest, prefix, callback) { assert.strictEqual(typeof app, 'object'); assert.strictEqual(typeof app.lastBackupId, 'string'); @@ -179,27 +154,17 @@ function copyLastBackup(app, manifest, prefix, callback) { assert.strictEqual(typeof callback, 'function'); var timestamp = (new Date()).toISOString().replace(/[T.]/g, '-').replace(/[:Z]/g,''); - var toFilenameArchive = util.format('%s/app_%s_%s_v%s.tar.gz', prefix, app.id, timestamp, manifest.version); - var toFilenameConfig = util.format('%s/app_%s_%s_v%s.json', prefix, app.id, timestamp, manifest.version); + var newBackupId = util.format('%s/app_%s_%s_v%s.tar.gz', prefix, app.id, timestamp, manifest.version); settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - debug('copyLastBackup: copying archive %s to %s', app.lastBackupId, toFilenameArchive); + debug('copyLastBackup: copying backup %s to %s', app.lastBackupId, newBackupId); - api(backupConfig.provider).copyObject(backupConfig, app.lastBackupId, toFilenameArchive, function (error) { + api(backupConfig.provider).copyBackup(backupConfig, app.lastBackupId, newBackupId, function (error) { if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); - // TODO change that logic by adjusting app.lastBackupId to not contain the file type - var configFileId = app.lastBackupId.slice(0, -'.tar.gz'.length) + '.json'; - - debug('copyLastBackup: copying config %s to %s', configFileId, toFilenameConfig); - - api(backupConfig.provider).copyObject(backupConfig, configFileId, toFilenameConfig, function (error) { - if (error) return callback(new BackupsError(BackupsError.EXTERNAL_ERROR, error)); - - return callback(null, toFilenameArchive); - }); + callback(null, newBackupId); }); }); } @@ -209,29 +174,23 @@ function backupBoxWithAppBackupIds(appBackupIds, prefix, callback) { assert.strictEqual(typeof prefix, 'string'); var timestamp = (new Date()).toISOString().replace(/[T.]/g, '-').replace(/[:Z]/g,''); - var filebase = util.format('%s/box_%s_v%s', prefix, timestamp, config.version()); - var filename = filebase + '.tar.gz'; + var backupId = util.format('%s/box_%s_v%s', prefix, timestamp, config.version()); settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - api(backupConfig.provider).getBoxBackupDetails(backupConfig, filename, function (error, result) { - if (error) return callback(error); + shell.sudo('backupBox', [ BACKUP_BOX_CMD, backupId ], function (error) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - debug('backupBoxWithAppBackupIds: backup details %j', result); + debug('backupBoxWithAppBackupIds: success'); - shell.sudo('backupBox', [ BACKUP_BOX_CMD ].concat(result.backupScriptArguments), function (error) { + backupdb.add({ id: backupId, version: config.version(), type: backupdb.BACKUP_TYPE_BOX, dependsOn: appBackupIds }, function (error) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - debug('backupBoxWithAppBackupIds: success'); - - backupdb.add({ id: filename, version: config.version(), type: backupdb.BACKUP_TYPE_BOX, dependsOn: appBackupIds }, function (error) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - api(backupConfig.provider).backupDone(filename, null /* app */, appBackupIds, function (error) { - if (error) return callback(error); - callback(null, filename); - }); + // FIXME this is only needed for caas, is it really??? + api(backupConfig.provider).backupDone(backupId, null /* app */, appBackupIds, function (error) { + if (error) return callback(error); + callback(null, backupId); }); }); }); @@ -254,31 +213,21 @@ function createNewAppBackup(app, manifest, prefix, callback) { assert.strictEqual(typeof callback, 'function'); var timestamp = (new Date()).toISOString().replace(/[T.]/g, '-').replace(/[:Z]/g,''); - var filebase = util.format('%s/app_%s_%s_v%s', prefix, app.id, timestamp, manifest.version); - var configFilename = filebase + '.json', dataFilename = filebase + '.tar.gz'; + var backupId = util.format('%s/app_%s_%s_v%s', prefix, app.id, timestamp, config.version()); - settings.getBackupConfig(function (error, backupConfig) { + // FIXME move addon backup into backuptask + async.series([ + addons.backupAddons.bind(null, app, manifest.addons), + shell.sudo.bind(null, 'backupApp', [ BACKUP_APP_CMD, backupId, app.id ]) + ], function (error) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - api(backupConfig.provider).getAppBackupDetails(backupConfig, app.id, dataFilename, configFilename, function (error, result) { - if (error) return callback(error); + debugApp(app, 'createNewAppBackup: %s done', backupId); - debug('createNewAppBackup: backup details %j', result); + backupdb.add({ id: backupId, version: manifest.version, type: backupdb.BACKUP_TYPE_APP, dependsOn: [ ] }, function (error) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - async.series([ - addons.backupAddons.bind(null, app, manifest.addons), - shell.sudo.bind(null, 'backupApp', [ BACKUP_APP_CMD ].concat(result.backupScriptArguments)) - ], function (error) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - debugApp(app, 'createNewAppBackup: %s done', dataFilename); - - backupdb.add({ id: dataFilename, version: manifest.version, type: backupdb.BACKUP_TYPE_APP, dependsOn: [ ] }, function (error) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - callback(null, dataFilename); - }); - }); + callback(null, backupId); }); }); } @@ -438,32 +387,34 @@ function restoreApp(app, addonsToRestore, backupId, callback) { assert.strictEqual(typeof callback, 'function'); assert(app.lastBackupId); - getRestoreUrl(backupId, function (error, result) { - if (error) return callback(error); + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - debugApp(app, 'restoreApp: restoreUrl:%s', result.url); + var directoryMapping = [{ + source: '/', + destination: path.join(paths.APPS_DATA_DIR, app.id) + }]; - shell.sudo('restoreApp', [ RESTORE_APP_CMD, app.id, result.url, result.backupKey, result.sessionToken ], function (error) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - - addons.restoreAddons(app, addonsToRestore, callback); - }); + async.series([ + api(backupConfig.provider).restore.bind(null, backupConfig, backupId, directoryMapping), + addons.restoreAddons.bind(null, app, addonsToRestore) + ], callback); }); } -function getLocalDownloadPath(backupId, callback) { +function getDownloadStream(backupId, callback) { assert.strictEqual(typeof backupId, 'string'); assert.strictEqual(typeof callback, 'function'); settings.getBackupConfig(function (error, backupConfig) { if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - api(backupConfig.provider).getLocalFilePath(backupConfig, backupId, function (error, result) { + api(backupConfig.provider).getDownloadStream(backupConfig, backupId, function (error, result) { if (error) return callback(error); - debug('getLocalDownloadPath: id:%s path:%s', backupId, result.filePath); + debug('getDownloadStream: %s', backupId); - callback(null, result.filePath); + callback(null, result); }); }); } diff --git a/src/backuptask.js b/src/backuptask.js new file mode 100755 index 000000000..965fba37b --- /dev/null +++ b/src/backuptask.js @@ -0,0 +1,106 @@ +#!/usr/bin/env node + +'use strict'; + +require('supererror')({ splatchError: true }); + +// remove timestamp from debug() based output +require('debug').formatArgs = function formatArgs(args) { + args[0] = this.namespace + ' ' + args[0]; +}; + +var assert = require('assert'), + database = require('./database.js'), + debug = require('debug')('box:backuptask'), + path = require('path'), + paths = require('./paths.js'), + filesystem = require('./storage/filesystem.js'), + caas = require('./storage/caas.js'), + s3 = require('./storage/s3.js'), + BackupsError = require('./backups.js').BackupsError, + settings = require('./settings.js'); + +// choose which storage backend we use for test purpose we use s3 +function api(provider) { + switch (provider) { + case 'caas': return caas; + case 's3': return s3; + case 'filesystem': return filesystem; + default: return null; + } +} + +function initialize(callback) { + assert.strictEqual(typeof callback, 'function'); + + database.initialize(callback); +} + +function backupApp(backupId, appId, callback) { + assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof appId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + debug('Start app backup with id %s for %s', backupId, appId); + + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + + var backupMapping = [{ + source: path.join(paths.APPS_DATA_DIR, appId), + destination: '/' + }]; + + api(backupConfig.provider).backup(backupConfig, backupId, backupMapping, callback); + }); +} + +function backupBox(backupId, callback) { + assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + debug('Start box backup with id %s', backupId); + + settings.getBackupConfig(function (error, backupConfig) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + + var backupMapping = [{ + source: paths.BOX_DATA_DIR, + destination: '/box/' + }, { + source: path.join(paths.PLATFORM_DATA_DIR, 'mail'), + destination: '/mail/' + }]; + + api(backupConfig.provider).backup(backupConfig, backupId, backupMapping, callback); + }); +} + +if (require.main === module) { + var backupId = process.argv[2]; + var appId = process.argv[3]; + + if (appId) debug('Backuptask for the app %s with id %s', appId, backupId); + else debug('Backuptask for the whole Cloudron with id %s', backupId); + + process.on('SIGTERM', function () { + process.exit(0); + }); + + initialize(function (error) { + if (error) throw error; + + function resultHandler(error) { + if (error) debug('Backuptask completed with error', error); + + debug('Backuptask completed'); + + // https://nodejs.org/api/process.html are exit codes used by node. apps.js uses the value below + // to check apptask crashes + process.exit(error ? 50 : 0); + } + + if (appId) backupApp(backupId, appId, resultHandler); + else backupBox(backupId, resultHandler); + }); +} diff --git a/src/routes/backups.js b/src/routes/backups.js index 7bac1ec21..d01c235de 100644 --- a/src/routes/backups.js +++ b/src/routes/backups.js @@ -3,7 +3,6 @@ exports = module.exports = { get: get, create: create, - createDownloadUrl: createDownloadUrl, download: download }; @@ -44,22 +43,13 @@ function create(req, res, next) { }); } -function createDownloadUrl(req, res, next) { - assert.strictEqual(typeof req.params.backupId, 'string'); - - backups.getRestoreUrl(req.params.backupId, function (error, result) { - if (error) return next(new HttpError(500, error)); - - next(new HttpSuccess(200, result)); - }); -} - function download(req, res, next) { assert.strictEqual(typeof req.params.backupId, 'string'); - backups.getLocalDownloadPath(req.params.backupId, function (error, result) { + backups.getDownloadStream(req.params.backupId, function (error, result) { + if (error && error.reason === BackupsError.NOT_FOUND) return next(new HttpError(404, error.message)); if (error) return next(new HttpError(500, error)); - res.sendFile(result); + result.pipe(res); }); } diff --git a/src/scripts/backupapp.sh b/src/scripts/backupapp.sh index b3ab40140..3b13aa843 100755 --- a/src/scripts/backupapp.sh +++ b/src/scripts/backupapp.sh @@ -2,6 +2,8 @@ set -eu -o pipefail +readonly script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + if [[ $EUID -ne 0 ]]; then echo "This script should be run as root." >&2 exit 1 @@ -15,92 +17,16 @@ fi readonly APPS_DATA_DIR="${HOME}/appsdata" # verify argument count -if [[ "$1" == "s3" && $# -lt 9 ]]; then - echo "Usage: backupapp.sh s3 [session token]" +if [[ $# -lt 2 ]]; then + echo "Usage: backupbox.sh " exit 1 fi -if [[ "$1" == "filesystem" && $# -lt 6 ]]; then - echo "Usage: backupapp.sh filesystem " - exit 1 -fi - - # extract arguments +readonly backup_id="$1" readonly app_id="$2" -if [[ "$1" == "s3" ]]; then - # env vars used by the awscli - readonly s3_config_url="$3" - readonly s3_data_url="$4" - export AWS_ACCESS_KEY_ID="$5" - export AWS_SECRET_ACCESS_KEY="$6" - export AWS_DEFAULT_REGION="$7" - readonly endpoint_url="$8" - readonly password="$9" +echo "Running app backup task" +DEBUG="box*" ${script_dir}/../backuptask.js "${backup_id}" "${app_id}" - if [ $# -gt 9 ]; then - export AWS_SESSION_TOKEN="${10}" - fi -elif [[ "$1" == "filesystem" ]]; then - readonly backup_folder="$3" - readonly backup_config_fileName="$4" - readonly backup_data_fileName="$5" - readonly password="$6" -fi - -# perform backup -readonly app_data_dir="${APPS_DATA_DIR}/${app_id}" -readonly tar_bin="/home/yellowtent/box/helper/tarjs" - -# will be checked at the end -try=0 - -if [[ "$1" == "s3" ]]; then - # may be empty - optional_args="" - if [ -n "${endpoint_url}" ]; then - optional_args="--endpoint-url ${endpoint_url}" - fi - - # Upload config.json first because uploading tarball might take a lot of time, leading to token expiry - for try in `seq 1 5`; do - echo "Uploading config.json to ${s3_config_url} (try ${try})" - error_log=$(mktemp) - - # use aws instead of curl because curl will always read entire stream memory to set Content-Length - # aws will do multipart upload - if cat "${app_data_dir}/config.json" \ - | aws ${optional_args} s3 cp - "${s3_config_url}" 2>"${error_log}"; then - break - fi - cat "${error_log}" && rm "${error_log}" - done - - for try in `seq 1 5`; do - echo "Uploading backup to ${s3_data_url} (try ${try})" - error_log=$(mktemp) - - if ${tar_bin} "${app_data_dir}" . \ - | openssl aes-256-cbc -e -pass "pass:${password}" \ - | aws ${optional_args} s3 cp - "${s3_data_url}" 2>"${error_log}"; then - break - fi - cat "${error_log}" && rm "${error_log}" - done -elif [[ "$1" == "filesystem" ]]; then - mkdir -p $(dirname "${backup_folder}/${backup_config_fileName}") - - echo "Storing backup config to ${backup_folder}/${backup_config_fileName}" - cat "${app_data_dir}/config.json" > "${backup_folder}/${backup_config_fileName}" - - echo "Storing backup data to ${backup_folder}/${backup_data_fileName}" - ${tar_bin} "${app_data_dir}" . | openssl aes-256-cbc -e -pass "pass:${password}" > "${backup_folder}/${backup_data_fileName}" -fi - -if [[ ${try} -eq 5 ]]; then - echo "Backup failed uploading backup tarball" - exit 3 -else - echo "Backup successful" -fi +echo "App backup successful" diff --git a/src/scripts/backupbox.sh b/src/scripts/backupbox.sh index 84eb8d3d8..4c955af08 100755 --- a/src/scripts/backupbox.sh +++ b/src/scripts/backupbox.sh @@ -2,6 +2,10 @@ set -eu -o pipefail +readonly script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +BOX_DATA_DIR="${HOME}/boxdata" + if [[ $EUID -ne 0 ]]; then echo "This script should be run as root." >&2 exit 1 @@ -12,78 +16,19 @@ if [[ $# == 1 && "$1" == "--check" ]]; then exit 0 fi - # verify argument count -if [[ "$1" == "s3" && $# -lt 7 ]]; then - echo "Usage: backupbox.sh s3 [session token]" - exit 1 -fi - -if [[ "$1" == "filesystem" && $# -lt 4 ]]; then - echo "Usage: backupbox.sh filesystem " +if [[ $# -lt 1 ]]; then + echo "Usage: backupbox.sh " exit 1 fi # extract arguments -if [[ "$1" == "s3" ]]; then - # env vars used by the awscli - readonly s3_url="$2" - export AWS_ACCESS_KEY_ID="$3" - export AWS_SECRET_ACCESS_KEY="$4" - export AWS_DEFAULT_REGION="$5" - readonly endpoint_url="$6" - readonly password="$7" - - if [ $# -gt 7 ]; then - export AWS_SESSION_TOKEN="$8" - fi -elif [[ "$1" == "filesystem" ]]; then - readonly backup_folder="$2" - readonly backup_fileName="$3" - readonly password="$4" -fi - -# perform backup -BOX_DATA_DIR="${HOME}/boxdata" +readonly backup_id="$1" echo "Creating MySQL dump" mysqldump -u root -ppassword --single-transaction --routines --triggers box > "${BOX_DATA_DIR}/box.mysqldump" -# will be checked at the end -try=0 +echo "Running backup task" +DEBUG="box*" ${script_dir}/../backuptask.js "${backup_id}" -if [[ "$1" == "s3" ]]; then - for try in `seq 1 5`; do - echo "Uploading backup to ${s3_url} (try ${try})" - error_log=$(mktemp) - - # may be empty - optional_args="" - if [ -n "${endpoint_url}" ]; then - optional_args="--endpoint-url ${endpoint_url}" - fi - - # use aws instead of curl because curl will always read entire stream memory to set Content-Length - # aws will do multipart upload - if tar -czf - -C "${HOME}" --transform="s,^boxdata/\?,box/," --transform="s,^platformdata/mail/\?,mail/," --show-transformed-names boxdata platformdata/mail \ - | openssl aes-256-cbc -e -pass "pass:${password}" \ - | aws ${optional_args} s3 cp - "${s3_url}" 2>"${error_log}"; then - break - fi - cat "${error_log}" && rm "${error_log}" - done -elif [[ "$1" == "filesystem" ]]; then - echo "Storing backup to ${backup_folder}/${backup_fileName}" - - mkdir -p $(dirname "${backup_folder}/${backup_fileName}") - - tar -czf - -C "${HOME}" --transform="s,^boxdata/\?,box/," --transform="s,^platformdata/mail/\?,mail/," --show-transformed-names boxdata platformdata/mail \ - | openssl aes-256-cbc -e -pass "pass:${password}" > "${backup_folder}/${backup_fileName}" -fi - -if [[ ${try} -eq 5 ]]; then - echo "Backup failed" - exit 3 -else - echo "Backup successful" -fi +echo "Backup successful" diff --git a/src/scripts/createappdir.sh b/src/scripts/createappdir.sh index a9d6bfa0d..c9cb2ee41 100755 --- a/src/scripts/createappdir.sh +++ b/src/scripts/createappdir.sh @@ -24,6 +24,7 @@ if [[ "${BOX_ENV}" == "cloudron" ]]; then # only the top level ownership is changed because containers own the subdirectores # and will chown them as necessary chown yellowtent:yellowtent "${app_data_dir}" + chown yellowtent:yellowtent "${app_data_dir}/data" else readonly app_data_dir="${HOME}/.cloudron_test/appsdata/$1" mkdir -p "${app_data_dir}/data" diff --git a/src/server.js b/src/server.js index e45847e34..3f6ab1ab3 100644 --- a/src/server.js +++ b/src/server.js @@ -219,7 +219,6 @@ function initializeExpressSync() { // backup routes router.get ('/api/v1/backups', settingsScope, routes.user.requireAdmin, routes.backups.get); router.post('/api/v1/backups', settingsScope, routes.user.requireAdmin, routes.backups.create); - router.post('/api/v1/backups/:backupId/download_url', appsScope, routes.user.requireAdmin, routes.backups.createDownloadUrl); router.get ('/api/v1/backups/:backupId/download', appsScope, routes.user.requireAdmin, routes.backups.download); // disable server socket "idle" timeout. we use the timeout middleware to handle timeouts on a route level diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 87128bd36..9d19c439f 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -1,14 +1,13 @@ 'use strict'; exports = module.exports = { - getBoxBackupDetails: getBoxBackupDetails, - getAppBackupDetails: getAppBackupDetails, + backup: backup, + restore: restore, - getRestoreUrl: getRestoreUrl, getAppRestoreConfig: getAppRestoreConfig, - getLocalFilePath: getLocalFilePath, + getDownloadStream: getDownloadStream, - copyObject: copyObject, + copyBackup: copyBackup, removeBackup: removeBackup, backupDone: backupDone, @@ -19,111 +18,167 @@ exports = module.exports = { var assert = require('assert'), async = require('async'), BackupsError = require('../backups.js').BackupsError, - checksum = require('checksum'), + debug = require('debug')('box:storage/filesystem'), fs = require('fs'), path = require('path'), + mkdirp = require('mkdirp'), + once = require('once'), safe = require('safetydance'), SettingsError = require('../settings.js').SettingsError, shell = require('../shell.js'), - util = require('util'); + tar = require('tar-fs'), + archiver = require('archiver'); var FALLBACK_BACKUP_FOLDER = '/var/backups'; var RMBACKUP_CMD = path.join(__dirname, '../scripts/rmbackup.sh'); -function getBoxBackupDetails(apiConfig, id, callback) { +function backup(apiConfig, backupId, sourceDirectories, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof backupId, 'string'); + assert(Array.isArray(sourceDirectories)); assert.strictEqual(typeof callback, 'function'); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; + callback = once(callback); - var details = { - backupScriptArguments: [ 'filesystem', backupFolder, id, apiConfig.key ] - }; + var backupFilePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, backupId + '.tar.gz'); - callback(null, details); -} + debug('[%s] backup: %j -> %s', backupId, sourceDirectories, backupFilePath); -function getAppBackupDetails(apiConfig, appId, dataId, configId, callback) { - assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof appId, 'string'); - assert.strictEqual(typeof dataId, 'string'); - assert.strictEqual(typeof configId, 'string'); - assert.strictEqual(typeof callback, 'function'); + mkdirp(path.dirname(backupFilePath), function (error) { + if (error) return callback(error); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; + var fileStream = fs.createWriteStream(backupFilePath); + var archive = archiver('tar', { gzip: true }); - var details = { - backupScriptArguments: [ 'filesystem', appId, backupFolder, configId, dataId, apiConfig.key ] - }; + fileStream.on('error', function (error) { + console.error('[%s] backup: out stream error.', error); + }); - callback(null, details); -} + archive.on('error', function (error) { + console.error('[%s] backup: archive stream error.', error); + }); -function getRestoreUrl(apiConfig, filename, callback) { - assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof filename, 'string'); - assert.strictEqual(typeof callback, 'function'); + fileStream.on('close', function () { + debug('[%s] backup: done.', backupId); + callback(); + }); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; - var restoreUrl = 'file://' + path.join(backupFolder, filename); - - checksum.file(path.join(backupFolder, filename), function (error, result) { - if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, util.format('Failed to calculate checksum:', error))); - - callback(null, { url: restoreUrl, sha1: result }); + archive.pipe(fileStream); + sourceDirectories.forEach(function (directoryMap) { + archive.directory(directoryMap.source, directoryMap.destination); + }); + archive.finalize(); }); } +function restore(apiConfig, backupId, destinationDirectories, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof backupId, 'string'); + assert(Array.isArray(destinationDirectories)); + assert.strictEqual(typeof callback, 'function'); + + var sourceFilePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, backupId + '.tar.gz'); + + debug('[%s] restore: %s -> %j', backupId, sourceFilePath, destinationDirectories); + + if (!fs.existsSync(sourceFilePath)) return callback(new BackupsError(BackupsError.NOT_FOUND, 'backup file does not exist')); + + async.eachSeries(destinationDirectories, function (directory, callback) { + debug('[%s] restore: directory %s -> %s', backupId, directory.source, directory.destination); + + mkdirp(directory, function (error) { + if (error) return callback(error); + + var fileStream = fs.createReadStream(sourceFilePath); + var extract = tar.extract(directory); + + fileStream.on('error', function (error) { + console.error('[%s] restore: file stream error.', error); + callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + }); + + extract.on('error', function (error) { + console.error('[%s] restore: extract stream error.', error); + callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); + }); + + extract.on('end', function () { + debug('[%s] restore: directory %s done.', backupId, directory.source); + callback(); + }); + + fileStream.pipe(extract); + }); + }, function (error) { + if (error) return callback(error); + + debug('[%s] restore: done', backupId); + + callback(); + }); +} + +function getDownloadStream(apiConfig, backupId, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var backupFilePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, backupId); + + debug('[%s] getDownloadStream: %s %s', backupId, backupId, backupFilePath); + + if (!fs.existsSync(backupFilePath)) return callback(new BackupsError(BackupsError.NOT_FOUND, 'backup file does not exist')); + + var stream = fs.createReadStream(backupFilePath); + callback(null, stream); +} + function getAppRestoreConfig(apiConfig, backupId, callback) { assert.strictEqual(typeof apiConfig, 'object'); assert.strictEqual(typeof backupId, 'string'); assert.strictEqual(typeof callback, 'function'); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; - var configFilename = backupId.replace(/\.tar\.gz$/, '.json'); + callback = once(callback); - var restoreConfig = safe.require(path.join(backupFolder, configFilename)); - if (!restoreConfig) return callback(new BackupsError(BackupsError.NOT_FOUND, 'No app backup config found for ' + configFilename)); + var sourceFilePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, backupId + '.json'); + + debug('[%s] getAppRestoreConfig: %s', backupId, sourceFilePath); + + if (!fs.existsSync(sourceFilePath)) return callback(new BackupsError(BackupsError.NOT_FOUND, 'restore config file does not exist')); + + var restoreConfig = safe.require(sourceFilePath); + if (!restoreConfig) { + console.error('[%s] getAppRestoreConfig: failed', safe.error); + return callback(new BackupsError(BackupsError.INTERNAL_ERROR, safe.error)); + } callback(null, restoreConfig); } -function getLocalFilePath(apiConfig, filename, callback) { +function copyBackup(apiConfig, oldBackupId, newBackupId, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof filename, 'string'); + assert.strictEqual(typeof oldBackupId, 'string'); + assert.strictEqual(typeof newBackupId, 'string'); assert.strictEqual(typeof callback, 'function'); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; + callback = once(callback); - callback(null, { filePath: path.join(backupFolder, filename) }); -} + var oldBackupFilePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, oldBackupId + '.tar.gz'); + var newBackupFilePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, newBackupId + '.tar.gz'); -function copyObject(apiConfig, from, to, callback) { - assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof from, 'string'); - assert.strictEqual(typeof to, 'string'); - assert.strictEqual(typeof callback, 'function'); + // FIXME this most likely has a permissions issue as this process runs as yellowtent not root + mkdirp(path.dirname(newBackupFilePath), function (error) { + if (error) return callback(new BackupsError(BackupsError.INTERNAL_ERROR, error)); - var calledBack = false; - function done (error) { - if (!calledBack) callback(error); - calledBack = true; - } + var readStream = fs.createReadStream(oldBackupFilePath); + var writeStream = fs.createWriteStream(newBackupFilePath); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; - var readStream = fs.createReadStream(path.join(backupFolder, from)); - var writeStream = fs.createWriteStream(path.join(backupFolder, to)); + readStream.on('error', callback); + writeStream.on('error', callback); + writeStream.on('close', callback); - readStream.on('error', done); - writeStream.on('error', done); - - writeStream.on('close', function () { - // avoid passing arguments - done(null); + readStream.pipe(writeStream); }); - - readStream.pipe(writeStream); } function removeBackup(apiConfig, backupId, appBackupIds, callback) { @@ -132,11 +187,8 @@ function removeBackup(apiConfig, backupId, appBackupIds, callback) { assert(Array.isArray(appBackupIds)); assert.strictEqual(typeof callback, 'function'); - var backupFolder = apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER; - var appBackupJSONFiles = appBackupIds.map(function (id) { return id.replace(/\.tar\.gz$/, '.json'); }); - - async.each([backupId].concat(appBackupIds).concat(appBackupJSONFiles), function (id, callback) { - var filePath = path.join(backupFolder, id); + async.each([backupId].concat(appBackupIds), function (id, callback) { + var filePath = path.join(apiConfig.backupFolder || FALLBACK_BACKUP_FOLDER, id + '.tar.gz'); shell.sudo('deleteBackup', [ RMBACKUP_CMD, filePath ], function (error) { if (error) console.error('Unable to remove %s. Not fatal.', filePath, safe.error); @@ -162,4 +214,3 @@ function backupDone(filename, app, appBackupIds, callback) { callback(); } - diff --git a/src/storage/interface.js b/src/storage/interface.js index 00dc76fba..4a0ddaf5a 100644 --- a/src/storage/interface.js +++ b/src/storage/interface.js @@ -7,8 +7,9 @@ // ------------------------------------------- exports = module.exports = { - getBoxBackupDetails: getBoxBackupDetails, - getAppBackupDetails: getAppBackupDetails, + backupBegin: backupBegin, + backupDirectory: backupDirectory, + backupFinalize: backupFinalize, getRestoreUrl: getRestoreUrl, getAppRestoreConfig: getAppRestoreConfig, @@ -24,26 +25,34 @@ exports = module.exports = { var assert = require('assert'); -function getBoxBackupDetails(apiConfig, id, callback) { +function backupBegin(apiConfig, backupId, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof backupId, 'string'); assert.strictEqual(typeof callback, 'function'); - // Result: { backupScriptArguments: [] } - // The resulting array consists of string passed down 1to1 to the backupbox.sh + // Result: none callback(new Error('not implemented')); } -function getAppBackupDetails(apiConfig, appId, dataId, configId, callback) { +function backupDirectory(apiConfig, backupId, source, destination, callback) { assert.strictEqual(typeof apiConfig, 'object'); - assert.strictEqual(typeof appId, 'string'); - assert.strictEqual(typeof dataId, 'string'); - assert.strictEqual(typeof configId, 'string'); + assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof source, 'string'); + assert.strictEqual(typeof destination, 'string'); assert.strictEqual(typeof callback, 'function'); - // Result: { backupScriptArguments: [] } - // The resulting array consists of string passed down 1to1 to the backupapp.sh + // Result: none + + callback(new Error('not implemented')); +} + +function backupFinalize(apiConfig, backupId, callback) { + assert.strictEqual(typeof apiConfig, 'object'); + assert.strictEqual(typeof backupId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + // Result: none callback(new Error('not implemented')); }