From c9c6e3d47bf3eb9fccdfc5b11bfa5e90366f75d1 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Mon, 6 Apr 2020 06:38:29 +0000 Subject: [PATCH 01/76] created server side --- app.js | 18 + db.js | 9 + package-lock.json | 5324 ++++++++++++++++++++ package.json | 28 + server-side/README.md | 0 server-side/auth/verify.js | 23 + server-side/controllers/to-do-query.js | 62 + server-side/controllers/user-controller.js | 47 + server-side/models/to-do-list.js | 81 + server-side/models/user.js | 20 + server-side/routes/router.js | 23 + 11 files changed, 5635 insertions(+) create mode 100644 app.js create mode 100644 db.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server-side/README.md create mode 100644 server-side/auth/verify.js create mode 100644 server-side/controllers/to-do-query.js create mode 100644 server-side/controllers/user-controller.js create mode 100644 server-side/models/to-do-list.js create mode 100644 server-side/models/user.js create mode 100644 server-side/routes/router.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..33cdc0b --- /dev/null +++ b/app.js @@ -0,0 +1,18 @@ +const express = require('express') +const app = express() +const bodyParser = require('body-parser') +const port = process.env.PORT || 8080 +const userController = require('./server-side/controllers/user-controller') +const listRouter = require('./server-side/routes/router') +const cookieParser = require('cookie-parser') + +app.use(bodyParser.json()) +app.use(bodyParser.urlencoded({extended: true})) +app.use(cookieParser()) +app.use(listRouter) + + + +app.listen(port, () => { + console.log(`Now listening on port ${port}`) +}) diff --git a/db.js b/db.js new file mode 100644 index 0000000..37525e6 --- /dev/null +++ b/db.js @@ -0,0 +1,9 @@ +const { Pool } = require('pg') + + +const pool = new Pool({ + connectionString: process.env.DATABASE_URL +}) + + +module.exports = pool \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3299eb2 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5324 @@ +{ + "name": "problem-set-7_4", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@heroku-cli/color": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/@heroku-cli/color/-/color-1.1.14.tgz", + "integrity": "sha512-2JYy//YE2YINTe21hpdVMBNc7aYFkgDeY9JUz/BCjFZmYLn0UjGaCc4BpTcMGXNJwuqoUenw2WGOFGHsJqlIDw==", + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "strip-ansi": "^5.0.0", + "supports-color": "^5.5.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@heroku-cli/command": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/@heroku-cli/command/-/command-8.3.0.tgz", + "integrity": "sha512-gQoe6KnIr8q+JCYvO/6STRBsJXHw+UwwtNs5me5Zx/020u2S1I4oqi3KamcTeRTC7ZVORH3DfE30aA3HNgYXsA==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@oclif/errors": "^1.2.2", + "cli-ux": "^4.9.3", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "heroku-client": "^3.1.0", + "http-call": "^5.2.4", + "netrc-parser": "^3.1.6", + "open": "^6.2.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "http-call": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", + "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", + "requires": { + "content-type": "^1.0.4", + "debug": "^4.1.1", + "is-retry-allowed": "^1.1.0", + "is-stream": "^2.0.0", + "parse-json": "^4.0.0", + "tunnel-agent": "^0.6.0" + } + } + } + }, + "@heroku-cli/notifications": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/notifications/-/notifications-1.2.2.tgz", + "integrity": "sha512-bW2R/I2TpxECPMU8bqiY9rTDHZHjRmKNPWCmXZGCg1ko3NehYfF26i2KBZ8OW3pSwcUi/cWSGhytpLPonHfQ+g==", + "requires": { + "node-notifier": "^5.2.1" + } + }, + "@heroku-cli/plugin-addons": { + "version": "1.2.31", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-addons/-/plugin-addons-1.2.31.tgz", + "integrity": "sha1-Ytl57s/3LyYWd+x4nzfgTWFQNac=", + "requires": { + "co": "4.6.0", + "co-wait": "0.0.0", + "heroku-cli-util": "^8.0.9", + "lodash": "^4.17.10", + "printf": "0.3.0" + }, + "dependencies": { + "printf": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/printf/-/printf-0.3.0.tgz", + "integrity": "sha512-DlJSroT2n9nkh47D4T6BHFQvsMR0L41889ECLmdbzk2BlhN0t31/vl5mHvlWiNBCNQrqG9XfpXwqmJQ2utoYwg==" + } + } + }, + "@heroku-cli/plugin-addons-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-addons-v5/-/plugin-addons-v5-7.39.2.tgz", + "integrity": "sha512-9MiZpsQjboG4quXNQ4GzqnLMeM/6DXbFZFoeOpyFeGRiRiXSFXO0Rif/3zrhWTEr2Kf2GHN+ng6qwMy8dp8ClA==", + "requires": { + "co": "4.6.0", + "co-wait": "0.0.0", + "heroku-cli-util": "^8.0.11", + "lodash": "^4.17.11", + "printf": "0.5.1" + } + }, + "@heroku-cli/plugin-apps": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-apps/-/plugin-apps-7.39.2.tgz", + "integrity": "sha512-XD+wLc3oA1UnSX6ypcyVAuUioRL6ddd9tnxYg5S9/WNdmy/tk5RmqYFtf+gXU+RqbFmxLbD45H1ou0xTnlNJeA==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@heroku-cli/schema": "^1.0.25", + "@oclif/command": "^1", + "@oclif/config": "^1", + "cli-ux": "^5.3.2", + "inquirer": "^7.0.1", + "shell-escape": "^0.2.0", + "tslib": "^1", + "urijs": "^1.19.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-ux": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.4.5.tgz", + "integrity": "sha512-5A6FuU0wPUlfCWUjtizUvNIbXElp6jN9QUJsDibs6F9cVX1kTgaMR3m6KT0R3iriEXpMrmPKV6yYS8XICNuQ6Q==", + "requires": { + "@oclif/command": "^1.5.1", + "@oclif/errors": "^1.2.1", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "cli-progress": "^3.4.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.1", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^1.1.0", + "js-yaml": "^3.13.1", + "lodash": "^4.17.11", + "natural-orderby": "^2.0.1", + "password-prompt": "^1.1.2", + "semver": "^5.6.0", + "string-width": "^3.1.0", + "strip-ansi": "^5.1.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@heroku-cli/plugin-apps-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-apps-v5/-/plugin-apps-v5-7.39.2.tgz", + "integrity": "sha512-04JmTIa0pWw8CQIjwMd5P1is7+p1BcjJb+XXv7EaTQ8Z9YBhOFwiBi5Zwg7Mh+DcSWbX4FtGsozMCF/3T5DOlg==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "co": "^4.6.0", + "filesize": "^4.0.0", + "fs-extra": "^7.0.1", + "heroku-cli-util": "^8.0.11", + "inquirer": "^6.2.2", + "js-yaml": "^3.12.1", + "lodash": "^4.17.11", + "shell-escape": "^0.2.0", + "sparkline": "^0.2.0", + "strftime": "^0.10.0", + "term-img": "^2.1.0", + "urijs": "1.19.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "urijs": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", + "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" + } + } + }, + "@heroku-cli/plugin-auth": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-auth/-/plugin-auth-7.39.2.tgz", + "integrity": "sha512-e9KPOsSBgXe3DVXMORduC11VGafgZ2P7HQJQLYaJxhA4cUIKMfcRkAfeXZAQjAgRTG7aK/Bisk+2Bd3H4Le9Ow==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "cli-ux": "^4.9.3", + "date-fns": "^2.0.0-alpha.8" + } + }, + "@heroku-cli/plugin-autocomplete": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-autocomplete/-/plugin-autocomplete-7.39.2.tgz", + "integrity": "sha512-NDN+lpXV0pSc+BHS04kGvEWWsQYdQ5fm0UiRcvdm/Ef7ywU77pMzh+HR/4Bto05/hFA4Stpk7d8cTs26x7x4jg==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "chalk": "^2.4.2", + "cli-ux": "^4.9.3", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash.flatten": "^4.4.0", + "tslib": "1.9.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@heroku-cli/plugin-buildpacks": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-buildpacks/-/plugin-buildpacks-7.39.2.tgz", + "integrity": "sha512-uPm7pLNtOJGsBMz+FxIAGExQxB8UV0rJZGIlKSi+ODhsWtKwa6LdMr76VzWP6xVAa0LKmeAv8SkH4DtLZ1Hgtg==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@heroku/buildpack-registry": "^1.0.1", + "@oclif/config": "^1.12.10", + "@oclif/plugin-legacy": "^1.1.4", + "cli-ux": "^4.9.3", + "heroku-cli-util": "^8.0.11", + "http-call": "^5.2.3", + "lodash": "^4.17.11", + "true-myth": "2.2.3", + "valid-url": "^1.0.9" + }, + "dependencies": { + "@types/node": { + "version": "10.14.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.13.tgz", + "integrity": "sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==" + }, + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + }, + "dependencies": { + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + } + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "eslint": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", + "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", + "requires": { + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-utils": "^1.4.3", + "file-entry-cache": "^5.0.1", + "globals": "^12.1.0", + "inquirer": "^7.0.0", + "js-yaml": "^3.13.1", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "optionator": "^0.8.3", + "semver": "^6.1.2", + "strip-json-comments": "^3.0.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==" + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "write": "1.0.3" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "fast-levenshtein": "~2.0.6" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "@heroku-cli/plugin-certs": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-certs/-/plugin-certs-7.39.2.tgz", + "integrity": "sha512-3TcqeijqW26dYWHW43lBx92ZIral9Pv06/fNSkGsngG1MfDpLfr+rHE1uHUKqyYp/WumhxgiwO6be1qmCnR4zA==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "tslib": "^1.9.3" + } + }, + "@heroku-cli/plugin-certs-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-certs-v5/-/plugin-certs-v5-7.39.2.tgz", + "integrity": "sha512-/ubmVOpu7FpwxDPrNYiDQSzG7kT7p/9KJbDDU0kAE1FKQYHZjnQG/1u+FWgiGTbcsVROPN5jLa/AhS7AZGr0gA==", + "requires": { + "co": "4.6.0", + "co-wait": "0.0.0", + "date-fns": "^1.29.0", + "heroku-cli-util": "^8.0.11", + "inquirer": "^6.2.2", + "lodash": "^4.17.13", + "psl": "^1.1.29" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + } + } + }, + "@heroku-cli/plugin-ci": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-ci/-/plugin-ci-7.39.2.tgz", + "integrity": "sha512-FjyUB19CnfAQvLecAh6voeBS/oVI0FHi+pRFVVdjCugAxq5Xq2H2DSehzSaf+F6pWHhDEzUUAMLdfArHHcZk1A==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "ansi-escapes": "3.2.0", + "async-file": "^2.0.2", + "cli-ux": "^4.9.3", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "github-url-to-object": "^4.0.4", + "got": "^9.6.0", + "inquirer": "^6.2.2", + "phoenix": "^1.4.3", + "tmp": "^0.0.33", + "tslib": "^1.9.3", + "validator": "^10.11.0", + "ws": "^6.2.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@types/node": { + "version": "10.14.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.14.13.tgz", + "integrity": "sha512-yN/FNNW1UYsRR1wwAoyOwqvDuLDtVXnaJTZ898XIw/Q5cCaeVAlVwvsmXLX5PuiScBYwZsZU4JYSHB3TvfdwvQ==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==" + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cacheable-request": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.0.0.tgz", + "integrity": "sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^4.0.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^1.0.1", + "normalize-url": "^3.1.0", + "responselike": "^1.0.2" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "eslint": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.7.2.tgz", + "integrity": "sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==", + "requires": { + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-utils": "^1.4.3", + "file-entry-cache": "^5.0.1", + "globals": "^12.1.0", + "inquirer": "^7.0.0", + "js-yaml": "^3.13.1", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "optionator": "^0.8.3", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.2.1.tgz", + "integrity": "sha512-Cg3ymMAdN10wOk/VYfLV7KCQyv7EDirJ64500sU7n9UlmioEtDuU5Gd+hj73hXSU/ex7tHJSssmyftDdkMLO8Q==", + "requires": { + "type-fest": "^0.5.2" + } + }, + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", + "requires": { + "ms": "^2.1.1" + } + }, + "inquirer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.0.tgz", + "integrity": "sha512-rSdC7zelHdRQFkWnhsMu2+2SO41mpv2oF2zy4tMhmiLWkcKbOAs87fWAJhVXttKVwhdZvymvnuM95EyEXg2/tQ==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "type-fest": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.5.2.tgz", + "integrity": "sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==" + } + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==" + }, + "figures": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "write": "1.0.3" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "globals": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", + "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-OO/9K7uFN30qwAKvslzmCTbimZ/uRjtdN5S50vvWLwUKqFuZj0n96XyCzF5tHRHEO/Q4JYC01hv41gkX06gmHA==" + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nock": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/nock/-/nock-9.6.1.tgz", + "integrity": "sha512-EDgl/WgNQ0C1BZZlASOQkQdE6tAWXJi8QQlugqzN64JJkvZ7ILijZuG24r4vCC7yOfnm6HKpne5AGExLGCeBWg==", + "requires": { + "debug": "^3.1.0", + "lodash": "^4.17.5", + "mkdirp": "^0.5.0", + "qs": "^6.5.1", + "semver": "^5.5.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "fast-levenshtein": "~2.0.6" + } + }, + "p-cancelable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz", + "integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA==" + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.1.0.tgz", + "integrity": "sha512-NrX+1dVVh+6Y9dnQ19pR0pP4FiEIlUvdTGn8pw6CKTNq5sgib2nIhmUNT5TAmhWmvKr3WcxBcP3E8nWezuipuQ==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + } + } + }, + "@heroku-cli/plugin-ci-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-ci-v5/-/plugin-ci-v5-7.39.2.tgz", + "integrity": "sha512-huMukBjxux25OwG/QmCspxNyWRBOysMQXM91QFzl5Xzb9/B2Y7v9ZajKnQBercXUb2B0QlKIpppOb0G3WI765A==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "@heroku-cli/plugin-run-v5": "^7.39.2", + "ansi-escapes": "3.2.0", + "bluebird": "^3.5.3", + "co": "^4.6.0", + "co-wait": "0.0.0", + "github-url-to-object": "^4.0.4", + "got": "^8.3.2", + "heroku-cli-util": "^8.0.11", + "inquirer": "^7.0.0", + "lodash.flatten": "^4.4.0", + "shell-escape": "^0.2.0", + "temp": "^0.8.3", + "validator": "^12.0.0" + }, + "dependencies": { + "validator": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz", + "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ==" + } + } + }, + "@heroku-cli/plugin-config": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-config/-/plugin-config-7.39.2.tgz", + "integrity": "sha512-Fmv7gS4wJObSRL3mntPsM8rmQj6SSWkxmRSxsFgS3col13lBsc5Q7ttj+vqs/WhPCD3bI4WWuZvICAi0YFIzrw==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "cli-ux": "^4.9.3", + "edit-string": "^1.1.6", + "lodash": "^4.17.11", + "shell-quote": "^1.6.1" + } + }, + "@heroku-cli/plugin-container-registry-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-container-registry-v5/-/plugin-container-registry-v5-7.39.2.tgz", + "integrity": "sha512-TDLvUhlkvIWyt3lDQUkJkfgL9XUWFAYmN4xvTWf3X/ZumYuJvWGsXrrVGinZeLtOGzpdMVHtHspPUEYotP4GbA==", + "requires": { + "glob": "^7.1.3", + "heroku-cli-util": "^8.0.11", + "http-call": "^5.2.3", + "inquirer": "^6.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + } + } + }, + "@heroku-cli/plugin-git": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-git/-/plugin-git-7.39.2.tgz", + "integrity": "sha512-KdsHYUyyHBw0NbwRxKbPI8QwzvF3DvsxlIAc9lIH0YZwXPTEJ6z79Vl7AkuvP337UDvIHqFyIAVukUrgKZH8LA==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "cli-ux": "^4.9.3", + "debug": "4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@heroku-cli/plugin-local": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-local/-/plugin-local-7.39.2.tgz", + "integrity": "sha512-+dT+AIp9+DZ8tAG1Rn3UrbdQgGfhSmeKek6EeZL8tEV3YDXoaHJ1m8cMQSi2GZo04vGiYy2d7bx9JcUCS0pYdQ==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1", + "@oclif/config": "^1", + "foreman": "^3.0.1", + "tslib": "^1" + } + }, + "@heroku-cli/plugin-oauth-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-oauth-v5/-/plugin-oauth-v5-7.39.2.tgz", + "integrity": "sha512-dLhNf0Kwwi65yvzSFtsi7DFjOQigYoIrz/P397Nvqcy0z6cbvndtefo5mlKbv7HjP0r92yUo6WMrGMUYBTJebQ==", + "requires": { + "co": "^4.6.0", + "date-fns": "^1.29.0", + "heroku-cli-util": "^8.0.11", + "lodash": "^4.17.11" + }, + "dependencies": { + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + } + } + }, + "@heroku-cli/plugin-orgs-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-orgs-v5/-/plugin-orgs-v5-7.39.2.tgz", + "integrity": "sha512-cOu8UXEP0Wg2B8LZ7rDmmBlcp9FSlri7FkcnmlJzorTGLSVqYc55bw631uRJ3c56heoN4yvK3o4A96V9shzQxQ==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "co": "^4.6.0", + "heroku-cli-util": "^8.0.11", + "inquirer": "^6.2.2", + "lodash": "^4.17.11", + "lodash.flatten": "^4.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "requires": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + } + } + } + } + }, + "@heroku-cli/plugin-pg-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-pg-v5/-/plugin-pg-v5-7.39.2.tgz", + "integrity": "sha512-i4WWw1FN3ThT7LGUp2uFhOziG2w8OV0IZTse2bJlP9tm7rAJG35pV0u6S1tsf45Sr59IWNWoayl0TmOzoLC7zA==", + "requires": { + "@heroku-cli/plugin-addons": "^1.2.29", + "bytes": "^3.1.0", + "co": "^4.6.0", + "co-wait": "^0.0.0", + "debug": "^4.1.1", + "filesize": "^4.0.0", + "heroku-cli-util": "^8.0.11", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "node-notifier": "^5.4.0", + "smooth-progress": "^1.1.0", + "strip-eof": "^1.0.0", + "tunnel-ssh": "^4.1.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@heroku-cli/plugin-pipelines": { + "version": "7.38.1", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-pipelines/-/plugin-pipelines-7.38.1.tgz", + "integrity": "sha512-pkGycD+vK9ag2kToOTQKac+OGnVIwXwK9W1TSW2MAGYvOQCmsJ9dJ2MNPNYUqLJBoUwT+Gj2qz9tFNvjcng1sw==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@heroku-cli/schema": "^1.0.25", + "@oclif/command": "^1", + "@oclif/config": "^1", + "cli-ux": "^5.2.1", + "got": "^9.6.0", + "heroku-cli-util": "^8.0.11", + "http-call": "^5.2.4", + "inquirer": "^7.0.0", + "lodash.keyby": "^4.6.0", + "lodash.sortby": "^4.7.0", + "validator": "^10.11.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-ux": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.4.5.tgz", + "integrity": "sha512-5A6FuU0wPUlfCWUjtizUvNIbXElp6jN9QUJsDibs6F9cVX1kTgaMR3m6KT0R3iriEXpMrmPKV6yYS8XICNuQ6Q==", + "requires": { + "@oclif/command": "^1.5.1", + "@oclif/errors": "^1.2.1", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "cli-progress": "^3.4.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.1", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^1.1.0", + "js-yaml": "^3.13.1", + "lodash": "^4.17.11", + "natural-orderby": "^2.0.1", + "password-prompt": "^1.1.2", + "semver": "^5.6.0", + "string-width": "^3.1.0", + "strip-ansi": "^5.1.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-call": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.3.0.tgz", + "integrity": "sha512-ahwimsC23ICE4kPl9xTBjKB4inbRaeLyZeRunC/1Jy/Z6X8tv22MEAjK+KBOMSVLaqXPTTmd8638waVIKLGx2w==", + "requires": { + "content-type": "^1.0.4", + "debug": "^4.1.1", + "is-retry-allowed": "^1.1.0", + "is-stream": "^2.0.0", + "parse-json": "^4.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@heroku-cli/plugin-ps": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-ps/-/plugin-ps-7.39.2.tgz", + "integrity": "sha512-49ZW7Hs1/m1TslZihZNlOL/hGkGQuvHmxIq4xOruMwYx8Wveyywsl6lfMF5ts8wp79BDHYFR8GTCbNnRuALC1g==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "cli-ux": "^4.9.3", + "lodash": "^4.17.11" + } + }, + "@heroku-cli/plugin-ps-exec": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-ps-exec/-/plugin-ps-exec-2.3.8.tgz", + "integrity": "sha512-r+wCiFtNEJ+hsztVvinzZYaLL00s3Ovn+IbTQIQkeKG+CpFXa3yrBQsyNvfIs3yUdEF5n2086czJ1iaAq/qyLQ==", + "requires": { + "heroku-cli-util": "^8.0.8", + "heroku-exec-util": "0.7.5", + "lodash": "^4.17.13" + } + }, + "@heroku-cli/plugin-redis-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-redis-v5/-/plugin-redis-v5-7.39.2.tgz", + "integrity": "sha512-qOnZSS0jF1c22fkQDG3L1ufy/4rU9LSV5JoVTqDADiIK6GHaPriNr6fzEALCTSnk+fNv48IN39BS4NEileC6dQ==", + "requires": { + "heroku-cli-util": "^8.0.11", + "redis-parser": "^3.0.0", + "ssh2": "^0.6.1" + }, + "dependencies": { + "ssh2": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.6.2.tgz", + "integrity": "sha512-DJ+dOhXEEsmNpcQTI0x69FS++JH6qqL/ltEHf01pI1SSLMAcmD+hL4jRwvHjPwynPsmSUbHJ/WIZYzROfqZWjA==", + "requires": { + "ssh2-streams": "~0.2.0" + } + }, + "ssh2-streams": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.2.1.tgz", + "integrity": "sha512-3zCOsmunh1JWgPshfhKmBCL3lUtHPoh+a/cyQ49Ft0Q0aF7xgN06b76L+oKtFi0fgO57FLjFztb1GlJcEZ4a3Q==", + "requires": { + "asn1": "~0.2.0", + "semver": "^5.1.0", + "streamsearch": "~0.1.2" + } + } + } + }, + "@heroku-cli/plugin-run-v5": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-run-v5/-/plugin-run-v5-7.39.2.tgz", + "integrity": "sha512-CkHsB7TnMjiPk+NVms2bOREk3mj7r+uZPbWYWUloUHPWc67qGMWDUtdFXqUQCzpsQQSUGKEsZKmUQREKEEFQtQ==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@heroku-cli/notifications": "^1.2.2", + "@heroku/eventsource": "^1.0.7", + "co": "4.6.0", + "fs-extra": "^7.0.1", + "heroku-cli-util": "^8.0.11", + "shellwords": "^0.1.1" + } + }, + "@heroku-cli/plugin-spaces": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-spaces/-/plugin-spaces-7.39.2.tgz", + "integrity": "sha512-UGgYJWuGCBO0ofm7mfOpx6cC4yBc803jfs+HPiMcgGAUlBmiPHGh47SYjYsm55/F4kG9s5ApPUGSHY2YIfzUgg==", + "requires": { + "@heroku-cli/command": "^8.3.0", + "@heroku-cli/notifications": "^1.2.2", + "co": "4.6.0", + "heroku-cli-util": "^8.0.11", + "lodash": "^4.17.11", + "strftime": "^0.10.0" + } + }, + "@heroku-cli/plugin-status": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-status/-/plugin-status-7.39.2.tgz", + "integrity": "sha512-Kq9PNuItDlfBIQ1W+EMVcSpsz91VjXUL0BV4uC7OicKXJtK60Q2Q9UoBL+k/J4oF6v4QuDqwcI1R1kSlxQtiFQ==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1.5.11", + "@oclif/config": "^1.12.10", + "@oclif/errors": "^1.2.2", + "cli-ux": "^4.9.3", + "date-fns": "^1.29.0", + "http-call": "^5.2.3" + }, + "dependencies": { + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" + } + } + }, + "@heroku-cli/plugin-webhooks": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/@heroku-cli/plugin-webhooks/-/plugin-webhooks-7.39.2.tgz", + "integrity": "sha512-5ZK1CNYGAsXgmtjlsmVM/JRh4jxM6qrGW0YyJmmNVGJAlTepe6CcC3kAdErrQDXMs+RL7AMoE3SSM7dJut+q/Q==", + "requires": { + "@heroku-cli/color": "^1.1.14", + "@heroku-cli/command": "^8.3.0", + "@oclif/command": "^1", + "@oclif/config": "^1", + "cli-ux": "^5.2.1", + "tslib": "^1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-ux": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.4.5.tgz", + "integrity": "sha512-5A6FuU0wPUlfCWUjtizUvNIbXElp6jN9QUJsDibs6F9cVX1kTgaMR3m6KT0R3iriEXpMrmPKV6yYS8XICNuQ6Q==", + "requires": { + "@oclif/command": "^1.5.1", + "@oclif/errors": "^1.2.1", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "cli-progress": "^3.4.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.1", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^1.1.0", + "js-yaml": "^3.13.1", + "lodash": "^4.17.11", + "natural-orderby": "^2.0.1", + "password-prompt": "^1.1.2", + "semver": "^5.6.0", + "string-width": "^3.1.0", + "strip-ansi": "^5.1.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@heroku-cli/schema": { + "version": "1.0.25", + "resolved": "https://registry.npmjs.org/@heroku-cli/schema/-/schema-1.0.25.tgz", + "integrity": "sha512-7V6/WdTHrsvpqeqttm4zhzVJyt/Us/Cz9oS4yure4JdLtwlr2eF6PvlDLA5ZIvBybMtSDyxhHid0PeshKLtwxw==" + }, + "@heroku/buildpack-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@heroku/buildpack-registry/-/buildpack-registry-1.0.1.tgz", + "integrity": "sha512-cbB6ND+unRk692jf1PctcoqnmuyifanTMtFStucXukkpyeI/QgXac5qJNb3g6yhHOObTghJBXi9Uzy1KBcnPgQ==", + "requires": { + "node-fetch": "^2.2.0", + "true-myth": "^2.0.0" + } + }, + "@heroku/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@heroku/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-zepmPMu8A6S2SyhhzUFVJLhLfqOAGXYR8brf+dRhP41yK9fFinoTT5DO4bo8/EGCJFptPAqfKDavLHsedvynzQ==", + "requires": { + "original": "^1.0.0" + } + }, + "@heroku/socksv5": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@heroku/socksv5/-/socksv5-0.0.9.tgz", + "integrity": "sha1-ejkFkhE2smZpeaD4a7TwYvZX95M=", + "requires": { + "ip-address": "^5.8.8" + } + }, + "@oclif/color": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/@oclif/color/-/color-0.0.0.tgz", + "integrity": "sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw==", + "requires": { + "ansi-styles": "^3.2.1", + "supports-color": "^5.4.0", + "tslib": "^1" + } + }, + "@oclif/command": { + "version": "1.5.18", + "resolved": "https://registry.npmjs.org/@oclif/command/-/command-1.5.18.tgz", + "integrity": "sha512-sfLb5UUCwyQ0w9LyQ1/3DUuD/RWnPZk6uvcK5P7pqD65WgRJaOPCqzuNZyb56kPsj6FftRp1UudApNKd7U0KBQ==", + "requires": { + "@oclif/config": "^1", + "@oclif/errors": "^1.2.2", + "@oclif/parser": "^3.8.3", + "@oclif/plugin-help": "^2", + "debug": "^4.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@oclif/config": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@oclif/config/-/config-1.13.2.tgz", + "integrity": "sha512-RUOKeuAaopo3zrA5hcgE0PT2lbAUT72+eJdqTlWyI9sbPrGHZgUwV+vrL6Qal7ywWYDkL0vrKd1YS4yXtKIDKw==", + "requires": { + "@oclif/parser": "^3.8.0", + "debug": "^4.1.1", + "tslib": "^1.9.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@oclif/errors": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/errors/-/errors-1.2.2.tgz", + "integrity": "sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==", + "requires": { + "clean-stack": "^1.3.0", + "fs-extra": "^7.0.0", + "indent-string": "^3.2.0", + "strip-ansi": "^5.0.0", + "wrap-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@oclif/linewrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@oclif/linewrap/-/linewrap-1.0.0.tgz", + "integrity": "sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==" + }, + "@oclif/parser": { + "version": "3.8.4", + "resolved": "https://registry.npmjs.org/@oclif/parser/-/parser-3.8.4.tgz", + "integrity": "sha512-cyP1at3l42kQHZtqDS3KfTeyMvxITGwXwH1qk9ktBYvqgMp5h4vHT+cOD74ld3RqJUOZY/+Zi9lb4Tbza3BtuA==", + "requires": { + "@oclif/linewrap": "^1.0.0", + "chalk": "^2.4.2", + "tslib": "^1.9.3" + } + }, + "@oclif/plugin-commands": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@oclif/plugin-commands/-/plugin-commands-1.2.3.tgz", + "integrity": "sha512-8ECrHOGJOAK/0q2xag6yfDBbPM7Qr+tzELvy9vsvNg05yKqRu8JSmgZ0Ir8RyjCsRNDdAmesQYhxzX3ZGuG+7g==", + "requires": { + "@oclif/command": "^1.5.4", + "@oclif/config": "^1.8.7", + "cli-ux": "^4.9.0", + "lodash": "^4.17.11", + "tslib": "^1.9.3" + } + }, + "@oclif/plugin-help": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-2.2.0.tgz", + "integrity": "sha512-56iIgE7NQfwy/ZrWrvrEfJGb5rrMUt409yoQGw4feiU101UudA1btN1pbUbcKBr7vY9KFeqZZcftXEGxOp7zBg==", + "requires": { + "@oclif/command": "^1.5.13", + "chalk": "^2.4.1", + "indent-string": "^3.2.0", + "lodash.template": "^4.4.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0", + "widest-line": "^2.0.1", + "wrap-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@oclif/plugin-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@oclif/plugin-legacy/-/plugin-legacy-1.1.4.tgz", + "integrity": "sha512-/oJGRcM7VaSGJ9Eodi/kl0avAKDlJvdYA8jmh4bhBHrCsaPqM61P7LUH2w2PUIccnM82mPPCp3PoUEM85PAIdw==", + "requires": { + "@heroku-cli/command": "^8.2.0", + "@oclif/color": "^0.0.0", + "@oclif/command": "^1.5.4", + "ansi-escapes": "^3.1.0", + "debug": "^4.1.0", + "semver": "^5.6.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@oclif/plugin-not-found": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz", + "integrity": "sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA==", + "requires": { + "@oclif/color": "^0.0.0", + "@oclif/command": "^1.5.3", + "cli-ux": "^4.9.0", + "fast-levenshtein": "^2.0.6", + "lodash": "^4.17.11" + } + }, + "@oclif/plugin-plugins": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-1.7.9.tgz", + "integrity": "sha512-o7qfmiUGl+NUyA2lM18/Ch5sasGGYPIINR3cZ/AjwtdQ3ooINnF00pUDcUOtbjW97gRmk6/j79tcyTo8i7rHZg==", + "requires": { + "@oclif/color": "^0.0.0", + "@oclif/command": "^1.5.12", + "chalk": "^2.4.2", + "cli-ux": "^5.2.1", + "debug": "^4.1.0", + "fs-extra": "^7.0.1", + "http-call": "^5.2.2", + "load-json-file": "^5.2.0", + "npm-run-path": "^3.0.0", + "semver": "^5.6.0", + "tslib": "^1.9.3", + "yarn": "^1.21.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-ux": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-5.4.5.tgz", + "integrity": "sha512-5A6FuU0wPUlfCWUjtizUvNIbXElp6jN9QUJsDibs6F9cVX1kTgaMR3m6KT0R3iriEXpMrmPKV6yYS8XICNuQ6Q==", + "requires": { + "@oclif/command": "^1.5.1", + "@oclif/errors": "^1.2.1", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "cli-progress": "^3.4.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.1", + "hyperlinker": "^1.0.0", + "indent-string": "^4.0.0", + "is-wsl": "^1.1.0", + "js-yaml": "^3.13.1", + "lodash": "^4.17.11", + "natural-orderby": "^2.0.1", + "password-prompt": "^1.1.2", + "semver": "^5.6.0", + "string-width": "^3.1.0", + "strip-ansi": "^5.1.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "requires": { + "path-key": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@oclif/plugin-update": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@oclif/plugin-update/-/plugin-update-1.3.9.tgz", + "integrity": "sha512-rEMsKT7VlCNnfAF7gxHcY9FtQw+w3ZMvxzoRqafMRCz6+Lt94r3PRulBI4M7IkIQwE+dqW/GPUlkDj86Os9Njg==", + "requires": { + "@oclif/color": "^0.0.0", + "@oclif/command": "^1.5.4", + "@oclif/config": "^1.9.0", + "@oclif/errors": "^1.2.2", + "@types/semver": "^5.5.0", + "cli-ux": "^4.9.3", + "cross-spawn": "^6.0.5", + "debug": "^4.1.0", + "filesize": "^3.6.1", + "fs-extra": "^7.0.1", + "http-call": "^5.2.2", + "lodash": "^4.17.11", + "log-chopper": "^1.0.2", + "semver": "^5.6.0", + "tar-fs": "^1.16.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" + } + } + }, + "@oclif/plugin-warn-if-update-available": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@oclif/plugin-warn-if-update-available/-/plugin-warn-if-update-available-1.7.0.tgz", + "integrity": "sha512-Nwyz3BJ8RhsfQ+OmFSsJSPIfn5YJqMrCzPh72Zgo2jqIjKIBWD8N9vTTe4kZlpeUUn77SyXFfwlBQbNCL5OEuQ==", + "requires": { + "@oclif/command": "^1.5.10", + "@oclif/config": "^1.12.8", + "@oclif/errors": "^1.2.2", + "chalk": "^2.4.1", + "debug": "^4.1.0", + "fs-extra": "^7.0.0", + "http-call": "^5.2.2", + "lodash.template": "^4.4.0", + "semver": "^5.6.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@oclif/plugin-which": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@oclif/plugin-which/-/plugin-which-1.0.3.tgz", + "integrity": "sha512-abYZ9hgtifrDDIXtDEO3eQu5zbrAwxjdXvtnD0kIgADvTNXui4XP8qZs1+bL8BsNW/G6WiSghz0CV7WH8vkmVg==", + "requires": { + "@oclif/command": "^1.5.4", + "@oclif/config": "^1.8.7", + "cli-ux": "^4.9.1", + "tslib": "^1.9.3" + } + }, + "@oclif/screen": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oclif/screen/-/screen-1.0.4.tgz", + "integrity": "sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==" + }, + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "app-path": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/app-path/-/app-path-2.2.0.tgz", + "integrity": "sha1-KvXCtUSkDhX8GsVVSDFDl0YIRdA=", + "requires": { + "execa": "^0.4.0" + }, + "dependencies": { + "execa": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", + "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", + "requires": { + "cross-spawn-async": "^2.1.1", + "is-stream": "^1.1.0", + "npm-run-path": "^1.0.0", + "object-assign": "^4.0.1", + "path-key": "^1.0.0", + "strip-eof": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "npm-run-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", + "requires": { + "path-key": "^1.0.0" + } + }, + "path-key": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "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" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "async-file": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/async-file/-/async-file-2.0.2.tgz", + "integrity": "sha1-Aq0HhWrDcX6DayCuxaTP4AxG3yM=", + "requires": { + "rimraf": "^2.5.2" + } + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", + "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" + }, + "bcrypt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-4.0.1.tgz", + "integrity": "sha512-hSIZHkUxIDS5zA2o00Kf2O5RfVbQ888n54xQoF/eIaquU4uaLxK8vhhBdktd0B3n2MjkcAWzv4mnhogykBKOUQ==", + "requires": { + "node-addon-api": "^2.0.0", + "node-pre-gyp": "0.14.0" + } + }, + "bl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + } + } + }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "clean-stack": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", + "integrity": "sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-progress": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.6.1.tgz", + "integrity": "sha512-OVRgcyeI0viJW47MnyS10Jw/0RTpk7wwNbrCOPyXT0TVi2o3Q/u+Os8vQUFYhvkdXSbguSdFvMv1ia+UuwgIQQ==", + "requires": { + "colors": "^1.1.2", + "string-width": "^4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "cli-ux": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/cli-ux/-/cli-ux-4.9.3.tgz", + "integrity": "sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA==", + "requires": { + "@oclif/errors": "^1.2.2", + "@oclif/linewrap": "^1.0.0", + "@oclif/screen": "^1.0.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "clean-stack": "^2.0.0", + "extract-stack": "^1.0.0", + "fs-extra": "^7.0.0", + "hyperlinker": "^1.0.0", + "indent-string": "^3.2.0", + "is-wsl": "^1.1.0", + "lodash": "^4.17.11", + "password-prompt": "^1.0.7", + "semver": "^5.6.0", + "strip-ansi": "^5.0.0", + "supports-color": "^5.5.0", + "supports-hyperlinks": "^1.0.1", + "treeify": "^1.1.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "co-wait": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/co-wait/-/co-wait-0.0.0.tgz", + "integrity": "sha1-wiNyAyIY7b9u2RXkM1RsIeRFYos=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cross-spawn-async": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", + "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", + "requires": { + "lru-cache": "^4.0.0", + "which": "^1.2.8" + } + }, + "date-fns": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.11.1.tgz", + "integrity": "sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w==" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "edit-string": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/edit-string/-/edit-string-1.1.6.tgz", + "integrity": "sha1-HJqInbx+YAdn9P7KadCKfOFZYvQ=", + "requires": { + "debug": "^3.1.0", + "execa": "^0.10.0", + "lodash": "^4.17.10", + "tmp": "^0.0.33", + "tslib": "^1.9.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eventemitter3": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", + "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "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", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "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", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extract-stack": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/extract-stack/-/extract-stack-1.0.0.tgz", + "integrity": "sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "filesize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-4.2.1.tgz", + "integrity": "sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "follow-redirects": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.11.0.tgz", + "integrity": "sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==", + "requires": { + "debug": "^3.0.0" + } + }, + "foreman": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/foreman/-/foreman-3.0.1.tgz", + "integrity": "sha512-ek/qoM0vVKpxzkBUQN9k4Fs7l0XsHv4bqxuEW6oqIS4s0ouYKsQ19YjBzUJKTFRumFiSpUv7jySkrI6lfbhjlw==", + "requires": { + "commander": "^2.15.1", + "http-proxy": "^1.17.0", + "mustache": "^2.2.1", + "shell-quote": "^1.6.1" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "github-url-to-object": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/github-url-to-object/-/github-url-to-object-4.0.4.tgz", + "integrity": "sha512-1Ri1pR8XTfzLpbtPz5MlW/amGNdNReuExPsbF9rxLsBfO1GH9RtDBamhJikd0knMWq3RTTQDbTtw0GGvvEAJEA==", + "requires": { + "is-url": "^1.1.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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" + } + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==" + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "here": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz", + "integrity": "sha1-acGvPwISHz2HiOAuhNyLOQXXEZU=" + }, + "heroku": { + "version": "7.39.2", + "resolved": "https://registry.npmjs.org/heroku/-/heroku-7.39.2.tgz", + "integrity": "sha512-AApna3pZKyibmIK5rwQDTwV6IjfRRMy1/Aw2UQgwOg3S8KOvFUMbohF/BlpdiSljR0ORXhWMVKpF10N2SkjrRQ==", + "requires": { + "@heroku-cli/color": "1.1.14", + "@heroku-cli/command": "^8.3.0", + "@heroku-cli/plugin-addons-v5": "^7.39.2", + "@heroku-cli/plugin-apps": "^7.39.2", + "@heroku-cli/plugin-apps-v5": "^7.39.2", + "@heroku-cli/plugin-auth": "^7.39.2", + "@heroku-cli/plugin-autocomplete": "^7.39.2", + "@heroku-cli/plugin-buildpacks": "^7.39.2", + "@heroku-cli/plugin-certs": "^7.39.2", + "@heroku-cli/plugin-certs-v5": "^7.39.2", + "@heroku-cli/plugin-ci": "^7.39.2", + "@heroku-cli/plugin-ci-v5": "^7.39.2", + "@heroku-cli/plugin-config": "^7.39.2", + "@heroku-cli/plugin-container-registry-v5": "^7.39.2", + "@heroku-cli/plugin-git": "^7.39.2", + "@heroku-cli/plugin-local": "^7.39.2", + "@heroku-cli/plugin-oauth-v5": "^7.39.2", + "@heroku-cli/plugin-orgs-v5": "^7.39.2", + "@heroku-cli/plugin-pg-v5": "^7.39.2", + "@heroku-cli/plugin-pipelines": "^7.38.1", + "@heroku-cli/plugin-ps": "^7.39.2", + "@heroku-cli/plugin-ps-exec": "2.3.8", + "@heroku-cli/plugin-redis-v5": "^7.39.2", + "@heroku-cli/plugin-run-v5": "^7.39.2", + "@heroku-cli/plugin-spaces": "^7.39.2", + "@heroku-cli/plugin-status": "^7.39.2", + "@heroku-cli/plugin-webhooks": "^7.39.2", + "@oclif/command": "1.5.18", + "@oclif/config": "1.13.2", + "@oclif/errors": "1.2.2", + "@oclif/plugin-commands": "^1.2.2", + "@oclif/plugin-help": "2.2.0", + "@oclif/plugin-legacy": "1.1.4", + "@oclif/plugin-not-found": "1.2.2", + "@oclif/plugin-plugins": "1.7.9", + "@oclif/plugin-update": "1.3.9", + "@oclif/plugin-warn-if-update-available": "1.7.0", + "@oclif/plugin-which": "1.0.3", + "cli-ux": "4.9.3", + "debug": "4.1.1", + "execa": "1.0.0", + "fs-extra": "7.0.1", + "http-call": "5.2.3", + "netrc-parser": "3.1.6", + "semver": "5.6.0", + "tslib": "1.9.3", + "uuid": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + } + } + }, + "heroku-cli-util": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/heroku-cli-util/-/heroku-cli-util-8.0.12.tgz", + "integrity": "sha512-63wB17oSktlA/HzpIV/PGe8Isq5AZArT51KAW1gg54zyYRIiHOwXik93HZuuRVUaVrWvVUhItFeLgqMwAwlTsw==", + "requires": { + "@heroku-cli/color": "^1.1.3", + "ansi-escapes": "^3.1.0", + "ansi-styles": "^3.2.1", + "cardinal": "^2.0.1", + "chalk": "^2.4.1", + "co": "^4.6.0", + "got": "^8.3.1", + "heroku-client": "^3.1.0", + "lodash": "^4.17.10", + "netrc-parser": "^3.1.4", + "opn": "^3.0.3", + "strip-ansi": "^4.0.0", + "supports-color": "^5.4.0", + "tslib": "^1.9.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "heroku-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/heroku-client/-/heroku-client-3.1.0.tgz", + "integrity": "sha512-UfGKwUm5duzzSVI8uUXlNAE1mus6uPxmZPji4vuG1ArV5DYL1rXsZShp0OoxraWdEwYoxCUrM6KGztC68x5EZQ==", + "requires": { + "is-retry-allowed": "^1.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "heroku-exec-util": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/heroku-exec-util/-/heroku-exec-util-0.7.5.tgz", + "integrity": "sha512-br2hIJN0y0yO+EOxV9qn+i6zhRpZTWa+ECKSpjwtAHsG3dFp+cZkHoVm6QxC/9XypCILFBN0LRlOoVNWs/IUhQ==", + "requires": { + "@heroku/socksv5": "^0.0.9", + "co-wait": "0.0.0", + "heroku-cli-util": "^8.0.9", + "keypair": "1.0.1", + "node-forge": "0.7.5", + "smooth-progress": "1.1.0", + "ssh2": "0.6.1", + "temp": "0.8.3", + "uuid": "3.2.1" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "ssh2": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.6.1.tgz", + "integrity": "sha512-fNvocq+xetsaAZtBG/9Vhh0GDjw1jQeW7Uq/DPh4fVrJd0XxSfXAqBjOGVk4o2jyWHvyC6HiaPFpfHlR12coDw==", + "requires": { + "ssh2-streams": "~0.2.0" + } + }, + "ssh2-streams": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.2.1.tgz", + "integrity": "sha512-3zCOsmunh1JWgPshfhKmBCL3lUtHPoh+a/cyQ49Ft0Q0aF7xgN06b76L+oKtFi0fgO57FLjFztb1GlJcEZ4a3Q==", + "requires": { + "asn1": "~0.2.0", + "semver": "^5.1.0", + "streamsearch": "~0.1.2" + } + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-call": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/http-call/-/http-call-5.2.3.tgz", + "integrity": "sha512-IkwGruHVHATmnonLKMGX5tkpM0KSn/C240o8/OfBsESRaJacykSia+akhD0d3fljQ5rQPXtBvSrVShAsj+EOUQ==", + "requires": { + "content-type": "^1.0.4", + "debug": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "is-stream": "^1.1.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + } + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-proxy": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", + "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "hyperlinker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hyperlinker/-/hyperlinker-1.0.0.tgz", + "integrity": "sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "ip-address": { + "version": "5.9.4", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-5.9.4.tgz", + "integrity": "sha512-dHkI3/YNJq4b/qQaz+c8LuarD3pY24JqZWfjB8aZx1gtpc2MDILu9L9jpZe1sHpzo/yWFweQVn+U//FhazUxmw==", + "requires": { + "jsbn": "1.1.0", + "lodash": "^4.17.15", + "sprintf-js": "1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "iterm2-version": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-2.3.0.tgz", + "integrity": "sha1-rmQABGHgK18f5TMfC58Oxxzg4Tg=", + "requires": { + "app-path": "^2.1.0", + "plist": "^2.0.1" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "keypair": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/keypair/-/keypair-1.0.1.tgz", + "integrity": "sha1-dgNxknCvtlZO04oiCHoG/Jqk6hs=" + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + } + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.keyby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.keyby/-/lodash.keyby-4.6.0.tgz", + "integrity": "sha1-f2oavak/0k4icopNNh7YvLpaQ1Q=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "log-chopper": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-chopper/-/log-chopper-1.0.2.tgz", + "integrity": "sha512-tEWS6Fb+Xv0yLChJ6saA1DP3H1yPL0PfiIN7SDJ+U/CyP+fD4G/dhKfow+P5UuJWi6BdE4mUcPkJclGXCWxDrg==", + "requires": { + "byline": "5.x" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mustache": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", + "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "natural-orderby": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-2.0.3.tgz", + "integrity": "sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==" + }, + "needle": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.1.tgz", + "integrity": "sha512-x/gi6ijr4B7fwl6WYL9FwlCvRQKGlUNvnceho8wxkwXqN8jvVmmmATTmZPRRG7b/yC1eode26C2HO9jl78Du9g==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "netrc-parser": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/netrc-parser/-/netrc-parser-3.1.6.tgz", + "integrity": "sha512-lY+fmkqSwntAAjfP63jB4z5p5WbuZwyMCD3pInT7dpHU/Gc6Vv90SAC6A0aNiqaRGHiuZFBtiwu+pu8W/Eyotw==", + "requires": { + "debug": "^3.1.0", + "execa": "^0.10.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + } + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-addon-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.0.tgz", + "integrity": "sha512-ASCL5U13as7HhOExbT6OlWJJUV/lLzL2voOSP1UVehpRD8FbSrSDjfScK/KwAvVTI5AS6r4VwbOMlIqtvRidnA==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==" + }, + "node-notifier": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", + "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "requires": { + "p-finally": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "password-prompt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz", + "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==", + "requires": { + "ansi-escapes": "^3.1.0", + "cross-spawn": "^6.0.5" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "phoenix": { + "version": "1.4.16", + "resolved": "https://registry.npmjs.org/phoenix/-/phoenix-1.4.16.tgz", + "integrity": "sha512-XmKVTlFQuRwTYBO1WU1OaN2tzywRAtY6haUpxHPGxNZuyPEgmo+Caw7+BMlIPhipM197+d962i6sGZLylBtCbA==" + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "plist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", + "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", + "requires": { + "base64-js": "1.2.0", + "xmlbuilder": "8.2.2", + "xmldom": "0.1.x" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "printf": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/printf/-/printf-0.5.1.tgz", + "integrity": "sha512-UaE/jO0hNsrvPGQEb4LyNzcrJv9Z00tsreBduOSxMtrebvoUhxiEJ4YCHX8YHf6akwfKsC2Gyv5zv47UXhMiLg==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "~4.0.0" + } + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", + "requires": { + "redis-errors": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "requires": { + "is-promise": "^2.1.0" + } + }, + "rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "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", + "fresh": "0.5.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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-escape": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz", + "integrity": "sha1-aP0CXrBJC09WegJ/C/IkgLX4QTM=" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "smooth-progress": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/smooth-progress/-/smooth-progress-1.1.0.tgz", + "integrity": "sha1-pR1tvCscRjWslL9L6JNk1c6RzjI=", + "requires": { + "ansi-escapes": "1.4.0", + "chalk": "^1.1.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "sparkline": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.2.0.tgz", + "integrity": "sha1-vJqI17g4j8GpUf3hJ1+c5A/ssiI=", + "requires": { + "here": "0.0.2", + "nopt": "~4.0.1" + } + }, + "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.5.4", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.4.tgz", + "integrity": "sha1-G/a2soyW6u8mf01sRqWiUXpZnic=", + "requires": { + "ssh2-streams": "~0.1.15" + } + }, + "ssh2-streams": { + "version": "0.1.20", + "resolved": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.20.tgz", + "integrity": "sha1-URGNFUVV31Rp7h9n4M8efoosDjo=", + "requires": { + "asn1": "~0.2.0", + "semver": "^5.1.0", + "streamsearch": "~0.1.2" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, + "strftime": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", + "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "requires": { + "has-flag": "^2.0.0", + "supports-color": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + } + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + }, + "dependencies": { + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "requires": { + "rimraf": "~2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "term-img": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/term-img/-/term-img-2.1.0.tgz", + "integrity": "sha512-j78Y+26QYTTWvtVVCmDx94idvQm6p59E+xRfQDSevIyM8dg45uUAtr/xbu13l0BeKrebPyUpgh8PM3noXlIBkw==", + "requires": { + "ansi-escapes": "^2.0.0", + "iterm2-version": "^2.1.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", + "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=" + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "treeify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", + "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" + }, + "true-myth": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/true-myth/-/true-myth-2.2.3.tgz", + "integrity": "sha512-ZdlJjMyNBtOjlR0qbYboAfdnXYhUPuD5F5QOAaKEgdUPg3UTxuTfC5cu3MidWIRemI3iWcuUZEwKybDJXP0Ocw==" + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tunnel-ssh": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tunnel-ssh/-/tunnel-ssh-4.1.4.tgz", + "integrity": "sha512-CjBqboGvAbM7iXSX2F95kzoI+c2J81YkrHbyyo4SWNKCzU6w5LfEvXBCHu6PPriYaNvfhMKzD8bFf5Vl14YTtg==", + "requires": { + "debug": "2.6.9", + "lodash.defaults": "^4.1.0", + "ssh2": "0.5.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "urijs": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", + "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==" + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=" + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrap-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-4.0.0.tgz", + "integrity": "sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yarn": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.4.tgz", + "integrity": "sha512-oYM7hi/lIWm9bCoDMEWgffW8aiNZXCWeZ1/tGy0DWrN6vmzjCXIKu2Y21o8DYVBUtiktwKcNoxyGl/2iKLUNGA==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a1b47af --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "problem-set-7_4", + "version": "1.0.0", + "description": "## Project Overview The purpose of this Problem Set is to merge your work from Problem Set 7.1 and Problem Set 7.3. You will rebuild your MVC To-Do list from 7.1 using the RESTful API that you created in 7.3. Instead of sending rendered templates in response to an incoming request, you will make AJAX requests to your backend, handle JSON responses, and render to-do's to the DOM.", + "main": "app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node app.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Devonte202/problem-set-7_4.git" + }, + "author": "Devonte Gianni Duncan", + "license": "ISC", + "bugs": { + "url": "https://github.com/Devonte202/problem-set-7_4/issues" + }, + "homepage": "https://github.com/Devonte202/problem-set-7_4#readme", + "dependencies": { + "bcrypt": "^4.0.1", + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.5", + "express": "^4.17.1", + "heroku": "^7.39.2", + "jsonwebtoken": "^8.5.1" + } +} diff --git a/server-side/README.md b/server-side/README.md new file mode 100644 index 0000000..e69de29 diff --git a/server-side/auth/verify.js b/server-side/auth/verify.js new file mode 100644 index 0000000..c3d83f8 --- /dev/null +++ b/server-side/auth/verify.js @@ -0,0 +1,23 @@ +const jwt = require('jsonwebtoken') +const bcrypt = require('bcrypt') +const User = require('../models/user') + +const authenticate = async (req, res, next) => { + const token = req.cookies.token + + if (!token) return res.status(401).send('Unauthorized, please sign in.') + + const user = await jwt.verify(token, 'secret', (err, decoded) => { + if (err) return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' }) + return decoded + }) + + const userInfo = await User.getByEmail(user.email) + + if (!userInfo) return res.status(404).send("No user found.") + + req.userId = userInfo.user_id + next() +} + +module.exports = authenticate \ No newline at end of file diff --git a/server-side/controllers/to-do-query.js b/server-side/controllers/to-do-query.js new file mode 100644 index 0000000..bd2333c --- /dev/null +++ b/server-side/controllers/to-do-query.js @@ -0,0 +1,62 @@ +const pool = require('../../db') + +const greetUser = (req, res) => { + res.send('To Do List API') +} + +async function getAllIncompletedTasks(req, res) { + try { + const user_id = req.userId + const queryText = 'SELECT * FROM tasks WHERE is_complete = false AND user_id = $1;' + const client = await pool.connect(); + const result = await client.query(queryText, [user_id]); + const results = { 'results': (result) ? result.rows : null }; + res.send(results); + client.release(); + } + catch (err) { + console.error(err); + res.send('My bad'); + } +} + +async function getAllCompletedTasks(req, res) { + try { + const user_id = req.userId + const queryText = 'SELECT * FROM tasks WHERE is_complete = true AND user_id = $1;' + const client = await pool.connect(); + const result = await client.query(queryText, [user_id]); + const results = { 'results': (result) ? result.rows : null }; + res.send(results); + client.release(); + } + catch (err) { + console.error(err); + res.send(err); + } +} + +async function getAllTasks(req, res) { + try { + const user_id = req.userId + const queryText = 'SELECT * FROM tasks WHERE user_id = $1;' + const client = await pool.connect(); + const result = await client.query(queryText, [user_id]); + const results = { 'results': (result) ? result.rows : null }; + res.send(results); + client.release(); + } + catch (err) { + console.error(err); + res.send(err); + } +} + + + +module.exports = { + greetUser, + getAllTasks, + getAllCompletedTasks, + getAllIncompletedTasks, +} \ No newline at end of file diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js new file mode 100644 index 0000000..c2581ab --- /dev/null +++ b/server-side/controllers/user-controller.js @@ -0,0 +1,47 @@ +const express = require('express') +const jwt = require('jsonwebtoken') +const bcrypt = require('bcrypt') +const User = require('../models/user') + + +const register = (req, res) => { + const {first_name, last_name, email, password} = req.body + const saltRounds = 10 + bcrypt.hash(password, saltRounds) + .then((hashedPassword) => { + User.addUser(first_name, last_name, email, hashedPassword) + const token = jwt.sign({ email: email, password: hashedPassword }, 'secret') + return token + }) + .then((token) => { + res.cookie('token', token) + res.status(200).send(`Cookie set with token: ${token}`) + }) + .catch((err) => { + console.log(err) + res.send(err) + }) +} + +const login = async (req, res, next) => { + const {email, password} = req.body + const user = await User.getByEmail(email) + + if (!user) { + return res.status(401).send('Invalid Email') + } + const isValidPassword = await bcrypt.compare(password, user.hashed_password) + + if (isValidPassword) { + const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') + res.cookie('token', token) + return res.status(200).send('Successfully logged in') + } + return res.status(403).send('Invalid Email/Password') +} + + +module.exports = { + register, + login +} \ No newline at end of file diff --git a/server-side/models/to-do-list.js b/server-side/models/to-do-list.js new file mode 100644 index 0000000..508d6bb --- /dev/null +++ b/server-side/models/to-do-list.js @@ -0,0 +1,81 @@ +const pool = require('../../db') + +async function addTask(req, res) { + try { + const user_id = req.userId + const {name, description} = req.body + const queryText = 'INSERT INTO tasks (user_id, name, description) VALUES ($1, $2, $3);' + const client = await pool.connect(); + const result = await client.query(queryText, [user_id, name, description]); + const results = { 'results': (result) ? result.rows : null }; + res.send(results); + client.release(); + } + catch (err) { + console.error(err); + res.send(err); + } +} + +async function deleteTask(req, res) { + try { + const user_id = req.userId + const {id} = req.params + const queryText = 'DELETE FROM tasks WHERE task_id = $1 AND user_id = $2' + const client = await pool.connect(); + const result = await client.query(queryText, [id, user_id]); + const results = { 'results': (result) ? result.rows : null }; + res.status(201).json({ message: 'Task deleted.' }); + client.release(); + } + catch (err) { + console.error(err); + res.status(500).json({ error: '500: Internal Server Error. Resource not deleted.' }); + } +} + +async function updateTask(req, res) { + try { + const user_id = req.userId + const {id} = req.params + const {name, description} = req.body + const dateAdded = new Date() + const queryText = 'UPDATE tasks SET (name, description, date_added) = ($2, $3, $4) WHERE task_id = $1 AND user_id = $5;' + const client = await pool.connect(); + const result = await client.query(queryText, [id, name, description, dateAdded, user_id]); + const results = { 'results': (result) ? result.rows : null }; + res.status(201).json({ message: 'Task updated.' }); + client.release(); + } + catch (err) { + console.error(err); + res.status(500).json({ error: '500: Internal Server Error. Resource not updated.' }); + } +} + +async function completeTask(req, res) { + try { + const user_id = req.userId + const {id} = req.params + const dateCompleted = new Date() + const queryText = 'UPDATE tasks SET (is_complete, date_complete) = ($2, $3) WHERE task_id = $1 AND user_id = $4;' + const client = await pool.connect(); + const result = await client.query(queryText, [id, true, dateCompleted, user_id]); + const results = { 'results': (result) ? result.rows : null }; + res.send(results); + res.status(201).json({ message: 'Task completed.' }); + client.release(); + } + catch (err) { + console.error(err); + res.status(500).json({ error: '500: Internal Server Error. Resource not completed.' }); + } +} + + +module.exports = { + addTask, + deleteTask, + updateTask, + completeTask, +} \ No newline at end of file diff --git a/server-side/models/user.js b/server-side/models/user.js new file mode 100644 index 0000000..934b830 --- /dev/null +++ b/server-side/models/user.js @@ -0,0 +1,20 @@ +const db = require('../../db') + + +async function addUser(first_name, last_name, email, hashedPassword) { + const queryText = `INSERT INTO users (first_name, last_name, email, hashed_password) + VALUES ($1, $2, $3, $4);` + return db.query(queryText, [first_name, last_name, email, hashedPassword]) +} + +async function getByEmail(email) { + const queryText = 'SELECT * FROM users WHERE email=$1' + return db.query(queryText, [email]) + .then((data) => data.rows[0]) +} + + +module.exports = { + addUser, + getByEmail +} \ No newline at end of file diff --git a/server-side/routes/router.js b/server-side/routes/router.js new file mode 100644 index 0000000..3726208 --- /dev/null +++ b/server-side/routes/router.js @@ -0,0 +1,23 @@ +const express = require('express') +const listController = require('../controllers/to-do-query') +const userController = require('../controllers/user-controller') +const toDoList = require('../models/to-do-list') +const router = express.Router() +const pool = require('../../db') +const authenticate = require('../auth/verify') + +router.get('/', listController.greetUser) +router.get('/login', userController.login) +router.post('/register', userController.register) +router.get('/incomplete-tasks', authenticate, listController.getAllIncompletedTasks) +router.get('/completed-tasks', authenticate, listController.getAllCompletedTasks) +router.get('/tasks', authenticate, listController.getAllTasks) +router.post('/add-task', authenticate, toDoList.addTask) +router.delete('/delete-task/:id', authenticate, toDoList.deleteTask) +router.put('/update-task/:id', authenticate, toDoList.updateTask) +router.put('/complete-task/:id', authenticate, toDoList.completeTask) + + + + +module.exports = router \ No newline at end of file From 393ccd5fd2e0759a5d0c8f6fd769cb8c3ce25e80 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Mon, 6 Apr 2020 06:44:38 +0000 Subject: [PATCH 02/76] saved express and pg --- package-lock.json | 103 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 3299eb2..fc3f247 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2620,6 +2620,11 @@ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, + "buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==" + }, "byline": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", @@ -4436,6 +4441,11 @@ "p-finally": "^1.0.0" } }, + "packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -4474,6 +4484,68 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "pg": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.0.tgz", + "integrity": "sha512-jinx9Xcmkeh7Y7gatu2EJiXr37mcDeF0G5X14MjqPMwYjoZMk7PMMSTTXQQl03GRp2IICxo/zyybqfv2RNgXsg==", + "requires": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "0.1.3", + "pg-packet-stream": "^1.1.0", + "pg-pool": "^3.0.0", + "pg-types": "^2.1.0", + "pgpass": "1.x", + "semver": "4.3.2" + }, + "dependencies": { + "semver": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz", + "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" + } + } + }, + "pg-connection-string": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz", + "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc=" + }, + "pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + }, + "pg-packet-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", + "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" + }, + "pg-pool": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.0.0.tgz", + "integrity": "sha512-AJWVHFre7CjOtu4D/PQjX+U9uhNKGRFSO9xQAzB7cn1Xu1vmhyo8s8eg9cw6kf2m2/+TYuvMH8i5jeFPSdllPw==" + }, + "pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "requires": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + } + }, + "pgpass": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", + "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", + "requires": { + "split": "^1.0.0" + } + }, "phoenix": { "version": "1.4.16", "resolved": "https://registry.npmjs.org/phoenix/-/phoenix-1.4.16.tgz", @@ -4494,6 +4566,29 @@ "xmldom": "0.1.x" } }, + "postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==" + }, + "postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=" + }, + "postgres-date": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz", + "integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA==" + }, + "postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "requires": { + "xtend": "^4.0.0" + } + }, "prepend-http": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", @@ -4836,6 +4931,14 @@ "nopt": "~4.0.1" } }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", diff --git a/package.json b/package.json index a1b47af..7c71e63 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "cookie-parser": "^1.4.5", "express": "^4.17.1", "heroku": "^7.39.2", - "jsonwebtoken": "^8.5.1" + "jsonwebtoken": "^8.5.1", + "pg": "^8.0.0" } } From e5f9c0e59a12629dda47caf4ca1fb54971660d87 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 05:05:54 +0000 Subject: [PATCH 03/76] Created homepage and register page --- app.js | 3 +++ package.json | 1 + public/models/user.js | 0 public/styles/form.css | 7 ++++++ public/styles/style.css | 17 +++++++++++++ public/to-do-list.js | 3 +++ public/views/add-task.html | 0 public/views/index.html | 31 +++++++++++++++++++++++ public/views/login.html | 0 public/views/register.html | 46 +++++++++++++++++++++++++++++++++++ public/views/to-do-list.html | 29 ++++++++++++++++++++++ public/views/update-task.html | 0 server-side/routes/router.js | 25 +++++++++++++++++++ 13 files changed, 162 insertions(+) create mode 100644 public/models/user.js create mode 100644 public/styles/form.css create mode 100644 public/styles/style.css create mode 100644 public/to-do-list.js create mode 100644 public/views/add-task.html create mode 100644 public/views/index.html create mode 100644 public/views/login.html create mode 100644 public/views/register.html create mode 100644 public/views/to-do-list.html create mode 100644 public/views/update-task.html diff --git a/app.js b/app.js index 33cdc0b..2188d77 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,9 @@ const cookieParser = require('cookie-parser') app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true})) + +app.use(express.static('public')) + app.use(cookieParser()) app.use(listRouter) diff --git a/package.json b/package.json index 7c71e63..d04ee6f 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "express": "^4.17.1", "heroku": "^7.39.2", "jsonwebtoken": "^8.5.1", + "node-fetch": "^2.6.0", "pg": "^8.0.0" } } diff --git a/public/models/user.js b/public/models/user.js new file mode 100644 index 0000000..e69de29 diff --git a/public/styles/form.css b/public/styles/form.css new file mode 100644 index 0000000..2caf837 --- /dev/null +++ b/public/styles/form.css @@ -0,0 +1,7 @@ +section{ + text-align: left; +} + +#nameField{ + display: flex; +} diff --git a/public/styles/style.css b/public/styles/style.css new file mode 100644 index 0000000..bf6c781 --- /dev/null +++ b/public/styles/style.css @@ -0,0 +1,17 @@ +header{ + display: flex; + justify-content: center; +} + +main{ + display: flex; + justify-content: center; +} + +section{ + text-align: center; +} + +article{ + margin-top: 70px; +} \ No newline at end of file diff --git a/public/to-do-list.js b/public/to-do-list.js new file mode 100644 index 0000000..8137ae5 --- /dev/null +++ b/public/to-do-list.js @@ -0,0 +1,3 @@ +const incomplete = document.getElementById('incomplete-tasks') + +fetch('https://5a90f1b3156e47f4b0e59404a9162ead.vfs.cloud9.us-east-2.amazonaws.com/').then((res) => res.json()).then((json) => incomplete.innerText = json) \ No newline at end of file diff --git a/public/views/add-task.html b/public/views/add-task.html new file mode 100644 index 0000000..e69de29 diff --git a/public/views/index.html b/public/views/index.html new file mode 100644 index 0000000..5e70ecd --- /dev/null +++ b/public/views/index.html @@ -0,0 +1,31 @@ + + + + + + + To-Do List + + + + + + +
+
+
+

To-Do List

+

Powered by Node.js and Express

+
Created by Devonte G. Duncan
+
+
+
+
+ Login + Register + To-do List +
+
+
+ + \ No newline at end of file diff --git a/public/views/login.html b/public/views/login.html new file mode 100644 index 0000000..e69de29 diff --git a/public/views/register.html b/public/views/register.html new file mode 100644 index 0000000..bdf6435 --- /dev/null +++ b/public/views/register.html @@ -0,0 +1,46 @@ + + + + + + + To-Do List + + + + + + + +
+
+

Create a To-Do List Account

+
+
+
+
+
+
+
+
+ + +
+
+ + +
+
+ + + + + + + +
+
+
+
+ + \ No newline at end of file diff --git a/public/views/to-do-list.html b/public/views/to-do-list.html new file mode 100644 index 0000000..9bf78fc --- /dev/null +++ b/public/views/to-do-list.html @@ -0,0 +1,29 @@ + + + + + + + To-Do List + + + + + + + + + \ No newline at end of file diff --git a/public/views/update-task.html b/public/views/update-task.html new file mode 100644 index 0000000..e69de29 diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 3726208..f5e1c61 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -5,7 +5,9 @@ const toDoList = require('../models/to-do-list') const router = express.Router() const pool = require('../../db') const authenticate = require('../auth/verify') +const path = require('path') +//API paths router.get('/', listController.greetUser) router.get('/login', userController.login) router.post('/register', userController.register) @@ -17,7 +19,30 @@ router.delete('/delete-task/:id', authenticate, toDoList.deleteTask) router.put('/update-task/:id', authenticate, toDoList.updateTask) router.put('/complete-task/:id', authenticate, toDoList.completeTask) +//Client side paths +router.get('/home-page', (req, res) =>{ + res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')); +}) +router.get('/register-page', (req, res) =>{ + res.sendFile(path.join(__dirname ,'../../public/views' , 'register.html')); +}) + +router.get('/login-page', (req, res) =>{ + res.sendFile(path.join(__dirname ,'../../public/views' , 'login.html')); +}) + +router.get('/to-do-list', (req, res) =>{ + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')); +}) + +router.get('/add-task-page', (req, res) =>{ + res.sendFile(path.join(__dirname ,'../../public/views' , 'add-task.html')); +}) + +router.get('/update-task-page', (req, res) =>{ + res.sendFile(path.join(__dirname ,'../../public/views' , 'update-task.html')); +}) module.exports = router \ No newline at end of file From 4e15f3faa5d52759dccff0f12662435ead9b43f7 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 05:10:52 +0000 Subject: [PATCH 04/76] Assigned homepage view to root path --- public/views/register.html | 2 +- server-side/controllers/to-do-query.js | 5 ----- server-side/routes/router.js | 3 +-- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/public/views/register.html b/public/views/register.html index bdf6435..9a07e23 100644 --- a/public/views/register.html +++ b/public/views/register.html @@ -19,7 +19,7 @@

Create a To-Do List Account

-
+
diff --git a/server-side/controllers/to-do-query.js b/server-side/controllers/to-do-query.js index bd2333c..4d4bb60 100644 --- a/server-side/controllers/to-do-query.js +++ b/server-side/controllers/to-do-query.js @@ -1,9 +1,5 @@ const pool = require('../../db') -const greetUser = (req, res) => { - res.send('To Do List API') -} - async function getAllIncompletedTasks(req, res) { try { const user_id = req.userId @@ -55,7 +51,6 @@ async function getAllTasks(req, res) { module.exports = { - greetUser, getAllTasks, getAllCompletedTasks, getAllIncompletedTasks, diff --git a/server-side/routes/router.js b/server-side/routes/router.js index f5e1c61..226bf50 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -8,7 +8,6 @@ const authenticate = require('../auth/verify') const path = require('path') //API paths -router.get('/', listController.greetUser) router.get('/login', userController.login) router.post('/register', userController.register) router.get('/incomplete-tasks', authenticate, listController.getAllIncompletedTasks) @@ -20,7 +19,7 @@ router.put('/update-task/:id', authenticate, toDoList.updateTask) router.put('/complete-task/:id', authenticate, toDoList.completeTask) //Client side paths -router.get('/home-page', (req, res) =>{ +router.get('/', (req, res) =>{ res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')); }) From 758e2803ac9ce067d00f161b8bc15a0ddb4a3fbe Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 05:28:39 +0000 Subject: [PATCH 05/76] fixed form submission bug --- public/views/register.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/views/register.html b/public/views/register.html index 9a07e23..700abfb 100644 --- a/public/views/register.html +++ b/public/views/register.html @@ -24,18 +24,18 @@

Create a To-Do List Account

- +
- +
- + - +
From 9d4faac8aade6482b4871a259f457eaf3be5afcb Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 07:32:42 +0000 Subject: [PATCH 06/76] added completed views --- public/styles/to-do-list.css | 16 +++++++++++++ public/to-do-list.js | 7 ++++-- public/views/add-task.html | 36 ++++++++++++++++++++++++++++++ public/views/login.html | 36 ++++++++++++++++++++++++++++++ public/views/register.html | 2 +- public/views/to-do-list.html | 42 ++++++++++++++++++++++++++++++----- public/views/update-task.html | 36 ++++++++++++++++++++++++++++++ 7 files changed, 167 insertions(+), 8 deletions(-) create mode 100644 public/styles/to-do-list.css diff --git a/public/styles/to-do-list.css b/public/styles/to-do-list.css new file mode 100644 index 0000000..56bcad7 --- /dev/null +++ b/public/styles/to-do-list.css @@ -0,0 +1,16 @@ +.task-list{ + text-align: center; +} + +.task{ + border: 2px solid black; + border-radius: 10px; + padding: 10px; + margin-left: 15px; + margin-top: 10px; +} + +#list{ + display: flex; + +} diff --git a/public/to-do-list.js b/public/to-do-list.js index 8137ae5..fb7623d 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -1,3 +1,6 @@ -const incomplete = document.getElementById('incomplete-tasks') +const incomplete = document.getElementById('incomplete') +const complete = document.getElementById('complete') -fetch('https://5a90f1b3156e47f4b0e59404a9162ead.vfs.cloud9.us-east-2.amazonaws.com/').then((res) => res.json()).then((json) => incomplete.innerText = json) \ No newline at end of file +window.addEventListener('load', (event) => { + fetch('/tasks').then(res => console.log(res.json())) +}) \ No newline at end of file diff --git a/public/views/add-task.html b/public/views/add-task.html index e69de29..b33370c 100644 --- a/public/views/add-task.html +++ b/public/views/add-task.html @@ -0,0 +1,36 @@ + + + + + + + To-Do List + + + + + + + +
+
+

Add A New Task

+
+
+
+
+ +
+ + + + + + + +
+ +
+
+ + \ No newline at end of file diff --git a/public/views/login.html b/public/views/login.html index e69de29..d916b6c 100644 --- a/public/views/login.html +++ b/public/views/login.html @@ -0,0 +1,36 @@ + + + + + + + To-Do List + + + + + + + +
+
+

Login

+
+
+
+
+
+
+ + + + + + + +
+
+
+
+ + \ No newline at end of file diff --git a/public/views/register.html b/public/views/register.html index 700abfb..01ecff5 100644 --- a/public/views/register.html +++ b/public/views/register.html @@ -37,7 +37,7 @@

Create a To-Do List Account

- +
diff --git a/public/views/to-do-list.html b/public/views/to-do-list.html index 9bf78fc..39c8204 100644 --- a/public/views/to-do-list.html +++ b/public/views/to-do-list.html @@ -9,21 +9,53 @@ +

To-Do List

+ Log Out + Add New Task
-
- Home - Add Task - Home -
+
+
+

To Do

+
+

Walk Dog

+

Walk him down the beach

+

Added 11/13/1998 5:34PM

+ + + +
+
+

Walk Dog

+

Walk him down the beach

+

Added 11/13/1998 5:34PM

+ + + +
+
+
+

Completed

+
+

Go shopping

+

Get milk, eggs, water

+

Added 2/11/3002 5:34PM

+

Completed 2/11/3002 9:34PM

+ + + +
+
+
+ \ No newline at end of file diff --git a/public/views/update-task.html b/public/views/update-task.html index e69de29..d43e394 100644 --- a/public/views/update-task.html +++ b/public/views/update-task.html @@ -0,0 +1,36 @@ + + + + + + + To-Do List + + + + + + + +
+
+

Update Task

+
+
+
+
+
+
+ + + + + + + +
+
+
+
+ + \ No newline at end of file From 2a1eb9370036d765048227a43255a6d2b1ec11e4 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 07:39:11 +0000 Subject: [PATCH 07/76] test commit --- public/to-do-list.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index fb7623d..11955b4 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -2,5 +2,7 @@ const incomplete = document.getElementById('incomplete') const complete = document.getElementById('complete') window.addEventListener('load', (event) => { - fetch('/tasks').then(res => console.log(res.json())) + fetch('/tasks') + .then(res => res.json()) + .then(tasks => console.log(tasks)) }) \ No newline at end of file From 3a1e1c0915b286c61e42f8655c4b727b08936c1a Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 07:41:49 +0000 Subject: [PATCH 08/76] test commit --- public/to-do-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 11955b4..e3fefb9 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -4,5 +4,5 @@ const complete = document.getElementById('complete') window.addEventListener('load', (event) => { fetch('/tasks') .then(res => res.json()) - .then(tasks => console.log(tasks)) + .then(tasks => console.log(tasks[0])) }) \ No newline at end of file From 74041e6cca5837b183c1d76dae0677e347465457 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 07:42:58 +0000 Subject: [PATCH 09/76] test commit --- public/to-do-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index e3fefb9..f67e652 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -4,5 +4,5 @@ const complete = document.getElementById('complete') window.addEventListener('load', (event) => { fetch('/tasks') .then(res => res.json()) - .then(tasks => console.log(tasks[0])) + .then(tasks => console.log(tasks.results[0])) }) \ No newline at end of file From a2a525f4b03d1a56cdbb4779b3b0a5a19885894b Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 08:00:07 +0000 Subject: [PATCH 10/76] test commit --- public/to-do-list.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index f67e652..22a878b 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -4,5 +4,10 @@ const complete = document.getElementById('complete') window.addEventListener('load', (event) => { fetch('/tasks') .then(res => res.json()) - .then(tasks => console.log(tasks.results[0])) + .then(tasks => { + const tasksArray = tasks.results + for(let task of tasksArray){ + console.log(task) + } + }) }) \ No newline at end of file From 502b7ea8b32196612e06fccea9258928d7a5d4b4 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 08:20:44 +0000 Subject: [PATCH 11/76] test commit --- public/to-do-list.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 22a878b..4f68658 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -7,7 +7,29 @@ window.addEventListener('load', (event) => { .then(tasks => { const tasksArray = tasks.results for(let task of tasksArray){ - console.log(task) + if(task.is_complete === false){ + complete.appendChild(document.createElement('div').classList.add("task").innerHTML = ` +

${task.name}

+

${task.description}

+

Added: ${task.date_added}

+ + + + `) + } + + if(task.is_complete === true){ + incomplete.appendChild(document.createElement('div').classList.add("task").innerHTML = ` +

${task.name}

+

${task.description}

+

Added: ${task.date_added}

+

${task.date_complete}

+ + + + `) + } + } }) }) \ No newline at end of file From 98a8ff9a1380d61390c2b6ea7860f0e78d629c6a Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 08:26:32 +0000 Subject: [PATCH 12/76] test commit --- public/to-do-list.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 4f68658..dcbe1c1 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -8,18 +8,23 @@ window.addEventListener('load', (event) => { const tasksArray = tasks.results for(let task of tasksArray){ if(task.is_complete === false){ - complete.appendChild(document.createElement('div').classList.add("task").innerHTML = ` + let taskElement = document.createElement('div') + taskElement.classList.add("task") + taskElement.innerHTML = `

${task.name}

${task.description}

Added: ${task.date_added}

- `) + ` + complete.appendChild(taskElement) } if(task.is_complete === true){ - incomplete.appendChild(document.createElement('div').classList.add("task").innerHTML = ` + let taskElement = document.createElement('div') + taskElement.classList.add("task") + taskElement.innerHTML = `

${task.name}

${task.description}

Added: ${task.date_added}

@@ -27,7 +32,8 @@ window.addEventListener('load', (event) => { - `) + ` + incomplete.appendChild(taskElement) } } From 62658c2745d8cdd2858a6c6e3c07f38fe0d7bc74 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 08:39:28 +0000 Subject: [PATCH 13/76] test commit --- public/to-do-list.js | 7 ++++--- public/views/to-do-list.html | 25 ------------------------- 2 files changed, 4 insertions(+), 28 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index dcbe1c1..caf60f9 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -18,7 +18,7 @@ window.addEventListener('load', (event) => { ` - complete.appendChild(taskElement) + incomplete.appendChild(taskElement) } if(task.is_complete === true){ @@ -33,9 +33,10 @@ window.addEventListener('load', (event) => { ` - incomplete.appendChild(taskElement) + complete.appendChild(taskElement) } } }) -}) \ No newline at end of file +}) + diff --git a/public/views/to-do-list.html b/public/views/to-do-list.html index 39c8204..f33ca56 100644 --- a/public/views/to-do-list.html +++ b/public/views/to-do-list.html @@ -24,34 +24,9 @@

To-Do List

To Do

-
-

Walk Dog

-

Walk him down the beach

-

Added 11/13/1998 5:34PM

- - - -
-
-

Walk Dog

-

Walk him down the beach

-

Added 11/13/1998 5:34PM

- - - -

Completed

-
-

Go shopping

-

Get milk, eggs, water

-

Added 2/11/3002 5:34PM

-

Completed 2/11/3002 9:34PM

- - - -
From fc959b26f6455b008e25bdaec4e5dbf7979deaed Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 09:20:34 +0000 Subject: [PATCH 14/76] activated task buttons --- public/to-do-list.js | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index caf60f9..6008571 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -14,11 +14,22 @@ window.addEventListener('load', (event) => {

${task.name}

${task.description}

Added: ${task.date_added}

- - - + + + Update ` incomplete.appendChild(taskElement) + + const completeButton = document.getElementsByClassName('complete-button') + const deleteButton = document.getElementsByClassName('delete-button') + const updateButton = document.getElementsByClassName('update-button') + + deleteButton.addEventListener('click', (event) => { + fetch(`/delete-task/${task.task_id}`,{method:'post'}) + }) + completeButton.addEventListener('click', (event) => { + fetch(`/complete-task/${task.task_id}`,{method:'post'}) + }) } if(task.is_complete === true){ @@ -29,14 +40,19 @@ window.addEventListener('load', (event) => {

${task.description}

Added: ${task.date_added}

${task.date_complete}

- - - + ` complete.appendChild(taskElement) - } + const deleteButton = document.getElementsByClassName('delete-button') + + deleteButton.addEventListener('click', (event) => { + fetch(`/delete-task/${task.task_id}`,{method:'post'}) + }) + } } }) }) + + From 884056eef2000cf79dc88476bbc66ef3342e317a Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 10:10:02 +0000 Subject: [PATCH 15/76] test commit --- public/to-do-list.js | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 6008571..49b27ac 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -14,22 +14,11 @@ window.addEventListener('load', (event) => {

${task.name}

${task.description}

Added: ${task.date_added}

- - - Update + + + Update ` incomplete.appendChild(taskElement) - - const completeButton = document.getElementsByClassName('complete-button') - const deleteButton = document.getElementsByClassName('delete-button') - const updateButton = document.getElementsByClassName('update-button') - - deleteButton.addEventListener('click', (event) => { - fetch(`/delete-task/${task.task_id}`,{method:'post'}) - }) - completeButton.addEventListener('click', (event) => { - fetch(`/complete-task/${task.task_id}`,{method:'post'}) - }) } if(task.is_complete === true){ @@ -40,19 +29,22 @@ window.addEventListener('load', (event) => {

${task.description}

Added: ${task.date_added}

${task.date_complete}

- + ` complete.appendChild(taskElement) - - const deleteButton = document.getElementsByClassName('delete-button') - - deleteButton.addEventListener('click', (event) => { - fetch(`/delete-task/${task.task_id}`,{method:'post'}) - }) } } }) }) +const deleteTask = (taskId) => { + fetch(`/delete-task/${taskId}`,{method:'post'}) +} + +const completeTask = (taskId) => { + fetch(`/complete-task/${taskId}`,{method:'post'}) +} + + From 611fe79b049726505d1587c03962ca70b77d9363 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 10:24:59 +0000 Subject: [PATCH 16/76] test commit --- public/to-do-list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 49b27ac..2313783 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -38,11 +38,11 @@ window.addEventListener('load', (event) => { }) const deleteTask = (taskId) => { - fetch(`/delete-task/${taskId}`,{method:'post'}) + fetch(`/delete-task/${taskId}`, {method:'put'}) } const completeTask = (taskId) => { - fetch(`/complete-task/${taskId}`,{method:'post'}) + fetch(`/complete-task/${taskId}`, {method:'put'}) } From ee3a03e493694775e297d1dbcc3b5de83abb02b4 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 10:54:07 +0000 Subject: [PATCH 17/76] added full task button functionality --- public/styles/to-do-list.css | 1 - public/to-do-list.js | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/public/styles/to-do-list.css b/public/styles/to-do-list.css index 56bcad7..0d70e81 100644 --- a/public/styles/to-do-list.css +++ b/public/styles/to-do-list.css @@ -12,5 +12,4 @@ #list{ display: flex; - } diff --git a/public/to-do-list.js b/public/to-do-list.js index 2313783..05a3c09 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -28,7 +28,7 @@ window.addEventListener('load', (event) => {

${task.name}

${task.description}

Added: ${task.date_added}

-

${task.date_complete}

+

Completed: ${task.date_complete}

` complete.appendChild(taskElement) @@ -38,7 +38,7 @@ window.addEventListener('load', (event) => { }) const deleteTask = (taskId) => { - fetch(`/delete-task/${taskId}`, {method:'put'}) + fetch(`/delete-task/${taskId}`, {method:'delete'}) } const completeTask = (taskId) => { From 03cdcf5f9cc4243cd87952a3233f36a679ff91da Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 10:57:12 +0000 Subject: [PATCH 18/76] added page reload on button clicks --- public/to-do-list.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/to-do-list.js b/public/to-do-list.js index 05a3c09..0d35f0d 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -39,10 +39,12 @@ window.addEventListener('load', (event) => { const deleteTask = (taskId) => { fetch(`/delete-task/${taskId}`, {method:'delete'}) + location.reload() } const completeTask = (taskId) => { fetch(`/complete-task/${taskId}`, {method:'put'}) + location.reload() } From 8cccde2e4ed20841abb5ac1b452976c26dcaa2f2 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 11:26:33 +0000 Subject: [PATCH 19/76] added update functionality --- public/to-do-list.js | 6 +++- public/views/update-task.html | 2 +- server-side/models/to-do-list.js | 59 ++++++++++++++++---------------- server-side/routes/router.js | 12 +++---- 4 files changed, 42 insertions(+), 37 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 0d35f0d..5096e26 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -16,7 +16,7 @@ window.addEventListener('load', (event) => {

Added: ${task.date_added}

- Update + ` incomplete.appendChild(taskElement) } @@ -47,6 +47,10 @@ const completeTask = (taskId) => { location.reload() } +const updateTask = (taskId) => { + document.getElementsById("updateForm").setAttribute("action", `/update-task/${taskId}`) +} + diff --git a/public/views/update-task.html b/public/views/update-task.html index d43e394..1de2ee4 100644 --- a/public/views/update-task.html +++ b/public/views/update-task.html @@ -19,7 +19,7 @@

Update Task

-
+
diff --git a/server-side/models/to-do-list.js b/server-side/models/to-do-list.js index 508d6bb..9043891 100644 --- a/server-side/models/to-do-list.js +++ b/server-side/models/to-do-list.js @@ -1,19 +1,20 @@ const pool = require('../../db') +const path = require('path') async function addTask(req, res) { try { const user_id = req.userId const {name, description} = req.body const queryText = 'INSERT INTO tasks (user_id, name, description) VALUES ($1, $2, $3);' - const client = await pool.connect(); - const result = await client.query(queryText, [user_id, name, description]); - const results = { 'results': (result) ? result.rows : null }; - res.send(results); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [user_id, name, description]) + const results = { 'results': (result) ? result.rows : null } + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + client.release() } catch (err) { - console.error(err); - res.send(err); + console.error(err) + res.send(err) } } @@ -22,15 +23,15 @@ async function deleteTask(req, res) { const user_id = req.userId const {id} = req.params const queryText = 'DELETE FROM tasks WHERE task_id = $1 AND user_id = $2' - const client = await pool.connect(); - const result = await client.query(queryText, [id, user_id]); - const results = { 'results': (result) ? result.rows : null }; - res.status(201).json({ message: 'Task deleted.' }); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [id, user_id]) + const results = { 'results': (result) ? result.rows : null } + res.status(201).json({ message: 'Task deleted.' }) + client.release() } catch (err) { - console.error(err); - res.status(500).json({ error: '500: Internal Server Error. Resource not deleted.' }); + console.error(err) + res.status(500).json({ error: '500: Internal Server Error. Resource not deleted.' }) } } @@ -41,15 +42,15 @@ async function updateTask(req, res) { const {name, description} = req.body const dateAdded = new Date() const queryText = 'UPDATE tasks SET (name, description, date_added) = ($2, $3, $4) WHERE task_id = $1 AND user_id = $5;' - const client = await pool.connect(); - const result = await client.query(queryText, [id, name, description, dateAdded, user_id]); - const results = { 'results': (result) ? result.rows : null }; - res.status(201).json({ message: 'Task updated.' }); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [id, name, description, dateAdded, user_id]) + const results = { 'results': (result) ? result.rows : null } + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + client.release() } catch (err) { - console.error(err); - res.status(500).json({ error: '500: Internal Server Error. Resource not updated.' }); + console.error(err) + res.status(500).json({ error: '500: Internal Server Error. Resource not updated.' }) } } @@ -59,16 +60,16 @@ async function completeTask(req, res) { const {id} = req.params const dateCompleted = new Date() const queryText = 'UPDATE tasks SET (is_complete, date_complete) = ($2, $3) WHERE task_id = $1 AND user_id = $4;' - const client = await pool.connect(); - const result = await client.query(queryText, [id, true, dateCompleted, user_id]); - const results = { 'results': (result) ? result.rows : null }; - res.send(results); - res.status(201).json({ message: 'Task completed.' }); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [id, true, dateCompleted, user_id]) + const results = { 'results': (result) ? result.rows : null } + res.send(results) + res.status(201).json({ message: 'Task completed.' }) + client.release() } catch (err) { - console.error(err); - res.status(500).json({ error: '500: Internal Server Error. Resource not completed.' }); + console.error(err) + res.status(500).json({ error: '500: Internal Server Error. Resource not completed.' }) } } diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 226bf50..c2052b4 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -20,27 +20,27 @@ router.put('/complete-task/:id', authenticate, toDoList.completeTask) //Client side paths router.get('/', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')); + res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')) }) router.get('/register-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'register.html')); + res.sendFile(path.join(__dirname ,'../../public/views' , 'register.html')) }) router.get('/login-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'login.html')); + res.sendFile(path.join(__dirname ,'../../public/views' , 'login.html')) }) router.get('/to-do-list', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')); + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) }) router.get('/add-task-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'add-task.html')); + res.sendFile(path.join(__dirname ,'../../public/views' , 'add-task.html')) }) router.get('/update-task-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'update-task.html')); + res.sendFile(path.join(__dirname ,'../../public/views' , 'update-task.html')) }) From 97a4a382c0a8e69d6a06bb32c11b2b0a24764cd0 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 11:40:59 +0000 Subject: [PATCH 20/76] troubleshooting update functionality --- public/to-do-list.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 5096e26..1b622bc 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -16,7 +16,7 @@ window.addEventListener('load', (event) => {

Added: ${task.date_added}

- + - - ` incomplete.appendChild(taskElement) } @@ -40,18 +40,15 @@ window.addEventListener('load', (event) => { const deleteTask = (taskId) => { fetch(`/delete-task/${taskId}`, {method:'delete'}) location = '/to-do-list' - location.reload() } const completeTask = (taskId) => { fetch(`/complete-task/${taskId}`, {method:'put'}) location = '/to-do-list' - location.reload() } const updateTask = (taskId) => { location = '/update-task-page' - location.reload() document.getElementsById("updateForm").setAttribute("action", `/update-task/${taskId}`) } From ea47cd562161ae4ddc36f20962dd2aa283a09e3e Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 11:55:26 +0000 Subject: [PATCH 23/76] test commit --- public/to-do-list.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index cf81628..e39f948 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -48,8 +48,9 @@ const completeTask = (taskId) => { } const updateTask = (taskId) => { - location = '/update-task-page' document.getElementsById("updateForm").setAttribute("action", `/update-task/${taskId}`) + location = '/update-task-page' + } From 91f4d9d730fec02a94da93b849e838b4824bb766 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 11:58:39 +0000 Subject: [PATCH 24/76] test commit --- public/to-do-list.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index e39f948..7bde1bc 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -48,8 +48,7 @@ const completeTask = (taskId) => { } const updateTask = (taskId) => { - document.getElementsById("updateForm").setAttribute("action", `/update-task/${taskId}`) - location = '/update-task-page' + fetch(`/update-task/${taskId}`, {method:'put'}) } From e562d971ba55579dcaeae0366054caf621feddc7 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:07:03 +0000 Subject: [PATCH 25/76] test commit --- public/to-do-list.js | 5 ++--- public/views/update-task.html | 1 + 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index 7bde1bc..a6bfd83 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -16,7 +16,7 @@ window.addEventListener('load', (event) => {

Added: ${task.date_added}

- +
Update ` incomplete.appendChild(taskElement) } @@ -48,8 +48,7 @@ const completeTask = (taskId) => { } const updateTask = (taskId) => { - fetch(`/update-task/${taskId}`, {method:'put'}) - + document.getElementsById("updateForm").setAttribute("action", `/update-task/${taskId}`) } diff --git a/public/views/update-task.html b/public/views/update-task.html index 1de2ee4..6d70a4a 100644 --- a/public/views/update-task.html +++ b/public/views/update-task.html @@ -32,5 +32,6 @@

Update Task

+ \ No newline at end of file From 1027c9f5a88f122a5851e4d5e51798d7d14f3468 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:11:16 +0000 Subject: [PATCH 26/76] test commit --- public/to-do-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index a6bfd83..290fa2e 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -48,7 +48,7 @@ const completeTask = (taskId) => { } const updateTask = (taskId) => { - document.getElementsById("updateForm").setAttribute("action", `/update-task/${taskId}`) + document.getElementById("updateForm").action = `/update-task/${taskId}` } From 86e24b852d107a54c45ce902211328694f7edb42 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:15:33 +0000 Subject: [PATCH 27/76] test commit --- public/views/update-task.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/views/update-task.html b/public/views/update-task.html index 6d70a4a..d505627 100644 --- a/public/views/update-task.html +++ b/public/views/update-task.html @@ -19,7 +19,7 @@

Update Task

-
+
From 2f62258da0343e8dad9b1bbe98cba44b2bba7e11 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:26:38 +0000 Subject: [PATCH 28/76] test commit --- public/views/update-task.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/views/update-task.html b/public/views/update-task.html index d505627..09c22cd 100644 --- a/public/views/update-task.html +++ b/public/views/update-task.html @@ -19,7 +19,7 @@

Update Task

- +
From 7c35f0c6539e3bee738198100bc0cfcb5694a5b6 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:36:36 +0000 Subject: [PATCH 29/76] test commit --- public/to-do-list.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/to-do-list.js b/public/to-do-list.js index 290fa2e..b8420e3 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -49,6 +49,7 @@ const completeTask = (taskId) => { const updateTask = (taskId) => { document.getElementById("updateForm").action = `/update-task/${taskId}` + console.log('big') } From 43adf213c2c8ce5659e56d07099af35dadbdcf4d Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:40:10 +0000 Subject: [PATCH 30/76] test commit --- public/to-do-list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index b8420e3..a4fcd19 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -49,7 +49,7 @@ const completeTask = (taskId) => { const updateTask = (taskId) => { document.getElementById("updateForm").action = `/update-task/${taskId}` - console.log('big') + location ='/to-do-list' } From a10744c45e5eb8ddde3cd29e31a20e283c3d788c Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 12:49:18 +0000 Subject: [PATCH 31/76] test commit --- public/to-do-list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/to-do-list.js b/public/to-do-list.js index a4fcd19..2bcbf10 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -48,8 +48,8 @@ const completeTask = (taskId) => { } const updateTask = (taskId) => { - document.getElementById("updateForm").action = `/update-task/${taskId}` - location ='/to-do-list' + //document.getElementById("updateForm").action = `/update-task/${taskId}` + location =`/update-task/${taskId}` } From a044cafcf6830bbb57de80ee86afe4235d193010 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:00:04 +0000 Subject: [PATCH 32/76] incomplete submission --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 97f7499..e66e17d 100644 --- a/README.md +++ b/README.md @@ -17,4 +17,6 @@ The purpose of this Problem Set is to merge your work from Problem Set 7.1 and P 3. Deploy to Heroku and be sure to include the project URL in your README. ### Due Date -Tuesday, April 7 at 9AM \ No newline at end of file +Tuesday, April 7 at 9AM + +[Link to project](https://shielded-lowlands-62326.herokuapp.com/) \ No newline at end of file From c21041c23d63f35cce27df32ba382649bcf44fcf Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:40:49 +0000 Subject: [PATCH 33/76] update fix --- app.js | 2 +- package-lock.json | 5 +++++ package.json | 1 + public/to-do-list.js | 6 +----- public/views/{update-task.html => update-task.ejs} | 2 +- server-side/routes/router.js | 5 +++-- 6 files changed, 12 insertions(+), 9 deletions(-) rename public/views/{update-task.html => update-task.ejs} (94%) diff --git a/app.js b/app.js index 2188d77..862fca7 100644 --- a/app.js +++ b/app.js @@ -8,7 +8,7 @@ const cookieParser = require('cookie-parser') app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true})) - +app.set('view engine', 'ejs') app.use(express.static('public')) app.use(cookieParser()) diff --git a/package-lock.json b/package-lock.json index fc3f247..541532a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3016,6 +3016,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "ejs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.2.tgz", + "integrity": "sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA==" + }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", diff --git a/package.json b/package.json index d04ee6f..26c597f 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "bcrypt": "^4.0.1", "body-parser": "^1.19.0", "cookie-parser": "^1.4.5", + "ejs": "^3.0.2", "express": "^4.17.1", "heroku": "^7.39.2", "jsonwebtoken": "^8.5.1", diff --git a/public/to-do-list.js b/public/to-do-list.js index 2bcbf10..dc9abc6 100644 --- a/public/to-do-list.js +++ b/public/to-do-list.js @@ -16,7 +16,7 @@ window.addEventListener('load', (event) => {

Added: ${task.date_added}

- Update + Update ` incomplete.appendChild(taskElement) } @@ -47,10 +47,6 @@ const completeTask = (taskId) => { location = '/to-do-list' } -const updateTask = (taskId) => { - //document.getElementById("updateForm").action = `/update-task/${taskId}` - location =`/update-task/${taskId}` -} diff --git a/public/views/update-task.html b/public/views/update-task.ejs similarity index 94% rename from public/views/update-task.html rename to public/views/update-task.ejs index 09c22cd..8f9c537 100644 --- a/public/views/update-task.html +++ b/public/views/update-task.ejs @@ -19,7 +19,7 @@

Update Task

- +
diff --git a/server-side/routes/router.js b/server-side/routes/router.js index c2052b4..bed9a3d 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -39,8 +39,9 @@ router.get('/add-task-page', (req, res) =>{ res.sendFile(path.join(__dirname ,'../../public/views' , 'add-task.html')) }) -router.get('/update-task-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'update-task.html')) +router.get('/update-task/:id', (req, res) =>{ + const id = req.params + res.render('update-task.ejs', {taskId: id}) }) From 32fcf0a8a56d9633b7b18ab167809ba3ca1e7222 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:45:05 +0000 Subject: [PATCH 34/76] update fix --- app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 862fca7..700f2c1 100644 --- a/app.js +++ b/app.js @@ -8,8 +8,9 @@ const cookieParser = require('cookie-parser') app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true})) -app.set('view engine', 'ejs') + app.use(express.static('public')) +app.set('view engine', 'ejs') app.use(cookieParser()) app.use(listRouter) From 7e9ebe33164d16a946b09e833d87f51885f00677 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:47:41 +0000 Subject: [PATCH 35/76] update fix --- server-side/routes/router.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server-side/routes/router.js b/server-side/routes/router.js index bed9a3d..2167cc4 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -6,6 +6,8 @@ const router = express.Router() const pool = require('../../db') const authenticate = require('../auth/verify') const path = require('path') +const app = express() +app.set('view engine', 'ejs') //API paths router.get('/login', userController.login) From 6261206eaa80c74dafbdeb0ae4b73cdb0fb8c6ce Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:50:49 +0000 Subject: [PATCH 36/76] update fix --- server-side/routes/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 2167cc4..d2ad4bc 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -43,7 +43,7 @@ router.get('/add-task-page', (req, res) =>{ router.get('/update-task/:id', (req, res) =>{ const id = req.params - res.render('update-task.ejs', {taskId: id}) + res.render('../../public/views/update-task.ejs', {taskId: id}) }) From 2ebd7db0c21a16179f3ecee58f37b3598febe908 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:53:44 +0000 Subject: [PATCH 37/76] update fix --- server-side/routes/router.js | 4 +--- {public/views => server-side/routes}/update-task.ejs | 0 2 files changed, 1 insertion(+), 3 deletions(-) rename {public/views => server-side/routes}/update-task.ejs (100%) diff --git a/server-side/routes/router.js b/server-side/routes/router.js index d2ad4bc..bed9a3d 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -6,8 +6,6 @@ const router = express.Router() const pool = require('../../db') const authenticate = require('../auth/verify') const path = require('path') -const app = express() -app.set('view engine', 'ejs') //API paths router.get('/login', userController.login) @@ -43,7 +41,7 @@ router.get('/add-task-page', (req, res) =>{ router.get('/update-task/:id', (req, res) =>{ const id = req.params - res.render('../../public/views/update-task.ejs', {taskId: id}) + res.render('update-task.ejs', {taskId: id}) }) diff --git a/public/views/update-task.ejs b/server-side/routes/update-task.ejs similarity index 100% rename from public/views/update-task.ejs rename to server-side/routes/update-task.ejs From 87dfc67a52f004eed5f40e8c71d980c21d187de0 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 13:57:06 +0000 Subject: [PATCH 38/76] update fix --- app.js | 5 +++++ server-side/routes/update-task.ejs => update-task.ejs | 0 2 files changed, 5 insertions(+) rename server-side/routes/update-task.ejs => update-task.ejs (100%) diff --git a/app.js b/app.js index 700f2c1..9c3759a 100644 --- a/app.js +++ b/app.js @@ -15,6 +15,11 @@ app.set('view engine', 'ejs') app.use(cookieParser()) app.use(listRouter) +app.get('/update-task/:id', (req, res) =>{ + const id = req.params + res.render('update-task.ejs', { taskId: id }) +}) + app.listen(port, () => { diff --git a/server-side/routes/update-task.ejs b/update-task.ejs similarity index 100% rename from server-side/routes/update-task.ejs rename to update-task.ejs From 972464d54b0610c3bfb12a9abf991b055d66083a Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 21:42:29 +0000 Subject: [PATCH 39/76] update page accesible --- server-side/routes/router.js | 10 +++++----- {public/views => views}/add-task.html | 0 {public/views => views}/index.html | 0 {public/views => views}/login.html | 0 {public/views => views}/register.html | 0 {public/views => views}/to-do-list.html | 0 update-task.ejs => views/update-task.ejs | 0 7 files changed, 5 insertions(+), 5 deletions(-) rename {public/views => views}/add-task.html (100%) rename {public/views => views}/index.html (100%) rename {public/views => views}/login.html (100%) rename {public/views => views}/register.html (100%) rename {public/views => views}/to-do-list.html (100%) rename update-task.ejs => views/update-task.ejs (100%) diff --git a/server-side/routes/router.js b/server-side/routes/router.js index bed9a3d..990db45 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -20,23 +20,23 @@ router.put('/complete-task/:id', authenticate, toDoList.completeTask) //Client side paths router.get('/', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')) + res.sendFile(path.join(__dirname ,'../../views' , 'index.html')) }) router.get('/register-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'register.html')) + res.sendFile(path.join(__dirname ,'../../views' , 'register.html')) }) router.get('/login-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'login.html')) + res.sendFile(path.join(__dirname ,'../../views' , 'login.html')) }) router.get('/to-do-list', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + res.sendFile(path.join(__dirname ,'../../views' , 'to-do-list.html')) }) router.get('/add-task-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../public/views' , 'add-task.html')) + res.sendFile(path.join(__dirname ,'../../views' , 'add-task.html')) }) router.get('/update-task/:id', (req, res) =>{ diff --git a/public/views/add-task.html b/views/add-task.html similarity index 100% rename from public/views/add-task.html rename to views/add-task.html diff --git a/public/views/index.html b/views/index.html similarity index 100% rename from public/views/index.html rename to views/index.html diff --git a/public/views/login.html b/views/login.html similarity index 100% rename from public/views/login.html rename to views/login.html diff --git a/public/views/register.html b/views/register.html similarity index 100% rename from public/views/register.html rename to views/register.html diff --git a/public/views/to-do-list.html b/views/to-do-list.html similarity index 100% rename from public/views/to-do-list.html rename to views/to-do-list.html diff --git a/update-task.ejs b/views/update-task.ejs similarity index 100% rename from update-task.ejs rename to views/update-task.ejs From e80efcbb80c81cba44d3948f877521af009505be Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 21:51:47 +0000 Subject: [PATCH 40/76] update put request fixed --- views/update-task.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/update-task.ejs b/views/update-task.ejs index 8f9c537..cf2a9af 100644 --- a/views/update-task.ejs +++ b/views/update-task.ejs @@ -19,7 +19,7 @@
- +
From 3fd581d2a25cc09324058ed818ef13d0312c9117 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Tue, 7 Apr 2020 22:03:27 +0000 Subject: [PATCH 41/76] update changed to post request --- server-side/models/to-do-list.js | 4 ++-- server-side/routes/router.js | 2 +- views/add-task.html | 4 ++-- views/index.html | 2 +- views/login.html | 4 ++-- views/register.html | 4 ++-- views/to-do-list.html | 4 ++-- views/update-task.ejs | 6 +++--- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/server-side/models/to-do-list.js b/server-side/models/to-do-list.js index 9043891..1a59a21 100644 --- a/server-side/models/to-do-list.js +++ b/server-side/models/to-do-list.js @@ -41,11 +41,11 @@ async function updateTask(req, res) { const {id} = req.params const {name, description} = req.body const dateAdded = new Date() - const queryText = 'UPDATE tasks SET (name, description, date_added) = ($2, $3, $4) WHERE task_id = $1 AND user_id = $5;' + const queryText = 'UPDATE tasks SET (name, description, date_added) = ($2, $3, $4) WHERE task_id = $1;' const client = await pool.connect() const result = await client.query(queryText, [id, name, description, dateAdded, user_id]) const results = { 'results': (result) ? result.rows : null } - res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + res.sendFile(path.join(__dirname ,'../../views' , 'to-do-list.html')) client.release() } catch (err) { diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 990db45..1180766 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -15,7 +15,7 @@ router.get('/completed-tasks', authenticate, listController.getAllCompletedTasks router.get('/tasks', authenticate, listController.getAllTasks) router.post('/add-task', authenticate, toDoList.addTask) router.delete('/delete-task/:id', authenticate, toDoList.deleteTask) -router.put('/update-task/:id', authenticate, toDoList.updateTask) +router.post('/update-task/:id', authenticate, toDoList.updateTask) router.put('/complete-task/:id', authenticate, toDoList.completeTask) //Client side paths diff --git a/views/add-task.html b/views/add-task.html index b33370c..0f2b89e 100644 --- a/views/add-task.html +++ b/views/add-task.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/index.html b/views/index.html index 5e70ecd..559478a 100644 --- a/views/index.html +++ b/views/index.html @@ -8,7 +8,7 @@ - +
diff --git a/views/login.html b/views/login.html index d916b6c..016c648 100644 --- a/views/login.html +++ b/views/login.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/register.html b/views/register.html index 01ecff5..a1d9bfb 100644 --- a/views/register.html +++ b/views/register.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/to-do-list.html b/views/to-do-list.html index f33ca56..aac8d3e 100644 --- a/views/to-do-list.html +++ b/views/to-do-list.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/update-task.ejs b/views/update-task.ejs index cf2a9af..382d0af 100644 --- a/views/update-task.ejs +++ b/views/update-task.ejs @@ -8,8 +8,8 @@ - - + +
@@ -19,7 +19,7 @@
- +
From 5b3ecb4cdc7ba8d54f2ff53588198260dc302353 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 01:45:58 +0000 Subject: [PATCH 42/76] fixed update feature --- {views => public/views}/add-task.html | 4 ++-- {views => public/views}/index.html | 2 +- {views => public/views}/login.html | 4 ++-- {views => public/views}/register.html | 4 ++-- {views => public/views}/to-do-list.html | 4 ++-- server-side/models/to-do-list.js | 5 ++--- server-side/routes/router.js | 12 ++++++------ views/update-task.ejs | 7 +++---- 8 files changed, 20 insertions(+), 22 deletions(-) rename {views => public/views}/add-task.html (88%) rename {views => public/views}/index.html (93%) rename {views => public/views}/login.html (88%) rename {views => public/views}/register.html (91%) rename {views => public/views}/to-do-list.html (87%) diff --git a/views/add-task.html b/public/views/add-task.html similarity index 88% rename from views/add-task.html rename to public/views/add-task.html index 0f2b89e..b33370c 100644 --- a/views/add-task.html +++ b/public/views/add-task.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/index.html b/public/views/index.html similarity index 93% rename from views/index.html rename to public/views/index.html index 559478a..5e70ecd 100644 --- a/views/index.html +++ b/public/views/index.html @@ -8,7 +8,7 @@ - +
diff --git a/views/login.html b/public/views/login.html similarity index 88% rename from views/login.html rename to public/views/login.html index 016c648..d916b6c 100644 --- a/views/login.html +++ b/public/views/login.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/register.html b/public/views/register.html similarity index 91% rename from views/register.html rename to public/views/register.html index a1d9bfb..01ecff5 100644 --- a/views/register.html +++ b/public/views/register.html @@ -8,8 +8,8 @@ - - + +
diff --git a/views/to-do-list.html b/public/views/to-do-list.html similarity index 87% rename from views/to-do-list.html rename to public/views/to-do-list.html index aac8d3e..f33ca56 100644 --- a/views/to-do-list.html +++ b/public/views/to-do-list.html @@ -8,8 +8,8 @@ - - + +
diff --git a/server-side/models/to-do-list.js b/server-side/models/to-do-list.js index 1a59a21..d1d990b 100644 --- a/server-side/models/to-do-list.js +++ b/server-side/models/to-do-list.js @@ -37,15 +37,14 @@ async function deleteTask(req, res) { async function updateTask(req, res) { try { - const user_id = req.userId const {id} = req.params const {name, description} = req.body const dateAdded = new Date() const queryText = 'UPDATE tasks SET (name, description, date_added) = ($2, $3, $4) WHERE task_id = $1;' const client = await pool.connect() - const result = await client.query(queryText, [id, name, description, dateAdded, user_id]) + const result = await client.query(queryText, [id, name, description, dateAdded]) const results = { 'results': (result) ? result.rows : null } - res.sendFile(path.join(__dirname ,'../../views' , 'to-do-list.html')) + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) client.release() } catch (err) { diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 1180766..2c3a45e 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -20,27 +20,27 @@ router.put('/complete-task/:id', authenticate, toDoList.completeTask) //Client side paths router.get('/', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../views' , 'index.html')) + res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')) }) router.get('/register-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../views' , 'register.html')) + res.sendFile(path.join(__dirname ,'../../public/views' , 'register.html')) }) router.get('/login-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../views' , 'login.html')) + res.sendFile(path.join(__dirname ,'../../public/views' , 'login.html')) }) router.get('/to-do-list', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../views' , 'to-do-list.html')) + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) }) router.get('/add-task-page', (req, res) =>{ - res.sendFile(path.join(__dirname ,'../../views' , 'add-task.html')) + res.sendFile(path.join(__dirname ,'../../public/views' , 'add-task.html')) }) router.get('/update-task/:id', (req, res) =>{ - const id = req.params + const {id} = req.params res.render('update-task.ejs', {taskId: id}) }) diff --git a/views/update-task.ejs b/views/update-task.ejs index 382d0af..5aea390 100644 --- a/views/update-task.ejs +++ b/views/update-task.ejs @@ -8,8 +8,8 @@ - - + +
@@ -19,7 +19,7 @@
- +
@@ -32,6 +32,5 @@
- \ No newline at end of file From a15190bb6fc4706b1cccbded6426540e86569c37 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:01:09 +0000 Subject: [PATCH 43/76] added logout feature --- public/models/user.js | 0 public/views/to-do-list.html | 2 +- server-side/controllers/user-controller.js | 9 ++++++++- server-side/routes/router.js | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) delete mode 100644 public/models/user.js diff --git a/public/models/user.js b/public/models/user.js deleted file mode 100644 index e69de29..0000000 diff --git a/public/views/to-do-list.html b/public/views/to-do-list.html index f33ca56..de766aa 100644 --- a/public/views/to-do-list.html +++ b/public/views/to-do-list.html @@ -16,7 +16,7 @@

To-Do List

- Log Out + Log Out Add New Task
diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index c2581ab..280ed11 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -2,6 +2,7 @@ const express = require('express') const jwt = require('jsonwebtoken') const bcrypt = require('bcrypt') const User = require('../models/user') +const path = require('path') const register = (req, res) => { @@ -40,8 +41,14 @@ const login = async (req, res, next) => { return res.status(403).send('Invalid Email/Password') } +const logout = async (req, res) => { + res.clearCookie('token') + res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')) +} + module.exports = { register, - login + login, + logout } \ No newline at end of file diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 2c3a45e..2c4f8ed 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -31,6 +31,8 @@ router.get('/login-page', (req, res) =>{ res.sendFile(path.join(__dirname ,'../../public/views' , 'login.html')) }) +router.get('/logout', userController.logout) + router.get('/to-do-list', (req, res) =>{ res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) }) From f8e63d27e66f490eb427811aa79f195121c7c6ed Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:08:39 +0000 Subject: [PATCH 44/76] fixing login feature --- server-side/controllers/user-controller.js | 2 +- server-side/models/user.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 280ed11..42005f6 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -36,7 +36,7 @@ const login = async (req, res, next) => { if (isValidPassword) { const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') res.cookie('token', token) - return res.status(200).send('Successfully logged in') + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) } return res.status(403).send('Invalid Email/Password') } diff --git a/server-side/models/user.js b/server-side/models/user.js index 934b830..f7bab9d 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -10,7 +10,6 @@ async function addUser(first_name, last_name, email, hashedPassword) { async function getByEmail(email) { const queryText = 'SELECT * FROM users WHERE email=$1' return db.query(queryText, [email]) - .then((data) => data.rows[0]) } From e2f02e7c4e0a166ba5a99fabf7a05c8e3af46c76 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:29:05 +0000 Subject: [PATCH 45/76] fixing login feature --- server-side/controllers/to-do-query.js | 2 +- server-side/models/user.js | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/server-side/controllers/to-do-query.js b/server-side/controllers/to-do-query.js index 4d4bb60..ab50df9 100644 --- a/server-side/controllers/to-do-query.js +++ b/server-side/controllers/to-do-query.js @@ -12,7 +12,7 @@ async function getAllIncompletedTasks(req, res) { } catch (err) { console.error(err); - res.send('My bad'); + res.send('err'); } } diff --git a/server-side/models/user.js b/server-side/models/user.js index f7bab9d..129b41b 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -7,12 +7,24 @@ async function addUser(first_name, last_name, email, hashedPassword) { return db.query(queryText, [first_name, last_name, email, hashedPassword]) } -async function getByEmail(email) { - const queryText = 'SELECT * FROM users WHERE email=$1' - return db.query(queryText, [email]) +async function getByEmail(res, email) { + try{ + const queryText = 'SELECT * FROM users WHERE email=$1' + const client = await db.connect() + const result = await client.query(queryText, [email]) + const results = { 'results': (result) ? result.rows : null } + client.release() + return results + + } + catch (err) { + console.error(err) + res.send(err) + } } + module.exports = { addUser, getByEmail From 532c47059f0a312b017e28d38541e13e12cd067e Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:37:46 +0000 Subject: [PATCH 46/76] fixing login feature --- server-side/controllers/user-controller.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 42005f6..f30d215 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -3,6 +3,7 @@ const jwt = require('jsonwebtoken') const bcrypt = require('bcrypt') const User = require('../models/user') const path = require('path') +const db = require('../../db') const register = (req, res) => { @@ -26,7 +27,12 @@ const register = (req, res) => { const login = async (req, res, next) => { const {email, password} = req.body - const user = await User.getByEmail(email) + //const user = await User.getByEmail(res, email) + const queryText = 'SELECT * FROM users WHERE email=$1' + const client = await db.connect() + const result = await client.query(queryText, [email]) + const user = { 'user': (result) ? result.rows : null } + client.release() if (!user) { return res.status(401).send('Invalid Email') From 1a01d4ca88e06d25656ccf7f8953095e1de057ff Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:49:21 +0000 Subject: [PATCH 47/76] fixing login feature --- server-side/controllers/user-controller.js | 10 +++------- server-side/models/user.js | 6 ++++-- server-side/routes/router.js | 2 ++ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index f30d215..10aa3c8 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -3,7 +3,7 @@ const jwt = require('jsonwebtoken') const bcrypt = require('bcrypt') const User = require('../models/user') const path = require('path') -const db = require('../../db') +const fetch = require('node-fetch') const register = (req, res) => { @@ -26,13 +26,9 @@ const register = (req, res) => { } const login = async (req, res, next) => { + const {email, password} = req.body - //const user = await User.getByEmail(res, email) - const queryText = 'SELECT * FROM users WHERE email=$1' - const client = await db.connect() - const result = await client.query(queryText, [email]) - const user = { 'user': (result) ? result.rows : null } - client.release() + const user = await fetch(`/user/${email}`) if (!user) { return res.status(401).send('Invalid Email') diff --git a/server-side/models/user.js b/server-side/models/user.js index 129b41b..c0cdd67 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -7,14 +7,16 @@ async function addUser(first_name, last_name, email, hashedPassword) { return db.query(queryText, [first_name, last_name, email, hashedPassword]) } -async function getByEmail(res, email) { +async function getByEmail(req, res) { try{ + const {email} = req.params const queryText = 'SELECT * FROM users WHERE email=$1' const client = await db.connect() const result = await client.query(queryText, [email]) const results = { 'results': (result) ? result.rows : null } client.release() - return results + res.send(results) + } catch (err) { diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 2c4f8ed..1bf62cb 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -2,6 +2,7 @@ const express = require('express') const listController = require('../controllers/to-do-query') const userController = require('../controllers/user-controller') const toDoList = require('../models/to-do-list') +const User = require('../models/user') const router = express.Router() const pool = require('../../db') const authenticate = require('../auth/verify') @@ -17,6 +18,7 @@ router.post('/add-task', authenticate, toDoList.addTask) router.delete('/delete-task/:id', authenticate, toDoList.deleteTask) router.post('/update-task/:id', authenticate, toDoList.updateTask) router.put('/complete-task/:id', authenticate, toDoList.completeTask) +router.get('user/:email', User.getByEmail) //Client side paths router.get('/', (req, res) =>{ From f28c4737c533a77ddc1abc79c160db16a6b7effa Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:54:42 +0000 Subject: [PATCH 48/76] fixing login feature --- server-side/routes/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 1bf62cb..561253a 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -18,7 +18,7 @@ router.post('/add-task', authenticate, toDoList.addTask) router.delete('/delete-task/:id', authenticate, toDoList.deleteTask) router.post('/update-task/:id', authenticate, toDoList.updateTask) router.put('/complete-task/:id', authenticate, toDoList.completeTask) -router.get('user/:email', User.getByEmail) +router.get('/user/:email', User.getByEmail) //Client side paths router.get('/', (req, res) =>{ From 7c90e0033c86c93607058215bd0270f661596af8 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 02:57:40 +0000 Subject: [PATCH 49/76] fixing login feature --- server-side/controllers/user-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 10aa3c8..b484f8d 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -28,7 +28,7 @@ const register = (req, res) => { const login = async (req, res, next) => { const {email, password} = req.body - const user = await fetch(`/user/${email}`) + const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) if (!user) { return res.status(401).send('Invalid Email') From ce8e973f886685378816b5a70863f5be3976c79d Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 03:03:51 +0000 Subject: [PATCH 50/76] fixing login feature --- server-side/controllers/user-controller.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index b484f8d..e11276e 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -30,13 +30,13 @@ const login = async (req, res, next) => { const {email, password} = req.body const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) - if (!user) { + if (!user[0]) { return res.status(401).send('Invalid Email') } - const isValidPassword = await bcrypt.compare(password, user.hashed_password) + const isValidPassword = await bcrypt.compare(password, user[0].hashed_password) if (isValidPassword) { - const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') + const token = jwt.sign({ email: email, password: user[0].hashedPassword }, 'secret') res.cookie('token', token) res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) } From 95ab87a033a31152e63af4a4ceef501f692ade58 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 03:06:17 +0000 Subject: [PATCH 51/76] test commit --- server-side/controllers/user-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index e11276e..93d419f 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -31,7 +31,7 @@ const login = async (req, res, next) => { const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) if (!user[0]) { - return res.status(401).send('Invalid Email') + return res.status(401).send(user[0]) } const isValidPassword = await bcrypt.compare(password, user[0].hashed_password) From 5d4c7e50d7e4c5a9d941968b91e658e3da68c6ad Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 03:08:16 +0000 Subject: [PATCH 52/76] test commit --- server-side/controllers/user-controller.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 93d419f..4d506c7 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -30,9 +30,9 @@ const login = async (req, res, next) => { const {email, password} = req.body const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) - if (!user[0]) { - return res.status(401).send(user[0]) - } + // if (!user[0]) { + // return res.status(401).send(user[0]) + // } const isValidPassword = await bcrypt.compare(password, user[0].hashed_password) if (isValidPassword) { From 748ef5be8d2c5c00b16c90c696af9d8947b436c3 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 03:11:23 +0000 Subject: [PATCH 53/76] test commit --- server-side/controllers/user-controller.js | 1 + 1 file changed, 1 insertion(+) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 4d506c7..9e1f38b 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -29,6 +29,7 @@ const login = async (req, res, next) => { const {email, password} = req.body const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) + console.log(user) // if (!user[0]) { // return res.status(401).send(user[0]) From c824e8d3113a70fcd0c42fa49ab56ce2d07cc943 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 08:27:55 +0000 Subject: [PATCH 54/76] test commit --- server-side/controllers/user-controller.js | 32 +++++++++++----------- server-side/models/user.js | 32 +++++++++++----------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 9e1f38b..8f5dc2e 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -25,24 +25,24 @@ const register = (req, res) => { }) } -const login = async (req, res, next) => { +// const login = async (req, res, next) => { - const {email, password} = req.body - const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) - console.log(user) +// const {email, password} = req.body +// const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) +// console.log(user) - // if (!user[0]) { - // return res.status(401).send(user[0]) - // } - const isValidPassword = await bcrypt.compare(password, user[0].hashed_password) +// // if (!user[0]) { +// // return res.status(401).send(user[0]) +// // } +// const isValidPassword = await bcrypt.compare(password, user[0].hashed_password) - if (isValidPassword) { - const token = jwt.sign({ email: email, password: user[0].hashedPassword }, 'secret') - res.cookie('token', token) - res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) - } - return res.status(403).send('Invalid Email/Password') -} +// if (isValidPassword) { +// const token = jwt.sign({ email: email, password: user[0].hashedPassword }, 'secret') +// res.cookie('token', token) +// res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) +// } +// return res.status(403).send('Invalid Email/Password') +// } const logout = async (req, res) => { res.clearCookie('token') @@ -52,6 +52,6 @@ const logout = async (req, res) => { module.exports = { register, - login, + //login, logout } \ No newline at end of file diff --git a/server-side/models/user.js b/server-side/models/user.js index c0cdd67..7c2e88c 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -7,27 +7,27 @@ async function addUser(first_name, last_name, email, hashedPassword) { return db.query(queryText, [first_name, last_name, email, hashedPassword]) } -async function getByEmail(req, res) { - try{ - const {email} = req.params - const queryText = 'SELECT * FROM users WHERE email=$1' - const client = await db.connect() - const result = await client.query(queryText, [email]) - const results = { 'results': (result) ? result.rows : null } - client.release() - res.send(results) +// async function getByEmail(req, res) { +// try{ +// const {email} = req.params +// const queryText = 'SELECT * FROM users WHERE email=$1' +// const client = await db.connect() +// const result = await client.query(queryText, [email]) +// const results = { 'results': (result) ? result.rows : null } +// client.release() +// res.send(results) - } - catch (err) { - console.error(err) - res.send(err) - } -} +// } +// catch (err) { +// console.error(err) +// res.send(err) +// } +// } module.exports = { addUser, - getByEmail + //getByEmail } \ No newline at end of file From 189f24ad79b45e831841fb8f8a41a8f02b514380 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 08:32:04 +0000 Subject: [PATCH 55/76] test commit --- server-side/controllers/user-controller.js | 31 +++++++++++----------- server-side/models/user.js | 25 +++++------------ 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 8f5dc2e..aebb356 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -25,24 +25,23 @@ const register = (req, res) => { }) } -// const login = async (req, res, next) => { +const login = async (req, res, next) => { -// const {email, password} = req.body -// const user = await fetch(`https://shielded-lowlands-62326.herokuapp.com/user/${email}`) -// console.log(user) + const {email, password} = req.body + const user = await User.getByEmail(email) -// // if (!user[0]) { -// // return res.status(401).send(user[0]) -// // } -// const isValidPassword = await bcrypt.compare(password, user[0].hashed_password) + if (!user) { + return res.status(401).send('Invalid Email') + } + const isValidPassword = await bcrypt.compare(password, user.hashed_password) -// if (isValidPassword) { -// const token = jwt.sign({ email: email, password: user[0].hashedPassword }, 'secret') -// res.cookie('token', token) -// res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) -// } -// return res.status(403).send('Invalid Email/Password') -// } + if (isValidPassword) { + const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') + res.cookie('token', token) + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + } + return res.status(403).send('Invalid Email/Password') +} const logout = async (req, res) => { res.clearCookie('token') @@ -52,6 +51,6 @@ const logout = async (req, res) => { module.exports = { register, - //login, + login, logout } \ No newline at end of file diff --git a/server-side/models/user.js b/server-side/models/user.js index 7c2e88c..934b830 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -7,27 +7,14 @@ async function addUser(first_name, last_name, email, hashedPassword) { return db.query(queryText, [first_name, last_name, email, hashedPassword]) } -// async function getByEmail(req, res) { -// try{ -// const {email} = req.params -// const queryText = 'SELECT * FROM users WHERE email=$1' -// const client = await db.connect() -// const result = await client.query(queryText, [email]) -// const results = { 'results': (result) ? result.rows : null } -// client.release() -// res.send(results) - - -// } -// catch (err) { -// console.error(err) -// res.send(err) -// } -// } - +async function getByEmail(email) { + const queryText = 'SELECT * FROM users WHERE email=$1' + return db.query(queryText, [email]) + .then((data) => data.rows[0]) +} module.exports = { addUser, - //getByEmail + getByEmail } \ No newline at end of file From 232cf70a513425c6da06831e74a4afe39438d4f2 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 08:52:15 +0000 Subject: [PATCH 56/76] test commit --- server-side/controllers/user-controller.js | 32 ++++++++++++++++++---- server-side/models/user.js | 7 +++-- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index aebb356..3e37ac0 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -25,25 +25,45 @@ const register = (req, res) => { }) } -const login = async (req, res, next) => { - +const login = (req, res) => { const {email, password} = req.body - const user = await User.getByEmail(email) + const user = User.getByEmail(email) if (!user) { - return res.status(401).send('Invalid Email') + return res.status(401).send('Invalid Email') } - const isValidPassword = await bcrypt.compare(password, user.hashed_password) + + const isValidPassword = bcrypt.compare(password, user.hashed_password) if (isValidPassword) { const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') res.cookie('token', token) res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) } + return res.status(403).send('Invalid Email/Password') + } -const logout = async (req, res) => { +// const login = async (req, res) => { + +// const {email, password} = req.body +// const user = await User.getByEmail(email) + +// if (!user) { +// return res.status(401).send('Invalid Email') +// } +// const isValidPassword = await bcrypt.compare(password, user.hashed_password) + +// if (isValidPassword) { +// const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') +// res.cookie('token', token) +// res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) +// } +// return res.status(403).send('Invalid Email/Password') +// } + +const logout = (req, res) => { res.clearCookie('token') res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')) } diff --git a/server-side/models/user.js b/server-side/models/user.js index 934b830..7047786 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -8,9 +8,12 @@ async function addUser(first_name, last_name, email, hashedPassword) { } async function getByEmail(email) { - const queryText = 'SELECT * FROM users WHERE email=$1' + const queryText = 'SELECT * FROM users WHERE email = $1' return db.query(queryText, [email]) - .then((data) => data.rows[0]) + .then((data) => { + console.log(data.rows[0]) + return data.rows[0] + }) } From 1d504c3c5d3922648ee3fa42b51a70c57e9a767a Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 08:55:30 +0000 Subject: [PATCH 57/76] test commit --- server-side/controllers/user-controller.js | 4 ++-- server-side/models/user.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 3e37ac0..244a604 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -25,7 +25,7 @@ const register = (req, res) => { }) } -const login = (req, res) => { +const login = async (req, res) => { const {email, password} = req.body const user = User.getByEmail(email) @@ -33,7 +33,7 @@ const login = (req, res) => { return res.status(401).send('Invalid Email') } - const isValidPassword = bcrypt.compare(password, user.hashed_password) + const isValidPassword = await bcrypt.compare(password, user.hashed_password) if (isValidPassword) { const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') diff --git a/server-side/models/user.js b/server-side/models/user.js index 7047786..c4ca42a 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -11,8 +11,8 @@ async function getByEmail(email) { const queryText = 'SELECT * FROM users WHERE email = $1' return db.query(queryText, [email]) .then((data) => { - console.log(data.rows[0]) - return data.rows[0] + console.log(data) + return data }) } From 97abdd99ec46b95d78b488fec6973db5ddbf49d8 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 08:58:03 +0000 Subject: [PATCH 58/76] test commit --- server-side/models/user.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server-side/models/user.js b/server-side/models/user.js index c4ca42a..2369284 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -9,10 +9,10 @@ async function addUser(first_name, last_name, email, hashedPassword) { async function getByEmail(email) { const queryText = 'SELECT * FROM users WHERE email = $1' - return db.query(queryText, [email]) + db.query(queryText, [email]) .then((data) => { console.log(data) - return data + return data.rows[0] }) } From b598ebaf65ee7f8b1fd1f39bce750805481daa23 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:03:37 +0000 Subject: [PATCH 59/76] test commit --- server-side/controllers/user-controller.js | 14 +++++++------- server-side/models/user.js | 2 +- server-side/routes/router.js | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 244a604..7fefee7 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -33,15 +33,15 @@ const login = async (req, res) => { return res.status(401).send('Invalid Email') } - const isValidPassword = await bcrypt.compare(password, user.hashed_password) + // const isValidPassword = await bcrypt.compare(password, user.hashed_password) - if (isValidPassword) { - const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') - res.cookie('token', token) - res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) - } + // if (isValidPassword) { + // const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') + // res.cookie('token', token) + // res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + // } - return res.status(403).send('Invalid Email/Password') + return res.status(403).send('Password') } diff --git a/server-side/models/user.js b/server-side/models/user.js index 2369284..dee7305 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -7,7 +7,7 @@ async function addUser(first_name, last_name, email, hashedPassword) { return db.query(queryText, [first_name, last_name, email, hashedPassword]) } -async function getByEmail(email) { +function getByEmail(email) { const queryText = 'SELECT * FROM users WHERE email = $1' db.query(queryText, [email]) .then((data) => { diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 561253a..521be01 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -18,7 +18,6 @@ router.post('/add-task', authenticate, toDoList.addTask) router.delete('/delete-task/:id', authenticate, toDoList.deleteTask) router.post('/update-task/:id', authenticate, toDoList.updateTask) router.put('/complete-task/:id', authenticate, toDoList.completeTask) -router.get('/user/:email', User.getByEmail) //Client side paths router.get('/', (req, res) =>{ From 152ee128557b48275791205bef2a1f050fe95727 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:07:20 +0000 Subject: [PATCH 60/76] test commit --- server-side/models/user.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server-side/models/user.js b/server-side/models/user.js index dee7305..585d336 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -9,9 +9,11 @@ async function addUser(first_name, last_name, email, hashedPassword) { function getByEmail(email) { const queryText = 'SELECT * FROM users WHERE email = $1' - db.query(queryText, [email]) + const client = db.connect() + client.query(queryText, [email]) .then((data) => { - console.log(data) + console.log(data[0]) + client.release() return data.rows[0] }) } From 98d322f76c5c9c4440b99f99ebd30bce562d53bc Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:12:45 +0000 Subject: [PATCH 61/76] test commit --- server-side/models/user.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/server-side/models/user.js b/server-side/models/user.js index 585d336..3c71f4c 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -8,12 +8,11 @@ async function addUser(first_name, last_name, email, hashedPassword) { } function getByEmail(email) { - const queryText = 'SELECT * FROM users WHERE email = $1' - const client = db.connect() - client.query(queryText, [email]) + const queryText = "SELECT * FROM users WHERE email = '$1'" + + db.query(queryText, [email]) .then((data) => { console.log(data[0]) - client.release() return data.rows[0] }) } From 954af95ff89cab02c24e1fca432c812985252f66 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:15:28 +0000 Subject: [PATCH 62/76] test commit --- server-side/controllers/user-controller.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 7fefee7..a6fa37d 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -27,8 +27,8 @@ const register = (req, res) => { const login = async (req, res) => { const {email, password} = req.body - const user = User.getByEmail(email) - + const user = await User.getByEmail(email) + console.log(user) if (!user) { return res.status(401).send('Invalid Email') } From acfecda61b1342fd6a2e6723bc7449d1d9ac9bd4 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:22:03 +0000 Subject: [PATCH 63/76] test commit --- server-side/controllers/user-controller.js | 30 ++++++++++------------ 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index a6fa37d..d1ae14b 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -4,6 +4,7 @@ const bcrypt = require('bcrypt') const User = require('../models/user') const path = require('path') const fetch = require('node-fetch') +const pool = require('../../db') const register = (req, res) => { @@ -25,23 +26,20 @@ const register = (req, res) => { }) } -const login = async (req, res) => { - const {email, password} = req.body - const user = await User.getByEmail(email) - console.log(user) - if (!user) { - return res.status(401).send('Invalid Email') +async function login(req, res){ + try { + const {email, password} = req.body + const queryText = 'SELECT * FROM users WHERE email = $1' + const client = await pool.connect() + const result = await client.query(queryText, [email]) + const results = { 'results': (result) ? result.rows : null } + res.send(results) + client.release() + } + catch (err) { + console.error(err) + res.send('err') } - - // const isValidPassword = await bcrypt.compare(password, user.hashed_password) - - // if (isValidPassword) { - // const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') - // res.cookie('token', token) - // res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) - // } - - return res.status(403).send('Password') } From 96840edf85e5e7abab6675e341dca045cb7c824b Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:26:34 +0000 Subject: [PATCH 64/76] test commit --- public/views/login.html | 2 +- server-side/controllers/user-controller.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/public/views/login.html b/public/views/login.html index d916b6c..fde652e 100644 --- a/public/views/login.html +++ b/public/views/login.html @@ -22,7 +22,7 @@

Login

- + diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index d1ae14b..e20c194 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -29,6 +29,7 @@ const register = (req, res) => { async function login(req, res){ try { const {email, password} = req.body + console.log(email, password) const queryText = 'SELECT * FROM users WHERE email = $1' const client = await pool.connect() const result = await client.query(queryText, [email]) From a9b0e0e7aeea9213a4aef68fb7d2b9bc9c49daea Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:33:48 +0000 Subject: [PATCH 65/76] test commit --- public/views/login.html | 2 +- server-side/routes/router.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/views/login.html b/public/views/login.html index fde652e..13e45b6 100644 --- a/public/views/login.html +++ b/public/views/login.html @@ -19,7 +19,7 @@

Login

- +
diff --git a/server-side/routes/router.js b/server-side/routes/router.js index 521be01..310477f 100644 --- a/server-side/routes/router.js +++ b/server-side/routes/router.js @@ -9,7 +9,7 @@ const authenticate = require('../auth/verify') const path = require('path') //API paths -router.get('/login', userController.login) +router.post('/login', userController.login) router.post('/register', userController.register) router.get('/incomplete-tasks', authenticate, listController.getAllIncompletedTasks) router.get('/completed-tasks', authenticate, listController.getAllCompletedTasks) From 30550d40a404fec0855cae172c65109388d5d76e Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:36:14 +0000 Subject: [PATCH 66/76] test commit --- server-side/controllers/user-controller.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index e20c194..13f8f51 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -34,7 +34,8 @@ async function login(req, res){ const client = await pool.connect() const result = await client.query(queryText, [email]) const results = { 'results': (result) ? result.rows : null } - res.send(results) + const user = results[0] + res.send(user) client.release() } catch (err) { From 04d4a62418467711f75b865e70a62e5251ccefaa Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:37:55 +0000 Subject: [PATCH 67/76] test commit --- server-side/controllers/user-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 13f8f51..a358574 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -35,7 +35,7 @@ async function login(req, res){ const result = await client.query(queryText, [email]) const results = { 'results': (result) ? result.rows : null } const user = results[0] - res.send(user) + res.send(results.email) client.release() } catch (err) { From a931d5c32de80b3034fc7cf34f4664598046bf2b Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:40:13 +0000 Subject: [PATCH 68/76] test commit --- server-side/controllers/user-controller.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index a358574..6335126 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -34,8 +34,7 @@ async function login(req, res){ const client = await pool.connect() const result = await client.query(queryText, [email]) const results = { 'results': (result) ? result.rows : null } - const user = results[0] - res.send(results.email) + res.send(results.results) client.release() } catch (err) { From d8a3cb7156ffedf751797a409cc146da4e930c58 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:43:22 +0000 Subject: [PATCH 69/76] test commit --- server-side/controllers/user-controller.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 6335126..08940b6 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -33,8 +33,9 @@ async function login(req, res){ const queryText = 'SELECT * FROM users WHERE email = $1' const client = await pool.connect() const result = await client.query(queryText, [email]) - const results = { 'results': (result) ? result.rows : null } - res.send(results.results) + const results = { 'userArr': (result) ? result.rows : null } + const user = results.userArr[0] + res.send(user) client.release() } catch (err) { From bc2b433d41cf57e8bc3e547a70f587cd18e197da Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:48:09 +0000 Subject: [PATCH 70/76] test commit --- server-side/controllers/user-controller.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 08940b6..2a2da93 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -35,8 +35,21 @@ async function login(req, res){ const result = await client.query(queryText, [email]) const results = { 'userArr': (result) ? result.rows : null } const user = results.userArr[0] - res.send(user) - client.release() + + if (!user.email) { + return res.status(401).send('Invalid Email') + } + + const isValidPassword = await bcrypt.compare(password, user.hashed_password) + + if (isValidPassword) { + const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') + res.cookie('token', token) + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) + } + return res.status(403).send('Invalid Email/Password') + // res.send(user) + // client.release() } catch (err) { console.error(err) From 75508aca7eafd623fb4639f910460949de05a258 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:50:12 +0000 Subject: [PATCH 71/76] test commit --- server-side/controllers/user-controller.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 2a2da93..888ecca 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -41,7 +41,9 @@ async function login(req, res){ } const isValidPassword = await bcrypt.compare(password, user.hashed_password) - + + console.log(isValidPassword) + if (isValidPassword) { const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') res.cookie('token', token) From 45b9c5778a4205331b4a43f236f42025c018b198 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:57:28 +0000 Subject: [PATCH 72/76] test commit --- server-side/models/user.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/server-side/models/user.js b/server-side/models/user.js index 3c71f4c..934b830 100644 --- a/server-side/models/user.js +++ b/server-side/models/user.js @@ -7,14 +7,10 @@ async function addUser(first_name, last_name, email, hashedPassword) { return db.query(queryText, [first_name, last_name, email, hashedPassword]) } -function getByEmail(email) { - const queryText = "SELECT * FROM users WHERE email = '$1'" - - db.query(queryText, [email]) - .then((data) => { - console.log(data[0]) - return data.rows[0] - }) +async function getByEmail(email) { + const queryText = 'SELECT * FROM users WHERE email=$1' + return db.query(queryText, [email]) + .then((data) => data.rows[0]) } From 07f9459193db1367b06ae0757be4be679325662a Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 09:59:09 +0000 Subject: [PATCH 73/76] test commit --- server-side/controllers/user-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 888ecca..10d1afa 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -49,7 +49,7 @@ async function login(req, res){ res.cookie('token', token) res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) } - return res.status(403).send('Invalid Email/Password') + //return res.status(403).send('Invalid Email/Password') // res.send(user) // client.release() } From 0a43b2a1d98a7d523a9700bff23c204778a12117 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 10:32:11 +0000 Subject: [PATCH 74/76] test commit --- server-side/controllers/to-do-query.js | 42 +++++++++++----------- server-side/controllers/user-controller.js | 26 +------------- 2 files changed, 22 insertions(+), 46 deletions(-) diff --git a/server-side/controllers/to-do-query.js b/server-side/controllers/to-do-query.js index ab50df9..cc2503e 100644 --- a/server-side/controllers/to-do-query.js +++ b/server-side/controllers/to-do-query.js @@ -4,15 +4,15 @@ async function getAllIncompletedTasks(req, res) { try { const user_id = req.userId const queryText = 'SELECT * FROM tasks WHERE is_complete = false AND user_id = $1;' - const client = await pool.connect(); - const result = await client.query(queryText, [user_id]); - const results = { 'results': (result) ? result.rows : null }; - res.send(results); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [user_id]) + const results = { 'results': (result) ? result.rows : null } + res.send(results) + client.release() } catch (err) { - console.error(err); - res.send('err'); + console.error(err) + res.send('err') } } @@ -20,15 +20,15 @@ async function getAllCompletedTasks(req, res) { try { const user_id = req.userId const queryText = 'SELECT * FROM tasks WHERE is_complete = true AND user_id = $1;' - const client = await pool.connect(); - const result = await client.query(queryText, [user_id]); - const results = { 'results': (result) ? result.rows : null }; - res.send(results); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [user_id]) + const results = { 'results': (result) ? result.rows : null } + res.send(results) + client.release() } catch (err) { - console.error(err); - res.send(err); + console.error(err) + res.send(err) } } @@ -36,15 +36,15 @@ async function getAllTasks(req, res) { try { const user_id = req.userId const queryText = 'SELECT * FROM tasks WHERE user_id = $1;' - const client = await pool.connect(); - const result = await client.query(queryText, [user_id]); - const results = { 'results': (result) ? result.rows : null }; - res.send(results); - client.release(); + const client = await pool.connect() + const result = await client.query(queryText, [user_id]) + const results = { 'results': (result) ? result.rows : null } + res.send(results) + client.release() } catch (err) { - console.error(err); - res.send(err); + console.error(err) + res.send(err) } } diff --git a/server-side/controllers/user-controller.js b/server-side/controllers/user-controller.js index 10d1afa..b837de6 100644 --- a/server-side/controllers/user-controller.js +++ b/server-side/controllers/user-controller.js @@ -18,7 +18,7 @@ const register = (req, res) => { }) .then((token) => { res.cookie('token', token) - res.status(200).send(`Cookie set with token: ${token}`) + res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) }) .catch((err) => { console.log(err) @@ -29,7 +29,6 @@ const register = (req, res) => { async function login(req, res){ try { const {email, password} = req.body - console.log(email, password) const queryText = 'SELECT * FROM users WHERE email = $1' const client = await pool.connect() const result = await client.query(queryText, [email]) @@ -42,16 +41,11 @@ async function login(req, res){ const isValidPassword = await bcrypt.compare(password, user.hashed_password) - console.log(isValidPassword) - if (isValidPassword) { const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') res.cookie('token', token) res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) } - //return res.status(403).send('Invalid Email/Password') - // res.send(user) - // client.release() } catch (err) { console.error(err) @@ -60,24 +54,6 @@ async function login(req, res){ } -// const login = async (req, res) => { - -// const {email, password} = req.body -// const user = await User.getByEmail(email) - -// if (!user) { -// return res.status(401).send('Invalid Email') -// } -// const isValidPassword = await bcrypt.compare(password, user.hashed_password) - -// if (isValidPassword) { -// const token = jwt.sign({ email: email, password: user.hashedPassword }, 'secret') -// res.cookie('token', token) -// res.sendFile(path.join(__dirname ,'../../public/views' , 'to-do-list.html')) -// } -// return res.status(403).send('Invalid Email/Password') -// } - const logout = (req, res) => { res.clearCookie('token') res.sendFile(path.join(__dirname ,'../../public/views' , 'index.html')) From 6ea4e1ba6407d685ad471ea8c79d822e322be067 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 10:50:30 +0000 Subject: [PATCH 75/76] Added favicon --- public/views/add-task.html | 4 ++++ .../views/favicon_io/android-chrome-192x192.png | Bin 0 -> 10203 bytes .../views/favicon_io/android-chrome-512x512.png | Bin 0 -> 32982 bytes public/views/favicon_io/apple-touch-icon.png | Bin 0 -> 9361 bytes public/views/favicon_io/favicon-16x16.png | Bin 0 -> 549 bytes public/views/favicon_io/favicon-32x32.png | Bin 0 -> 1189 bytes public/views/favicon_io/favicon.ico | Bin 0 -> 15406 bytes public/views/favicon_io/site.webmanifest | 1 + public/views/index.html | 4 ++++ public/views/login.html | 4 ++++ public/views/register.html | 4 ++++ public/views/to-do-list.html | 4 ++++ 12 files changed, 21 insertions(+) create mode 100644 public/views/favicon_io/android-chrome-192x192.png create mode 100644 public/views/favicon_io/android-chrome-512x512.png create mode 100644 public/views/favicon_io/apple-touch-icon.png create mode 100644 public/views/favicon_io/favicon-16x16.png create mode 100644 public/views/favicon_io/favicon-32x32.png create mode 100644 public/views/favicon_io/favicon.ico create mode 100644 public/views/favicon_io/site.webmanifest diff --git a/public/views/add-task.html b/public/views/add-task.html index b33370c..880b1db 100644 --- a/public/views/add-task.html +++ b/public/views/add-task.html @@ -10,6 +10,10 @@ + + + +
diff --git a/public/views/favicon_io/android-chrome-192x192.png b/public/views/favicon_io/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d9000c6f2090647ff9b06354f79c810bed1c8e GIT binary patch literal 10203 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 L!@HHL*5UsPKb{5& literal 0 HcmV?d00001 diff --git a/public/views/favicon_io/apple-touch-icon.png b/public/views/favicon_io/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..992b8f81da8ffc151f2d37fd07c97453a0d6cdb0 GIT binary patch literal 9361 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 adxMXzd0TGvJA!RB0?2(aK z8&K$A5Co-<37Fdebx=y5fRKj(ru%yzg#pmrr=$W1clFF(ZfosL%qP3oHBGpBK^PD{Zf!oPcC05#LcLkqBg2MyBAza7uU<4T*R60C6<}0;$rD-MO^MVrW57qLTO4 z{{!UmdFgv*#qM+X4mUt&-PHyZR5DDnyc}ze!@(i5#Z?0e#iI1{cNTPSy%t3vdJZB> z>#G6gpKVFgbG8OTJ&#qxSsSpSZ&m_k>EPlm00pBct^QiG9pY}7)@rq2HAIGGz_IK< z;F>uot#SEBmBE3!IvhXd+aEBSPzNZ5Z0ldXkjim*o^}mJZ+h>SlK3&cc*cY=3PMiW nL3ESB_!6(GIsV#6NQmzM!3GE*^5_iH00000NkvXXu0mjfpnLd1 literal 0 HcmV?d00001 diff --git a/public/views/favicon_io/favicon-32x32.png b/public/views/favicon_io/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..3e8ed0e37fa2f63fca4c0b2af77d4db445aaecb5 GIT binary patch literal 1189 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 + + + +
diff --git a/public/views/login.html b/public/views/login.html index 13e45b6..e9c979f 100644 --- a/public/views/login.html +++ b/public/views/login.html @@ -10,6 +10,10 @@ + + + +
diff --git a/public/views/register.html b/public/views/register.html index 01ecff5..105249f 100644 --- a/public/views/register.html +++ b/public/views/register.html @@ -10,6 +10,10 @@ + + + +
diff --git a/public/views/to-do-list.html b/public/views/to-do-list.html index de766aa..48801f7 100644 --- a/public/views/to-do-list.html +++ b/public/views/to-do-list.html @@ -10,6 +10,10 @@ + + + +
From 2d388f20cc756d5b0f6dc61716d43480eec799b3 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Wed, 8 Apr 2020 10:54:20 +0000 Subject: [PATCH 76/76] Added favicon link --- .../favicon_io/android-chrome-192x192.png | Bin .../favicon_io/android-chrome-512x512.png | Bin public/{views => }/favicon_io/apple-touch-icon.png | Bin public/{views => }/favicon_io/favicon-16x16.png | Bin public/{views => }/favicon_io/favicon-32x32.png | Bin public/{views => }/favicon_io/favicon.ico | Bin public/{views => }/favicon_io/site.webmanifest | 0 public/views/add-task.html | 8 ++++---- public/views/index.html | 8 ++++---- public/views/login.html | 8 ++++---- public/views/register.html | 8 ++++---- public/views/to-do-list.html | 8 ++++---- 12 files changed, 20 insertions(+), 20 deletions(-) rename public/{views => }/favicon_io/android-chrome-192x192.png (100%) rename public/{views => }/favicon_io/android-chrome-512x512.png (100%) rename public/{views => }/favicon_io/apple-touch-icon.png (100%) rename public/{views => }/favicon_io/favicon-16x16.png (100%) rename public/{views => }/favicon_io/favicon-32x32.png (100%) rename public/{views => }/favicon_io/favicon.ico (100%) rename public/{views => }/favicon_io/site.webmanifest (100%) diff --git a/public/views/favicon_io/android-chrome-192x192.png b/public/favicon_io/android-chrome-192x192.png similarity index 100% rename from public/views/favicon_io/android-chrome-192x192.png rename to public/favicon_io/android-chrome-192x192.png diff --git a/public/views/favicon_io/android-chrome-512x512.png b/public/favicon_io/android-chrome-512x512.png similarity index 100% rename from public/views/favicon_io/android-chrome-512x512.png rename to public/favicon_io/android-chrome-512x512.png diff --git a/public/views/favicon_io/apple-touch-icon.png b/public/favicon_io/apple-touch-icon.png similarity index 100% rename from public/views/favicon_io/apple-touch-icon.png rename to public/favicon_io/apple-touch-icon.png diff --git a/public/views/favicon_io/favicon-16x16.png b/public/favicon_io/favicon-16x16.png similarity index 100% rename from public/views/favicon_io/favicon-16x16.png rename to public/favicon_io/favicon-16x16.png diff --git a/public/views/favicon_io/favicon-32x32.png b/public/favicon_io/favicon-32x32.png similarity index 100% rename from public/views/favicon_io/favicon-32x32.png rename to public/favicon_io/favicon-32x32.png diff --git a/public/views/favicon_io/favicon.ico b/public/favicon_io/favicon.ico similarity index 100% rename from public/views/favicon_io/favicon.ico rename to public/favicon_io/favicon.ico diff --git a/public/views/favicon_io/site.webmanifest b/public/favicon_io/site.webmanifest similarity index 100% rename from public/views/favicon_io/site.webmanifest rename to public/favicon_io/site.webmanifest diff --git a/public/views/add-task.html b/public/views/add-task.html index 880b1db..13cefc7 100644 --- a/public/views/add-task.html +++ b/public/views/add-task.html @@ -10,10 +10,10 @@ - - - - + + + +
diff --git a/public/views/index.html b/public/views/index.html index bffa44d..2c5a37f 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -9,10 +9,10 @@ - - - - + + + +
diff --git a/public/views/login.html b/public/views/login.html index e9c979f..d46f0a2 100644 --- a/public/views/login.html +++ b/public/views/login.html @@ -10,10 +10,10 @@ - - - - + + + +
diff --git a/public/views/register.html b/public/views/register.html index 105249f..560f937 100644 --- a/public/views/register.html +++ b/public/views/register.html @@ -10,10 +10,10 @@ - - - - + + + +
diff --git a/public/views/to-do-list.html b/public/views/to-do-list.html index 48801f7..699d257 100644 --- a/public/views/to-do-list.html +++ b/public/views/to-do-list.html @@ -10,10 +10,10 @@ - - - - + + + +