diff --git a/.bundlewatch.config.js b/.bundlewatch.config.js index 62be5bb911..735f2fb3b9 100644 --- a/.bundlewatch.config.js +++ b/.bundlewatch.config.js @@ -14,11 +14,7 @@ module.exports = { "maxSize": "180 kB", }, { - "path": "client-participation/dist/cached/*/js/polis.js", - "maxSize": "150 kB", - }, - { - "path": "client-participation/dist/cached/*/js/vis_bundle.js", + "path": "client-participation/dist/*.js", "maxSize": "200 kB", }, ] diff --git a/.github/workflows/bundlewatch.yml b/.github/workflows/bundlewatch.yml index f988aba48b..c216c8b709 100644 --- a/.github/workflows/bundlewatch.yml +++ b/.github/workflows/bundlewatch.yml @@ -1,6 +1,7 @@ name: "Bundlewatch Github Action" on: + workflow_dispatch: push: # Required so that baseline for comparison is pushed to bundlewatch service. branches: ["dev"] @@ -53,10 +54,15 @@ jobs: working-directory: client-participation run: | npm install - cp polis.config.template.js polis.config.js - npm run deploy:prod - # So directory stays consistent between builds for comparison. - mv dist/cached/* dist/cached/xxxxxxxxx + npm run build:webpack + + # - name: "Install & Build: client-participation" + # working-directory: client-participation + # run: | + # npm install + # npm run deploy:prod + # # So directory stays consistent between builds for comparison. + # mv dist/cached/* dist/cached/xxxxxxxxx - name: Install Bundlewatch run: npm install -g bundlewatch@0.2.6 diff --git a/.github/workflows/cypress-tests.yml b/.github/workflows/cypress-tests.yml index 8993b703d2..aeaeae1790 100644 --- a/.github/workflows/cypress-tests.yml +++ b/.github/workflows/cypress-tests.yml @@ -2,6 +2,7 @@ name: E2E Tests on: + workflow_dispatch: push: branches: - dev diff --git a/.github/workflows/depcheck.yml b/.github/workflows/depcheck.yml index c78e0539a2..db88e16662 100644 --- a/.github/workflows/depcheck.yml +++ b/.github/workflows/depcheck.yml @@ -1,5 +1,6 @@ name: DepCheck on: + workflow_dispatch: pull_request: types: ["opened", "reopened", "synchronize"] paths: diff --git a/.github/workflows/deploy-preprod.yml b/.github/workflows/deploy-preprod.yml index 6260ff0442..b5dddec4c8 100644 --- a/.github/workflows/deploy-preprod.yml +++ b/.github/workflows/deploy-preprod.yml @@ -1,4 +1,5 @@ on: + workflow_dispatch: push: branches: - dev diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 83ea3471e8..6fcc784d5b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,6 +1,7 @@ name: Lint on: + workflow_dispatch: pull_request: types: ["opened", "reopened", "synchronize"] diff --git a/.github/workflows/release-docker-images.yml b/.github/workflows/release-docker-images.yml index 1823c91614..00b9ae8bbc 100644 --- a/.github/workflows/release-docker-images.yml +++ b/.github/workflows/release-docker-images.yml @@ -2,6 +2,7 @@ name: Docker image builds on: + workflow_dispatch: push: branches: - main diff --git a/.github/workflows/test-clojure.yml b/.github/workflows/test-clojure.yml index a7bda1660b..14885b2315 100644 --- a/.github/workflows/test-clojure.yml +++ b/.github/workflows/test-clojure.yml @@ -1,6 +1,7 @@ name: Test Math on: + workflow_dispatch: push: branches: ["dev", "504-clj-tests"] # Note: Only configured for client-admin right now. diff --git a/client-admin/Dockerfile b/client-admin/Dockerfile index 00001a1f04..e8df55127a 100644 --- a/client-admin/Dockerfile +++ b/client-admin/Dockerfile @@ -8,8 +8,9 @@ RUN apk add git --no-cache COPY package*.json ./ RUN npm install -COPY polis.config.template.js polis.config.js -# If polis.config.js exists on host, will override template here. +COPY --from=polis_config /config/config.js /app/config/ +COPY --from=polis_config /config/*.yaml /app/config/ + COPY . . ARG GIT_HASH diff --git a/client-admin/dev-server.js b/client-admin/dev-server.js index cbf2cc2895..d95e77fcef 100644 --- a/client-admin/dev-server.js +++ b/client-admin/dev-server.js @@ -11,7 +11,8 @@ var request = require("request"); var app = express(); var compiler = webpack(config); -var polisConfig = require("./polis.config"); +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); app.use( require("webpack-dev-middleware")(compiler, { @@ -20,7 +21,7 @@ app.use( }) ); -const serviceUrl = polisConfig.SERVICE_URL ? polisConfig.SERVICE_URL : "https://pol.is"; +const serviceUrl = config.get('service_url') ? config.get('service_url') : "https://pol.is"; console.log("SERVICE_URL:", serviceUrl); function proxy(req, res) { @@ -58,10 +59,10 @@ app.get(/^\/embed\/?$/, function (req, res) { app.get("*", function (req, res) { var html = fs.readFileSync(path.join(__dirname, "index.html"), { encoding: "utf8" }); - html = html.replace("<%= fbAppId %>", polisConfig.FB_APP_ID); - html = html.replace("<%= useIntercom %>", !isTrue(polisConfig.DISABLE_INTERCOM)); - html = html.replace("<%= usePlans %>", !isTrue(polisConfig.DISABLE_PLANS)); - var domainWhitelist = '["' + polisConfig.domainWhitelist.join('","') + '"]'; + html = html.replace("<%= fbAppId %>", config.get('fb_app_id')); + html = html.replace("<%= useIntercom %>", !isTrue(config.get('disable_intercom'))); + html = html.replace("<%= usePlans %>", !isTrue(config.get('disable_plans'))); + var domainWhitelist = '["' + config.get('domainWhitelist').join('","') + '"]'; html = html.replace("<%= domainWhitelist %>", domainWhitelist); res.set({ diff --git a/client-admin/gulpfile.js b/client-admin/gulpfile.js index 3dbdde86b7..365202f471 100644 --- a/client-admin/gulpfile.js +++ b/client-admin/gulpfile.js @@ -13,9 +13,10 @@ var rimraf = require("rimraf"); var runSequence = require("run-sequence"); var scp = require("gulp-scp2"); -var polisConfig = require("./polis.config"); +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); -console.log("Uploader: " + polisConfig.UPLOADER); +console.log("Uploader: " + config.get('uploader')); const staticFilesPrefix = "cached"; const baseDistRoot = "dist"; @@ -78,11 +79,11 @@ gulp.task("index", [], function () { ); html = html.replace("NULL_VERSION", versionString); - html = html.replace("<%= fbAppId %>", polisConfig.FB_APP_ID); - html = html.replace("<%= useIntercom %>", !isTrue(polisConfig.DISABLE_INTERCOM)); - html = html.replace("<%= usePlans %>", !isTrue(polisConfig.DISABLE_PLANS)); + html = html.replace("<%= fbAppId %>", config.get('fb_app_id')); + html = html.replace("<%= useIntercom %>", !isTrue(config.get('disable_intercom'))); + html = html.replace("<%= usePlans %>", !isTrue(config.get('disable_plans'))); - var domainWhitelist = '["' + polisConfig.domainWhitelist.join('","') + '"]'; + var domainWhitelist = '["' + config.get('domainWhitelist').join('","') + '"]'; html = html.replace("<%= domainWhitelist %>", domainWhitelist); // index goes to the root of the dist folder. @@ -129,8 +130,8 @@ gulp.task("404", [], function () { gulp.task("preprodConfig", function () { preprodMode = true; minified = true; - scpSubdir = polisConfig.SCP_SUBDIR_PREPROD; - s3Subdir = polisConfig.S3_BUCKET_PREPROD; + scpSubdir = config.get('scp_subdir_preprod'); + s3Subdir = config.get('s3_bucket_preprod'); }); gulp.task("unminifiedConfig", function () { @@ -140,8 +141,8 @@ gulp.task("unminifiedConfig", function () { gulp.task("prodConfig", function () { prodMode = true; minified = true; - scpSubdir = polisConfig.SCP_SUBDIR_PROD; - s3Subdir = polisConfig.S3_BUCKET_PROD; + scpSubdir = config.get('scp_subdir_prod'); + s3Subdir = config.get('s3_bucket_prod'); }); gulp.task("configureForProduction", function (callback) { @@ -220,12 +221,12 @@ gulp.task("dist", ["configureForProduction"], function (callback) { gulp.task("deploy_TO_PRODUCTION", ["prodConfig", "dist"], function () { var uploader; - if ("s3" === polisConfig.UPLOADER) { + if ("s3" === config.get('uploader')) { uploader = s3uploader({ bucket: s3Subdir, }); } - if ("scp" === polisConfig.UPLOADER) { + if ("scp" === config.get('uploader')) { uploader = scpUploader({ // subdir: "cached", watch: function (client) { @@ -235,7 +236,7 @@ gulp.task("deploy_TO_PRODUCTION", ["prodConfig", "dist"], function () { }, }); } - if ('local' === polisConfig.UPLOADER) { + if ('local' === config.get('uploader')) { uploader = localUploader uploader.needsHeadersJson = true } @@ -244,12 +245,12 @@ gulp.task("deploy_TO_PRODUCTION", ["prodConfig", "dist"], function () { function doUpload() { var uploader; - if ("s3" === polisConfig.UPLOADER) { + if ("s3" === config.get('uploader')) { uploader = s3uploader({ bucket: s3Subdir, }); } - if ("scp" === polisConfig.UPLOADER) { + if ("scp" === config.get('uploader')) { uploader = scpUploader({ // subdir: "cached", watch: function (client) { @@ -259,7 +260,7 @@ function doUpload() { }, }); } - if ('local' === polisConfig.UPLOADER) { + if ('local' === config.get('uploader')) { uploader = localUploader uploader.needsHeadersJson = true } @@ -272,19 +273,19 @@ gulp.task("deployPreprodUnminified", ["preprodConfig", "unminifiedConfig", "dist gulp.task("fontsPreprod", ["preprodConfig"], function () { return deployFonts({ - bucket: polisConfig.S3_BUCKET_PREPROD, + bucket: config.get('s3_bucket_preprod'), }); }); gulp.task("fontsProd", ["prodConfig"], function () { return deployFonts({ - bucket: polisConfig.S3_BUCKET_PROD, + bucket: config.get('s3_bucket_prod'), }); }); function localUploader(params) { params.subdir = params.subdir || '' - return gulp.dest(path.join(polisConfig.LOCAL_OUTPUT_PATH, params.subdir)) + return gulp.dest(path.join(config.get('local_output_path'), params.subdir)) } function s3uploader(params) { diff --git a/client-admin/package-lock.json b/client-admin/package-lock.json index 0fdf20a07e..ee07181f2b 100644 --- a/client-admin/package-lock.json +++ b/client-admin/package-lock.json @@ -5092,7 +5092,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -5779,6 +5778,11 @@ "get-intrinsic": "^1.0.0" } }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -6068,6 +6072,15 @@ "safe-buffer": "~5.1.1" } }, + "convict": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.0.0.tgz", + "integrity": "sha512-osfPkv5yjVoZqrTWBXuh/ABGpFoaJplbt0WXr0CodR4CSWt8UnzY4PSUyRz/+5BX5YUtWcToG29Kr0B6xhdIMg==", + "requires": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^18.1.3" + } + }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -6344,8 +6357,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -7318,8 +7330,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.4.0", @@ -9650,10 +9661,9 @@ "integrity": "sha1-eZA/VWPud4zBFi5tzxoAJ8l/nLU=" }, "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -10072,6 +10082,11 @@ "lodash._objecttypes": "~2.4.1" } }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -13039,8 +13054,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "ssh2": { "version": "0.3.6", @@ -15015,6 +15029,21 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zwitch": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", diff --git a/client-admin/package.json b/client-admin/package.json index 7f54011700..914ca2a1c7 100644 --- a/client-admin/package.json +++ b/client-admin/package.json @@ -9,7 +9,8 @@ "build:webpack_unminified": "npm run clean && NODE_ENV=development webpack --config webpack.config.unminified.js", "build": "npm run build:webpack", "build-debug": "npm run build:webpack_unminified", - "deploy:prod": "node gulpfile.js deploy_TO_PRODUCTION", + "convict": "6.0.0", + "deploy:prod": "POLIS_ROOT=/app/ node gulpfile.js deploy_TO_PRODUCTION", "deploy:preprod": "node gulpfile.js deployPreprod", "start": "./x", "lint": "eslint src", @@ -58,8 +59,10 @@ }, "dependencies": { "boolean": "^3.0.2", + "convict": "6.0.0", "d3-scale": "^3.2.3", "jquery": "^2.1.4", + "js-yaml": "3.14.0", "lodash": "^4.17.21", "prop-types": "^15.7.2", "react": "^16.14.0", diff --git a/client-admin/polis.config.template.js b/client-admin/polis.config.template.js deleted file mode 100644 index 90cfa90b52..0000000000 --- a/client-admin/polis.config.template.js +++ /dev/null @@ -1,37 +0,0 @@ - -module.exports = { - - domainWhitelist: [ - // local ports - "^localhost$", - "^127\\.0\\.0\\.1$", - "^192\\.168\\.1\\.140$", - // sample configuration for main pol.is deployment - "^pol\\.is", - ".+\\.pol\\.is$", - // These allow for local ip routing for remote dev deployment - "^(n|ssl)ip\\.io$", - ".+\\.(n|ssl)ip\\.io$", - ], - - DISABLE_INTERCOM: true, - DISABLE_PLANS: true, - - FB_APP_ID: '661042417336977', - - //SERVICE_URL: 'http://localhost:5000', - SERVICE_URL: 'https://preprod.pol.is', - - UPLOADER: 'local', // alt: s3, scp - - // Uploader settings: local - LOCAL_OUTPUT_PATH: './build', - - // Uploader settings: s3 - S3_BUCKET_PROD: 'pol.is', - S3_BUCKET_PREPROD: 'preprod.pol.is', - - // Uploader settings: scp - SCP_SUBDIR_PREPROD: 'preprod', - SCP_SUBDIR_PROD: 'prod', -}; diff --git a/client-participation/Dockerfile b/client-participation/Dockerfile index 1a8899cdce..979a02e1f5 100644 --- a/client-participation/Dockerfile +++ b/client-participation/Dockerfile @@ -19,8 +19,9 @@ RUN npm ci RUN apk del .build -COPY polis.config.template.js polis.config.js -# If polis.config.js exists on host, will override template here. +COPY --from=polis_config /config/config.js /app/config/ +COPY --from=polis_config /config/*.yaml /app/config/ + COPY . . ARG GIT_HASH diff --git a/client-participation/gulpfile.js b/client-participation/gulpfile.js index bcaafa0dfb..de091d8639 100644 --- a/client-participation/gulpfile.js +++ b/client-participation/gulpfile.js @@ -50,9 +50,10 @@ var spawn = require("child_process").spawn; var Stream = require("stream"); var url = require("url"); -var polisConfig = require("./polis.config"); +let POLIS_ROOT = process.env.POLIS_ROOT +var yaml_config = require(POLIS_ROOT + 'config/config.js'); -console.log("Uploader: " + polisConfig.UPLOADER); +console.log("Uploader: " + yaml_config.get('uploader')); // WARNING: useJsHint gets mutated in watch builds var useJsHint = true; @@ -108,7 +109,7 @@ function prepPathForTemplate(path) { gulp.task("connect", [], function () { function proxyToPreprod(req, response) { var x = request( - (polisConfig.SERVICE_URL || "https://preprod.pol.is") + req.originalUrl + (yaml_config.get('service_url') || "https://preprod.pol.is") + req.originalUrl ); x.on("error", function (err) { response.status(500).end(); @@ -232,8 +233,8 @@ gulp.task("connect", [], function () { app.use(/^\/wimp$/, express.static(path.join(destRootBase, "wimp.html"))); app.use(/^\/try$/, express.static(path.join(destRootBase, "try.html"))); - app.listen(polisConfig.PORT); - console.log("listening on localhost:" + polisConfig.PORT); + app.listen(yaml_config.get('port')); + console.log("listening on localhost:" + yaml_config.get('port')); }); function getGitHash() { @@ -285,7 +286,7 @@ gulp.task("embedJs", function () { ]) .pipe( template({ - polisHostName: polisConfig.SERVICE_HOSTNAME || "pol.is", + polisHostName: yaml_config.get('service_hostname') || "pol.is", }) ) // .pipe(template({ @@ -298,15 +299,15 @@ gulp.task("embedJs", function () { gulp.task("index", [], function () { var s = gulp.src("index.html"); var basepath = prepPathForTemplate(destRootRest); - var domainWhitelist = '["' + polisConfig.domainWhitelist.join('","') + '"]'; + var domainWhitelist = '["' + yaml_config.get('domainWhitelist').join('","') + '"]'; if (devMode) { s = s.pipe( template({ basepath: basepath, basepath_visbundle: basepath_visbundle_dev, d3Filename: "d3.js", - fbAppId: polisConfig.FB_APP_ID, - useIntercom: !isTrue(polisConfig.DISABLE_INTERCOM), + fbAppId: yaml_config.get('fb_app_id'), + useIntercom: !isTrue(config.get('disable_intercom')), versionString: versionString, domainWhitelist: domainWhitelist, }) @@ -318,8 +319,8 @@ gulp.task("index", [], function () { basepath: basepath, // proxy through server (cached by cloudflare, and easier than choosing a bucket for preprod, etc) basepath_visbundle: basepath, d3Filename: "d3.min.js", - fbAppId: polisConfig.FB_APP_ID, - useIntercom: !isTrue(polisConfig.DISABLE_INTERCOM), + fbAppId: yaml_config.get('fb_app_id'), + useIntercom: !isTrue(yaml_config.get('disable_intercom')), versionString: versionString, domainWhitelist: domainWhitelist, }) @@ -656,15 +657,15 @@ gulp.task("scriptsD3v4", function () { gulp.task("preprodConfig", function () { preprodMode = true; minified = true; - scpSubdir = polisConfig.SCP_SUBDIR_PREPROD; - s3Subdir = polisConfig.S3_BUCKET_PREPROD; + scpSubdir = yaml_config.get('scp_subdir_preprod'); + s3Subdir = yaml_config.get('s3_bucket_preprod'); }); gulp.task("prodConfig", function () { prodMode = true; minified = true; - scpSubdir = polisConfig.SCP_SUBDIR_PROD; - s3Subdir = polisConfig.S3_BUCKET_PROD; + scpSubdir = yaml_config.get('scp_subdir_prod'); + s3Subdir = yaml_config.get('s3_bucket_prod'); }); gulp.task("unminifiedConfig", function () { @@ -790,12 +791,12 @@ gulp.task("deploy_TO_PRODUCTION", ["prodConfig", "dist"], function () { notifySlackOfDeployment("prod"); var uploader; - if ("s3" === polisConfig.UPLOADER) { + if ("s3" === yaml_config.get('uploader')) { uploader = s3uploader({ bucket: s3Subdir, }); } - if ("scp" === polisConfig.UPLOADER) { + if ("scp" === yaml_config.get('uploader')) { uploader = scpUploader({ // TODO needs to upload as prod somehow. // subdir: "cached", @@ -806,7 +807,7 @@ gulp.task("deploy_TO_PRODUCTION", ["prodConfig", "dist"], function () { }, }); } - if ("local" === polisConfig.UPLOADER) { + if ("local" === yaml_config.get('uploader')) { uploader = localUploader; uploader.needsHeadersJson = true; } @@ -817,12 +818,12 @@ function doUpload() { notifySlackOfDeployment("preprod"); var uploader; - if ("s3" === polisConfig.UPLOADER) { + if ("s3" === yaml_config.get('uploader')) { uploader = s3uploader({ bucket: s3Subdir, }); } - if ("scp" === polisConfig.UPLOADER) { + if ("scp" === yaml_config.get('uploader')) { uploader = scpUploader({ // TODO needs to upload as PREprod somehow. // subdir: "cached", @@ -833,7 +834,7 @@ function doUpload() { }, }); } - if ("local" === polisConfig.UPLOADER) { + if ("local" === yaml_config.get('uploader')) { uploader = localUploader; uploader.needsHeadersJson = true; } @@ -857,7 +858,7 @@ gulp.task("deploySurvey", ["prodConfig", "dist"], function () { function localUploader(params) { params.subdir = params.subdir || ""; - return gulp.dest(path.join(polisConfig.LOCAL_OUTPUT_PATH, params.subdir)); + return gulp.dest(path.join(yaml_config.get('local_output_path'), params.subdir)); } function s3uploader(params) { diff --git a/client-participation/package-lock.json b/client-participation/package-lock.json index 32384e5c4c..aa0c542ff5 100644 --- a/client-participation/package-lock.json +++ b/client-participation/package-lock.json @@ -789,6 +789,14 @@ "readable-stream": "^2.0.6" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -2235,6 +2243,15 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "compression-webpack-plugin": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-7.1.2.tgz", + "integrity": "sha512-9DKNW6ILLjx+bNBoviHDgLx6swBhWWH9ApClC9sTH2NoFfQM47BapQfovCm9zjD9v1uZwInF5a925FB9ErGQeQ==", + "requires": { + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2392,6 +2409,15 @@ "safe-buffer": "~5.1.1" } }, + "convict": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.0.0.tgz", + "integrity": "sha512-osfPkv5yjVoZqrTWBXuh/ABGpFoaJplbt0WXr0CodR4CSWt8UnzY4PSUyRz/+5BX5YUtWcToG29Kr0B6xhdIMg==", + "requires": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^18.1.3" + } + }, "cookie": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", @@ -3454,6 +3480,11 @@ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6980,6 +7011,15 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -7192,6 +7232,14 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash-webpack-plugin": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/lodash-webpack-plugin/-/lodash-webpack-plugin-0.11.6.tgz", + "integrity": "sha512-nsHN/+IxZK/C425vGC8pAxkKJ8KQH2+NJnhDul14zYNWr6HJcA95w+oRR7Cp0oZpOdMplDZXmjVROp8prPk7ig==", + "requires": { + "lodash": "^4.17.20" + } + }, "lodash._arraypool": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash._arraypool/-/lodash._arraypool-2.4.1.tgz", @@ -7518,6 +7566,11 @@ "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.defaults": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz", @@ -10315,6 +10368,11 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "ssh2": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.3.6.tgz", @@ -12698,6 +12756,22 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/client-participation/package.json b/client-participation/package.json index bdf22f58b4..3a8fc9d055 100644 --- a/client-participation/package.json +++ b/client-participation/package.json @@ -4,10 +4,12 @@ "version": "0.0.0", "license": "AGPL-3.0", "scripts": { + "clean": "rimraf dist", "start": "gulp", "build:prod": "gulp prodBuildNoDeploy", + "build:webpack": "npm run clean && NODE_ENV=production webpack --config webpack.config.js", "deploy:preprod": "gulp deployPreprod", - "deploy:prod": "gulp deploy_TO_PRODUCTION", + "deploy:prod": "POLIS_ROOT=/app/ gulp deploy_TO_PRODUCTION", "deploy:preprod:unminified": "gulp deployPreprodUnminified" }, "dependencies": { @@ -17,6 +19,8 @@ "bootstrap-sass": "^3.4.1", "brain": "~0.6.3", "combine-css": "0.0.2", + "compression-webpack-plugin": "^7.1.2", + "convict": "6.0.0", "d3": "^3.5.17", "d3-force": "^1.2.1", "d3-tip": "^0.6.7", @@ -34,7 +38,9 @@ "handlebones": "github:pol-is/handlebones#master", "hull.js": "^0.2.10", "jquery": "~1.11", + "js-yaml": "3.14.0", "lodash": "4.17.21", + "lodash-webpack-plugin": "^0.11.6", "map-stream": "~0.1.0", "markdown": "^0.5.0", "prop-types": "^15.7.2", diff --git a/client-participation/polis.config.template.js b/client-participation/polis.config.template.js deleted file mode 100644 index ec6ea1de81..0000000000 --- a/client-participation/polis.config.template.js +++ /dev/null @@ -1,45 +0,0 @@ -module.exports = { - domainWhitelist: [ - // local ports - "^localhost$", - "^127\\.0\\.0\\.1$", - "^192\\.168\\.1\\.140$", - // sample configuration for main pol.is deployment - "^pol\\.is", - ".+\\.pol\\.is$", - // These allow for local ip routing for remote dev deployment - "^(n|ssl)ip\\.io$", - ".+\\.(n|ssl)ip\\.io$", - ], - - // Point to a polisServer instance (local recommended for dev) - //SERVICE_URL: "http://localhost:5000", // local server; recommended for dev - SERVICE_URL: "http:localhost:5000", - - // Used for setting appropriate hostname for embedding. - //SERVICE_HOSTNAME: "123.45.67.89.sslip.io", - SERVICE_HOSTNAME: "localhost", - - // Note that this must match the participation client port specified in polisServer instance - PORT: 5001, - - DISABLE_INTERCOM: true, - - // must register with facebook and get a facebook app id to use the facebook auth features - FB_APP_ID: "661042417336977", - - // For data exports - - UPLOADER: "local", // alt: s3, scp - - // Uploader settings: local - LOCAL_OUTPUT_PATH: "./build", - - // Uploader settings: s3 - S3_BUCKET_PROD: "pol.is", - S3_BUCKET_PREPROD: "preprod.pol.is", - - // Uploader settings: scp - SCP_SUBDIR_PREPROD: "preprod", - SCP_SUBDIR_PROD: "prod", -}; diff --git a/client-participation/webpack.config.js b/client-participation/webpack.config.js index 8b5f3f65b2..efe208970e 100644 --- a/client-participation/webpack.config.js +++ b/client-participation/webpack.config.js @@ -1,16 +1,41 @@ +// Copyright (C) 2012-present, The Authors. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License, version 3, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . + var path = require("path"); var webpack = require("webpack"); +var CompressionPlugin = require('compression-webpack-plugin') +var LodashModuleReplacementPlugin = require('lodash-webpack-plugin'); module.exports = { - // devtool: "source-map", entry: [ "./vis2/vis2" ], output: { - path: path.join(__dirname, "dist_foo"), + path: path.join(__dirname, "dist"), filename: "vis_bundle.js", - publicPath: "SET_THIS_FROM_GULP" + publicPath: "/dist/", + }, + resolve: { + extensions: [".js", ".css", ".png", ".svg"], }, + plugins: [ + new LodashModuleReplacementPlugin({ + "currying": true, + "flattening": true, + "paths": true, + "placeholders": true, + "shorthands": true + }), + new CompressionPlugin({ + test: /\.js$/, + // Leave unmodified without gz ext. + // See: https://webpack.js.org/plugins/compression-webpack-plugin/#options + filename: '[path][base]', + deleteOriginalAssets: true, + }), + new webpack.DefinePlugin({ + "process.env.NODE_ENV": JSON.stringify("production"), + }), + ], mode: 'production', optimization: { minimize: true, diff --git a/client-report/Dockerfile b/client-report/Dockerfile index b98a3dcd37..3e7b107e64 100644 --- a/client-report/Dockerfile +++ b/client-report/Dockerfile @@ -8,8 +8,9 @@ RUN apk add git --no-cache COPY package*.json ./ RUN npm ci -COPY polis.config.template.js polis.config.js -# If polis.config.js exists on host, will override template here. +COPY --from=polis_config /config/config.js /app/config/ +COPY --from=polis_config /config/*.yaml /app/config/ + COPY . . ARG GIT_HASH diff --git a/client-report/dev-server.js b/client-report/dev-server.js index 632b931883..3da05870cd 100644 --- a/client-report/dev-server.js +++ b/client-report/dev-server.js @@ -5,6 +5,8 @@ var express = require("express"); var webpack = require("webpack"); var config = require("./webpack.config.dev"); var request = require("request"); +let POLIS_ROOT = process.env.POLIS_ROOT +var globalConfig = require(POLIS_ROOT + 'config/config.js'); var app = express(); var compiler = webpack(config); @@ -26,7 +28,7 @@ app.use(require("webpack-hot-middleware")(compiler)); -const serviceUrl = process.env.SERVICE_URL ? process.env.SERVICE_URL : "https://preprod.pol.is"; +const serviceUrl = globalConfig.get('service_url') ? globalConfig.get('service_url') : "https://preprod.pol.is"; console.log("SERVICE_URL:", serviceUrl); diff --git a/client-report/gulpfile.js b/client-report/gulpfile.js index 09e4358cc4..f9ca7c04f4 100644 --- a/client-report/gulpfile.js +++ b/client-report/gulpfile.js @@ -14,9 +14,10 @@ var rimraf = require("rimraf"); var runSequence = require('run-sequence'); var scp = require('gulp-scp2'); -var polisConfig = require('./polis.config'); +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); -console.log("Uploader: " + polisConfig.UPLOADER); +console.log("Uploader: " + config.get('uploader')); const staticFilesPrefix = "cached"; const baseDistRoot = "dist"; @@ -88,14 +89,14 @@ gulp.task('index', [ gulp.task("preprodConfig", function() { preprodMode = true; - scpSubdir = polisConfig.SCP_SUBDIR_PREPROD; - s3Subdir = polisConfig.S3_BUCKET_PREPROD; + scpSubdir = config.get('scp_subdir_preprod'); + s3Subdir = config.get('s3_bucket_preprod'); }); gulp.task("prodConfig", function() { prodMode = true; - scpSubdir = polisConfig.SCP_SUBDIR_PROD; - s3Subdir = polisConfig.S3_BUCKET_PROD; + scpSubdir = config.get('scp_subdir_prod'); + s3Subdir = config.get('s3_bucket_prod'); }); @@ -165,7 +166,7 @@ gulp.task('dist', [ function localUploader(params) { params.subdir = params.subdir || '' - return gulp.dest(path.join(polisConfig.LOCAL_OUTPUT_PATH, params.subdir)) + return gulp.dest(path.join(config.get('local_output_path'), params.subdir)) } function s3uploader(params) { @@ -324,12 +325,12 @@ function deploy(uploader) { function doUpload() { var uploader; - if ('s3' === polisConfig.UPLOADER) { + if ('s3' === config.get('uploader')) { uploader = s3uploader({ bucket: s3Subdir, }); } - if ('scp' === polisConfig.UPLOADER) { + if ('scp' === config.get('uploader')) { uploader = scpUploader({ // subdir: "cached", watch: function(client) { @@ -339,7 +340,7 @@ function doUpload() { }, }); } - if ('local' === polisConfig.UPLOADER) { + if ('local' === config.get('uploader')) { uploader = localUploader uploader.needsHeadersJson = true } diff --git a/client-report/package-lock.json b/client-report/package-lock.json index b9afddfe38..d22b4a9b9c 100644 --- a/client-report/package-lock.json +++ b/client-report/package-lock.json @@ -10,7 +10,7 @@ "integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=", "dev": true, "requires": { - "mime-types": "~2.1.24", + "mime-types": "2.1.27", "negotiator": "0.6.2" } }, @@ -26,7 +26,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "^3.0.4" + "acorn": "3.3.0" }, "dependencies": { "acorn": { @@ -48,10 +48,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", "integrity": "sha1-xinF7O0XuvMUQ3kY0tqIyZ1ZWM0=", "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "3.1.1", + "fast-json-stable-stringify": "2.1.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ajv-keywords": { @@ -66,9 +66,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" }, "dependencies": { "kind-of": { @@ -77,7 +77,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -88,7 +88,7 @@ "integrity": "sha1-x1iICGF1cgNKrmJICvJrHU0cs80=", "dev": true, "requires": { - "stable": "~0.1.3" + "stable": "0.1.8" } }, "amdefine": { @@ -142,8 +142,8 @@ "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "dev": true, "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "micromatch": "2.3.11", + "normalize-path": "2.1.1" }, "dependencies": { "arr-diff": { @@ -152,7 +152,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "array-unique": { @@ -167,9 +167,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.3" } }, "expand-brackets": { @@ -178,7 +178,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "extglob": { @@ -187,7 +187,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "is-extglob": { @@ -202,7 +202,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -211,7 +211,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "micromatch": { @@ -220,19 +220,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" } } } @@ -246,10 +246,9 @@ "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -328,7 +327,7 @@ "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", "dev": true, "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } }, "assert": { @@ -337,7 +336,7 @@ "integrity": "sha1-VcEJqvbgrv2z3EtxJAxwv1dLGOs=", "dev": true, "requires": { - "object-assign": "^4.1.1", + "object-assign": "4.1.1", "util": "0.10.3" }, "dependencies": { @@ -426,52 +425,52 @@ "integrity": "sha1-H8ruedfmG3ULALjlT238nQr4ZVg=", "dev": true, "requires": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", + "babel-plugin-constant-folding": "1.0.1", + "babel-plugin-dead-code-elimination": "1.0.2", + "babel-plugin-eval": "1.0.1", + "babel-plugin-inline-environment-variables": "1.0.1", + "babel-plugin-jscript": "1.0.4", + "babel-plugin-member-expression-literals": "1.0.1", + "babel-plugin-property-literals": "1.0.1", + "babel-plugin-proto-to-assign": "1.0.4", + "babel-plugin-react-constant-elements": "1.0.3", + "babel-plugin-react-display-name": "1.0.3", + "babel-plugin-remove-console": "1.0.1", + "babel-plugin-remove-debugger": "1.0.1", + "babel-plugin-runtime": "1.0.7", + "babel-plugin-undeclared-variables-check": "1.0.2", + "babel-plugin-undefined-to-void": "1.1.6", + "babylon": "5.8.38", + "bluebird": "2.11.0", + "chalk": "1.1.3", + "convert-source-map": "1.7.0", + "core-js": "1.2.7", + "debug": "2.6.9", + "detect-indent": "3.0.1", + "esutils": "2.0.3", + "fs-readdir-recursive": "0.1.2", + "globals": "6.4.1", + "home-or-tmp": "1.0.0", + "is-integer": "1.0.7", "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", + "json5": "0.4.0", + "lodash": "3.10.1", + "minimatch": "2.0.10", + "output-file-sync": "1.1.2", + "path-exists": "1.0.0", + "path-is-absolute": "1.0.1", + "private": "0.1.8", "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" + "regexpu": "1.3.0", + "repeating": "1.1.3", + "resolve": "1.17.0", + "shebang-regex": "1.0.0", + "slash": "1.0.0", + "source-map": "0.5.7", + "source-map-support": "0.2.10", + "to-fast-properties": "1.0.3", + "trim-right": "1.0.1", + "try-resolve": "1.0.1" }, "dependencies": { "js-tokens": { @@ -498,7 +497,7 @@ "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.1.0" } } } @@ -509,10 +508,10 @@ "integrity": "sha1-T3nnpPWHns8D9Iyxb1UqNV/MMbI=", "dev": true, "requires": { - "acorn-to-esprima": "^1.0.5", - "babel-core": "^5.8.33", - "lodash.assign": "^3.2.0", - "lodash.pick": "^3.1.0" + "acorn-to-esprima": "1.0.7", + "babel-core": "5.8.38", + "lodash.assign": "3.2.0", + "lodash.pick": "3.1.0" }, "dependencies": { "lodash.pick": { @@ -521,11 +520,11 @@ "integrity": "sha1-8lKoVbIEa2G805BLJvdr0u/GVVA=", "dev": true, "requires": { - "lodash._baseflatten": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash._pickbyarray": "^3.0.0", - "lodash._pickbycallback": "^3.0.0", - "lodash.restparam": "^3.0.0" + "lodash._baseflatten": "3.1.4", + "lodash._bindcallback": "3.0.1", + "lodash._pickbyarray": "3.0.2", + "lodash._pickbycallback": "3.0.0", + "lodash.restparam": "3.6.1" } } } @@ -536,9 +535,9 @@ "integrity": "sha1-d/4o2OYNDwVrHBvKJbhJTNqrnHY=", "dev": true, "requires": { - "babel-core": "^5.4.0", - "loader-utils": "^0.2.9", - "object-assign": "^3.0.0" + "babel-core": "5.8.38", + "loader-utils": "0.2.17", + "object-assign": "3.0.0" } }, "babel-plugin-constant-folding": { @@ -589,7 +588,7 @@ "integrity": "sha1-xJ56/QL1d7xNoF6i3wAiUM980SM=", "dev": true, "requires": { - "lodash": "^3.9.3" + "lodash": "3.10.1" }, "dependencies": { "lodash": { @@ -618,7 +617,7 @@ "integrity": "sha1-leJDgnoQkLuLbpP+fG9W+1wjsPs=", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.7" } }, "babel-plugin-remove-console": { @@ -645,7 +644,7 @@ "integrity": "sha1-XPGqU52BP/ZOmWQSkK9iCWX2Xe4=", "dev": true, "requires": { - "leven": "^1.0.2" + "leven": "1.0.2" } }, "babel-plugin-undefined-to-void": { @@ -659,7 +658,7 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.38.tgz", "integrity": "sha1-HAsC62MxL18If/IEUIJ7QlydTBk=", "requires": { - "core-js": "^1.0.0" + "core-js": "1.2.7" } }, "babylon": { @@ -679,13 +678,13 @@ "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -694,7 +693,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -703,7 +702,7 @@ "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-data-descriptor": { @@ -712,7 +711,7 @@ "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-descriptor": { @@ -721,9 +720,9 @@ "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" } } } @@ -739,7 +738,7 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "beeper": { @@ -783,15 +782,15 @@ "dev": true, "requires": { "bytes": "3.1.0", - "content-type": "~1.0.4", + "content-type": "1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "1.1.2", "http-errors": "1.7.2", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", + "on-finished": "2.3.0", "qs": "6.7.0", "raw-body": "2.4.0", - "type-is": "~1.6.17" + "type-is": "1.6.18" }, "dependencies": { "qs": { @@ -817,7 +816,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -827,16 +826,16 @@ "integrity": "sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -845,7 +844,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -862,7 +861,7 @@ "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", "dev": true, "requires": { - "inherits": "^2.0.1" + "inherits": "2.0.4" } }, "browserify-zlib": { @@ -871,7 +870,7 @@ "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", "dev": true, "requires": { - "pako": "~0.2.0" + "pako": "0.2.9" } }, "buffer": { @@ -880,9 +879,9 @@ "integrity": "sha1-Iw6tNEACmIZEhBqwJEr4xEu+Pvg=", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.3.1", + "ieee754": "1.1.13", + "isarray": "1.0.0" }, "dependencies": { "isarray": { @@ -917,15 +916,15 @@ "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" } }, "caller-path": { @@ -934,7 +933,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "^0.2.0" + "callsites": "0.2.0" } }, "callsites": { @@ -955,8 +954,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "2.1.1", + "map-obj": "1.0.1" } }, "caseless": { @@ -970,8 +969,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -980,11 +979,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "cheerio": { @@ -992,22 +991,22 @@ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", "requires": { - "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", - "entities": "~1.1.1", - "htmlparser2": "^3.9.1", - "lodash.assignin": "^4.0.9", - "lodash.bind": "^4.1.4", - "lodash.defaults": "^4.0.1", - "lodash.filter": "^4.4.0", - "lodash.flatten": "^4.2.0", - "lodash.foreach": "^4.3.0", - "lodash.map": "^4.4.0", - "lodash.merge": "^4.4.0", - "lodash.pick": "^4.2.1", - "lodash.reduce": "^4.4.0", - "lodash.reject": "^4.4.0", - "lodash.some": "^4.4.0" + "css-select": "1.2.0", + "dom-serializer": "0.1.1", + "entities": "1.1.2", + "htmlparser2": "3.10.1", + "lodash.assignin": "4.2.0", + "lodash.bind": "4.2.1", + "lodash.defaults": "4.2.0", + "lodash.filter": "4.6.0", + "lodash.flatten": "4.4.0", + "lodash.foreach": "4.5.0", + "lodash.map": "4.6.0", + "lodash.merge": "4.6.2", + "lodash.pick": "4.4.0", + "lodash.reduce": "4.6.0", + "lodash.reject": "4.6.0", + "lodash.some": "4.6.0" }, "dependencies": { "lodash.defaults": { @@ -1023,15 +1022,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" + "anymatch": "1.3.2", + "async-each": "1.0.3", + "fsevents": "1.2.13", + "glob-parent": "2.0.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1" }, "dependencies": { "is-extglob": { @@ -1046,7 +1045,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -1063,10 +1062,10 @@ "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -1075,7 +1074,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -1091,7 +1090,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "1.0.1" } }, "cli-width": { @@ -1106,8 +1105,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" } }, @@ -1146,8 +1145,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color": { @@ -1155,8 +1154,8 @@ "resolved": "https://registry.npmjs.org/color/-/color-0.7.3.tgz", "integrity": "sha1-qzrkvGy4z62110nEDzSuoIgQT4k=", "requires": { - "color-convert": "0.5.x", - "color-string": "0.2.x" + "color-convert": "0.5.3", + "color-string": "0.2.4" } }, "color-convert": { @@ -1174,7 +1173,7 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.2.4.tgz", "integrity": "sha1-Ih/2QjT3Gqo+E7yMfoyV883Y+Bo=", "requires": { - "color-name": "1.0.x" + "color-name": "1.0.1" } }, "color-support": { @@ -1188,7 +1187,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=", "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -1202,15 +1201,15 @@ "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", "dev": true, "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" + "commander": "2.20.3", + "detective": "4.7.1", + "glob": "5.0.15", + "graceful-fs": "4.2.4", + "iconv-lite": "0.4.24", + "mkdirp": "0.5.5", + "private": "0.1.8", + "q": "1.5.1", + "recast": "0.11.23" }, "dependencies": { "esprima": { @@ -1225,11 +1224,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "2.0.10", + "once": "1.3.3", + "path-is-absolute": "1.0.1" } }, "graceful-fs": { @@ -1245,9 +1244,9 @@ "dev": true, "requires": { "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" + "esprima": "3.1.3", + "private": "0.1.8", + "source-map": "0.5.7" } } } @@ -1269,10 +1268,10 @@ "integrity": "sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.1.1", + "inherits": "2.0.4", + "readable-stream": "2.3.7", + "typedarray": "0.0.6" }, "dependencies": { "isarray": { @@ -1287,13 +1286,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -1302,7 +1301,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -1340,7 +1339,32 @@ "integrity": "sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI=", "dev": true, "requires": { - "safe-buffer": "~5.1.1" + "safe-buffer": "5.1.2" + } + }, + "convict": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.0.0.tgz", + "integrity": "sha512-osfPkv5yjVoZqrTWBXuh/ABGpFoaJplbt0WXr0CodR4CSWt8UnzY4PSUyRz/+5BX5YUtWcToG29Kr0B6xhdIMg==", + "requires": { + "lodash.clonedeep": "4.5.0", + "yargs-parser": "18.1.3" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "5.3.1", + "decamelize": "1.2.0" + } + } } }, "cookie": { @@ -1376,9 +1400,9 @@ "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", "integrity": "sha1-LXMjf7P5cK5uvgEanmb0bbyoADY=", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.3.1", - "object-assign": "^4.1.1" + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1" }, "dependencies": { "object-assign": { @@ -1405,10 +1429,10 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", + "boolbase": "1.0.0", + "css-what": "2.1.3", "domutils": "1.5.1", - "nth-check": "~1.0.1" + "nth-check": "1.0.2" } }, "css-what": { @@ -1422,7 +1446,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "^1.0.1" + "array-find-index": "1.0.2" } }, "d": { @@ -1431,8 +1455,8 @@ "integrity": "sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o=", "dev": true, "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "es5-ext": "0.10.53", + "type": "1.2.0" } }, "d3": { @@ -1487,11 +1511,11 @@ "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", "integrity": "sha1-AMLyOAGfJPbAoZSibUGhUw/+e8Q=", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-transition": "1.1.1" } }, "d3-chord": { @@ -1499,8 +1523,8 @@ "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", "integrity": "sha1-fexPC6iG9xP+ERxF92NBT290yiw=", "requires": { - "d3-array": "1", - "d3-path": "1" + "d3-array": "1.2.1", + "d3-path": "1.0.5" } }, "d3-collection": { @@ -1518,7 +1542,7 @@ "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", "integrity": "sha1-ZSqs1QDSJkyzQjzuENtp9vWb6tM=", "requires": { - "d3-array": "^1.1.1" + "d3-array": "1.2.1" } }, "d3-dispatch": { @@ -1531,8 +1555,8 @@ "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", "integrity": "sha1-343UxQL7SQ/HRiBGqK2YpcR5KC0=", "requires": { - "d3-dispatch": "1", - "d3-selection": "1" + "d3-dispatch": "1.0.3", + "d3-selection": "1.3.0" } }, "d3-dsv": { @@ -1540,9 +1564,9 @@ "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", "integrity": "sha1-kH4kDVezhmGNxWRous/na/GXZK4=", "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" + "commander": "2.20.3", + "iconv-lite": "0.4.24", + "rw": "1.3.3" } }, "d3-ease": { @@ -1555,10 +1579,10 @@ "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", "integrity": "sha1-zr88aU8QePzD1Nr45Wey+9cNTqM=", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-timer": "1.0.7" } }, "d3-format": { @@ -1571,7 +1595,7 @@ "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", "integrity": "sha1-FX47D5FzedD3O+v/875Tf0n6c1Y=", "requires": { - "d3-array": "1" + "d3-array": "1.2.1" } }, "d3-hexbin": { @@ -1589,7 +1613,7 @@ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", "integrity": "sha1-LPOVriOBgE3wiqG/dmt/l7X2j7Y=", "requires": { - "d3-color": "1" + "d3-color": "1.0.3" } }, "d3-path": { @@ -1622,10 +1646,10 @@ "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", "integrity": "sha1-oQRKnvTsKMgkFxyTefrm15R0sZ8=", "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-dsv": "1", - "xmlhttprequest": "1" + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-dsv": "1.0.8", + "xmlhttprequest": "1.8.0" } }, "d3-sankey": { @@ -1633,9 +1657,9 @@ "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.7.1.tgz", "integrity": "sha1-0imDImj8aaf+yEgD6WwiVqYUxSE=", "requires": { - "d3-array": "1", - "d3-collection": "1", - "d3-shape": "^1.2.0" + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-shape": "1.2.0" } }, "d3-scale": { @@ -1643,13 +1667,13 @@ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", "integrity": "sha1-+pAySz6op3ZCK9BHKvqwslKglF0=", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-format": "1.2.2", + "d3-interpolate": "1.1.6", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" } }, "d3-scale-chromatic": { @@ -1657,8 +1681,8 @@ "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", "integrity": "sha1-VOMz/HghL0ObFGQftVgB3YETWpg=", "requires": { - "d3-color": "1", - "d3-interpolate": "1" + "d3-color": "1.0.3", + "d3-interpolate": "1.1.6" } }, "d3-selection": { @@ -1671,7 +1695,7 @@ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", "integrity": "sha1-RdAVOPBkuv0F6j1tLLdI/YxB93c=", "requires": { - "d3-path": "1" + "d3-path": "1.0.5" } }, "d3-time": { @@ -1684,7 +1708,7 @@ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", "integrity": "sha1-hbfN+8n/yhh/FNPEVv/aJoCBuzE=", "requires": { - "d3-time": "1" + "d3-time": "1.0.8" } }, "d3-timer": { @@ -1697,12 +1721,12 @@ "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", "integrity": "sha1-2O+Jw7hIc1sGDlSjmzKq66pCEDk=", "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" + "d3-color": "1.0.3", + "d3-dispatch": "1.0.3", + "d3-ease": "1.0.3", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-timer": "1.0.7" } }, "d3-voronoi": { @@ -1715,11 +1739,11 @@ "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", "integrity": "sha1-AvQ7PD4ttU82RYLX5KI2zMVQa2M=", "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-transition": "1.1.1" } }, "dashdash": { @@ -1727,7 +1751,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "dateformat": { @@ -1748,8 +1772,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", @@ -1767,12 +1790,12 @@ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha1-tcmMlCzv+vfLBR4k4UNKJaLmB2o=", "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "is-arguments": "1.0.4", + "is-date-object": "1.0.2", + "is-regex": "1.0.5", + "object-is": "1.1.2", + "object-keys": "1.1.1", + "regexp.prototype.flags": "1.3.0" } }, "deep-is": { @@ -1787,7 +1810,7 @@ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "^1.0.2" + "clone": "1.0.4" } }, "define-properties": { @@ -1795,7 +1818,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", "requires": { - "object-keys": "^1.0.12" + "object-keys": "1.1.1" } }, "define-property": { @@ -1804,8 +1827,8 @@ "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1814,7 +1837,7 @@ "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-data-descriptor": { @@ -1823,7 +1846,7 @@ "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-descriptor": { @@ -1832,9 +1855,9 @@ "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" } } } @@ -1851,16 +1874,16 @@ "integrity": "sha1-siYJ8sehG6ej2xFoBcE5scr/qdI=", "dev": true, "requires": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" + "alter": "0.2.0", + "ast-traverse": "0.1.1", + "breakable": "1.0.0", + "esprima-fb": "15001.1001.0-dev-harmony-fb", + "simple-fmt": "0.1.0", + "simple-is": "0.2.0", + "stringmap": "0.2.2", + "stringset": "0.2.1", + "tryor": "0.1.2", + "yargs": "3.27.0" } }, "delayed-stream": { @@ -1898,9 +1921,9 @@ "integrity": "sha1-ncXl3bzu+DJXZLlFGwK8bVQIT3U=", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" + "get-stdin": "4.0.1", + "minimist": "1.2.5", + "repeating": "1.1.3" }, "dependencies": { "repeating": { @@ -1909,7 +1932,7 @@ "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.1.0" } } } @@ -1920,8 +1943,8 @@ "integrity": "sha1-DspzFDOEQv67bWXaVMELscgrJG4=", "dev": true, "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" + "acorn": "5.7.4", + "defined": "1.0.0" } }, "doctrine": { @@ -1930,8 +1953,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "2.0.3", + "isarray": "1.0.0" }, "dependencies": { "isarray": { @@ -1947,8 +1970,8 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=", "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" + "domelementtype": "1.3.1", + "entities": "1.1.2" } }, "dom-walk": { @@ -1972,7 +1995,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", "requires": { - "domelementtype": "1" + "domelementtype": "1.3.1" } }, "domutils": { @@ -1980,8 +2003,8 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.1.1", + "domelementtype": "1.3.1" } }, "duplexer": { @@ -1996,7 +2019,7 @@ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "~1.1.9" + "readable-stream": "1.1.14" } }, "ecc-jsbn": { @@ -2004,8 +2027,8 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" } }, "ee-first": { @@ -2031,7 +2054,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "0.4.24" } }, "end-of-stream": { @@ -2040,7 +2063,7 @@ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, "requires": { - "once": "~1.3.0" + "once": "1.3.3" } }, "enhanced-resolve": { @@ -2049,9 +2072,9 @@ "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.2.0", - "tapable": "^0.1.8" + "graceful-fs": "4.2.4", + "memory-fs": "0.2.0", + "tapable": "0.1.10" }, "dependencies": { "graceful-fs": { @@ -2078,16 +2101,16 @@ "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.9.1.tgz", "integrity": "sha1-B9XOaRJBJA+4F78sSxjW5TAkDfY=", "requires": { - "cheerio": "^0.22.0", - "function.prototype.name": "^1.0.0", - "is-subset": "^0.1.1", - "lodash": "^4.17.4", - "object-is": "^1.0.1", - "object.assign": "^4.0.4", - "object.entries": "^1.0.4", - "object.values": "^1.0.4", - "prop-types": "^15.5.10", - "uuid": "^3.0.1" + "cheerio": "0.22.0", + "function.prototype.name": "1.1.2", + "is-subset": "0.1.1", + "lodash": "4.17.15", + "object-is": "1.1.2", + "object.assign": "4.1.0", + "object.entries": "1.1.1", + "object.values": "1.1.1", + "prop-types": "15.7.2", + "uuid": "3.4.0" }, "dependencies": { "lodash": { @@ -2103,7 +2126,7 @@ "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "dev": true, "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "error-ex": { @@ -2112,7 +2135,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "error-stack-parser": { @@ -2121,7 +2144,7 @@ "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", "dev": true, "requires": { - "stackframe": "^0.3.1" + "stackframe": "0.3.1" } }, "es-abstract": { @@ -2129,17 +2152,17 @@ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", "integrity": "sha1-2MnR1myJgfuSAOIlHXme7pJ3Suk=", "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "es-to-primitive": "1.2.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.1", + "is-callable": "1.1.5", + "is-regex": "1.0.5", + "object-inspect": "1.7.0", + "object-keys": "1.1.1", + "object.assign": "4.1.0", + "string.prototype.trimleft": "2.1.2", + "string.prototype.trimright": "2.1.2" } }, "es-to-primitive": { @@ -2147,9 +2170,9 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "1.1.5", + "is-date-object": "1.0.2", + "is-symbol": "1.0.3" } }, "es5-ext": { @@ -2158,9 +2181,9 @@ "integrity": "sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE=", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.3", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -2169,9 +2192,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.1", + "es5-ext": "0.10.53", + "es6-symbol": "3.1.3" } }, "es6-map": { @@ -2180,12 +2203,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.1", + "es5-ext": "0.10.53", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.3", + "event-emitter": "0.3.5" } }, "es6-promise": { @@ -2200,11 +2223,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.1", + "es5-ext": "0.10.53", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" }, "dependencies": { "es6-symbol": { @@ -2213,8 +2236,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.1", + "es5-ext": "0.10.53" } } } @@ -2225,8 +2248,8 @@ "integrity": "sha1-utXTwbzawoJp9MszHkMceKxwXRg=", "dev": true, "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" + "d": "1.0.1", + "ext": "1.4.0" } }, "es6-weak-map": { @@ -2235,10 +2258,10 @@ "integrity": "sha1-ttofFswswNm+Q+a9v8Xn383zHVM=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "d": "1.0.1", + "es5-ext": "0.10.53", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.3" } }, "escape-html": { @@ -2259,10 +2282,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.3", + "esrecurse": "4.2.1", + "estraverse": "4.3.0" } }, "eslint": { @@ -2271,39 +2294,39 @@ "integrity": "sha1-IvyfeA6lvKEwb6srbTM2sPpix1Q=", "dev": true, "requires": { - "chalk": "^1.1.3", - "concat-stream": "^1.4.6", - "debug": "^2.1.1", - "doctrine": "^1.2.2", - "escope": "^3.6.0", - "espree": "^3.1.6", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "glob": "^7.0.3", - "globals": "^9.2.0", - "ignore": "^3.1.5", - "imurmurhash": "^0.1.4", - "inquirer": "^0.12.0", - "is-my-json-valid": "^2.10.0", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.5.1", - "json-stable-stringify": "^1.0.0", - "levn": "^0.3.0", - "lodash": "^4.0.0", - "mkdirp": "^0.5.0", - "natural-compare": "^1.4.0", - "optionator": "^0.8.1", - "path-is-inside": "^1.0.1", - "pluralize": "^1.2.1", - "progress": "^1.1.8", - "require-uncached": "^1.0.2", - "shelljs": "^0.6.0", - "strip-bom": "^3.0.0", - "strip-json-comments": "~1.0.1", - "table": "^3.7.8", - "text-table": "~0.2.0", - "user-home": "^2.0.0" + "chalk": "1.1.3", + "concat-stream": "1.6.2", + "debug": "2.6.9", + "doctrine": "1.5.0", + "escope": "3.6.0", + "espree": "3.5.4", + "estraverse": "4.3.0", + "esutils": "2.0.3", + "file-entry-cache": "2.0.0", + "glob": "7.1.6", + "globals": "9.18.0", + "ignore": "3.3.10", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.20.0", + "is-resolvable": "1.1.0", + "js-yaml": "3.14.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.21", + "mkdirp": "0.5.5", + "natural-compare": "1.4.0", + "optionator": "0.8.3", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.6.1", + "strip-bom": "3.0.0", + "strip-json-comments": "1.0.4", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" }, "dependencies": { "globals": { @@ -2324,7 +2347,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "os-homedir": "1.0.2" } } } @@ -2353,10 +2376,15 @@ "integrity": "sha1-sPRHGHyKi+2US4FaZgvd9d610ac=", "dev": true, "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" + "acorn": "5.7.4", + "acorn-jsx": "3.0.1" } }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, "esprima-fb": { "version": "15001.1001.0-dev-harmony-fb", "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", @@ -2369,7 +2397,7 @@ "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "4.3.0" } }, "estraverse": { @@ -2396,8 +2424,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.1", + "es5-ext": "0.10.53" } }, "event-stream": { @@ -2406,13 +2434,13 @@ "integrity": "sha1-A4u7LqnqkDhbJvvBhU0LU58qvqM=", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.0.3", + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.0.7", "pause-stream": "0.0.11", - "split": "0.2", - "stream-combiner": "~0.0.3", - "through": "~2.3.1" + "split": "0.2.10", + "stream-combiner": "0.0.4", + "through": "2.3.8" } }, "events": { @@ -2438,13 +2466,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2453,7 +2481,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -2462,7 +2490,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2473,7 +2501,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" }, "dependencies": { "fill-range": { @@ -2482,11 +2510,11 @@ "integrity": "sha1-6x53OrsFbc2N8r/favWbizqTZWU=", "dev": true, "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.1", + "repeat-element": "1.1.3", + "repeat-string": "1.6.1" } }, "is-number": { @@ -2495,7 +2523,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "isarray": { @@ -2519,7 +2547,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2530,7 +2558,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.3" } }, "express": { @@ -2539,36 +2567,36 @@ "integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=", "dev": true, "requires": { - "accepts": "~1.3.7", + "accepts": "1.3.7", "array-flatten": "1.1.1", "body-parser": "1.19.0", "content-disposition": "0.5.3", - "content-type": "~1.0.4", + "content-type": "1.0.4", "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", + "proxy-addr": "2.0.6", "qs": "6.7.0", - "range-parser": "~1.2.1", + "range-parser": "1.2.1", "safe-buffer": "5.1.2", "send": "0.17.1", "serve-static": "1.14.1", "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", + "statuses": "1.5.0", + "type-is": "1.6.18", "utils-merge": "1.0.1", - "vary": "~1.1.2" + "vary": "1.1.2" }, "dependencies": { "qs": { @@ -2585,7 +2613,7 @@ "integrity": "sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ=", "dev": true, "requires": { - "type": "^2.0.0" + "type": "2.0.0" }, "dependencies": { "type": { @@ -2607,8 +2635,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -2617,7 +2645,7 @@ "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -2628,14 +2656,14 @@ "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2644,7 +2672,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -2653,7 +2681,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -2662,7 +2690,7 @@ "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-data-descriptor": { @@ -2671,7 +2699,7 @@ "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-descriptor": { @@ -2680,9 +2708,9 @@ "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" } } } @@ -2698,10 +2726,10 @@ "integrity": "sha1-28GRVPVYaQFQojlToK29A1vkX8c=", "dev": true, "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "parse-node-version": "1.0.1", + "time-stamp": "1.1.0" } }, "fast-deep-equal": { @@ -2725,13 +2753,13 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.18" + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.28" }, "dependencies": { "object-assign": { @@ -2747,8 +2775,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" }, "dependencies": { "object-assign": { @@ -2765,8 +2793,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" + "flat-cache": "1.3.4", + "object-assign": "4.1.1" }, "dependencies": { "object-assign": { @@ -2796,10 +2824,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -2808,7 +2836,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2820,12 +2848,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "statuses": "1.5.0", + "unpipe": "1.0.0" } }, "find-index": { @@ -2840,8 +2868,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" } }, "findup-sync": { @@ -2850,10 +2878,10 @@ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "detect-file": "1.0.0", + "is-glob": "3.1.0", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" } }, "fined": { @@ -2862,11 +2890,11 @@ "integrity": "sha1-0AvszxqitHXRbUI7Aji3E6LEo3s=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" } }, "first-chunk-stream": { @@ -2887,10 +2915,10 @@ "integrity": "sha1-LC73dSXMKSkAff/6HdMUqpyd7m8=", "dev": true, "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" + "circular-json": "0.3.3", + "graceful-fs": "4.2.4", + "rimraf": "2.6.3", + "write": "0.2.1" }, "dependencies": { "graceful-fs": { @@ -2905,7 +2933,7 @@ "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "7.1.6" } } } @@ -2922,7 +2950,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "forever-agent": { @@ -2935,9 +2963,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.27" } }, "forwarded": { @@ -2952,7 +2980,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "fresh": { @@ -2985,8 +3013,8 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" + "bindings": "1.5.0", + "nan": "2.14.1" } }, "function-bind": { @@ -2999,9 +3027,9 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.2.tgz", "integrity": "sha1-XN9518BdtAFZHf3oPjtwxRI+mkU=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "functions-have-names": "^1.2.0" + "define-properties": "1.1.3", + "es-abstract": "1.17.5", + "functions-have-names": "1.2.1" } }, "functions-have-names": { @@ -3015,7 +3043,7 @@ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", "dev": true, "requires": { - "globule": "~0.1.0" + "globule": "0.1.0" } }, "generate-function": { @@ -3024,7 +3052,7 @@ "integrity": "sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58=", "dev": true, "requires": { - "is-property": "^1.0.2" + "is-property": "1.0.2" } }, "generate-object-property": { @@ -3033,7 +3061,7 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "^1.0.0" + "is-property": "1.0.2" } }, "get-stdin": { @@ -3053,7 +3081,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -3062,12 +3090,12 @@ "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.3.3", + "path-is-absolute": "1.0.1" }, "dependencies": { "minimatch": { @@ -3076,7 +3104,7 @@ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -3087,8 +3115,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" }, "dependencies": { "is-extglob": { @@ -3103,7 +3131,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -3114,7 +3142,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" }, "dependencies": { "is-extglob": { @@ -3129,7 +3157,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -3140,12 +3168,12 @@ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", "dev": true, "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" }, "dependencies": { "glob": { @@ -3154,10 +3182,10 @@ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "2.0.10", + "once": "1.3.3" } }, "readable-stream": { @@ -3166,10 +3194,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "through2": { @@ -3178,8 +3206,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "1.0.34", + "xtend": "4.0.2" } } } @@ -3190,7 +3218,7 @@ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", "dev": true, "requires": { - "gaze": "^0.5.1" + "gaze": "0.5.2" } }, "glob2base": { @@ -3199,7 +3227,7 @@ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", "dev": true, "requires": { - "find-index": "^0.1.1" + "find-index": "0.1.1" } }, "global": { @@ -3207,8 +3235,8 @@ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", "integrity": "sha1-PnsQUXkAajI+1xqvyj6cV6XMZAY=", "requires": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "min-document": "2.19.0", + "process": "0.11.10" } }, "global-modules": { @@ -3217,9 +3245,9 @@ "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-prefix": { @@ -3228,11 +3256,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.3", + "ini": "1.3.8", + "is-windows": "1.0.2", + "which": "1.3.1" } }, "globals": { @@ -3247,9 +3275,9 @@ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "dev": true, "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" }, "dependencies": { "glob": { @@ -3258,9 +3286,9 @@ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "dev": true, "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" } }, "graceful-fs": { @@ -3287,8 +3315,8 @@ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } } } @@ -3299,7 +3327,7 @@ "integrity": "sha1-LX3XAr7aIus7/634gGltpthGMT8=", "dev": true, "requires": { - "sparkles": "^1.0.0" + "sparkles": "1.0.1" } }, "graceful-fs": { @@ -3308,7 +3336,7 @@ "integrity": "sha1-ADSUfOntaV7IqwuFS8kZ6Csf+u8=", "dev": true, "requires": { - "natives": "^1.1.3" + "natives": "1.1.6" } }, "gulp": { @@ -3317,19 +3345,19 @@ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "dev": true, "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.2.0", + "liftoff": "2.5.0", + "minimist": "1.2.5", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" } }, "gulp-gzip": { @@ -3338,8 +3366,8 @@ "integrity": "sha1-HrYkpKp1vtJ7vwxZpDsr6HLVeRQ=", "dev": true, "requires": { - "clone": "~0.1.11", - "event-stream": "~3.0.16" + "clone": "0.1.19", + "event-stream": "3.0.20" }, "dependencies": { "clone": { @@ -3356,18 +3384,17 @@ "integrity": "sha1-VSxBIE5RAXZNenr0NqaWpcJ1pJM=", "dev": true, "requires": { - "map-stream": ">=0.0.4" + "map-stream": "0.0.7" } }, "gulp-s3": { "version": "github:pol-is/gulp-s3#847e2b372204b4ceeccb0e9b567f28ff00e7fa1d", - "from": "github:pol-is/gulp-s3#master", "dev": true, "requires": { - "async": "^3.2.1", - "event-stream": "*", - "gulp-util": "~2.2.6", - "knox": "^0.9.2" + "async": "3.2.1", + "event-stream": "3.0.20", + "gulp-util": "2.2.20", + "knox": "0.9.2" }, "dependencies": { "ansi-regex": { @@ -3388,11 +3415,11 @@ "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", "dev": true, "requires": { - "ansi-styles": "^1.1.0", - "escape-string-regexp": "^1.0.0", - "has-ansi": "^0.1.0", - "strip-ansi": "^0.3.0", - "supports-color": "^0.2.0" + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" } }, "dateformat": { @@ -3401,8 +3428,8 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" + "get-stdin": "4.0.1", + "meow": "3.7.0" } }, "debug": { @@ -3420,14 +3447,14 @@ "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=", "dev": true, "requires": { - "chalk": "^0.5.0", - "dateformat": "^1.0.7-1.2.3", - "lodash._reinterpolate": "^2.4.1", - "lodash.template": "^2.4.1", - "minimist": "^0.2.0", - "multipipe": "^0.1.0", - "through2": "^0.5.0", - "vinyl": "^0.2.1" + "chalk": "0.5.1", + "dateformat": "1.0.12", + "lodash._reinterpolate": "2.4.1", + "lodash.template": "2.4.1", + "minimist": "0.2.1", + "multipipe": "0.1.2", + "through2": "0.5.1", + "vinyl": "0.2.3" } }, "has-ansi": { @@ -3436,7 +3463,7 @@ "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", "dev": true, "requires": { - "ansi-regex": "^0.2.0" + "ansi-regex": "0.2.1" } }, "knox": { @@ -3445,11 +3472,11 @@ "integrity": "sha1-NzZZNmniTwJP2vcjtqHcSv2DmnE=", "dev": true, "requires": { - "debug": "^1.0.2", - "mime": "*", - "once": "^1.3.0", - "stream-counter": "^1.0.0", - "xml2js": "^0.4.4" + "debug": "1.0.5", + "mime": "1.6.0", + "once": "1.3.3", + "stream-counter": "1.0.0", + "xml2js": "0.4.23" } }, "lodash._reinterpolate": { @@ -3464,9 +3491,9 @@ "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=", "dev": true, "requires": { - "lodash._escapehtmlchar": "~2.4.1", - "lodash._reunescapedhtml": "~2.4.1", - "lodash.keys": "~2.4.1" + "lodash._escapehtmlchar": "2.4.1", + "lodash._reunescapedhtml": "2.4.1", + "lodash.keys": "2.4.1" } }, "lodash.keys": { @@ -3475,9 +3502,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" } }, "lodash.template": { @@ -3486,13 +3513,13 @@ "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=", "dev": true, "requires": { - "lodash._escapestringchar": "~2.4.1", - "lodash._reinterpolate": "~2.4.1", - "lodash.defaults": "~2.4.1", - "lodash.escape": "~2.4.1", - "lodash.keys": "~2.4.1", - "lodash.templatesettings": "~2.4.1", - "lodash.values": "~2.4.1" + "lodash._escapestringchar": "2.4.1", + "lodash._reinterpolate": "2.4.1", + "lodash.defaults": "2.4.1", + "lodash.escape": "2.4.1", + "lodash.keys": "2.4.1", + "lodash.templatesettings": "2.4.1", + "lodash.values": "2.4.1" } }, "lodash.templatesettings": { @@ -3501,8 +3528,8 @@ "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=", "dev": true, "requires": { - "lodash._reinterpolate": "~2.4.1", - "lodash.escape": "~2.4.1" + "lodash._reinterpolate": "2.4.1", + "lodash.escape": "2.4.1" } }, "minimist": { @@ -3517,10 +3544,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "strip-ansi": { @@ -3529,7 +3556,7 @@ "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", "dev": true, "requires": { - "ansi-regex": "^0.2.1" + "ansi-regex": "0.2.1" } }, "supports-color": { @@ -3544,8 +3571,8 @@ "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", "dev": true, "requires": { - "readable-stream": "~1.0.17", - "xtend": "~3.0.0" + "readable-stream": "1.0.34", + "xtend": "3.0.0" } }, "vinyl": { @@ -3554,7 +3581,7 @@ "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=", "dev": true, "requires": { - "clone-stats": "~0.0.1" + "clone-stats": "0.0.1" } }, "xtend": { @@ -3571,9 +3598,9 @@ "integrity": "sha1-NhXJtZt8oUK/qEDFCqqZdayOeBY=", "dev": true, "requires": { - "debug": "~2.2.0", - "scp2": "~0.2.2", - "through2": "~2.0.0" + "debug": "2.2.0", + "scp2": "0.2.2", + "through2": "2.0.5" }, "dependencies": { "asn1": { @@ -3603,10 +3630,10 @@ "integrity": "sha1-aVxQvdTi+1xdNwsJHziNNwfikac=", "dev": true, "requires": { - "graceful-fs": "^3.0.2", - "inherits": "2", - "minimatch": "^1.0.0", - "once": "^1.3.0" + "graceful-fs": "3.0.12", + "inherits": "2.0.4", + "minimatch": "1.0.0", + "once": "1.3.3" } }, "lodash": { @@ -3621,8 +3648,8 @@ "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } }, "ms": { @@ -3637,10 +3664,10 @@ "integrity": "sha1-a2eYPCA1fO/QfwFlABoW1xDZEHg=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "scp2": { @@ -3649,10 +3676,10 @@ "integrity": "sha1-A6caLOV6LfWtYF32dYxgXzifv1c=", "dev": true, "requires": { - "async": "~0.9.0", - "glob": "~4.0.6", - "lodash": "~2.4.1", - "ssh2": "~0.3.6" + "async": "0.9.2", + "glob": "4.0.6", + "lodash": "2.4.2", + "ssh2": "0.3.6" } }, "ssh2": { @@ -3674,24 +3701,24 @@ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.3", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.5", + "multipipe": "0.1.2", + "object-assign": "3.0.0", "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" + "through2": "2.0.5", + "vinyl": "0.5.3" } }, "gulplog": { @@ -3700,7 +3727,7 @@ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "glogg": "^1.0.0" + "glogg": "1.0.2" } }, "har-schema": { @@ -3713,8 +3740,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha1-HvievT5JllV2de7ZiTEQ3DUPoIA=", "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "ajv": "6.12.2", + "har-schema": "2.0.0" } }, "has": { @@ -3722,7 +3749,7 @@ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -3731,7 +3758,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -3746,7 +3773,7 @@ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "dev": true, "requires": { - "sparkles": "^1.0.0" + "sparkles": "1.0.1" } }, "has-symbols": { @@ -3760,9 +3787,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -3771,8 +3798,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -3781,7 +3808,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3791,10 +3818,10 @@ "resolved": "https://registry.npmjs.org/history/-/history-1.17.0.tgz", "integrity": "sha1-xUg8qlodH+oAoafY0ZuHQBZxHSk=", "requires": { - "deep-equal": "^1.0.0", - "invariant": "^2.0.0", - "query-string": "^3.0.0", - "warning": "^2.0.0" + "deep-equal": "1.1.1", + "invariant": "2.2.4", + "query-string": "3.0.3", + "warning": "2.1.0" }, "dependencies": { "query-string": { @@ -3802,7 +3829,7 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz", "integrity": "sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=", "requires": { - "strict-uri-encode": "^1.0.0" + "strict-uri-encode": "1.1.0" } } } @@ -3817,7 +3844,7 @@ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha1-7OCsr3HWLClpwuxZ/v9CpLGoW0U=", "requires": { - "react-is": "^16.7.0" + "react-is": "16.13.1" } }, "home-or-tmp": { @@ -3826,8 +3853,8 @@ "integrity": "sha1-S58eQIAMPlDGwn94FnavzOcfOYU=", "dev": true, "requires": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" + "os-tmpdir": "1.0.2", + "user-home": "1.1.1" } }, "homedir-polyfill": { @@ -3836,7 +3863,7 @@ "integrity": "sha1-dDKYzvTlrz4ZQWH7rcwhUdOgWOg=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "parse-passwd": "1.0.0" } }, "hosted-git-info": { @@ -3856,12 +3883,12 @@ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "1.3.1", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "3.6.0" }, "dependencies": { "readable-stream": { @@ -3869,9 +3896,9 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha1-M3u9o63AcGvT4CRCaihtS0sskZg=", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "2.0.4", + "string_decoder": "1.3.0", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -3884,7 +3911,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=", "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "5.2.0" } } } @@ -3895,10 +3922,10 @@ "integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", + "statuses": "1.5.0", "toidentifier": "1.0.0" }, "dependencies": { @@ -3915,9 +3942,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.16.1" } }, "https-browserify": { @@ -3936,7 +3963,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "ieee754": { @@ -3963,7 +3990,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "^2.0.0" + "repeating": "2.0.1" } }, "indexof": { @@ -3977,8 +4004,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.3.3", + "wrappy": "1.0.2" } }, "inherits": { @@ -4002,8 +4029,8 @@ "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-1.0.4.tgz", "integrity": "sha1-hJ9lc3Olz72BQc/dsBPfb2jG3zk=", "requires": { - "bowser": "^1.0.0", - "inline-style-prefix-all": "^2.0.2" + "bowser": "1.9.4", + "inline-style-prefix-all": "2.0.2" } }, "inquirer": { @@ -4012,19 +4039,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", - "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.1", + "figures": "1.7.0", + "lodash": "4.17.21", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" } }, "interpret": { @@ -4038,7 +4065,7 @@ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.4.0" } }, "invert-kv": { @@ -4059,8 +4086,8 @@ "integrity": "sha1-OV4a6EsR8mrReV5zwXN45IowFXY=", "dev": true, "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "is-relative": "1.0.0", + "is-windows": "1.0.2" } }, "is-accessor-descriptor": { @@ -4069,7 +4096,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4078,7 +4105,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4100,7 +4127,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.13.1" } }, "is-buffer": { @@ -4120,7 +4147,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4129,7 +4156,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4145,9 +4172,9 @@ "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -4170,7 +4197,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -4197,7 +4224,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-glob": { @@ -4206,7 +4233,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } }, "is-integer": { @@ -4215,7 +4242,7 @@ "integrity": "sha1-a96Bqs3feLZZtmKdYpytxRqIbVw=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.1.0" } }, "is-my-ip-valid": { @@ -4230,11 +4257,11 @@ "integrity": "sha1-E0Wm/KPo2u/BDQ+ncGf1TO2v1Zo=", "dev": true, "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" + "generate-function": "2.3.1", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.2" } }, "is-number": { @@ -4243,7 +4270,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4252,7 +4279,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4263,7 +4290,7 @@ "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "is-posix-bracket": { @@ -4289,7 +4316,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", "requires": { - "has": "^1.0.3" + "has": "1.0.3" } }, "is-relative": { @@ -4298,7 +4325,7 @@ "integrity": "sha1-obtpNc6MXboei5dUubLcwCDiJg0=", "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "is-unc-path": "1.0.0" } }, "is-resolvable": { @@ -4322,7 +4349,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "1.0.1" } }, "is-typedarray": { @@ -4336,7 +4363,7 @@ "integrity": "sha1-1zHoiY7QkKEsNSrS6u1Qla0yLJ0=", "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "unc-path-regex": "0.1.2" } }, "is-utf8": { @@ -4374,8 +4401,8 @@ "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" + "node-fetch": "1.7.3", + "whatwg-fetch": "0.10.1" } }, "isstream": { @@ -4394,21 +4421,12 @@ "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", - "dev": true, + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - } + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "jsbn": { @@ -4444,7 +4462,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stringify-safe": { @@ -4489,14 +4507,13 @@ }, "knox": { "version": "git://github.com/caremerge/knox.git#b1e031c209b3c17cab622a458e87728c1ee88cbd", - "from": "git://github.com/caremerge/knox.git#b1e031c209b3c17cab622a458e87728c1ee88cbd", "dev": true, "requires": { - "debug": "^2.2.0", + "debug": "2.6.9", "mime": "1.4.0", - "once": "^1.3.0", - "stream-counter": "^1.0.0", - "xml2js": "^0.4.4" + "once": "1.3.3", + "stream-counter": "1.0.0", + "xml2js": "0.4.23" }, "dependencies": { "mime": { @@ -4519,7 +4536,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "leven": { @@ -4534,8 +4551,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "prelude-ls": "1.1.2", + "type-check": "0.3.2" } }, "liftoff": { @@ -4544,14 +4561,14 @@ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "extend": "3.0.2", + "findup-sync": "2.0.0", + "fined": "1.2.0", + "flagged-respawn": "1.0.1", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.17.0" } }, "load-json-file": { @@ -4560,11 +4577,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "4.2.8", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" }, "dependencies": { "graceful-fs": { @@ -4579,7 +4596,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } } } @@ -4590,10 +4607,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" }, "dependencies": { "json5": { @@ -4626,8 +4643,8 @@ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" } }, "lodash._basecopy": { @@ -4642,8 +4659,8 @@ "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", "dev": true, "requires": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash._basefor": { @@ -4676,9 +4693,9 @@ "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", "dev": true, "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" } }, "lodash._escapehtmlchar": { @@ -4687,7 +4704,7 @@ "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=", "dev": true, "requires": { - "lodash._htmlescapes": "~2.4.1" + "lodash._htmlescapes": "2.4.1" } }, "lodash._escapestringchar": { @@ -4738,8 +4755,8 @@ "integrity": "sha1-/2G5oBens699MObFPeKK+hm4dQo=", "dev": true, "requires": { - "lodash._basefor": "^3.0.0", - "lodash.keysin": "^3.0.0" + "lodash._basefor": "3.0.3", + "lodash.keysin": "3.0.8" } }, "lodash._reescape": { @@ -4766,8 +4783,8 @@ "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=", "dev": true, "requires": { - "lodash._htmlescapes": "~2.4.1", - "lodash.keys": "~2.4.1" + "lodash._htmlescapes": "2.4.1", + "lodash.keys": "2.4.1" }, "dependencies": { "lodash.keys": { @@ -4776,9 +4793,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" } } } @@ -4795,7 +4812,7 @@ "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1" + "lodash._objecttypes": "2.4.1" } }, "lodash.assign": { @@ -4804,9 +4821,9 @@ "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", "dev": true, "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" } }, "lodash.assignin": { @@ -4819,6 +4836,11 @@ "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -4830,8 +4852,8 @@ "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1", - "lodash.keys": "~2.4.1" + "lodash._objecttypes": "2.4.1", + "lodash.keys": "2.4.1" }, "dependencies": { "lodash.keys": { @@ -4840,9 +4862,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" } } } @@ -4853,7 +4875,7 @@ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { - "lodash._root": "^3.0.0" + "lodash._root": "3.0.1" } }, "lodash.filter": { @@ -4894,7 +4916,7 @@ "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=", "dev": true, "requires": { - "lodash._objecttypes": "~2.4.1" + "lodash._objecttypes": "2.4.1" } }, "lodash.keys": { @@ -4903,9 +4925,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.keysin": { @@ -4914,8 +4936,8 @@ "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", "dev": true, "requires": { - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.map": { @@ -4960,15 +4982,15 @@ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" } }, "lodash.templatesettings": { @@ -4977,8 +4999,8 @@ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" } }, "lodash.values": { @@ -4987,7 +5009,7 @@ "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=", "dev": true, "requires": { - "lodash.keys": "~2.4.1" + "lodash.keys": "2.4.1" }, "dependencies": { "lodash.keys": { @@ -4996,9 +5018,9 @@ "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=", "dev": true, "requires": { - "lodash._isnative": "~2.4.1", - "lodash._shimkeys": "~2.4.1", - "lodash.isobject": "~2.4.1" + "lodash._isnative": "2.4.1", + "lodash._shimkeys": "2.4.1", + "lodash.isobject": "2.4.1" } } } @@ -5014,7 +5036,7 @@ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "js-tokens": "4.0.0" } }, "loud-rejection": { @@ -5023,8 +5045,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.3" } }, "lower-case": { @@ -5044,7 +5066,7 @@ "integrity": "sha1-KbM/MSqo9UfEpeSQ9Wr87JkTOtY=", "dev": true, "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.3" } }, "map-cache": { @@ -5071,7 +5093,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "math-random": { @@ -5092,8 +5114,8 @@ "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.7", + "readable-stream": "2.3.7" }, "dependencies": { "isarray": { @@ -5108,13 +5130,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -5123,7 +5145,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -5134,16 +5156,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.5", + "normalize-package-data": "2.5.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" }, "dependencies": { "object-assign": { @@ -5172,19 +5194,19 @@ "integrity": "sha1-cIWbyVyYQJUvNZoGij/En57PrCM=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "mime": { @@ -5211,7 +5233,7 @@ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "requires": { - "dom-walk": "^0.1.0" + "dom-walk": "0.1.2" } }, "minimatch": { @@ -5220,7 +5242,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -5235,8 +5257,8 @@ "integrity": "sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -5245,7 +5267,7 @@ "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -5256,7 +5278,7 @@ "integrity": "sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8=", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "1.2.5" } }, "moment": { @@ -5303,17 +5325,17 @@ "integrity": "sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.3", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } }, "natives": { @@ -5345,7 +5367,7 @@ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "node-fetch": { @@ -5353,8 +5375,8 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", "integrity": "sha1-mA9vcthSEaU0fGsrwYxbhMPrR+8=", "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" + "encoding": "0.1.12", + "is-stream": "1.1.0" } }, "node-libs-browser": { @@ -5363,28 +5385,28 @@ "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.1.4", - "buffer": "^4.9.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", + "assert": "1.5.0", + "browserify-zlib": "0.1.4", + "buffer": "4.9.2", + "console-browserify": "1.2.0", + "constants-browserify": "1.0.0", "crypto-browserify": "3.3.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", + "domain-browser": "1.2.0", + "events": "1.1.1", "https-browserify": "0.0.1", - "os-browserify": "^0.2.0", + "os-browserify": "0.2.1", "path-browserify": "0.0.0", - "process": "^0.11.0", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.0.5", - "stream-browserify": "^2.0.1", - "stream-http": "^2.3.1", - "string_decoder": "^0.10.25", - "timers-browserify": "^2.0.2", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.7", + "stream-browserify": "2.0.2", + "stream-http": "2.8.3", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.11", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", + "url": "0.11.0", + "util": "0.10.4", "vm-browserify": "0.0.4" }, "dependencies": { @@ -5406,13 +5428,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" }, "dependencies": { "string_decoder": { @@ -5421,7 +5443,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -5434,10 +5456,10 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.8.9", + "resolve": "1.17.0", + "semver": "4.3.6", + "validate-npm-package-license": "3.0.4" } }, "normalize-path": { @@ -5446,7 +5468,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "nth-check": { @@ -5454,7 +5476,7 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", "requires": { - "boolbase": "~1.0.0" + "boolbase": "1.0.0" } }, "number-is-nan": { @@ -5479,9 +5501,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -5490,7 +5512,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -5499,7 +5521,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -5514,8 +5536,8 @@ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", "integrity": "sha1-xdLof/nhGfeLegiEQVGeLuwVc7Y=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "define-properties": "1.1.3", + "es-abstract": "1.17.5" } }, "object-keys": { @@ -5529,7 +5551,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.assign": { @@ -5537,10 +5559,10 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "define-properties": "1.1.3", + "function-bind": "1.1.1", + "has-symbols": "1.0.1", + "object-keys": "1.1.1" } }, "object.defaults": { @@ -5549,10 +5571,10 @@ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" } }, "object.entries": { @@ -5560,10 +5582,10 @@ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", "integrity": "sha1-7hzwQVPeArsJP+wzaDkA9XzlOZs=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "define-properties": "1.1.3", + "es-abstract": "1.17.5", + "function-bind": "1.1.1", + "has": "1.0.3" } }, "object.map": { @@ -5572,8 +5594,8 @@ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "for-own": "1.0.0", + "make-iterator": "1.0.1" } }, "object.omit": { @@ -5582,8 +5604,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" }, "dependencies": { "for-own": { @@ -5592,7 +5614,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } } } @@ -5603,7 +5625,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "object.values": { @@ -5611,10 +5633,10 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", "integrity": "sha1-aKmezeNWt+kpWjxeDOMdyMlT3l4=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "define-properties": "1.1.3", + "es-abstract": "1.17.5", + "function-bind": "1.1.1", + "has": "1.0.3" } }, "on-finished": { @@ -5631,7 +5653,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "onetime": { @@ -5646,8 +5668,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "minimist": "0.0.10", + "wordwrap": "0.0.2" }, "dependencies": { "minimist": { @@ -5664,12 +5686,12 @@ "integrity": "sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU=", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "word-wrap": "1.2.3" } }, "orchestrator": { @@ -5678,9 +5700,9 @@ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", "dev": true, "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.1" } }, "ordered-read-streams": { @@ -5707,7 +5729,7 @@ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, "requires": { - "lcid": "^1.0.0" + "lcid": "1.0.0" } }, "os-tmpdir": { @@ -5722,9 +5744,9 @@ "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", "dev": true, "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" + "graceful-fs": "4.2.4", + "mkdirp": "0.5.5", + "object-assign": "4.1.1" }, "dependencies": { "graceful-fs": { @@ -5753,9 +5775,9 @@ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" } }, "parse-glob": { @@ -5764,10 +5786,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" }, "dependencies": { "is-extglob": { @@ -5782,7 +5804,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -5793,7 +5815,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.2" } }, "parse-node-version": { @@ -5832,7 +5854,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "pinkie-promise": "2.0.1" } }, "path-is-absolute": { @@ -5858,7 +5880,7 @@ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "^0.1.0" + "path-root-regex": "0.1.2" } }, "path-root-regex": { @@ -5879,9 +5901,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "graceful-fs": "4.2.8", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" }, "dependencies": { "graceful-fs": { @@ -5898,7 +5920,7 @@ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "through": "~2.3" + "through": "2.3.8" } }, "pbkdf2-compat": { @@ -5930,7 +5952,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "pinkie": "2.0.4" } }, "pluralize": { @@ -5991,7 +6013,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", "integrity": "sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078=", "requires": { - "asap": "~2.0.3" + "asap": "2.0.6" } }, "prop-types": { @@ -5999,9 +6021,9 @@ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", "integrity": "sha1-UsQedbjIfnK52TYOAga5ncv/psU=", "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.8.1" + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "react-is": "16.13.1" }, "dependencies": { "object-assign": { @@ -6017,7 +6039,7 @@ "integrity": "sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8=", "dev": true, "requires": { - "forwarded": "~0.1.2", + "forwarded": "0.1.2", "ipaddr.js": "1.9.1" } }, @@ -6053,8 +6075,8 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" }, "dependencies": { "object-assign": { @@ -6081,10 +6103,10 @@ "resolved": "https://registry.npmjs.org/radium/-/radium-0.18.1.tgz", "integrity": "sha1-oB25tMbmNk3jsC1Zdq3yjQuYNR0=", "requires": { - "array-find": "^1.0.0", - "exenv": "^1.2.0", - "inline-style-prefixer": "^1.0.3", - "rimraf": "^2.4.0" + "array-find": "1.0.0", + "exenv": "1.2.2", + "inline-style-prefixer": "1.0.4", + "rimraf": "2.7.1" } }, "raf": { @@ -6092,7 +6114,7 @@ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", "integrity": "sha1-B0LpmkplUvRF1z4+4DKK8P8e3jk=", "requires": { - "performance-now": "^2.1.0" + "performance-now": "2.1.0" }, "dependencies": { "performance-now": { @@ -6108,9 +6130,9 @@ "integrity": "sha1-t3bvxZN1mE42xTey9RofCv8Noe0=", "dev": true, "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-number": "4.0.0", + "kind-of": "6.0.3", + "math-random": "1.0.4" }, "dependencies": { "is-number": { @@ -6144,9 +6166,9 @@ "resolved": "https://registry.npmjs.org/react/-/react-15.3.1.tgz", "integrity": "sha1-94UB7YwuxubjHDIjZS6X8TadK9Y=", "requires": { - "fbjs": "^0.8.4", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0" + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1" }, "dependencies": { "object-assign": { @@ -6166,9 +6188,9 @@ "resolved": "https://registry.npmjs.org/react-autosuggest/-/react-autosuggest-3.9.0.tgz", "integrity": "sha1-KoAK/Gnea1WAFUlC5XYWiy65T7k=", "requires": { - "react-autowhatever": "^4.1.0", - "react-redux": "^4.4.5", - "redux": "^3.5.1" + "react-autowhatever": "4.3.0", + "react-redux": "4.4.10", + "redux": "3.7.2" } }, "react-autowhatever": { @@ -6176,8 +6198,8 @@ "resolved": "https://registry.npmjs.org/react-autowhatever/-/react-autowhatever-4.3.0.tgz", "integrity": "sha1-vxkZcm2dSMMKrr3kgnTrDupept8=", "requires": { - "react-themeable": "^1.0.1", - "section-iterator": "^2.0.0" + "react-themeable": "1.1.0", + "section-iterator": "2.0.0" } }, "react-codemirror": { @@ -6185,9 +6207,9 @@ "resolved": "https://registry.npmjs.org/react-codemirror/-/react-codemirror-0.2.6.tgz", "integrity": "sha1-5x41cXzm7/rmjfHb8rWnW4SkT4Q=", "requires": { - "classnames": "^2.2.3", - "codemirror": "^5.13.4", - "lodash.debounce": "^4.0.4" + "classnames": "2.2.6", + "codemirror": "5.61.0", + "lodash.debounce": "4.0.8" } }, "react-datepicker": { @@ -6195,10 +6217,10 @@ "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-0.29.0.tgz", "integrity": "sha1-y21/ZZQ9q15jCbyYR+GGooqXNGM=", "requires": { - "classnames": "^2.2.1", - "moment": "^2.13.0", - "react-onclickoutside": "^4.8.0", - "tether": "^1.3.2" + "classnames": "2.2.6", + "moment": "2.25.3", + "react-onclickoutside": "4.9.0", + "tether": "1.4.7" } }, "react-deep-force-update": { @@ -6217,7 +6239,7 @@ "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-2.2.6.tgz", "integrity": "sha1-OoBuEPLaa6v+pBNr5lEOibDXaQE=", "requires": { - "classnames": "^2.2.5" + "classnames": "2.2.6" } }, "react-fontawesome": { @@ -6230,9 +6252,9 @@ "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-0.13.9.tgz", "integrity": "sha1-W6Kc3A5kIjYvRtmkkEfrsk4OKT4=", "requires": { - "lodash.isequal": "^4.0.0", - "react-draggable": "^2.1.1", - "react-resizable": "^1.4.0" + "lodash.isequal": "4.5.0", + "react-draggable": "2.2.6", + "react-resizable": "1.10.1" } }, "react-input-autosize": { @@ -6240,7 +6262,7 @@ "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz", "integrity": "sha1-/KpwIFaOwga8BL429Oto5kfE2MI=", "requires": { - "prop-types": "^15.5.8" + "prop-types": "15.7.2" } }, "react-is": { @@ -6253,8 +6275,8 @@ "resolved": "https://registry.npmjs.org/react-json-tree/-/react-json-tree-0.1.9.tgz", "integrity": "sha1-SXy87seVbciAZbkqRwSRC334cps=", "requires": { - "babel-runtime": "^5.8.20", - "react-mixin": "^1.7.0" + "babel-runtime": "5.8.38", + "react-mixin": "1.7.0" } }, "react-mixin": { @@ -6262,8 +6284,8 @@ "resolved": "https://registry.npmjs.org/react-mixin/-/react-mixin-1.7.0.tgz", "integrity": "sha1-OMIsPrAgZPCPLCWHimDaw+lW9Ew=", "requires": { - "object-assign": "^2.0.0", - "smart-mixin": "^1.2.0" + "object-assign": "2.1.1", + "smart-mixin": "1.2.1" }, "dependencies": { "object-assign": { @@ -6278,9 +6300,9 @@ "resolved": "https://registry.npmjs.org/react-motion/-/react-motion-0.5.2.tgz", "integrity": "sha1-DdOmnkETFlZ5J5F8ZiZVG6BgcxY=", "requires": { - "performance-now": "^0.2.0", - "prop-types": "^15.5.8", - "raf": "^3.1.0" + "performance-now": "0.2.0", + "prop-types": "15.7.2", + "raf": "3.4.1" } }, "react-onclickoutside": { @@ -6288,7 +6310,7 @@ "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-4.9.0.tgz", "integrity": "sha1-KQjDE24kQQK+peVDeoOKUo1dKZU=", "requires": { - "object-assign": "^4.0.1" + "object-assign": "4.1.1" }, "dependencies": { "object-assign": { @@ -6304,8 +6326,8 @@ "integrity": "sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo=", "dev": true, "requires": { - "lodash": "^4.6.1", - "react-deep-force-update": "^1.0.0" + "lodash": "4.17.21", + "react-deep-force-update": "1.1.2" } }, "react-redux": { @@ -6313,12 +6335,12 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.10.tgz", "integrity": "sha1-rVe9HbAMLQqn25krNgzmPdC4DsU=", "requires": { - "create-react-class": "^15.5.1", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.0.0", - "lodash": "^4.17.11", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2" + "create-react-class": "15.6.3", + "hoist-non-react-statics": "3.3.2", + "invariant": "2.2.4", + "lodash": "4.17.15", + "loose-envify": "1.4.0", + "prop-types": "15.7.2" }, "dependencies": { "lodash": { @@ -6333,8 +6355,8 @@ "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-1.10.1.tgz", "integrity": "sha1-8MLPHYOzRwuHZ2zm1rArvj9NjNQ=", "requires": { - "prop-types": "15.x", - "react-draggable": "^4.0.3" + "prop-types": "15.7.2", + "react-draggable": "4.3.1" }, "dependencies": { "react-draggable": { @@ -6342,8 +6364,8 @@ "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.3.1.tgz", "integrity": "sha1-+cDNzyJ57Ft5xltwzf2TYdgvqe4=", "requires": { - "classnames": "^2.2.5", - "prop-types": "^15.6.0" + "classnames": "2.2.6", + "prop-types": "15.7.2" } } } @@ -6353,11 +6375,11 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.6.0.tgz", "integrity": "sha1-L9umq54Za+Z8JsG21CO1zqBW/tg=", "requires": { - "history": "^2.1.2", - "hoist-non-react-statics": "^1.2.0", - "invariant": "^2.2.1", - "loose-envify": "^1.2.0", - "warning": "^3.0.0" + "history": "2.1.2", + "hoist-non-react-statics": "1.2.0", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "warning": "3.0.0" }, "dependencies": { "history": { @@ -6365,10 +6387,10 @@ "resolved": "https://registry.npmjs.org/history/-/history-2.1.2.tgz", "integrity": "sha1-SqLeiXoOSGfkU5hDvm7Nsphr/ew=", "requires": { - "deep-equal": "^1.0.0", - "invariant": "^2.0.0", - "query-string": "^3.0.0", - "warning": "^2.0.0" + "deep-equal": "1.1.1", + "invariant": "2.2.4", + "query-string": "3.0.3", + "warning": "2.1.0" }, "dependencies": { "warning": { @@ -6376,7 +6398,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.4.0" } } } @@ -6391,7 +6413,7 @@ "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz", "integrity": "sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=", "requires": { - "strict-uri-encode": "^1.0.0" + "strict-uri-encode": "1.1.0" } }, "warning": { @@ -6399,7 +6421,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.4.0" } } } @@ -6409,9 +6431,9 @@ "resolved": "https://registry.npmjs.org/react-select/-/react-select-1.3.0.tgz", "integrity": "sha1-GCitW/fz5CqDXH4tjLE7XCBxSHY=", "requires": { - "classnames": "^2.2.4", - "prop-types": "^15.5.8", - "react-input-autosize": "^2.1.2" + "classnames": "2.2.6", + "prop-types": "15.7.2", + "react-input-autosize": "2.2.2" } }, "react-sidebar": { @@ -6424,8 +6446,8 @@ "resolved": "https://registry.npmjs.org/react-svg-pan-zoom/-/react-svg-pan-zoom-2.18.0.tgz", "integrity": "sha1-HwM9nbHIK5u0lOIZYjcnb2lOesk=", "requires": { - "prop-types": "^15.6.2", - "transformation-matrix": "^1.12.0" + "prop-types": "15.7.2", + "transformation-matrix": "1.15.3" } }, "react-tap-event-plugin": { @@ -6433,7 +6455,7 @@ "resolved": "https://registry.npmjs.org/react-tap-event-plugin/-/react-tap-event-plugin-0.2.2.tgz", "integrity": "sha1-T28leFFlT2wrHCE6HT/yGzU65OE=", "requires": { - "fbjs": "^0.2.1" + "fbjs": "0.2.1" }, "dependencies": { "fbjs": { @@ -6441,9 +6463,9 @@ "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.2.1.tgz", "integrity": "sha1-YiBhYwpD4R+EUBe5BEqqZI7T9zE=", "requires": { - "core-js": "^1.0.0", - "promise": "^7.0.3", - "whatwg-fetch": "^0.9.0" + "core-js": "1.2.7", + "promise": "7.3.1", + "whatwg-fetch": "0.9.0" } }, "whatwg-fetch": { @@ -6458,7 +6480,7 @@ "resolved": "https://registry.npmjs.org/react-themeable/-/react-themeable-1.1.0.tgz", "integrity": "sha1-fURm3ZsrX6dQWHJ4JenxUro3mg4=", "requires": { - "object-assign": "^3.0.0" + "object-assign": "3.0.0" } }, "react-throttle": { @@ -6466,11 +6488,11 @@ "resolved": "https://registry.npmjs.org/react-throttle/-/react-throttle-0.3.0.tgz", "integrity": "sha1-i3HtlfBmAtHgv1F3vvC2nAnm1Lk=", "requires": { - "enzyme": "^2.3.0", - "lodash": "^4.2.1", - "react": "^15.0.2", - "react-addons-test-utils": "^15.0.2", - "react-dom": "^15.0.2" + "enzyme": "2.9.1", + "lodash": "4.17.21", + "react": "15.3.1", + "react-addons-test-utils": "15.6.2", + "react-dom": "15.6.2" }, "dependencies": { "object-assign": { @@ -6483,10 +6505,10 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", "requires": { - "fbjs": "^0.8.9", - "loose-envify": "^1.1.0", - "object-assign": "^4.1.0", - "prop-types": "^15.5.10" + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "prop-types": "15.7.2" } } } @@ -6503,8 +6525,8 @@ "integrity": "sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s=", "dev": true, "requires": { - "global": "^4.3.0", - "react-proxy": "^1.1.7" + "global": "4.4.0", + "react-proxy": "1.1.8" } }, "react-vis": { @@ -6512,24 +6534,24 @@ "resolved": "https://registry.npmjs.org/react-vis/-/react-vis-1.11.7.tgz", "integrity": "sha1-kJkCrwAViJXRTaGt/h0NwARSKP8=", "requires": { - "d3-array": "^1.2.0", - "d3-collection": "^1.0.3", - "d3-color": "^1.0.3", - "d3-contour": "^1.1.0", - "d3-format": "^1.2.0", - "d3-geo": "^1.6.4", - "d3-hexbin": "^0.2.2", - "d3-hierarchy": "^1.1.4", - "d3-interpolate": "^1.1.4", - "d3-sankey": "^0.7.1", - "d3-scale": "^1.0.5", - "d3-shape": "^1.1.0", - "d3-voronoi": "^1.1.2", - "deep-equal": "^1.0.1", - "global": "^4.3.1", + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-contour": "1.3.2", + "d3-format": "1.2.2", + "d3-geo": "1.9.1", + "d3-hexbin": "0.2.2", + "d3-hierarchy": "1.1.5", + "d3-interpolate": "1.1.6", + "d3-sankey": "0.7.1", + "d3-scale": "1.0.7", + "d3-shape": "1.2.0", + "d3-voronoi": "1.1.2", + "deep-equal": "1.1.1", + "global": "4.4.0", "hoek": "4.2.1", - "prop-types": "^15.5.8", - "react-motion": "^0.5.2" + "prop-types": "15.7.2", + "react-motion": "0.5.2" } }, "read-pkg": { @@ -6538,9 +6560,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" } }, "read-pkg-up": { @@ -6549,8 +6571,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "1.1.2", + "read-pkg": "1.1.0" } }, "readable-stream": { @@ -6559,10 +6581,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "readdirp": { @@ -6571,9 +6593,9 @@ "integrity": "sha1-DodiKjMlqjPokihcr4tOhGUppSU=", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "graceful-fs": "4.2.4", + "micromatch": "3.1.10", + "readable-stream": "2.3.7" }, "dependencies": { "graceful-fs": { @@ -6594,13 +6616,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -6609,7 +6631,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -6620,8 +6642,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", "mute-stream": "0.0.5" } }, @@ -6632,9 +6654,9 @@ "dev": true, "requires": { "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" + "esprima-fb": "15001.1001.0-dev-harmony-fb", + "private": "0.1.8", + "source-map": "0.5.7" }, "dependencies": { "ast-types": { @@ -6651,7 +6673,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "1.17.0" } }, "redbox-react": { @@ -6660,8 +6682,8 @@ "integrity": "sha1-o+ASvMyKmBbAga/gZUsdY3lVgbo=", "dev": true, "requires": { - "error-stack-parser": "^1.2.0", - "object-assign": "^4.0.1" + "error-stack-parser": "1.3.6", + "object-assign": "4.1.1" }, "dependencies": { "object-assign": { @@ -6678,8 +6700,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "2.1.0", + "strip-indent": "1.0.1" } }, "redux": { @@ -6687,10 +6709,10 @@ "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", "integrity": "sha1-BrcxIyFZAdJdBlvjQusCa8HIU3s=", "requires": { - "lodash": "^4.2.1", - "lodash-es": "^4.2.1", - "loose-envify": "^1.1.0", - "symbol-observable": "^1.0.3" + "lodash": "4.17.21", + "lodash-es": "4.17.15", + "loose-envify": "1.4.0", + "symbol-observable": "1.2.0" } }, "redux-devtools": { @@ -6698,10 +6720,10 @@ "resolved": "https://registry.npmjs.org/redux-devtools/-/redux-devtools-2.1.5.tgz", "integrity": "sha1-cKMZWAl+4fqEbug/pjp3jxAvWac=", "requires": { - "react-json-tree": "^0.1.9", - "react-mixin": "^1.7.0", - "react-redux": "^3.0.0", - "redux": "^2.0.0 || ^3.0.0" + "react-json-tree": "0.1.9", + "react-mixin": "1.7.0", + "react-redux": "3.1.2", + "redux": "3.7.2" }, "dependencies": { "hoist-non-react-statics": { @@ -6714,8 +6736,8 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-3.1.2.tgz", "integrity": "sha1-KoiLEk6dARRIU2EqzuGfgdSYqDY=", "requires": { - "hoist-non-react-statics": "^1.0.3", - "invariant": "^2.0.0" + "hoist-non-react-statics": "1.2.0", + "invariant": "2.2.4" } } } @@ -6733,7 +6755,7 @@ "resolved": "https://registry.npmjs.org/redux-router/-/redux-router-1.0.0.tgz", "integrity": "sha1-PBZ240Qb7FD+jZJFfAF8tjaZM08=", "requires": { - "deep-equal": "^1.0.1" + "deep-equal": "1.1.1" } }, "redux-thunk": { @@ -6753,12 +6775,12 @@ "integrity": "sha1-oORXxY69uuV1yfjNdRJ+k3VkNdg=", "dev": true, "requires": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", + "commoner": "0.10.8", + "defs": "1.1.1", + "esprima-fb": "15001.1001.0-dev-harmony-fb", + "private": "0.1.8", "recast": "0.10.33", - "through": "~2.3.8" + "through": "2.3.8" } }, "regex-cache": { @@ -6767,7 +6789,7 @@ "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -6776,8 +6798,8 @@ "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexp.prototype.flags": { @@ -6785,8 +6807,8 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha1-erqJs8E6ZFCdq888qNn7ub31y3U=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "define-properties": "1.1.3", + "es-abstract": "1.17.5" } }, "regexpu": { @@ -6795,11 +6817,11 @@ "integrity": "sha1-5TTcmRqeWEYFDJjebX3UpVyeoW0=", "dev": true, "requires": { - "esprima": "^2.6.0", - "recast": "^0.10.10", - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "esprima": "2.7.3", + "recast": "0.10.33", + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" }, "dependencies": { "esprima": { @@ -6822,7 +6844,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" } }, "remove-trailing-separator": { @@ -6849,7 +6871,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "^1.0.0" + "is-finite": "1.1.0" } }, "replace-ext": { @@ -6863,26 +6885,26 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM=", "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "aws-sign2": "0.7.0", + "aws4": "1.9.1", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.27", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.6.0", + "uuid": "3.4.0" }, "dependencies": { "performance-now": { @@ -6898,8 +6920,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" + "caller-path": "0.1.0", + "resolve-from": "1.0.1" } }, "resolve": { @@ -6908,7 +6930,7 @@ "integrity": "sha1-sllBtUloIxzC0bt2p5y38sC/hEQ=", "dev": true, "requires": { - "path-parse": "^1.0.6" + "path-parse": "1.0.7" } }, "resolve-dir": { @@ -6917,8 +6939,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" } }, "resolve-from": { @@ -6939,8 +6961,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "exit-hook": "1.1.1", + "onetime": "1.1.0" } }, "ret": { @@ -6955,7 +6977,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -6963,7 +6985,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=", "requires": { - "glob": "^7.1.3" + "glob": "7.1.6" }, "dependencies": { "glob": { @@ -6971,12 +6993,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY=", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.3.3", + "path-is-absolute": "1.0.1" } }, "minimatch": { @@ -6984,7 +7006,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -7001,7 +7023,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "^1.3.0" + "once": "1.3.3" } }, "run-sequence": { @@ -7010,7 +7032,7 @@ "integrity": "sha1-pdegnRs4vsjoxV3JQILTrmAWpiM=", "dev": true, "requires": { - "chalk": "*" + "chalk": "1.1.3" } }, "rw": { @@ -7035,7 +7057,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -7055,10 +7077,10 @@ "integrity": "sha1-ZO50vDaF86TGKQ8tqMHjtO75Lo0=", "dev": true, "requires": { - "async": "~0.9.0", - "glob": "~7.0.3", - "lodash": "~4.11.1", - "ssh2": "~0.4.10" + "async": "0.9.2", + "glob": "7.0.6", + "lodash": "4.11.2", + "ssh2": "0.4.15" }, "dependencies": { "async": { @@ -7073,12 +7095,12 @@ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.2", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.3.3", + "path-is-absolute": "1.0.1" } }, "lodash": { @@ -7093,7 +7115,7 @@ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } } } @@ -7116,18 +7138,18 @@ "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "1.7.2", "mime": "1.6.0", "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "on-finished": "2.3.0", + "range-parser": "1.2.1", + "statuses": "1.5.0" }, "dependencies": { "ms": { @@ -7150,9 +7172,9 @@ "integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=", "dev": true, "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.3", "send": "0.17.1" } }, @@ -7162,10 +7184,10 @@ "integrity": "sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -7174,7 +7196,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7255,14 +7277,14 @@ "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.3", + "use": "3.1.1" }, "dependencies": { "define-property": { @@ -7271,7 +7293,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -7280,7 +7302,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -7291,9 +7313,9 @@ "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -7302,7 +7324,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -7311,7 +7333,7 @@ "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-data-descriptor": { @@ -7320,7 +7342,7 @@ "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.3" } }, "is-descriptor": { @@ -7329,9 +7351,9 @@ "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" } } } @@ -7342,7 +7364,7 @@ "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -7351,7 +7373,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -7374,11 +7396,11 @@ "integrity": "sha1-GQhmvs51U+H48mei7oLGBrVQmho=", "dev": true, "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -7396,7 +7418,7 @@ "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -7419,8 +7441,8 @@ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.1", + "spdx-license-ids": "3.0.10" } }, "spdx-exceptions": { @@ -7435,8 +7457,8 @@ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.3.0", + "spdx-license-ids": "3.0.10" } }, "spdx-license-ids": { @@ -7451,7 +7473,7 @@ "integrity": "sha1-Zwl8YB1pfOE2j0GPBs0gHPBSGlc=", "dev": true, "requires": { - "through": "2" + "through": "2.3.8" } }, "split-string": { @@ -7460,14 +7482,13 @@ "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "ssh2": { "version": "0.4.15", @@ -7475,8 +7496,8 @@ "integrity": "sha1-B8b0EG2fe26m5N9jbGxT8fmBf/g=", "dev": true, "requires": { - "readable-stream": "~1.0.0", - "ssh2-streams": "~0.0.22" + "readable-stream": "1.0.34", + "ssh2-streams": "0.0.23" }, "dependencies": { "readable-stream": { @@ -7485,10 +7506,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } } } @@ -7499,9 +7520,9 @@ "integrity": "sha1-ru8wgxu1/Er2qj9tCiYaQTUxYSs=", "dev": true, "requires": { - "asn1": "~0.2.0", - "readable-stream": "~1.0.0", - "streamsearch": "~0.1.2" + "asn1": "0.2.4", + "readable-stream": "1.0.34", + "streamsearch": "0.1.2" }, "dependencies": { "readable-stream": { @@ -7510,10 +7531,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } } } @@ -7523,15 +7544,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc=", "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.4", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" }, "dependencies": { "asn1": { @@ -7539,7 +7560,7 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", "requires": { - "safer-buffer": "~2.1.0" + "safer-buffer": "2.1.2" } } } @@ -7562,8 +7583,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -7572,7 +7593,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -7589,8 +7610,8 @@ "integrity": "sha1-h1IdOKRKp+6RzhzSpH3wy0ndZgs=", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.4", + "readable-stream": "2.3.7" }, "dependencies": { "isarray": { @@ -7605,13 +7626,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -7620,7 +7641,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -7631,7 +7652,7 @@ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "~0.1.1" + "duplexer": "0.1.1" } }, "stream-consume": { @@ -7652,11 +7673,11 @@ "integrity": "sha1-stJCRpKIpaJ+xP6JM6z2I95lFPw=", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.4", + "readable-stream": "2.3.7", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.2" }, "dependencies": { "isarray": { @@ -7671,13 +7692,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -7686,7 +7707,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -7708,9 +7729,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string.prototype.trimend": { @@ -7718,8 +7739,8 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", "integrity": "sha1-hYEqa4R6wAInD1gIFGBkyZX7aRM=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "define-properties": "1.1.3", + "es-abstract": "1.17.5" } }, "string.prototype.trimleft": { @@ -7727,9 +7748,9 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", "integrity": "sha1-RAiqLl1t3QyagHObCH+8BnwDs8w=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" + "define-properties": "1.1.3", + "es-abstract": "1.17.5", + "string.prototype.trimstart": "1.0.1" } }, "string.prototype.trimright": { @@ -7737,9 +7758,9 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", "integrity": "sha1-x28c7zDyG7rYr+uNsVEUls+w8qM=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" + "define-properties": "1.1.3", + "es-abstract": "1.17.5", + "string.prototype.trimend": "1.0.1" } }, "string.prototype.trimstart": { @@ -7747,8 +7768,8 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", "integrity": "sha1-FK9tnzSwU/fPyJty+PLuFLkDmlQ=", "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" + "define-properties": "1.1.3", + "es-abstract": "1.17.5" } }, "string_decoder": { @@ -7775,7 +7796,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -7784,8 +7805,8 @@ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", "dev": true, "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" } }, "strip-indent": { @@ -7794,7 +7815,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "get-stdin": "4.0.1" } }, "strip-json-comments": { @@ -7833,12 +7854,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "^4.7.0", - "ajv-keywords": "^1.0.0", - "chalk": "^1.1.1", - "lodash": "^4.0.0", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.21", "slice-ansi": "0.0.4", - "string-width": "^2.0.0" + "string-width": "2.1.1" }, "dependencies": { "ajv": { @@ -7847,8 +7868,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "co": "4.6.0", + "json-stable-stringify": "1.0.1" } }, "ansi-regex": { @@ -7869,8 +7890,8 @@ "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" } }, "strip-ansi": { @@ -7879,7 +7900,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -7913,8 +7934,8 @@ "integrity": "sha1-AcHjnrMdB8t9A6lqcIIyYLIxMs0=", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "readable-stream": "2.3.7", + "xtend": "4.0.2" }, "dependencies": { "isarray": { @@ -7929,13 +7950,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -7944,7 +7965,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -7955,7 +7976,7 @@ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "os-homedir": "1.0.2" } }, "time-stamp": { @@ -7970,7 +7991,7 @@ "integrity": "sha1-gAsfPu4nLlvFPuRloE0OgEwxIR8=", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "setimmediate": "1.0.5" } }, "title-case": { @@ -7978,8 +7999,8 @@ "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "to-arraybuffer": { @@ -8000,7 +8021,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -8009,7 +8030,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -8020,10 +8041,10 @@ "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -8032,8 +8053,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "toidentifier": { @@ -8047,8 +8068,8 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha1-zZ+yoKodWhK0c72fuW+j3P9lreI=", "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "1.8.0", + "punycode": "2.1.1" } }, "transformation-matrix": { @@ -8091,7 +8112,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.2" } }, "tweetnacl": { @@ -8111,7 +8132,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "1.1.2" } }, "type-is": { @@ -8121,7 +8142,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "mime-types": "2.1.27" } }, "typedarray": { @@ -8141,10 +8162,10 @@ "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", "dev": true, "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "async": { @@ -8171,9 +8192,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -8197,10 +8218,10 @@ "integrity": "sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" } }, "unique-stream": { @@ -8221,8 +8242,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -8231,9 +8252,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -8271,7 +8292,7 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "urix": { @@ -8349,7 +8370,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "^1.1.1" + "user-home": "1.1.1" } }, "validate-npm-package-license": { @@ -8358,8 +8379,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.1.1", + "spdx-expression-parse": "3.0.1" } }, "vary": { @@ -8373,9 +8394,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "victory": { @@ -8383,9 +8404,9 @@ "resolved": "https://registry.npmjs.org/victory/-/victory-0.21.5.tgz", "integrity": "sha1-8xxhI/Yg13fzzYe/yc9bwq9zhHA=", "requires": { - "victory-chart": "^21.6.1", - "victory-core": "^17.2.5", - "victory-pie": "^11.4.2" + "victory-chart": "21.6.2", + "victory-core": "17.2.7", + "victory-pie": "11.4.2" } }, "victory-chart": { @@ -8393,9 +8414,9 @@ "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-21.6.2.tgz", "integrity": "sha1-dibzkhIqwROGzrLG0s6rGdKJXFI=", "requires": { - "d3-voronoi": "^1.1.2", - "lodash": "^4.17.4", - "victory-core": "^17.1.0" + "d3-voronoi": "1.1.2", + "lodash": "4.17.15", + "victory-core": "17.2.7" }, "dependencies": { "lodash": { @@ -8410,12 +8431,12 @@ "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-17.2.7.tgz", "integrity": "sha1-uYsjWI/xACg8qJI3L4xxXO9TR1E=", "requires": { - "d3-ease": "^1.0.0", - "d3-interpolate": "^1.1.1", - "d3-scale": "^1.0.0", - "d3-shape": "^1.2.0", - "d3-timer": "^1.0.0", - "lodash": "^4.17.4" + "d3-ease": "1.0.3", + "d3-interpolate": "1.1.6", + "d3-scale": "1.0.7", + "d3-shape": "1.2.0", + "d3-timer": "1.0.7", + "lodash": "4.17.15" }, "dependencies": { "lodash": { @@ -8430,9 +8451,9 @@ "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-11.4.2.tgz", "integrity": "sha1-MzciaWvqK5c/y1QgGXchxbAhCd4=", "requires": { - "d3-shape": "^1.0.0", - "lodash": "^4.17.4", - "victory-core": "^17.0.0" + "d3-shape": "1.2.0", + "lodash": "4.17.15", + "victory-core": "17.2.7" }, "dependencies": { "lodash": { @@ -8448,8 +8469,8 @@ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", + "clone": "1.0.4", + "clone-stats": "0.0.1", "replace-ext": "0.0.1" } }, @@ -8459,14 +8480,14 @@ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.12", + "mkdirp": "0.5.5", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" }, "dependencies": { "clone": { @@ -8481,10 +8502,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.4", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "through2": { @@ -8493,8 +8514,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "1.0.34", + "xtend": "4.0.2" } }, "vinyl": { @@ -8503,8 +8524,8 @@ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "clone": "0.2.0", + "clone-stats": "0.0.1" } } } @@ -8523,7 +8544,7 @@ "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", "requires": { - "loose-envify": "^1.0.0" + "loose-envify": "1.4.0" } }, "watchpack": { @@ -8532,9 +8553,9 @@ "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", "dev": true, "requires": { - "async": "^0.9.0", - "chokidar": "^1.0.0", - "graceful-fs": "^4.1.2" + "async": "0.9.2", + "chokidar": "1.7.0", + "graceful-fs": "4.2.4" }, "dependencies": { "async": { @@ -8557,21 +8578,21 @@ "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", "dev": true, "requires": { - "acorn": "^3.0.0", - "async": "^1.3.0", - "clone": "^1.0.2", - "enhanced-resolve": "~0.9.0", - "interpret": "^0.6.4", - "loader-utils": "^0.2.11", - "memory-fs": "~0.3.0", - "mkdirp": "~0.5.0", - "node-libs-browser": "^0.7.0", - "optimist": "~0.6.0", - "supports-color": "^3.1.0", - "tapable": "~0.1.8", - "uglify-js": "~2.7.3", - "watchpack": "^0.2.1", - "webpack-core": "~0.6.9" + "acorn": "3.3.0", + "async": "1.5.2", + "clone": "1.0.4", + "enhanced-resolve": "0.9.1", + "interpret": "0.6.6", + "loader-utils": "0.2.17", + "memory-fs": "0.3.0", + "mkdirp": "0.5.5", + "node-libs-browser": "0.7.0", + "optimist": "0.6.1", + "supports-color": "3.2.3", + "tapable": "0.1.10", + "uglify-js": "2.7.5", + "watchpack": "0.2.9", + "webpack-core": "0.6.9" }, "dependencies": { "acorn": { @@ -8598,7 +8619,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -8609,8 +8630,8 @@ "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, "requires": { - "source-list-map": "~0.1.7", - "source-map": "~0.4.1" + "source-list-map": "0.1.8", + "source-map": "0.4.4" }, "dependencies": { "source-map": { @@ -8619,7 +8640,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": ">=0.0.4" + "amdefine": "1.0.1" } } } @@ -8630,11 +8651,11 @@ "integrity": "sha1-+PwRIM47T8VoDO7LQ9d3lmshEF4=", "dev": true, "requires": { - "memory-fs": "~0.4.1", - "mime": "^1.5.0", - "path-is-absolute": "^1.0.0", - "range-parser": "^1.0.3", - "time-stamp": "^2.0.0" + "memory-fs": "0.4.1", + "mime": "1.6.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.1", + "time-stamp": "2.2.0" }, "dependencies": { "isarray": { @@ -8649,8 +8670,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.7", + "readable-stream": "2.3.7" } }, "readable-stream": { @@ -8659,13 +8680,13 @@ "integrity": "sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -8674,7 +8695,7 @@ "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "time-stamp": { @@ -8692,9 +8713,9 @@ "dev": true, "requires": { "ansi-html": "0.0.7", - "html-entities": "^1.2.0", - "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" + "html-entities": "1.3.1", + "querystring": "0.2.0", + "strip-ansi": "3.0.1" } }, "whatwg-fetch": { @@ -8708,7 +8729,7 @@ "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "window-size": { @@ -8740,7 +8761,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "^0.5.1" + "mkdirp": "0.5.5" } }, "xml2js": { @@ -8749,8 +8770,8 @@ "integrity": "sha1-oMaVFnUkIesqx1juTUzPWIQ+rGY=", "dev": true, "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" + "sax": "1.2.4", + "xmlbuilder": "11.0.1" } }, "xmlbuilder": { @@ -8782,12 +8803,12 @@ "integrity": "sha1-ISBUaTFuk5Ex1Z8toMbX+YIh6kA=", "dev": true, "requires": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "os-locale": "1.4.0", + "window-size": "0.1.4", + "y18n": "3.2.1" }, "dependencies": { "camelcase": { @@ -8797,6 +8818,11 @@ "dev": true } } + }, + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==" } } } diff --git a/client-report/package.json b/client-report/package.json index a4e58ba42c..1886b08b84 100644 --- a/client-report/package.json +++ b/client-report/package.json @@ -6,8 +6,9 @@ "clean": "rimraf dist", "build:webpack": "NODE_ENV=production webpack --config webpack.config.js", "build": "npm run clean && npm run build:webpack", + "convict": "6.0.0", "deploy:preprod": "gulp deployPreprod", - "deploy:prod": "gulp deploy_TO_PRODUCTION", + "deploy:prod": "POLIS_ROOT=/app/ gulp deploy_TO_PRODUCTION", "start": "node dev-server.js", "lint": "eslint src", "postinstall": "npm run build" @@ -45,12 +46,14 @@ }, "dependencies": { "color": "^0.7.3", + "convict": "6.0.0", "d3": "^4.6.0", "d3-contour": "^1.1.1", "d3-scale-chromatic": "^1.1.1", "history": "^1.12.5", "hull.js": "^0.2.10", "jquery": "^2.1.4", + "js-yaml": "3.14.0", "lodash": "4.17.21", "moment": "^2.14.1", "moment-range": "^2.2.0", @@ -81,6 +84,7 @@ "svg-text-wrap": "0.0.1", "title-case": "^2.1.0", "victory": "^0.21.3", - "whatwg-fetch": "^0.10.1" + "whatwg-fetch": "^0.10.1", + "yargs-parser": "^21.0.0" } } diff --git a/client-report/polis.config.template.js b/client-report/polis.config.template.js deleted file mode 100644 index 495655bf76..0000000000 --- a/client-report/polis.config.template.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = { - - //SERVICE_URL: 'http://localhost:5000', - SERVICE_URL: 'https://preprod.pol.is', - - UPLOADER: 'local', // alt: s3, scp - - // Uploader settings: local - LOCAL_OUTPUT_PATH: './build', - - // Uploader settings: s3 - S3_BUCKET_PROD: 'pol.is', - S3_BUCKET_PREPROD: 'preprod.pol.is', - - // Uploader settings: scp - SCP_SUBDIR_PREPROD: 'preprod', - SCP_SUBDIR_PROD: 'prod', -}; diff --git a/client-report/server.js b/client-report/server.js index 415fdb884a..e9f3a1cdc8 100644 --- a/client-report/server.js +++ b/client-report/server.js @@ -3,8 +3,11 @@ var path = require("path"); var express = require("express"); +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + var app = express(); -app.set('port', process.env.PORT || 8080); +app.set('port', config.get('port') || 8080); app.use('/data', express.static('data')) app.use('/dist', express.static('dist')) diff --git a/config/Dockerfile b/config/Dockerfile new file mode 100644 index 0000000000..1508770741 --- /dev/null +++ b/config/Dockerfile @@ -0,0 +1,7 @@ +FROM busybox + +WORKDIR /config + +COPY . . + +CMD echo "copied config files" diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000000..baa35c3e1b --- /dev/null +++ b/config/README.md @@ -0,0 +1,16 @@ +# Configuration files and variables for polis +* Currently, configuration variables live in many different files. +* The goal is to use [`node-convict`](https://github.com/mozilla/node-convict) to manage configurations +* The defaults for all variables in `config/schema.yaml` are currently for development builds. +* Configurations for backend services (e.g. `server` & `math` are mounted onto a docker volume (`/app/config`) so that they can be updated and reread without a full restart. + - Resolved configuration variables are also written to `export_config.json` so that they can be easily used by `clojure`, `python`, etc. +* Configurations for front-end services (e.g. `client-admin`, `client-participation` & `client-report`) are copied into each directory with the `config/copy_config.sh` script. Running `make init` in the root directory will install a git hook that will automatically run `config/copy_config.sh` before each commit. +* Some config variables seem to be redundant and will be merged later: + - `primary_polis_url` & `SERVICE_URL` +* Some config variables can not be easily be managed by `node-convict`: + - `GIT_HASH` +* Work in progress: + - Build server and config from scratch + - Test whether docker config volume will override `server/config` directory + - Write code to read json config into math + - Write code to allow math to run in docker or locally diff --git a/config/config.js b/config/config.js new file mode 100644 index 0000000000..6908014715 --- /dev/null +++ b/config/config.js @@ -0,0 +1,55 @@ +// Copyright (C) 2012-present, The Authors. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License, version 3, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . + +"use strict"; + +console.log('starting config.js') + +const convict = require('convict'); +const fs = require('fs'); +const yaml = require('js-yaml'); + +convict.addParser({ extension: ['yml', 'yaml'], parse: yaml.safeLoad }); + +// for additional validation options, use the following: +// convict.addFormat(require('convict-format-with-validator').ipaddress); + +'use strict'; + +// Define a schema + +try { + // the next line only works with docker-compose + console.log('reading schema') + let fileContents = fs.readFileSync('/app/config/schema.yaml', 'utf8'); + let schema = yaml.safeLoad(fileContents); + var config = convict(schema); +} catch (e) { + console.log(e); +} + +console.log('default aws_region:' + config.get('aws_region')); + +// Load environment dependent configuration +var env = config.get('env'); +config.loadFile('/app/config/' + env + '.yaml'); +var now = new Date(); +console.log('config aws_region:' + config.get('aws_region') + " @ " + now.toUTCString()); + +const path = '/app/config/config_private.yaml'; + +try { + if (fs.existsSync(path)) { + config.loadFile(path); + } +} catch(err) { + console.error(err) +} + +// Perform validation +config.validate({allowed: 'strict'}); + +module.exports = config; + + +console.log('finishing config.js') + diff --git a/config/development.yaml b/config/development.yaml new file mode 100644 index 0000000000..56a4b49f03 --- /dev/null +++ b/config/development.yaml @@ -0,0 +1,22 @@ +# Precedence order (https://www.npmjs.com/package/convict) +# When merging configuration values from different sources, Convict follows precedence rules. The order, from lowest to highest, for config.loadFile(file) and config.load(json) is: + +# Default value +# File or json set in function argument +# Environment variables (only used when env property is set in schema) +# Command line arguments (only used when arg property is set in schema) + +# for easy json/yaml conversion: https://www.json2yaml.com/ + +aws_region: us-north-14 + +# aws_access_key_id: +# doc: aws_access_key_id +# default: NA +# env: AWS_ACCESS_KEY_ID +# sensitive: true +# aws_secret_access_key: +# doc: aws_secret_access_key +# default: NA +# env: AWS_SECRET_ACCESS_KEY +# sensitive: true diff --git a/config/env_all_to_be_deleted.yaml b/config/env_all_to_be_deleted.yaml new file mode 100644 index 0000000000..cec6a094f3 --- /dev/null +++ b/config/env_all_to_be_deleted.yaml @@ -0,0 +1,282 @@ +database_url: + doc: database_url + default: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev + env: DATABASE_URL + +webserver_username: + doc: webserver_username + default: ws-user + env: WEBSERVER_USERNAME + +webserver_pass: + doc: webserver_pass + default: ws-passPOSTGRES_DB=polis-dev + env: WEBSERVER_PASS + +postgres_password: + doc: postgres_password + default: oiPorg3Nrz0yqDLE + env: POSTGRES_PASSWORD + +postgres_user: + doc: postgres_user + default: postgres# For admin functionality, fill this out + env: POSTGRES_USER + +admin_emails: + doc: admin_emails + default: [] + env: ADMIN_EMAILS + +admin_email_data_export: + doc: admin_email_data_export + default: "" + env: ADMIN_EMAIL_DATA_EXPORT + +admin_email_data_export_test: + doc: admin_email_data_export_test + default: "" + env: ADMIN_EMAIL_DATA_EXPORT_TEST + +admin_email_email_test: + doc: admin_email_email_test + default: "" + env: ADMIN_EMAIL_EMAIL_TEST + +admin_uids: + doc: admin_uids + default: [] + env: ADMIN_UIDS + + +database_for_reads_name: + doc: database_for_reads_name + default: DATABASE_URL + env: DATABASE_FOR_READS_NAME + +database_url: + doc: database_url + default: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev + env: DATABASE_URL + + +webserver_username: + doc: webserver_username + default: ws-user + env: WEBSERVER_USERNAME + +webserver_pass: + doc: webserver_pass + default: ws-pass + env: WEBSERVER_PASS + +stripe_secret_key: + doc: stripe_secret_key + default: sk_test_NFBDEThkpHCYBzXPJuBlY8TW + env: STRIPE_SECRET_KEY + + +dev_mode: + doc: dev_mode + default: true + env: DEV_MODE + +disable_intercom: + doc: disable_intercom + default: true + env: DISABLE_INTERCOM + +domain_override: + doc: domain_override + default: localhost:5000 + env: DOMAIN_OVERRIDE + +# Options: prod, preprod, dev +math_env: + doc: math_env ex. prod, preprod, dev + default: dev + env: MATH_ENV + +port: + doc: port + default: 5000 + env: PORT + + +should_use_translation_api: + doc: should_use_translation_api + default: false + env: SHOULD_USE_TRANSLATION_API + +google_credentials_base64: + doc: google_credentials_base64 + default: xxxxxxxxxxxxxxxxxxxxxxx... + env: GOOGLE_CREDENTIALS_BASE64 + +google_creds_stringified: + doc: google_creds_stringified + default: xxxxxxxxxxxxxxxxxxxxxxx... + env: GOOGLE_CREDS_STRINGIFIED + + +static_files_admindash_port: + doc: static_files_admindash_port + default: 8080 + env: STATIC_FILES_ADMINDASH_PORT + +static_files_host: + doc: static_files_host + default: file-server + env: STATIC_FILES_HOST + +static_files_port: + doc: static_files_port + default: 8080 + env: STATIC_FILES_PORT + + +aws_region: + doc: aws_region + default: us-east-1 + env: AWS_REGION + + +# Options: maildev, aws-ses, mailgun +# Example: `aws-ses,mailgun` would try sending via AWS SES first, and fallback to Mailgun on error. +email_transport_types: + doc: email_transport_types ex. maildev, aws-ses, mailgun + default: maildev + env: EMAIL_TRANSPORT_TYPES + +polis_from_address: + doc: polis_from_address + default: "Example " + env: POLIS_FROM_ADDRESS + +database_url: + doc: database_url + default: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev + env: DATABASE_URL + +webserver_username: + doc: webserver_username + default: ws-user + env: WEBSERVER_USERNAME + +webserver_pass: + doc: webserver_pass + default: ws-passPOSTGRES_DB=polis-dev + env: WEBSERVER_PASS + +postgres_password: + doc: postgres_password + default: oiPorg3Nrz0yqDLE + env: POSTGRES_PASSWORD + +postgres_user: + doc: postgres_user + default: postgres# For admin functionality, fill this out + env: POSTGRES_USER + +admin_emails: + doc: admin_emails + default: [] + env: ADMIN_EMAILS + +admin_email_data_export: + doc: admin_email_data_export + default: "" + env: ADMIN_EMAIL_DATA_EXPORT + +admin_email_data_export_test: + doc: admin_email_data_export_test + default: "" + env: ADMIN_EMAIL_DATA_EXPORT_TEST + +admin_email_email_test: + doc: admin_email_email_test + default: "" + env: ADMIN_EMAIL_EMAIL_TEST + +admin_uids: + doc: admin_uids + default: [] + env: ADMIN_UIDS + + +database_for_reads_name: + doc: database_for_reads_name + default: DATABASE_URL + env: DATABASE_FOR_READS_NAME + +database_url: + doc: database_url + default: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev + env: DATABASE_URL + + +webserver_username: + doc: webserver_username + default: ws-user + env: WEBSERVER_USERNAME + +webserver_pass: + doc: webserver_pass + default: ws-pass + env: WEBSERVER_PASS + +stripe_secret_key: + doc: stripe_secret_key + default: sk_test_NFBDEThkpHCYBzXPJuBlY8TW + env: STRIPE_SECRET_KEY + + +dev_mode: + doc: dev_mode + default: true + env: DEV_MODE + +disable_intercom: + doc: disable_intercom + default: true + env: DISABLE_INTERCOM + +domain_override: + doc: domain_override + default: localhost:5000 + env: DOMAIN_OVERRIDE + +# Options: prod, preprod, dev +math_env: + doc: math_env + default: dev + env: MATH_ENV + +port: + doc: port + default: 5000 + env: PORT + + + +static_files_admindash_port: + doc: static_files_admindash_port + default: 8080 + env: STATIC_FILES_ADMINDASH_PORT + +static_files_host: + doc: static_files_host + default: file-server + env: STATIC_FILES_HOST + +static_files_port: + doc: static_files_port + default: 8080 + env: STATIC_FILES_PORT + + +aws_region: + doc: aws_region + default: us-east-1 + env: AWS_REGION + diff --git a/config/export_config.js b/config/export_config.js new file mode 100644 index 0000000000..3bb17095ac --- /dev/null +++ b/config/export_config.js @@ -0,0 +1,13 @@ +// Copyright (C) 2012-present, The Authors. This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License, version 3, as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . + +"use strict"; + +let POLIS_ROOT = process.env.POLIS_ROOT + +var config = require(POLIS_ROOT + '/config/config.js'); +const fs = require('fs'); + +console.log('export_config aws_region:' + config.get('aws_region')); + +let data = JSON.stringify(config.getProperties(), null, 2); +fs.writeFileSync('export_config.json', data); diff --git a/config/merge_config_yaml_files.ipynb b/config/merge_config_yaml_files.ipynb new file mode 100644 index 0000000000..b690afea31 --- /dev/null +++ b/config/merge_config_yaml_files.ipynb @@ -0,0 +1,461 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 38, + "id": "26416144", + "metadata": {}, + "outputs": [], + "source": [ + "import yaml\n", + "\n", + "import subprocess\n", + "from collections import defaultdict, OrderedDict\n", + "\n", + "\n", + "def parse_preserving_duplicates(src):\n", + " # We deliberately define a fresh class inside the function,\n", + " # because add_constructor is a class method and we don't want to\n", + " # mutate pyyaml classes.\n", + " class PreserveDuplicatesLoader(yaml.loader.Loader):\n", + " pass\n", + "\n", + " def map_constructor(loader, node, deep=False):\n", + " \"\"\"Walk the mapping, recording any duplicate keys.\n", + "\n", + " \"\"\"\n", + " mapping = defaultdict(list)\n", + " for key_node, value_node in node.value:\n", + " key = loader.construct_object(key_node, deep=deep)\n", + " value = loader.construct_object(value_node, deep=deep)\n", + "\n", + " mapping[key].append(value)\n", + "\n", + " return mapping\n", + "\n", + " PreserveDuplicatesLoader.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, map_constructor)\n", + " return yaml.load(src, PreserveDuplicatesLoader)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "d642dcfc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "finding duplicate keys in schema.yaml\n", + "number of keys: 68\n", + "no duplicates found\n", + "\n", + "For comparison with the next file:\n", + "key: webserver_pass\n", + " value: 8a7157439f50\n", + "key: admin_emails\n", + " value: []\n", + "key: admin_uids\n", + " value: []\n", + "\n", + "finding duplicate keys in env_all.yaml\n", + "key: webserver_pass\n", + " set of values: {'ws-pass', 'ws-passPOSTGRES_DB=polis-dev'}\n", + "key: admin_emails\n", + " unhashable value: {key_dict['default'][0]}\n", + "key: admin_emails\n", + " unhashable value: {key_dict['default'][0]}\n", + "key: admin_uids\n", + " unhashable value: {key_dict['default'][0]}\n", + "key: admin_uids\n", + " unhashable value: {key_dict['default'][0]}\n", + "number of keys: 26\n", + "\n", + "schema key: 00documentation\n", + "schema key: admin_email_data_export\n", + " schema value: \n", + " grep result:ADMIN_EMAIL_DATA_EXPORT=\"\"\n", + " grep result:\n", + "schema key: admin_email_data_export_test\n", + " schema value: \n", + " grep result:ADMIN_EMAIL_DATA_EXPORT_TEST=\"\"\n", + " grep result:\n", + "schema key: admin_email_email_test\n", + " schema value: \n", + " grep result:ADMIN_EMAIL_EMAIL_TEST=\"\"\n", + " grep result:\n", + "schema key: admin_emails\n", + " schema value: []\n", + " grep result:ADMIN_EMAILS=[]\n", + " grep result:\n", + "schema key: admin_uids\n", + " schema value: []\n", + " grep result:ADMIN_UIDS=[]\n", + " grep result:\n", + "schema key: akismet_antispam_api_key\n", + "schema key: akismet_root_url\n", + "schema key: aws_access_key_id\n", + "schema key: aws_region\n", + " schema value: us-east-1\n", + " grep result:AWS_REGION=us-east-1\n", + " grep result:\n", + "schema key: aws_s3_api_version\n", + "schema key: aws_secret_access_key\n", + "schema key: aws_ses_api_version\n", + "schema key: backfill_comment_lang_detection\n", + "schema key: cache_math_results\n", + "schema key: client_participation_port\n", + "schema key: database_for_reads_url\n", + "schema key: database_url\n", + " schema value: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev\n", + " grep result:DATABASE_URL=postgres\n", + " grep result: export DATABASE_URL=postgres\n", + " grep result:export DATABASE_URL=postgres\n", + " grep result:DATABASE_URL=postgres\n", + " grep result:\n", + "schema key: dev_mode\n", + " schema value: True\n", + " grep result:DEV_MODE=true\n", + " grep result: issues, you'll want to run with `export DEV_MODE=true`.\n", + " grep result:export DEV_MODE=true\n", + " grep result:\n", + "schema key: disable_intercom\n", + " schema value: True\n", + " grep result:DISABLE_INTERCOM=true\n", + " grep result:export DISABLE_INTERCOM=true\n", + " grep result: DISABLE_INTERCOM\n", + " grep result: DISABLE_INTERCOM\n", + " grep result:\n", + "schema key: disable_plans\n", + " schema value: True\n", + " grep result: DISABLE_PLANS\n", + " grep result:\n", + "schema key: domainWhitelist\n", + "schema key: domain_override\n", + " schema value: \n", + " grep result:DOMAIN_OVERRIDE=localhost\n", + " grep result:export DOMAIN_OVERRIDE=localhost\n", + " grep result:export DOMAIN_OVERRIDE=localhost\n", + " grep result:\n", + "schema key: domain_whitelist_item_01\n", + "schema key: domain_whitelist_item_02\n", + "schema key: domain_whitelist_item_03\n", + "schema key: domain_whitelist_item_04\n", + "schema key: domain_whitelist_item_05\n", + "schema key: domain_whitelist_item_06\n", + "schema key: domain_whitelist_item_07\n", + "schema key: domain_whitelist_item_08\n", + "schema key: email_transport_types\n", + " schema value: maildev\n", + " grep result:EMAIL_TRANSPORT_TYPES=maildev\n", + " grep result: echo EMAIL_TRANSPORT_TYPES=mailgun,aws-ses,nonexistent,maildev >> server/docker-dev.env\n", + " grep result:\n", + "schema key: encryption_password_00001\n", + "schema key: env\n", + " schema value: development\n", + " grep result: \"build\n", + " grep result: \"build\n", + " grep result: \"build\n", + " grep result:# export NODE_ENV=production\n", + " grep result:# export NODE_ENV=development\n", + " grep result: NODE_ENV\n", + " grep result:\n", + "schema key: fb_app_id\n", + " schema value: 661042417336977\n", + " grep result: FB_APP_ID\n", + " grep result: FB_APP_ID\n", + " grep result:\n", + "schema key: google_api_key\n", + "schema key: google_creds_stringified\n", + " schema value: X\n", + " grep result:# GOOGLE_CREDS_STRINGIFIED=xxxxxxxxxxxxxxxxxxxxxxx...\n", + " grep result:heroku config\n", + " grep result:heroku config\n", + " grep result:\n", + "schema key: intercom_access_token\n", + "schema key: local_output_path\n", + " schema value: ./build\n", + " grep result: LOCAL_OUTPUT_PATH\n", + " grep result: LOCAL_OUTPUT_PATH\n", + " grep result: LOCAL_OUTPUT_PATH\n", + " grep result:\n", + "schema key: mailgun_api_key\n", + "schema key: math_env\n", + " schema value: dev\n", + " grep result:MATH_ENV=dev\n", + " grep result:echo \"export MATH_ENV=prod\"\n", + " grep result:\n", + "schema key: maxmind_licensekey\n", + "schema key: maxmind_userid\n", + "schema key: polis_from_address\n", + " schema value: \n", + " grep result:POLIS_FROM_ADDRESS=\"Example \"\n", + " grep result:\n", + "schema key: polis_slack_app_client_id\n", + "schema key: polis_slack_app_client_secret\n", + "schema key: port\n", + " schema value: 5000\n", + " grep result:ADMIN_EMAIL_DATA_EXPORT=\"\"\n", + " grep result:PORT=5000\n", + " grep result:STATIC_FILES_ADMINDASH_PORT=8080\n", + " grep result:STATIC_FILES_PORT=8080\n", + " grep result:export STATIC_FILES_PORT=5001\n", + " grep result:export STATIC_FILES_ADMINDASH_PORT=5002\n", + " grep result:export PORT=5000\n", + " grep result:export STATIC_FILES_PORT=5001\n", + " grep result:export STATIC_FILES_ADMINDASH_PORT=5002\n", + " grep result:export PORT=5000\n", + " grep result: PORT\n", + " grep result:\n", + "schema key: primary_polis_url\n", + "schema key: run_periodic_export_tests\n", + "schema key: s3_bucket_preprod\n", + " schema value: preprod.pol.is\n", + " grep result: S3_BUCKET_PREPROD\n", + " grep result: S3_BUCKET_PREPROD\n", + " grep result: S3_BUCKET_PREPROD\n", + " grep result:\n", + "schema key: s3_bucket_prod\n", + " schema value: pol.is\n", + " grep result: S3_BUCKET_PROD\n", + " grep result: S3_BUCKET_PROD\n", + " grep result: S3_BUCKET_PROD\n", + " grep result:\n", + "schema key: scp_subdir_preprod\n", + " schema value: preprod\n", + " grep result: SCP_SUBDIR_PREPROD\n", + " grep result: SCP_SUBDIR_PREPROD\n", + " grep result: SCP_SUBDIR_PREPROD\n", + " grep result:\n", + "schema key: scp_subdir_prod\n", + " schema value: prod\n", + " grep result: SCP_SUBDIR_PROD\n", + " grep result: SCP_SUBDIR_PROD\n", + " grep result: SCP_SUBDIR_PROD\n", + " grep result:\n", + "schema key: service_hostname\n", + " schema value: undefined\n", + " grep result: //SERVICE_HOSTNAME\n", + " grep result: SERVICE_HOSTNAME\n", + " grep result:\n", + "schema key: service_url\n", + " schema value: http://localhost:5000\n", + " grep result: //SERVICE_URL\n", + " grep result: SERVICE_URL\n", + " grep result:console.log(\"SERVICE_URL\n", + " grep result:This shell script file should contain a line like `export SERVICE_URL=https\n", + " grep result:#export SERVICE_URL=https\n", + " grep result:export SERVICE_URL=http\n", + " grep result:#export SERVICE_URL=https\n", + " grep result:export SERVICE_URL=http\n", + " grep result: //SERVICE_URL\n", + " grep result: SERVICE_URL\n", + " grep result:console.log(\"SERVICE_URL\n", + " grep result: //SERVICE_URL\n", + " grep result: SERVICE_URL\n", + " grep result:\n", + "schema key: should_use_translation_api\n", + " schema value: False\n", + " grep result:SHOULD_USE_TRANSLATION_API=false\n", + " grep result:1. Configure `SHOULD_USE_TRANSLATION_API=true` within `server/docker-dev.env`\n", + " grep result: echo SHOULD_USE_TRANSLATION_API=true >> server/docker-dev.env\n", + " grep result:\n", + "schema key: slack_api_token\n", + "schema key: static_files_admindash_port\n", + " schema value: 8080\n", + " grep result:STATIC_FILES_ADMINDASH_PORT=8080\n", + " grep result:export STATIC_FILES_ADMINDASH_PORT=5002\n", + " grep result:export STATIC_FILES_ADMINDASH_PORT=5002\n", + " grep result:\n", + "schema key: static_files_host\n", + " schema value: file-server\n", + " grep result:STATIC_FILES_HOST=file-server\n", + " grep result:export STATIC_FILES_HOST=localhost\n", + " grep result:export STATIC_FILES_HOST=localhost\n", + " grep result:\n", + "schema key: static_files_port\n", + " schema value: 8080\n", + " grep result:STATIC_FILES_PORT=8080\n", + " grep result:export STATIC_FILES_PORT=5001\n", + " grep result:export STATIC_FILES_PORT=5001\n", + " grep result:\n", + "schema key: static_files_report_port\n", + "schema key: stripe_client_id\n", + "schema key: stripe_secret_key\n", + " schema value: sk_test_NFBDEThkpHCYBzXPJuBlY8TW\n", + " grep result:STRIPE_SECRET_KEY=sk_test_NFBDEThkpHCYBzXPJuBlY8TW\n", + " grep result:export STRIPE_SECRET_KEY=sk_test_NFBDEThkpHCYBzXPJuBlY8TW\n", + " grep result:\n", + "schema key: twitter_consumer_key\n", + "schema key: twitter_consumer_secret\n", + "schema key: uploader\n", + " schema value: local\n", + " grep result: UPLOADER\n", + " grep result: UPLOADER\n", + " grep result: UPLOADER\n", + " grep result:\n", + "schema key: webserver_pass\n", + " schema value: 8a7157439f50\n", + " grep result:WEBSERVER_PASS=ws-pass\n", + " grep result:WEBSERVER_PASS=ws-pass\n", + " grep result:\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "schema key: webserver_username\n", + " schema value: f4c19337e502\n", + " grep result:WEBSERVER_USERNAME=ws-user\n", + " grep result:WEBSERVER_USERNAME=ws-user\n", + " grep result:\n" + ] + } + ], + "source": [ + "file = \"schema.yaml\"\n", + "with open(file) as src:\n", + " data = parse_preserving_duplicates(src)\n", + "print(f\"finding duplicate keys in {file}\")\n", + "count = 0\n", + "for key in data.keys():\n", + " if len(data[key]) > 1: \n", + " count += 1\n", + " print(f\"key: {key}\")\n", + " print(f\"value:\\n{data[key]}\")\n", + "print(f\"number of keys: {len(data)}\")\n", + "if count == 0:\n", + " print(\"no duplicates found\")\n", + " \n", + "print(\"\\nFor comparison with the next file:\")\n", + "keys = [\n", + " 'webserver_pass',\n", + " 'admin_emails',\n", + " 'admin_uids']\n", + "for key in keys:\n", + " print(f\"key: {key}\")\n", + " print(f\" value: {data[key][0]['default'][0]}\")\n", + "print()\n", + "with open(file) as src:\n", + " data = yaml.safe_load(src)\n", + "\n", + "file = \"env_all_to_be_deleted.yaml\"\n", + "with open(file) as src:\n", + " data = parse_preserving_duplicates(src)\n", + "print(f\"finding duplicate keys in {file}\")\n", + "for key in data.keys():\n", + " if len(data[key]) > 1: \n", + " value_set = set()\n", + " for key_dict in data[key]:\n", + " try:\n", + " value_set.add(key_dict['default'][0])\n", + " except TypeError:\n", + " print(f\"key: {key}\")\n", + " print(\" unhashable value: {key_dict['default'][0]}\")\n", + " if len(value_set) > 1:\n", + " print(f\"key: {key}\")\n", + " print(f\" set of values: {value_set}\")\n", + "print(f\"number of keys: {len(data)}\")\n", + "\n", + "file = \"schema.yaml\"\n", + "sorted_file = \"schema_sorted.yaml\"\n", + "with open(file) as src:\n", + " data = yaml.safe_load(src)\n", + "sorted_data = {}\n", + "for key in sorted(data.keys()):\n", + " sorted_data[key] = data[key]\n", + "with open(sorted_file, \"w\") as dest:\n", + " yaml.dump(sorted_data, dest)\n", + "\n", + "print()\n", + "polis_path = \"/Users/crkrenn/code/polis_dir/polis\" \n", + "for key in list(sorted(data.keys())):\n", + " result = subprocess.run(\n", + " [\"grep\", \"-R\", \n", + " \"-e\", data[key]['env']+':', \n", + " \"-e\", data[key]['env']+'=', \n", + " polis_path],\n", + " capture_output=True)\n", + " print(f\"schema key: {key}\")\n", + " if not result.returncode:\n", + " print(f\" schema value: {data[key]['default']}\")\n", + " result_stdout = result.stdout.decode(\"utf-8\")\n", + " result_stdout_list = result_stdout.split('\\n')\n", + " for result_stdout in result_stdout_list:\n", + " try:\n", + " result_stdout = result_stdout.split(':')[1]\n", + " except IndexError:\n", + " pass\n", + " print( \" grep result:\" + result_stdout)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b9bd9442", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[defaultdict(list,\n", + " {'doc': ['webserver_pass'],\n", + " 'default': ['ws-passPOSTGRES_DB=polis-dev'],\n", + " 'env': ['WEBSERVER_PASS']}),\n", + " defaultdict(list,\n", + " {'doc': ['webserver_pass'],\n", + " 'default': ['ws-pass'],\n", + " 'env': ['WEBSERVER_PASS']}),\n", + " defaultdict(list,\n", + " {'doc': ['webserver_pass'],\n", + " 'default': ['ws-passPOSTGRES_DB=polis-dev'],\n", + " 'env': ['WEBSERVER_PASS']}),\n", + " defaultdict(list,\n", + " {'doc': ['webserver_pass'],\n", + " 'default': ['ws-pass'],\n", + " 'env': ['WEBSERVER_PASS']})]" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['webserver_pass']" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6aba1ae1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/config/merge_config_yaml_files.py b/config/merge_config_yaml_files.py new file mode 100644 index 0000000000..d9ae07f82b --- /dev/null +++ b/config/merge_config_yaml_files.py @@ -0,0 +1,128 @@ +# --- +# jupyter: +# jupytext: +# text_representation: +# extension: .py +# format_name: light +# format_version: '1.5' +# jupytext_version: 1.13.6 +# kernelspec: +# display_name: Python 3 +# language: python +# name: python3 +# --- + +# + +import yaml + +import subprocess +from collections import defaultdict, OrderedDict + + +def parse_preserving_duplicates(src): + # We deliberately define a fresh class inside the function, + # because add_constructor is a class method and we don't want to + # mutate pyyaml classes. + class PreserveDuplicatesLoader(yaml.loader.Loader): + pass + + def map_constructor(loader, node, deep=False): + """Walk the mapping, recording any duplicate keys. + + """ + mapping = defaultdict(list) + for key_node, value_node in node.value: + key = loader.construct_object(key_node, deep=deep) + value = loader.construct_object(value_node, deep=deep) + + mapping[key].append(value) + + return mapping + + PreserveDuplicatesLoader.add_constructor(yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, map_constructor) + return yaml.load(src, PreserveDuplicatesLoader) + + +# + +file = "schema.yaml" +with open(file) as src: + data = parse_preserving_duplicates(src) +print(f"finding duplicate keys in {file}") +count = 0 +for key in data.keys(): + if len(data[key]) > 1: + count += 1 + print(f"key: {key}") + print(f"value:\n{data[key]}") +print(f"number of keys: {len(data)}") +if count == 0: + print("no duplicates found") + +print("\nFor comparison with the next file:") +keys = [ + 'webserver_pass', + 'admin_emails', + 'admin_uids'] +for key in keys: + print(f"key: {key}") + print(f" value: {data[key][0]['default'][0]}") +print() +with open(file) as src: + data = yaml.safe_load(src) + +file = "env_all_to_be_deleted.yaml" +with open(file) as src: + data = parse_preserving_duplicates(src) +print(f"finding duplicate keys in {file}") +for key in data.keys(): + if len(data[key]) > 1: + value_set = set() + for key_dict in data[key]: + try: + value_set.add(key_dict['default'][0]) + except TypeError: + print(f"key: {key}") + print(" unhashable value: {key_dict['default'][0]}") + if len(value_set) > 1: + print(f"key: {key}") + print(f" set of values: {value_set}") +print(f"number of keys: {len(data)}") + +file = "schema.yaml" +sorted_file = "schema_sorted.yaml" +with open(file) as src: + data = yaml.safe_load(src) +sorted_data = {} +for key in sorted(data.keys()): + sorted_data[key] = data[key] +with open(sorted_file, "w") as dest: + yaml.dump(sorted_data, dest) + +print() +polis_path = "/Users/crkrenn/code/polis_dir/polis" +for key in list(sorted(data.keys())): + result = subprocess.run( + ["grep", "-R", + "-e", data[key]['env']+'.*:', + "-e", data[key]['env']+'.*=', + "-e", key+'.*=', + polis_path], + capture_output=True) + print(f"schema key: {key}") + if not result.returncode: + print(f" schema value: {data[key]['default']}") + result_stdout = result.stdout.decode("utf-8") + result_stdout_list = result_stdout.split('\n') + for result_stdout in result_stdout_list: + try: + result_stdout = result_stdout.split(':')[1] + except IndexError: + pass + print( " grep result:" + result_stdout) + + +# - + +data['webserver_pass'] + + diff --git a/config/package.json b/config/package.json new file mode 100644 index 0000000000..2ddf7e3698 --- /dev/null +++ b/config/package.json @@ -0,0 +1,16 @@ +{ + "name": "polisconfig", + "version": "1.0.0", + "description": "", + "main": "export_config.js", + "scripts": { + "start": "node export_config.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "convict": "6.0.0", + "js-yaml": "3.14.0" + } +} diff --git a/config/schema.yaml b/config/schema.yaml new file mode 100644 index 0000000000..2fe8dc8a6b --- /dev/null +++ b/config/schema.yaml @@ -0,0 +1,314 @@ +00documentation: + default: + - Precedence order (https://www.npmjs.com/package/convict) + - . + - When merging configuration values from different sources, + - Convict follows precedence rules. The order, from lowest to highest, for + - config.loadFile(file) and config.load(json) is + - . + - Default value + - File or json set in function argument + - Environment variables (only used when env property is set in schema) + - Command line arguments (only used when arg property is set in schema) + - . + - For easy json/yaml conversion: https://www.json2yaml.com/ + - . + - NOTE: Please be careful when chosing defaults for undefined + - environment variables. "undefined" is recommended + - . + - The defaults for all variables below are currently for development builds. + doc: 00documentation + env: 00DOCUMENTATION +admin_email_data_export: + default: '' + doc: admin_email_data_export + env: ADMIN_EMAIL_DATA_EXPORT +admin_email_data_export_test: + default: '' + doc: admin_email_data_export_test + env: ADMIN_EMAIL_DATA_EXPORT_TEST +admin_email_email_test: + default: '' + doc: admin_email_email_test + env: ADMIN_EMAIL_EMAIL_TEST +admin_emails: + default: [] + doc: admin_emails + env: ADMIN_EMAILS +admin_uids: + default: [] + doc: admin_uids + env: ADMIN_UIDS +akismet_antispam_api_key: + default: '' + doc: akismet_antispam_api_key (ex. a1a11111aa11) + env: AKISMET_ANTISPAM_API_KEY + format: String +akismet_root_url: + default: https://pol.is + doc: akismet_root_url + env: AKISMET_ROOT_URL +aws_access_key_id: + default: undefined + doc: aws_access_key_id + env: AWS_ACCESS_KEY_ID + sensitive: true + tag: api +aws_region: + default: us-east-1 + doc: aws_region + env: AWS_REGION +aws_s3_api_version: + default: 2006-03-01 + doc: aws_s3_api_version + env: AWS_S3_API_VERSION +aws_secret_access_key: + default: undefined + doc: aws_secret_access_key + env: AWS_SECRET_ACCESS_KEY + sensitive: true +aws_ses_api_version: + default: 2010-12-01 + doc: aws_s3_api_version + env: AWS_S3_API_VERSION +backfill_comment_lang_detection: + default: false + doc: backfill_comment_lang_detection + env: BACKFILL_COMMENT_LANG_DETECTION +cache_math_results: + default: false + doc: cache_math_results + env: CACHE_MATH_RESULTS +client_participation_port: + default: 5001 + doc: Note that this must match the participation client port specified in polisServer + instance + env: CLIENT_PARTICIPATION_PORT +database_for_reads_url: + default: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev + doc: database_for_reads_url (often is the same as database_url) + env: DATABASE_FOR_READS_URL +database_url: + default: postgres://postgres:oiPorg3Nrz0yqDLE@postgres:5432/polis-dev + doc: database_url + env: DATABASE_URL +dev_mode: + default: true + doc: dev_mode + env: DEV_MODE +disable_intercom: + default: true + doc: disable_intercom + env: DISABLE_INTERCOM +disable_plans: + default: true + doc: disable_plans + env: DISABLE_PLANS +domainWhitelist: + default: + - ^localhost$ + - ^192\\.168\\.1\\.141$ + - ^192\\.168\\.1\\.140$ + - ^pol\\.is + - .+\\.pol\\.is$ + - ^xip\\.io$ + - .+\\.xip\\.io$ + doc: domainWhitelist + env: DOMAIN_WHITELIST +domain_override: + default: '' + doc: domain_override + env: DOMAIN_OVERRIDE +domain_whitelist_item_01: + default: '' + doc: domain_whitelist_item_01 + env: DOMAIN_WHITELIST_ITEM_01 +domain_whitelist_item_02: + default: '' + doc: domain_whitelist_item_02 + env: DOMAIN_WHITELIST_ITEM_02 +domain_whitelist_item_03: + default: '' + doc: domain_whitelist_item_03 + env: DOMAIN_WHITELIST_ITEM_03 +domain_whitelist_item_04: + default: '' + doc: domain_whitelist_item_04 + env: DOMAIN_WHITELIST_ITEM_04 +domain_whitelist_item_05: + default: '' + doc: domain_whitelist_item_05 + env: DOMAIN_WHITELIST_ITEM_05 +domain_whitelist_item_06: + default: '' + doc: domain_whitelist_item_06 + env: DOMAIN_WHITELIST_ITEM_06 +domain_whitelist_item_07: + default: '' + doc: domain_whitelist_item_07 + env: DOMAIN_WHITELIST_ITEM_07 +domain_whitelist_item_08: + default: '' + doc: domain_whitelist_item_08 + env: DOMAIN_WHITELIST_ITEM_08 +email_transport_types: + default: maildev + doc: + - email_transport_types - maildev, aws-ses, mailgun + - ex. `aws-ses,mailgun` would try sending via AWS SES first, and fallback to Mailgun + on error. + - cypress-tests.yml uses - EMAIL_TRANSPORT_TYPES=mailgun,aws-ses,nonexistent,maildev + env: EMAIL_TRANSPORT_TYPES +encryption_password_00001: + default: c9336642-2024-43a8-99cd-77ee38e82a9c + doc: encryption_password_00001 + env: ENCRYPTION_PASSWORD_00001 +env: + default: development + doc: The application environment + env: NODE_ENV + format: + - production + - development + - test +fb_app_id: + default: 661042417336977 + doc: must register with facebook and get a facebook app id to use the facebook auth + features + env: FB_APP_ID +google_api_key: + default: undefined + doc: google_api_key + env: GOOGLE_API_KEY +google_creds_stringified: + default: X + doc: google_creds_stringified + env: GOOGLE_CREDS_STRINGIFIED +intercom_access_token: + default: undefined + doc: intercom_access_token + env: INTERCOM_ACCESS_TOKEN +local_output_path: + default: ./build + doc: Uploader settings local + env: LOCAL_OUTPUT_PATH +mailgun_api_key: + default: undefined + doc: mailgun_api_key + env: MAILGUN_API_KEY +math_env: + default: dev + doc: math_env + env: MATH_ENV +maxmind_licensekey: + default: undefined + doc: maxmind_licensekey + env: MAXMIND_LICENSEKEY +maxmind_userid: + default: undefined + doc: maxmind_userid + env: MAXMIND_USERID +polis_from_address: + default: "Example " + doc: polis_from_address + env: POLIS_FROM_ADDRESS +polis_slack_app_client_id: + default: X + doc: polis_slack_app_client_id + env: POLIS_SLACK_APP_CLIENT_ID +polis_slack_app_client_secret: + default: X + doc: polis_slack_app_client_secret + env: POLIS_SLACK_APP_CLIENT_SECRET +port: + default: undefined + doc: port + env: PORT +primary_polis_url: + default: undefined + doc: primary_polis_url + env: PRIMARY_POLIS_URL +run_periodic_export_tests: + default: false + doc: run_periodic_export_tests + env: RUN_PERIODIC_EXPORT_TESTS +s3_bucket_preprod: + default: preprod.pol.is + doc: uploader settings s3 + env: S3_BUCKET_PREPROD +s3_bucket_prod: + default: pol.is + doc: uploader settings s3 + env: S3_BUCKET_PROD +scp_subdir_preprod: + default: preprod + doc: uploader settings scp + env: SCP_SUBDIR_PREPROD +scp_subdir_prod: + default: prod + doc: uploader settings scp + env: SCP_SUBDIR_PROD +service_hostname: + default: undefined + doc: service_hostname + env: SERVICE_HOSTNAME +service_url: + default: undefined + doc: Point to a polisServer instance (local recommended for dev) + env: SERVICE_URL +should_use_translation_api: + default: false + doc: should_use_translation_api + env: SHOULD_USE_TRANSLATION_API +slack_api_token: + default: undefined + doc: slack_api_token + env: SLACK_API_TOKEN +static_files_admindash_port: + default: 8080 + doc: static_files_admindash_port + env: STATIC_FILES_ADMINDASH_PORT +static_files_host: + default: file-server + doc: static_files_host + env: STATIC_FILES_HOST +static_files_port: + default: 8080 + doc: static_files_port + env: STATIC_FILES_PORT +static_files_report_port: + default: 8080 + doc: static_files_report_port + env: STATIC_FILES_REPORT_PORT +stripe_client_id: + default: undefined + doc: stripe_client_id + env: STRIPE_CLIENT_ID +stripe_secret_key: + default: sk_test_NFBDEThkpHCYBzXPJuBlY8TW + doc: stripe_secret_key + env: STRIPE_SECRET_KEY +twitter_consumer_key: + default: undefined + doc: twitter_consumer_key + env: TWITTER_CONSUMER_KEY +twitter_consumer_secret: + default: undefined + doc: twitter_consumer_secret + env: TWITTER_CONSUMER_SECRET +uploader: + default: local + doc: uploader for compiled static javascript + env: UPLOADER + format: + - local + - s3 + - scp +webserver_pass: + default: 8a7157439f50 + doc: webserver_pass + env: WEBSERVER_PASS +webserver_username: + default: f4c19337e502 + doc: webserver_username + env: WEBSERVER_USERNAME diff --git a/docker-compose.yml b/docker-compose.yml index cffa3436f3..bd4fe1a525 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +# @TTD: sort networks/volumes consistently (network first) + # before running docker-compose up for the first time, # either do a pull: # docker-compose pull @@ -13,12 +15,16 @@ # to stop: # docker-compose down +## TODO: add config container + version: "3.1" services: server: container_name: polis-server env_file: ./server/docker-dev.env + environment: + - POLIS_ROOT=/app/ image: compdem/polis-server:${TAG} build: context: ./server @@ -28,6 +34,8 @@ services: - "file-server" networks: - "polis-net" + volumes: + - "config:/app/config" ports: - "5000:5000" - "9229:9229" @@ -40,6 +48,8 @@ services: - "postgres" build: context: ./math + volumes: + - "config:/config" networks: - "polis-net" @@ -47,6 +57,8 @@ services: container_name: polis-postgres env_file: ./server/docker-db-dev.env image: compdem/polis-postgres:${TAG} + depends_on: + - "config" restart: always build: context: ./server @@ -55,6 +67,7 @@ services: - "polis-net" volumes: - "backups:/backups" + - "config:/config" - "postgres:/var/lib/postgresql/data" nginx-proxy: @@ -69,6 +82,8 @@ services: - "server" networks: - "polis-net" + volumes: + - "config:/config" ports: - "80:80" - "443:443" @@ -85,12 +100,16 @@ services: - "client-report" networks: - "polis-net" + volumes: + - "config:/config" ports: - "8080:8080" client-participation: container_name: polis-client-participation image: compdem/polis-client-participation:${TAG} + depends_on: + - "config" build: context: ./client-participation args: @@ -99,6 +118,8 @@ services: client-admin: container_name: polis-client-admin image: compdem/polis-client-admin:${TAG} + depends_on: + - "config" build: context: ./client-admin args: @@ -107,6 +128,8 @@ services: client-report: container_name: polis-client-report image: compdem/polis-client-report:${TAG} + depends_on: + - "config" build: context: ./client-report args: @@ -122,9 +145,19 @@ services: # SMTP port - "25:25" + config: + build: + context: ./config + dockerfile: Dockerfile + volumes: + - "config:/config" + networks: polis-net: volumes: backups: postgres: + config: + # We hardcode this machine name so it won't vary depending on git dir name. + name: polis_config diff --git a/server/app.ts b/server/app.ts index 67d6ef0a58..bebf97b18b 100644 --- a/server/app.ts +++ b/server/app.ts @@ -16,6 +16,9 @@ const app = express(); // See: https://expressjs.com/en/guide/behind-proxies.html app.set("trust proxy", "uniquelocal"); +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + var helpersInitialized = new Promise(function (resolve, reject) { resolve(server.initializePolisHelpers()); @@ -1959,9 +1962,9 @@ helpersInitialized.then( app.get(/^\/[^(api\/)]?.*/, proxy); } - app.listen(process.env.PORT); + app.listen(config.get('port')); - winston.log("info", "started on port " + process.env.PORT); + winston.log("info", "started on port " + config.get('port')); }, function (err) { console.error("failed to init server"); diff --git a/server/package-lock.json b/server/package-lock.json index 0cc41b1f41..7a9a4a4433 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1284,6 +1284,15 @@ "bluebird": "^3.1.1" } }, + "convict": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/convict/-/convict-6.0.0.tgz", + "integrity": "sha512-osfPkv5yjVoZqrTWBXuh/ABGpFoaJplbt0WXr0CodR4CSWt8UnzY4PSUyRz/+5BX5YUtWcToG29Kr0B6xhdIMg==", + "requires": { + "lodash.clonedeep": "^4.5.0", + "yargs-parser": "^18.1.3" + } + }, "core-util-is": { "version": "1.0.2", "resolved": false, @@ -3858,6 +3867,22 @@ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + } + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", diff --git a/server/package.json b/server/package.json index be9ffe222d..2e9e36b6d1 100644 --- a/server/package.json +++ b/server/package.json @@ -32,12 +32,14 @@ "bluebird": "3.5.0", "boolean": "^0.1.3", "connect-timeout": "1.9.0", + "convict": "6.0.0", "eslint": "2.13.1", "express": "3.21.2", "fb": "1.0.2", "http-proxy": "1.18.1", "intercom-client": "2.11.2", "intercom.io": "1.5.0", + "js-yaml": "3.14.0", "lru-cache": "3.0.0", "mimelib": "0.2.19", "nodemailer": "^6.4.16", diff --git a/server/src/comment.ts b/server/src/comment.ts index ee046ccc10..5ae76d750d 100644 --- a/server/src/comment.ts +++ b/server/src/comment.ts @@ -44,7 +44,10 @@ type UidToSocialInfo = { [key: string]: any; }; -const useTranslateApi = isTrue(process.env.SHOULD_USE_TRANSLATION_API); +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + +const useTranslateApi = isTrue(config.get('should_use_translation_api')); let translateClient: any = null; if (useTranslateApi) { // Tell translation library where to find credentials, and write them to disk. diff --git a/server/src/db/pg-query.ts b/server/src/db/pg-query.ts index e45a098088..761ecaa3da 100644 --- a/server/src/db/pg-query.ts +++ b/server/src/db/pg-query.ts @@ -6,6 +6,9 @@ import { isDevMode } from "../config"; import { yell } from "../log"; import { MPromise } from "../utils/metered"; +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + // # DB Connections // // heroku pg standard plan has 120 connections @@ -18,13 +21,13 @@ import { MPromise } from "../utils/metered"; // // Note we use native const usingReplica = - process.env.DATABASE_URL !== +config.get('database_url') !== process.env[process.env.DATABASE_FOR_READS_NAME as string]; const poolSize = isDevMode() ? 2 : usingReplica ? 3 : 12; // not sure how many of these config options we really need anymore const pgConnection = Object.assign( - parsePgConnectionString(process.env.DATABASE_URL || ""), + parsePgConnectionString(config.get('database_url') || ""), { max: poolSize, isReadOnly: false, diff --git a/server/src/email/senders.ts b/server/src/email/senders.ts index 972d1f4217..c662a31ca2 100644 --- a/server/src/email/senders.ts +++ b/server/src/email/senders.ts @@ -11,9 +11,12 @@ import AWS from "aws-sdk"; import nodemailer from "nodemailer"; import mg from "nodemailer-mailgun-transport"; +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + // https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-region.html // v2 docs, since we use v2 in our package.json: "aws:sdk": "2.78.0" -AWS.config.update({ region: process.env.AWS_REGION }); +AWS.config.update({ region: config.get('aws_region') }); function sendTextEmailWithBackup( sender: any, @@ -22,7 +25,7 @@ function sendTextEmailWithBackup( text: any ) { const transportTypes = process.env.EMAIL_TRANSPORT_TYPES - ? process.env.EMAIL_TRANSPORT_TYPES.split(",") + ? config.get('email_transport_types').split(",") : ["aws-ses", "mailgun"]; if (transportTypes.length < 2) { new Error("No backup email transport available."); @@ -51,7 +54,7 @@ function getMailOptions(transportType: any) { // This forces fake credentials if envvars unset, so error is caught // in auth and failover works without crashing server process. // TODO: Suppress error thrown by mailgun library when unset. - api_key: process.env.MAILGUN_API_KEY || "unset-value", + api_key: config.get('mailgun_api_key') || "unset-value", domain: process.env.MAILGUN_DOMAIN || "unset-value", }, }; @@ -72,7 +75,7 @@ function sendTextEmail( recipient: any, subject: any, text: any, - transportTypes = process.env.EMAIL_TRANSPORT_TYPES, + transportTypes = config.get('email_transport_types'), priority = 1 ) { // Exit if empty string passed. diff --git a/server/src/server.ts b/server/src/server.ts index 859baaff3d..4238bdbae7 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -2,6 +2,9 @@ "use strict"; +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + import akismetLib from "akismet"; import AWS from "aws-sdk"; import badwords from "badwords/object"; @@ -74,10 +77,10 @@ import { Assignment, } from "./d"; -AWS.config.update({ region: process.env.AWS_REGION }); -const devMode = isTrue(process.env.DEV_MODE); +AWS.config.update({ region: config.get('aws_region') }); +const devMode = isTrue(config.get('dev_mode')); const s3Client = new AWS.S3({ apiVersion: "2006-03-01" }); -const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY); +const stripe = require("stripe")(config.get('stripe_secret_key')); const yell = Log.yell; // Property 'Client' does not exist on type '{ query: (...args: any[]) => void; query_readOnly: // (...args: any[]) => void; queryP: (...args: any[]) => Promise; queryP_metered: @@ -116,7 +119,7 @@ import SQL from "./db/sql"; // End of re-import // # Slack setup -var web = new WebClient(process.env.SLACK_API_TOKEN); +var web = new WebClient(config.get('slack_api_token')); // const winston = require("winston"); // # notifications const winston = console; @@ -129,9 +132,9 @@ const resolveWith = (x: { body?: { user_id: string } }) => { }; const intercomClient = - !isTrue(process.env.DISABLE_INTERCOM) && process.env.INTERCOM_ACCESS_TOKEN + !isTrue(config.get('disable_intercom')) && config.get('intercom_access_token') ? new IntercomOfficial.Client({ - token: process.env.INTERCOM_ACCESS_TOKEN, + token: config.get('intercom_access_token'), }) : { leads: { @@ -186,15 +189,15 @@ Promise.onPossiblyUnhandledRejection(function (err: { stack: any }) { // throw err; // not throwing since we're printing stack traces anyway }); -const adminEmailDataExport = process.env.ADMIN_EMAIL_DATA_EXPORT || ""; -const adminEmailDataExportTest = process.env.ADMIN_EMAIL_DATA_EXPORT_TEST || ""; -const adminEmailEmailTest = process.env.ADMIN_EMAIL_EMAIL_TEST || ""; +const adminEmailDataExport = config.get('admin_email_data_export') || ""; +const adminEmailDataExportTest = config.get('admin_email_data_export_test') || ""; +const adminEmailEmailTest = config.get('admin_email_email_test') || ""; -const admin_emails = process.env.ADMIN_EMAILS - ? JSON.parse(process.env.ADMIN_EMAILS) +const admin_emails = config.get('admin_emails').length !== 0 + ? JSON.parse(config.get('admin_emails')) : []; -const polisDevs = process.env.ADMIN_UIDS - ? JSON.parse(process.env.ADMIN_UIDS) +const polisDevs = config.get('admin_uids').length !== 0 + ? JSON.parse(config.get('admin_uids')) : []; function isPolisDev(uid?: any) { console.log("polisDevs", polisDevs); @@ -240,11 +243,11 @@ setInterval(function () { // state: '3(#0/!~' // }); // // END GITHUB OAUTH2 -const POLIS_FROM_ADDRESS = process.env.POLIS_FROM_ADDRESS; +const POLIS_FROM_ADDRESS = config.get('polis_from_address'); const akismet = akismetLib.client({ blog: "https://pol.is", // required: your root level url - apiKey: process.env.AKISMET_ANTISPAM_API_KEY, + apiKey: config.get('akismet_antispam_api_key'), }); akismet.verifyKey(function (err: any, verified: any) { @@ -747,7 +750,7 @@ function initializePolisHelpers() { const detectLanguage = Comment.detectLanguage; - if (isTrue(process.env.BACKFILL_COMMENT_LANG_DETECTION)) { + if (isTrue(config.get('backfill_comment_lang_detection'))) { pgQueryP("select tid, txt, zid from comments where lang is null;", []).then( // Argument of type '(comments: string | any[]) => void' is not assignable to parameter of type '(value: unknown) => void | PromiseLike'. // Types of parameters 'comments' and 'value' are incompatible. @@ -1383,14 +1386,14 @@ function initializePolisHelpers() { let whitelistedDomains = [ "pol.is", - process.env.DOMAIN_WHITELIST_ITEM_01, - process.env.DOMAIN_WHITELIST_ITEM_02, - process.env.DOMAIN_WHITELIST_ITEM_03, - process.env.DOMAIN_WHITELIST_ITEM_04, - process.env.DOMAIN_WHITELIST_ITEM_05, - process.env.DOMAIN_WHITELIST_ITEM_06, - process.env.DOMAIN_WHITELIST_ITEM_07, - process.env.DOMAIN_WHITELIST_ITEM_08, + config.get('domain_whitelist_item_01'), + config.get('domain_whitelist_item_02'), + config.get('domain_whitelist_item_03'), + config.get('domain_whitelist_item_04'), + config.get('domain_whitelist_item_05'), + config.get('domain_whitelist_item_06'), + config.get('domain_whitelist_item_07'), + config.get('domain_whitelist_item_08'), "localhost:5001", "localhost:5002", "canvas.instructure.com", // LTI @@ -1595,7 +1598,7 @@ function initializePolisHelpers() { } res.status(200).json({}); } - let pcaCacheSize = process.env.CACHE_MATH_RESULTS === "true" ? 300 : 1; + let pcaCacheSize = config.get('cache_math_results') === "true" ? 300 : 1; let pcaCache = new LruCache({ max: pcaCacheSize, }); @@ -1895,7 +1898,7 @@ function initializePolisHelpers() { return pgQueryP_readOnly( "select * from math_main where zid = ($1) and math_env = ($2);", - [zid, process.env.MATH_ENV] + [zid, config.get('math_env')] // Argument of type '(rows: string | any[]) => Promise | null' is not assignable to parameter of type '(value: unknown) => any'. // Types of parameters 'rows' and 'value' are incompatible. // Type 'unknown' is not assignable to type 'string | any[]'. @@ -1910,7 +1913,7 @@ function initializePolisHelpers() { INFO("mathpoll related; after cache miss, unable to find data for", { zid, math_tick, - math_env: process.env.MATH_ENV, + math_env: config.get('math_env'), }); return null; } @@ -2151,7 +2154,7 @@ function initializePolisHelpers() { ) { let zid = req.p.zid; let uid = req.p.uid; - let math_env = process.env.MATH_ENV; + let math_env = config.get('math_env'); let math_update_type = req.p.math_update_type; isModerator(zid, uid).then((hasPermission: any) => { @@ -2192,7 +2195,7 @@ function initializePolisHelpers() { } ) { let rid = req.p.rid; - let math_env = process.env.MATH_ENV; + let math_env = config.get('math_env'); let math_tick = req.p.math_tick; console.log(req.p); @@ -2298,9 +2301,9 @@ function initializePolisHelpers() { ); } if ( - process.env.RUN_PERIODIC_EXPORT_TESTS && + config.get('run_periodic_export_tests') && !devMode && - process.env.MATH_ENV === "preprod" + config.get('math_env') === "preprod" ) { let runExportTest = () => { let math_env = "prod"; @@ -2351,7 +2354,7 @@ function initializePolisHelpers() { getUserInfoForUid2(req.p.uid) .then((user: { email: any }) => { return doAddDataExportTask( - process.env.MATH_ENV, + config.get('math_env'), user.email, req.p.zid, req.p.unixTimestamp * 1000, @@ -2375,7 +2378,7 @@ function initializePolisHelpers() { ) { var url = s3Client.getSignedUrl("getObject", { Bucket: "polis-datadump", - Key: process.env.MATH_ENV + "/" + req.p.filename, + Key: config.get('math_env') + "/" + req.p.filename, Expires: 60 * 60 * 24 * 7, }); res.redirect(url); @@ -2389,7 +2392,7 @@ function initializePolisHelpers() { math_tick = math_tick || -1; return pgQueryP_readOnly( "select * from math_bidtopid where zid = ($1) and math_env = ($2);", - [zid, process.env.MATH_ENV] + [zid, config.get('math_env')] // Argument of type '(rows: string | any[]) => any' is not assignable to parameter of type '(value: unknown) => any'. // Types of parameters 'rows' and 'value' are incompatible. // Type 'unknown' is not assignable to type 'string | any[]'. @@ -2721,14 +2724,14 @@ function initializePolisHelpers() { // const state = req.p.state; console.log("handle_POST_auth_slack_redirect_uri 1"); - console.log(process.env.POLIS_SLACK_APP_CLIENT_ID); + console.log(config.get('polis_slack_app_client_id')); request .get( "https://slack.com/api/oauth.access?" + querystring.stringify({ - client_id: process.env.POLIS_SLACK_APP_CLIENT_ID, - client_secret: process.env.POLIS_SLACK_APP_CLIENT_SECRET, + client_id: config.get('polis_slack_app_client_id'), + client_secret: config.get('polis_slack_app_client_secret'), code: code, redirect_uri: getServerNameWithProtocol(req) + @@ -3745,8 +3748,8 @@ Feel free to reply to this email if you need help.`; ); } function populateGeoIpInfo(zid: any, uid?: any, ipAddress?: string | null) { - var userId = process.env.MAXMIND_USERID; - var licenseKey = process.env.MAXMIND_LICENSEKEY; + var userId = config.get('maxmind_userid'); + var licenseKey = config.get('maxmind_licensekey'); var url = "https://geoip.maxmind.com/geoip/v2.1/city/"; var contentType = @@ -5026,7 +5029,7 @@ Email verified! You can close this tab or hit the back button. let server = "http://localhost:5000"; if (!devMode) { - server = "https://" + process.env.PRIMARY_POLIS_URL; + server = "https://" + config.get('primary_polis_url'); } return server + "/" + path + "?" + paramsToStringSortedByName(params); } @@ -5044,7 +5047,7 @@ Email verified! You can close this tab or hit the back button. let server = "http://localhost:5000"; if (!devMode) { - server = "https://" + process.env.PRIMARY_POLIS_URL; + server = "https://" + config.get('primary_polis_url'); } return server + "/" + path + "?" + paramsToStringSortedByName(params); } @@ -11632,7 +11635,7 @@ Email verified! You can close this tab or hit the back button. }; } ) { - var stripe_client_id = process.env.STRIPE_CLIENT_ID; + var stripe_client_id = config.get('stripe_client_id'); var stripeUrl = "https://connect.stripe.com/oauth/authorize?response_type=code&client_id=" + @@ -11682,9 +11685,9 @@ Email verified! You can close this tab or hit the back button. url: "https://connect.stripe.com/oauth/token", form: { grant_type: "authorization_code", - client_id: process.env.STRIPE_CLIENT_ID, + client_id: config.get('stripe_client_id'), code: code, - client_secret: process.env.STRIPE_SECRET_KEY, + client_secret: config.get('stripe_secret_key'), }, }, function (err: any, r: any, body: string) { @@ -12152,8 +12155,8 @@ Email verified! You can close this tab or hit the back button. } ) { if ( - req.p.webserver_pass !== process.env.WEBSERVER_PASS || - req.p.webserver_username !== process.env.WEBSERVER_USERNAME + req.p.webserver_pass !== config.get('webserver_pass') || + req.p.webserver_username !== config.get('webserver_username') ) { return fail(res, 403, "polis_err_notifyTeam_auth"); } @@ -12185,13 +12188,13 @@ Email verified! You can close this tab or hit the back button. } ) { if ( - req.p.webserver_pass !== process.env.WEBSERVER_PASS || - req.p.webserver_username !== process.env.WEBSERVER_USERNAME + req.p.webserver_pass !== config.get('webserver_pass') || + req.p.webserver_username !== config.get('webserver_username') ) { return fail(res, 403, "polis_err_sending_export_link_to_email_auth"); } - const domain = process.env.PRIMARY_POLIS_URL; + const domain = config.get('primary_polis_url'); const email = req.p.email; const subject = "Polis data export for conversation pol.is/" + req.p.conversation_id; @@ -12231,8 +12234,8 @@ Thanks for using Polis! // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2345) // @ts-ignore - process.env.TWITTER_CONSUMER_KEY, //'your application consumer key', - process.env.TWITTER_CONSUMER_SECRET, //'your application secret', + config.get('twitter_consumer_key'), //'your application consumer key', + config.get('twitter_consumer_secret'), //'your application secret', "1.0A", null, "HMAC-SHA1" @@ -12300,8 +12303,8 @@ Thanks for using Polis! // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2345) // @ts-ignore - process.env.TWITTER_CONSUMER_KEY, //'your application consumer key', - process.env.TWITTER_CONSUMER_SECRET, //'your application secret', + config.get('twitter_consumer_key'), //'your application consumer key', + config.get('twitter_consumer_secret'), //'your application secret', "1.0A", null, "HMAC-SHA1" @@ -12363,8 +12366,8 @@ Thanks for using Polis! // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2345) // @ts-ignore - process.env.TWITTER_CONSUMER_KEY, //'your application consumer key', - process.env.TWITTER_CONSUMER_SECRET, //'your application secret', + config.get('twitter_consumer_key'), //'your application consumer key', + config.get('twitter_consumer_secret'), //'your application secret', "1.0A", null, "HMAC-SHA1" @@ -12421,8 +12424,8 @@ Thanks for using Polis! // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2345) // @ts-ignore - process.env.TWITTER_CONSUMER_KEY, //'your application consumer key', - process.env.TWITTER_CONSUMER_SECRET, //'your application secret', + config.get('twitter_consumer_key'), //'your application consumer key', + config.get('twitter_consumer_secret'), //'your application secret', "1.0A", null, "HMAC-SHA1" @@ -12461,8 +12464,8 @@ Thanks for using Polis! // let oauth = new OAuth.OAuth( // 'https://api.twitter.com/oauth/request_token', // null // 'https://api.twitter.com/oauth/access_token', // null - // process.env.TWITTER_CONSUMER_KEY, //'your application consumer key', - // process.env.TWITTER_CONSUMER_SECRET, //'your application secret', + // config.get('twitter_consumer_key'), //'your application consumer key', + // config.get('twitter_consumer_secret'), //'your application secret', // '1.0A', // null, // 'HMAC-SHA1' @@ -12503,8 +12506,8 @@ Thanks for using Polis! // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2345) // @ts-ignore - process.env.TWITTER_CONSUMER_KEY, //'your application consumer key', - process.env.TWITTER_CONSUMER_SECRET, //'your application secret', + config.get('twitter_consumer_key'), //'your application consumer key', + config.get('twitter_consumer_secret'), //'your application secret', "1.0A", null, "HMAC-SHA1" @@ -13556,7 +13559,7 @@ Thanks for using Polis! } function geoCodeWithGoogleApi(locationString: string) { - let googleApiKey = process.env.GOOGLE_API_KEY; + let googleApiKey = config.get('google_api_key'); let address = encodeURI(locationString); return new Promise(function ( @@ -16478,7 +16481,7 @@ CREATE TABLE slack_user_invites ( let hostname = buildStaticHostname(req, res); if (!hostname) { let host = req?.headers?.host || ""; - let re = new RegExp(process.env.SERVICE_HOSTNAME + "$"); + let re = new RegExp(config.get('service_hostname') + "$"); if (host.match(re)) { // don't alert for this, it's probably DNS related // TODO_SEO what should we return? @@ -16507,7 +16510,7 @@ CREATE TABLE slack_user_invites ( // // }); // getStaticFile("./unsupportedBrowser.html", res); // } else { - let port = process.env.STATIC_FILES_PORT; + let port = config.get('static_files_port'); // set the host header too, since S3 will look at that (or the routing proxy will patch up the request.. not sure which) if (req && req.headers && req.headers.host) req.headers.host = hostname; routingProxy.web(req, res, { @@ -16521,7 +16524,7 @@ CREATE TABLE slack_user_invites ( function buildStaticHostname(req: { headers?: { host: string } }, res: any) { if (devMode || domainOverride) { - return process.env.STATIC_FILES_HOST; + return config.get('static_files_host'); } else { let origin = req?.headers?.host; // Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ "pol.is": string; "embed.pol.is": string; "survey.pol.is": string; "preprod.pol.is": string; }'. @@ -16531,7 +16534,7 @@ CREATE TABLE slack_user_invites ( if (hasWhitelistMatches(origin || "")) { // Use the prod bucket for non pol.is domains return ( - whitelistedBuckets["pol.is"] + "." + process.env.STATIC_FILES_HOST + whitelistedBuckets["pol.is"] + "." + config.get('static_files_host') ); } else { console.error( @@ -16546,7 +16549,7 @@ CREATE TABLE slack_user_invites ( // No index signature with a parameter of type 'string' was found on type '{ "pol.is": string; "embed.pol.is": string; "survey.pol.is": string; "preprod.pol.is": string; }'.ts(7053) // @ts-ignore origin = whitelistedBuckets[origin || ""]; - return origin + "." + process.env.STATIC_FILES_HOST; + return origin + "." + config.get('static_files_host'); } } @@ -16715,9 +16718,9 @@ CREATE TABLE slack_user_invites ( } // serve up index.html in response to anything starting with a number - let hostname = process.env.STATIC_FILES_HOST; - let portForParticipationFiles = process.env.STATIC_FILES_PORT; - let portForAdminFiles = process.env.STATIC_FILES_ADMINDASH_PORT; + let hostname = config.get('static_files_host'); + let portForParticipationFiles = config.get('static_files_port'); + let portForAdminFiles = config.get('static_files_admindash_port'); let fetchUnsupportedBrowserPage = makeFileFetcher( hostname, portForParticipationFiles, diff --git a/server/src/session.ts b/server/src/session.ts index 4e3e266825..da70165984 100644 --- a/server/src/session.ts +++ b/server/src/session.ts @@ -3,9 +3,12 @@ import LruCache from "lru-cache"; import pg from "./db/pg-query"; +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + function encrypt(text: string | null) { const algorithm = "aes-256-ctr"; - const password = process.env.ENCRYPTION_PASSWORD_00001; + const password = config.get('encryption_password_00001'); // // TODO replace deprecated createCipher method with current createCipheriv method // @@ -41,7 +44,7 @@ function encrypt(text: string | null) { function decrypt(text: string) { const algorithm = "aes-256-ctr"; - const password = process.env.ENCRYPTION_PASSWORD_00001; + const password = config.get('encryption_password_00001'); // // TODO replace deprecated createDecipher method with current createDecipheriv method // diff --git a/server/src/utils/cookies.ts b/server/src/utils/cookies.ts index 3e948e06bf..00471f7d2e 100644 --- a/server/src/utils/cookies.ts +++ b/server/src/utils/cookies.ts @@ -16,6 +16,9 @@ type Req = { cookies: { [x: string]: any }; }; +let POLIS_ROOT = process.env.POLIS_ROOT +var config = require(POLIS_ROOT + 'config/config.js'); + const COOKIES = { COOKIE_TEST: "ct", HAS_EMAIL: "e", @@ -167,7 +170,7 @@ function setCookieTestCookie(req: any, res: any, setOnPolisDomain: any) { function shouldSetCookieOnPolisDomain(req: Req) { // FIXME domainOverride - let setOnPolisDomain = !(process.env.DOMAIN_OVERRIDE || null); + let setOnPolisDomain = !(config.get('domain_override') || null); let origin = req?.headers?.origin || ""; if (setOnPolisDomain && origin.match(/^http:\/\/localhost:[0-9]{4}/)) { setOnPolisDomain = false;